6 #ifndef TILESON_PICOJSON_HPP
7 #define TILESON_PICOJSON_HPP
14 inline PicoJson() =
default;
16 IJson &operator[](std::string_view key)
override
18 if(m_arrayCache.count(key.data()) == 0)
20 if(m_json->is<picojson::object>())
22 picojson::object &o = m_json->
get<picojson::object>();
23 m_arrayCache[key.data()] = std::make_unique<PicoJson>(&o[key.data()]);
27 return *m_arrayCache[key.data()].get();
30 inline explicit PicoJson(picojson::value *json) : m_json {json}
35 inline IJson& at(std::string_view key)
override
37 if(m_arrayCache.count(key.data()) == 0)
39 if(m_json->is<picojson::object>())
41 picojson::object &o = m_json->get<picojson::object>();
42 m_arrayCache[key.data()] = std::make_unique<PicoJson>(&o[key.data()]);
45 return *m_arrayCache[key.data()].get();
48 inline IJson& at(
size_t pos)
override
50 if(m_arrayPosCache.count(pos) == 0)
52 picojson::array &a = m_json->get<picojson::array>();
53 m_arrayPosCache[pos] = std::make_unique<PicoJson>(&a.at(pos));
56 return *m_arrayPosCache[pos];
59 std::vector<std::unique_ptr<IJson>> array()
override
61 std::vector<std::unique_ptr<IJson>> vec;
62 if(m_json->is<picojson::array>())
64 picojson::array &a = m_json->get<picojson::array>();
67 picojson::value *ptr = &item;
68 vec.emplace_back(std::make_unique<PicoJson>(ptr));
75 inline std::vector<std::unique_ptr<IJson>> &array(std::string_view key)
override
77 if(m_arrayListDataCache.count(key.data()) == 0)
79 if(count(key.data()) > 0)
83 picojson::object &obj = m_json->get<picojson::object>();
84 picojson::value &v = obj.at(key.data());
85 bool isArray = v.is<picojson::array>();
88 picojson::array &a = v.get<picojson::array>();
90 std::for_each(a.begin(), a.end(), [&](picojson::value &item)
92 picojson::value *ptr = &item;
93 m_arrayListDataCache[key.data()].emplace_back(std::make_unique<PicoJson>(ptr));
101 return m_arrayListDataCache[key.data()];
104 [[nodiscard]]
inline size_t size()
const override
106 if (m_json->is<picojson::object>())
108 picojson::object obj = m_json->get<picojson::object>();
114 inline bool parse(
const fs::path &path)
override
119 if (fs::exists(path) && fs::is_regular_file(path))
121 m_path = path.parent_path();
122 m_data = std::make_unique<picojson::value>();
123 std::ifstream i(path.u8string());
126 std::string error = picojson::parse(*m_data, i);
129 std::cerr <<
"PicoJson parse error: " << error <<
"\n";
133 m_json = m_data.get();
135 catch (
const std::exception &error)
137 std::string message =
"Parse error: ";
138 message += std::string(error.what());
139 message += std::string(
"\n");
140 std::cerr << message;
148 inline bool parse(
const void *data,
size_t size)
override
152 m_data = std::make_unique<picojson::value>();
156 std::string error = picojson::parse(*m_data, mem);
159 std::cerr <<
"PicoJson parse error: " << error <<
"\n";
163 m_json = m_data.get();
165 catch (
const std::exception &error)
167 std::string message =
"Parse error: ";
168 message += std::string(error.what());
169 message += std::string(
"\n");
170 std::cerr << message;
176 [[nodiscard]]
inline size_t count(std::string_view key)
const override
180 picojson::object obj = m_json->get<picojson::object>();
181 return obj.count(key.data());
184 return m_json->contains(key.data()) ? 1 : 0;
187 [[nodiscard]]
inline bool any(std::string_view key)
const override
189 return count(key) > 0;
192 [[nodiscard]]
inline bool isArray()
const override
194 return m_json->is<picojson::array>();
197 [[nodiscard]]
inline bool isObject()
const override
199 return m_json->is<picojson::object>();
202 [[nodiscard]]
inline bool isNull()
const override
204 return m_json->is<picojson::null>();
207 fs::path directory()
const override
212 void directory(
const fs::path &directory)
override
218 [[nodiscard]]
inline int32_t getInt32(std::string_view key)
override
220 picojson::object obj = m_json->get<picojson::object>();
221 return static_cast<int32_t
>(getDouble(key));
224 [[nodiscard]]
inline uint32_t getUInt32(std::string_view key)
override
226 picojson::object obj = m_json->get<picojson::object>();
227 return static_cast<uint32_t
>(getDouble(key));
230 [[nodiscard]]
inline int64_t getInt64(std::string_view key)
override
232 picojson::object obj = m_json->get<picojson::object>();
233 return static_cast<int64_t
>(getDouble(key));
236 [[nodiscard]]
inline uint64_t getUInt64(std::string_view key)
override
238 picojson::object obj = m_json->get<picojson::object>();
239 return static_cast<uint64_t
>(getDouble(key));
242 [[nodiscard]]
inline double getDouble(std::string_view key)
override
244 picojson::object obj = m_json->get<picojson::object>();
245 return obj[key.data()].get<
double>();
248 [[nodiscard]]
inline std::string getString(std::string_view key)
override
250 picojson::object obj = m_json->get<picojson::object>();
251 return obj[key.data()].get<std::string>();
254 [[nodiscard]]
inline bool getBool(std::string_view key)
override
256 picojson::object obj = m_json->get<picojson::object>();
257 return obj[key.data()].get<
bool>();
260 [[nodiscard]]
float getFloat(std::string_view key)
override
262 picojson::object obj = m_json->get<picojson::object>();
263 return static_cast<float>(getDouble(key));
266 [[nodiscard]]
inline int32_t getInt32()
override
268 return static_cast<int32_t
>(getDouble());
271 [[nodiscard]]
inline uint32_t getUInt32()
override
273 return static_cast<uint32_t
>(getDouble());
276 [[nodiscard]]
inline int64_t getInt64()
override
278 return static_cast<int64_t
>(getDouble());
281 [[nodiscard]]
inline uint64_t getUInt64()
override
283 return static_cast<uint64_t
>(getDouble());
286 [[nodiscard]]
inline double getDouble()
override
288 return m_json->get<
double>();
291 [[nodiscard]]
inline std::string getString()
override
293 return m_json->get<std::string>();
296 [[nodiscard]]
inline bool getBool()
override
298 return m_json->get<
bool>();
301 [[nodiscard]]
float getFloat()
override
303 return static_cast<float>(getDouble());
307 inline void clearCache()
309 m_arrayCache.clear();
310 m_arrayPosCache.clear();
311 m_arrayListDataCache.clear();
314 picojson::value *m_json =
nullptr;
315 std::unique_ptr<picojson::value> m_data =
nullptr;
319 std::map<std::string, std::unique_ptr<IJson>> m_arrayCache;
320 std::map<size_t, std::unique_ptr<IJson>> m_arrayPosCache;
321 std::map<std::string, std::vector<std::unique_ptr<IJson>>> m_arrayListDataCache;
T get(std::string_view key)
Definition: IJson.hpp:72
Definition: MemoryStream.hpp:12
Definition: Base64.hpp:12