Tileson 1.4.0
A helpful json parser for Tiled maps
Loading...
Searching...
No Matches
TiledEnum.hpp
Go to the documentation of this file.
1//
2// Created by robin on 06.06.22.
3//
4
5#ifndef TILESON_TILEDENUM_HPP
6#define TILESON_TILEDENUM_HPP
7
8namespace tson
9{
11 {
12 public:
13 inline explicit EnumDefinition(IJson &json);
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);
19
20 [[nodiscard]] inline uint32_t getId() const;
21 [[nodiscard]] inline uint32_t getMaxValue() const;
22 [[nodiscard]] inline const std::string &getName() const;
23 [[nodiscard]] inline EnumStorageType getStorageType() const;
24 [[nodiscard]] inline bool hasValuesAsFlags() const;
25
26 private:
27 inline bool hasFlag(uint32_t value, uint32_t flag) const;
28 uint32_t m_id {};
29 uint32_t m_maxValue {};
30 std::string m_name {};
31 std::map<uint32_t, std::string> m_values {};
32 bool m_valuesAsFlags {false};
34 };
35
37 {
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");
41 m_storageType = (type == "int") ? EnumStorageType::Int : (type == "string") ? EnumStorageType::String : EnumStorageType::Unspecified;
42 m_valuesAsFlags = json.get<bool>("valuesAsFlags");
43
44 if(json.count("values") > 0 && json["values"].isArray())
45 {
46 m_values[0] = "None";
47 uint32_t valueCounter = (m_valuesAsFlags) ? 1 : 0;
48 uint8_t flagBit = 1;
49 auto &array = json.array("values");
50 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item)
51 {
52 std::string v = item->get<std::string>();
53 m_values[valueCounter] = v;
54 if(m_valuesAsFlags)
55 {
56 valueCounter = 1 << flagBit;
57 ++flagBit;
58 }
59 else
60 {
61 ++valueCounter;
62 }
63 });
64
65 m_maxValue = valueCounter;
66 }
67 }
68
69 uint32_t EnumDefinition::getValue(const std::string &str)
70 {
71 auto result = std::find_if(m_values.begin(), m_values.end(), [&](const std::pair<uint32_t, std::string> &pair)
72 {
73 return pair.second == str;
74 });
75
76 if(result != m_values.end())
77 return result->first;
78
79 return 0;
80 }
81
82 std::string EnumDefinition::getValue(uint32_t num)
83 {
84 return (m_values.count(num) > 0) ? m_values[num] : "";
85 }
86
87 bool EnumDefinition::hasValuesAsFlags() const
88 {
89 return m_valuesAsFlags;
90 }
91
92 bool EnumDefinition::exists(const std::string &str)
93 {
94 auto result = std::find_if(m_values.begin(), m_values.end(), [&](const std::pair<uint32_t, std::string> &pair)
95 {
96 return pair.second == str;
97 });
98
99 if(result != m_values.end())
100 return true;
101
102 return false;
103 }
104
105 bool EnumDefinition::exists(uint32_t num) { return (m_values.count(num) > 0); }
106
107 uint32_t EnumDefinition::getId() const
108 {
109 return m_id;
110 }
111
112 const std::string &EnumDefinition::getName() const
113 {
114 return m_name;
115 }
116
117 EnumStorageType EnumDefinition::getStorageType() const
118 {
119 return m_storageType;
120 }
121
122 uint32_t EnumDefinition::getMaxValue() const
123 {
124 return m_maxValue;
125 }
126
127 std::vector<std::string> EnumDefinition::getValues(uint32_t num)
128 {
129 std::vector<std::string> values;
130 if(m_valuesAsFlags)
131 {
132 uint32_t flag = 0;
133 uint32_t i = 0;
134 while(flag < m_maxValue)
135 {
136 flag = 1 << i;
137 ++i;
138 if(m_values.count(flag) > 0 && hasFlag(num, flag))
139 {
140 values.emplace_back(m_values[flag]);
141 }
142 }
143 }
144 else
145 {
146 std::string v = getValue(num);
147 if(!v.empty())
148 values.emplace_back();
149 }
150
151 return values;
152 }
153
154 bool EnumDefinition::hasFlag(uint32_t value, uint32_t flag) const
155 {
156 return ((value & flag) == flag);
157 }
158
160 {
161 public:
162 inline EnumValue() = default;
163 inline EnumValue(uint32_t value, EnumDefinition *definition);
164 inline EnumValue(const std::string &value, EnumDefinition *definition);
165
166 [[nodiscard]] inline uint32_t getValue() const;
167 inline std::string getValueName() const;
168 [[nodiscard]] inline std::vector<std::string> getValueNames() const;
169 [[nodiscard]] inline EnumDefinition *getDefinition() const;
170
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;
178
179 private:
180 uint32_t m_value {0};
181 EnumDefinition *m_definition = nullptr;
182 };
183
184 EnumValue::EnumValue(uint32_t value, EnumDefinition *definition) : m_value {value}, m_definition {definition}
185 {
186
187 }
188
189 EnumValue::EnumValue(const std::string &value, EnumDefinition *definition) : m_definition {definition}
190 {
191 if(!value.empty() && definition != nullptr)
192 {
193 std::vector<std::string> values = Tools::SplitString(value, ',');
194 for(auto &item : values)
195 {
196 uint32_t v = definition->getValue(item);
197 m_value |= v;
198 }
199 }
200 }
201
208 bool EnumValue::hasFlagValue(uint32_t flags) const
209 {
210 if(m_definition->hasValuesAsFlags())
211 return ((m_value & flags) == flags) ? true : false;
212
213 return m_value == flags;
214 }
215
222 bool EnumValue::hasAnyFlagValue(uint32_t flags) const
223 {
224 if(m_definition->hasValuesAsFlags())
225 return ((m_value & flags) != 0);
226
227 return m_value == flags;
228 }
229
230 uint32_t EnumValue::getValue() const
231 {
232 return m_value;
233 }
234
241 std::string EnumValue::getValueName() const
242 {
243 return (m_definition == nullptr) ? "" : m_definition->getValue(m_value);
244 }
245
253 template<typename T>
254 bool EnumValue::hasFlag(T flags) const
255 {
256 return hasFlagValue(static_cast<uint32_t>(flags));
257 }
258
266 template<typename T>
267 bool EnumValue::hasAnyFlag(T flags) const
268 {
269 return hasAnyFlagValue(static_cast<uint32_t>(flags));
270 }
271
273 {
274 return m_definition;
275 }
276
277 std::vector<std::string> EnumValue::getValueNames() const
278 {
279 return (m_definition == nullptr) ? std::vector<std::string>() : m_definition->getValues(m_value);
280 }
281
287 bool EnumValue::containsValueName(const std::string &value) const
288 {
289 if(m_definition != nullptr)
290 {
291 if(m_definition->hasValuesAsFlags())
292 {
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();
296 }
297 return m_definition->getValue(value) == m_value;
298 }
299 return false;
300 }
301}
302
303#endif //TILESON_TILEDENUM_HPP
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
EnumValue()=default
std::string getValueName() const
Definition TiledEnum.hpp:241
Definition IJson.hpp:11
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
static std::vector< std::string > SplitString(const std::string &s, char delim)
Definition Tools.hpp:80
Definition Base64.hpp:12
EnumStorageType
Definition Enums.hpp:136