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.generic_string());
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
216 std::unique_ptr<IJson> create()
override
218 return std::make_unique<PicoJson>();
222 [[nodiscard]]
inline int32_t getInt32(std::string_view key)
override
224 picojson::object obj = m_json->get<picojson::object>();
225 return static_cast<int32_t
>(getDouble(key));
228 [[nodiscard]]
inline uint32_t getUInt32(std::string_view key)
override
230 picojson::object obj = m_json->get<picojson::object>();
231 return static_cast<uint32_t
>(getDouble(key));
234 [[nodiscard]]
inline int64_t getInt64(std::string_view key)
override
236 picojson::object obj = m_json->get<picojson::object>();
237 return static_cast<int64_t
>(getDouble(key));
240 [[nodiscard]]
inline uint64_t getUInt64(std::string_view key)
override
242 picojson::object obj = m_json->get<picojson::object>();
243 return static_cast<uint64_t
>(getDouble(key));
246 [[nodiscard]]
inline double getDouble(std::string_view key)
override
248 picojson::object obj = m_json->get<picojson::object>();
249 return obj[key.data()].get<
double>();
252 [[nodiscard]]
inline std::string getString(std::string_view key)
override
254 picojson::object obj = m_json->get<picojson::object>();
255 return obj[key.data()].get<std::string>();
258 [[nodiscard]]
inline bool getBool(std::string_view key)
override
260 picojson::object obj = m_json->get<picojson::object>();
261 return obj[key.data()].get<
bool>();
264 [[nodiscard]]
float getFloat(std::string_view key)
override
266 picojson::object obj = m_json->get<picojson::object>();
267 return static_cast<float>(getDouble(key));
270 [[nodiscard]]
inline int32_t getInt32()
override
272 return static_cast<int32_t
>(getDouble());
275 [[nodiscard]]
inline uint32_t getUInt32()
override
277 return static_cast<uint32_t
>(getDouble());
280 [[nodiscard]]
inline int64_t getInt64()
override
282 return static_cast<int64_t
>(getDouble());
285 [[nodiscard]]
inline uint64_t getUInt64()
override
287 return static_cast<uint64_t
>(getDouble());
290 [[nodiscard]]
inline double getDouble()
override
292 return m_json->get<
double>();
295 [[nodiscard]]
inline std::string getString()
override
297 return m_json->get<std::string>();
300 [[nodiscard]]
inline bool getBool()
override
302 return m_json->get<
bool>();
305 [[nodiscard]]
float getFloat()
override
307 return static_cast<float>(getDouble());
311 inline void clearCache()
313 m_arrayCache.clear();
314 m_arrayPosCache.clear();
315 m_arrayListDataCache.clear();
318 picojson::value *m_json =
nullptr;
319 std::unique_ptr<picojson::value> m_data =
nullptr;
323 std::map<std::string, std::unique_ptr<IJson>> m_arrayCache;
324 std::map<size_t, std::unique_ptr<IJson>> m_arrayPosCache;
325 std::map<std::string, std::vector<std::unique_ptr<IJson>>> m_arrayListDataCache;
T get(std::string_view key)
Definition IJson.hpp:82
Definition MemoryStream.hpp:12