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