5#ifndef TILESON_TILEDENUM_HPP
6#define TILESON_TILEDENUM_HPP
14 inline uint32_t
getValue(
const std::string &str);
15 inline std::string
getValue(uint32_t num);
16 inline std::vector<std::string>
getValues(uint32_t num);
17 inline bool exists(
const std::string &str);
18 inline bool exists(uint32_t num);
20 [[nodiscard]]
inline uint32_t
getId()
const;
22 [[nodiscard]]
inline const std::string &
getName()
const;
27 inline bool hasFlag(uint32_t value, uint32_t flag)
const;
29 uint32_t m_maxValue {};
30 std::string m_name {};
31 std::map<uint32_t, std::string> m_values {};
32 bool m_valuesAsFlags {
false};
38 m_id = json.
get<uint32_t>(
"id");
39 m_name = json.
get<std::string>(
"name");
40 std::string type = json.
get<std::string>(
"storageType");
42 m_valuesAsFlags = json.
get<
bool>(
"valuesAsFlags");
47 uint32_t valueCounter = (m_valuesAsFlags) ? 1 : 0;
49 auto &array = json.
array(
"values");
50 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
52 std::string v = item->get<std::string>();
53 m_values[valueCounter] = v;
56 valueCounter = 1 << flagBit;
65 m_maxValue = valueCounter;
69 uint32_t EnumDefinition::getValue(
const std::string &str)
71 auto result = std::find_if(m_values.begin(), m_values.end(), [&](
const std::pair<uint32_t, std::string> &pair)
73 return pair.second == str;
76 if(result != m_values.end())
82 std::string EnumDefinition::getValue(uint32_t num)
84 return (m_values.count(num) > 0) ? m_values[num] :
"";
87 bool EnumDefinition::hasValuesAsFlags()
const
89 return m_valuesAsFlags;
92 bool EnumDefinition::exists(
const std::string &str)
94 auto result = std::find_if(m_values.begin(), m_values.end(), [&](
const std::pair<uint32_t, std::string> &pair)
96 return pair.second == str;
99 if(result != m_values.end())
105 bool EnumDefinition::exists(uint32_t num) {
return (m_values.count(num) > 0); }
107 uint32_t EnumDefinition::getId()
const
112 const std::string &EnumDefinition::getName()
const
119 return m_storageType;
122 uint32_t EnumDefinition::getMaxValue()
const
127 std::vector<std::string> EnumDefinition::getValues(uint32_t num)
129 std::vector<std::string> values;
134 while(flag < m_maxValue)
138 if(m_values.count(flag) > 0 && hasFlag(num, flag))
140 values.emplace_back(m_values[flag]);
146 std::string v = getValue(num);
148 values.emplace_back();
154 bool EnumDefinition::hasFlag(uint32_t value, uint32_t flag)
const
156 return ((value & flag) == flag);
166 [[nodiscard]]
inline uint32_t getValue()
const;
167 inline std::string getValueName()
const;
168 [[nodiscard]]
inline std::vector<std::string> getValueNames()
const;
171 inline bool hasFlagValue(uint32_t flag)
const;
172 template <
typename T>
173 inline bool hasFlag(T flags)
const;
174 inline bool hasAnyFlagValue(uint32_t flags)
const;
175 template <
typename T>
176 inline bool hasAnyFlag(T flags)
const;
177 [[nodiscard]]
inline bool containsValueName(
const std::string &value)
const;
180 uint32_t m_value {0};
184 EnumValue::EnumValue(uint32_t value,
EnumDefinition *definition) : m_value {value}, m_definition {definition}
191 if(!value.empty() && definition !=
nullptr)
194 for(
auto &item : values)
196 uint32_t v = definition->
getValue(item);
211 return ((m_value & flags) == flags) ? true :
false;
213 return m_value == flags;
225 return ((m_value & flags) != 0);
227 return m_value == flags;
243 return (m_definition ==
nullptr) ?
"" : m_definition->
getValue(m_value);
279 return (m_definition ==
nullptr) ? std::vector<std::string>() : m_definition->
getValues(m_value);
289 if(m_definition !=
nullptr)
293 std::vector<std::string> values = m_definition->
getValues(m_value);
294 auto it = std::find(values.begin(), values.end(), value);
295 return it != values.end();
297 return m_definition->
getValue(value) == m_value;
Definition TiledEnum.hpp:11
EnumStorageType getStorageType() const
Definition TiledEnum.hpp:117
uint32_t getMaxValue() const
Definition TiledEnum.hpp:122
uint32_t getValue(const std::string &str)
Definition TiledEnum.hpp:69
std::vector< std::string > getValues(uint32_t num)
Definition TiledEnum.hpp:127
bool hasValuesAsFlags() const
Definition TiledEnum.hpp:87
bool exists(const std::string &str)
Definition TiledEnum.hpp:92
const std::string & getName() const
Definition TiledEnum.hpp:112
uint32_t getId() const
Definition TiledEnum.hpp:107
EnumDefinition(IJson &json)
Definition TiledEnum.hpp:36
Definition TiledEnum.hpp:160
bool hasFlagValue(uint32_t flag) const
Definition TiledEnum.hpp:208
std::vector< std::string > getValueNames() const
Definition TiledEnum.hpp:277
bool hasAnyFlagValue(uint32_t flags) const
Definition TiledEnum.hpp:222
bool containsValueName(const std::string &value) const
Definition TiledEnum.hpp:287
bool hasFlag(T flags) const
Definition TiledEnum.hpp:254
bool hasAnyFlag(T flags) const
Definition TiledEnum.hpp:267
uint32_t getValue() const
Definition TiledEnum.hpp:230
EnumDefinition * getDefinition() const
Definition TiledEnum.hpp:272
std::string getValueName() const
Definition TiledEnum.hpp:241
T get(std::string_view key)
Definition IJson.hpp:82
virtual bool isArray() const =0
virtual size_t count(std::string_view key) const =0
virtual std::vector< std::unique_ptr< IJson > > array()=0
EnumStorageType
Definition Enums.hpp:136