35 unsigned long long int,
47 Value(std::nullptr_t =
nullptr);
48 Value(std::string_view s);
49 Value(
const std::string& s);
50 Value(std::string&& s);
57 Value(
const std::initializer_list<Value>& init);
62 template<
typename,
typename>
class C,
64 typename A = std::allocator<T>,
65 std::enable_if_t<std::is_convertible_v<T, Value>,
bool> =
true
67 Value(
const C<T, A>& c);
73 std::enable_if_t<std::is_convertible_v<T, Value>,
bool> =
true
75 Value(
const std::array<T, N>& v);
80 std::enable_if_t<std::is_convertible_v<T, Value>,
bool> =
true
82 Value(
const std::map<std::string, T>& m);
87 std::enable_if_t<std::is_integral_v<T>&& std::is_unsigned_v<T>,
bool> =
true
93 std::enable_if_t<(std::is_integral_v<T>&& std::is_signed_v<T>) || std::is_enum_v<T>,
bool> =
true
99 std::enable_if_t<std::is_floating_point_v<T>,
bool> =
true
105 std::enable_if_t<!std::is_same_v<T, std::monostate> && !std::is_same_v<T, Object> && !std::is_same_v<T, Array> && !std::is_same_v<T, std::string>,
bool> =
true
111 std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>,
bool> =
true
117 std::enable_if_t<std::is_same_v<T, Object> || std::is_same_v<T, Array> || std::is_same_v<T, std::string>,
bool> =
true
123 std::enable_if_t<std::is_same_v<T, Object> || std::is_same_v<T, Array> || std::is_same_v<T, std::string>,
bool> =
true
125 const T&
get()
const;
154 bool contains(
const std::string& s)
const;
165 std::string
Dump(
const int indent = -1,
const char indent_char =
' ')
const;
173 std::string
Dump(
const size_t depth_level,
const int indent,
const char indent_char)
const;
179 class Array :
public std::vector<Value>
181 using std::vector<
Value>::vector;
185 class Object :
public std::map<std::string, Value>
187 using std::map<std::string,
Value>::map;
196 Value Parse(std::string_view::const_iterator iter,
size_t length,
bool no_except =
false);
203 Value Parse(
const std::string& s,
bool no_except =
false);
212 template<
typename,
typename>
class C,
215 std::enable_if_t<std::is_convertible_v<T, Value>,
bool>
219 for (
const auto& i : c)
228 std::enable_if_t<std::is_convertible_v<T, Value>,
bool>
232 for (
const auto& i : v)
240 std::enable_if_t<std::is_convertible_v<T, Value>,
bool>
244 for (
const auto& [k, v] : m)
252 std::enable_if_t<std::is_integral_v<T>&& std::is_unsigned_v<T>,
bool>
261 std::enable_if_t<(std::is_integral_v<T>&& std::is_signed_v<T>) || std::is_enum_v<T>,
bool>
263 Value::Value(
const T i) : val(static_cast<long long int>(i))
270 std::enable_if_t<std::is_floating_point_v<T>,
bool>
279 std::enable_if_t<!std::is_same_v<T, std::monostate> && !std::is_same_v<T, Object> && !std::is_same_v<T, Array> && !std::is_same_v<T, std::string>,
bool>
283 if constexpr (std::is_same_v<T, bool>)
285 if (!std::holds_alternative<bool>(
val))
287 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
289 return std::get<bool>(
val);
292 else if constexpr (std::is_integral_v<T> || std::is_floating_point_v<T>)
294 return get_number<T>();
298 if (!std::holds_alternative<T>(
val))
300 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
302 return std::get<T>(
val);
308 std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>,
bool>
312 if (std::holds_alternative<double>(
val))
314 return static_cast<T
>(std::get<double>(
val));
316 else if (std::holds_alternative<long long int>(
val))
318 return static_cast<T
>(std::get<long long int>(
val));
320 else if (std::holds_alternative<unsigned long long int>(
val))
322 return static_cast<T
>(std::get<unsigned long long int>(
val));
326 throw std::runtime_error(
"Trying to get a number value from a Json::Value that is something else");
332 std::enable_if_t<std::is_same_v<T, Object> || std::is_same_v<T, Array> || std::is_same_v<T, std::string>,
bool>
337 if constexpr (std::is_same_v<T, Object>)
341 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
343 return std::get<ProtocolCraft::Internal::RecursiveWrapper<Object>>(
val).
get();
346 else if constexpr (std::is_same_v<T, Array>)
350 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
352 return std::get<ProtocolCraft::Internal::RecursiveWrapper<Array>>(
val).
get();
357 if (!std::holds_alternative<T>(
val))
359 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
361 return std::get<T>(
val);
367 std::enable_if_t<std::is_same_v<T, Object> || std::is_same_v<T, Array> || std::is_same_v<T, std::string>,
bool>
372 if constexpr (std::is_same_v<T, Object>)
376 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
378 return std::get<ProtocolCraft::Internal::RecursiveWrapper<Object>>(
val).
get();
381 else if constexpr (std::is_same_v<T, Array>)
385 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
387 return std::get<ProtocolCraft::Internal::RecursiveWrapper<Array>>(
val).
get();
392 if (!std::holds_alternative<T>(
val))
394 throw std::runtime_error(
"Trying to get the wrong type from Json::Value");
396 return std::get<T>(
val);
403 if constexpr (std::is_same_v<T, Object>)
405 return std::holds_alternative<ProtocolCraft::Internal::RecursiveWrapper<Object>>(
val);
407 else if constexpr (std::is_same_v<T, Array>)
409 return std::holds_alternative<ProtocolCraft::Internal::RecursiveWrapper<Array>>(
val);
413 return std::holds_alternative<T>(
val);
std::variant< std::monostate, ProtocolCraft::Internal::RecursiveWrapper< Object >, ProtocolCraft::Internal::RecursiveWrapper< Array >, std::string, bool, long long int, unsigned long long int, double > JsonVariant
std::variant holding the actual data
Value Parse(std::string_view::const_iterator iter, size_t length, bool no_except=false)
Parse a string_view from iter for at most length characters.