Program Listing for File StringEnum.h
↰ Return to documentation for file (axr.sdk/StringEnum.h
)
// Copyright (C) AcceleratXR, Inc. All rights reserved.
#pragma once
#include <cpprest/details/basic_types.h>
#include <map>
#include <vector>
namespace axr {
namespace sdk {
template<class T>
class StringEnum
{
public:
bool operator==(const T* other) noexcept
{
return m_id == other->m_id;
}
bool operator==(const utility::char_t* value) noexcept
{
return m_value.compare(value) == 0;
}
bool operator!=(const T* other) noexcept
{
return m_id != other->m_id;
}
bool operator!=(const utility::char_t* value) noexcept
{
return m_value.compare(value) != 0;
}
virtual ~StringEnum() {}
size_t GetId() const
{
return m_id;
}
const utility::string_t& GetValue() const
{
return m_value;
}
static const T* FromValue(const utility::char_t* value)
{
auto valueIter = s_values.find(value);
return valueIter != s_values.end() ? valueIter->second : s_values.begin()->second;
}
static const T* FromValue(const utility::string_t& value)
{
auto valueIter = s_values.find(value);
return valueIter != s_values.end() ? valueIter->second : s_values.begin()->second;
}
protected:
StringEnum(const utility::char_t* value)
{
m_id = s_values.size();
m_value = value;
s_values.emplace(value, (T*)this);
}
private:
size_t m_id;
utility::string_t m_value;
static std::map<utility::string_t,const T*> s_values;
};
template<class T>
std::map<utility::string_t, const T*> StringEnum<T>::s_values;
} // namespace axr
} // namespace sdk