#ifndef TEST_WEBSITE_SRC_MODULE_JSON_LIBJSONINCPP_JSONOBJ_H #define TEST_WEBSITE_SRC_MODULE_JSON_LIBJSONINCPP_JSONOBJ_H #include "integer.h" #include #include #include namespace json { struct misuse : std::runtime_error { explicit misuse(const char *string); }; enum json_t { null_symbol, false_symbol, true_symbol, integer, string, array, dictionary, }; enum imaginary_key_t { undefined_array_element, undefined_dictionary_element, }; struct JSON_reference; struct JSON_reference_const; struct JSON { void* value = NULL; json_t type = null_symbol; JSON() = default; explicit JSON(json_t type); explicit JSON(bool V); explicit JSON(int64_t val); explicit JSON(const Integer& V); explicit JSON(const char* str); explicit JSON(const std::string& V); explicit JSON(const std::vector& V); explicit JSON(const std::map& V); JSON(const JSON& other); JSON& operator=(const JSON& other); ~JSON(); JSON_reference r() noexcept; JSON_reference_const r() const noexcept; json_t getType() const; bool isNull() const; bool isBool() const; bool isInteger() const; bool isFalse() const; bool isTrue() const; bool isString() const; bool isArray() const; bool isDictionary() const; bool isNatalistic() const; bool isSymbol() const; bool toBool() const; const Integer& asInteger() const; const std::string& asString() const; const std::vector& asArray() const; const std::map& asDictionary() const; Integer& asInteger(); std::string& asString(); std::vector& asArray(); std::map& asDictionary(); JSON_reference operator[](size_t index); JSON_reference operator[](const std::string& key); JSON_reference_const operator[](size_t index) const; JSON_reference_const operator[](const std::string& key) const; JSON& operator=(int64_t V); JSON& operator=(const Integer& V); JSON& operator=(const char* V); JSON& operator=(const std::string& V); bool operator==(const JSON& B) const; bool operator!=(const JSON& B) const; }; struct ImaginaryKeyChainEValue { imaginary_key_t type; /* Why messing with RAII-ing (int|string) value behind some void pointer when I can just include both. * C'mon, bros, memory consumption issue does not exist */ size_t when_array_index; std::string when_dictionary_key; }; /* These references get invalidated as soon as referenced object or any of its parents get changed */ struct JSON_reference { JSON& last_real; std::vector imaginary_chain; bool isDefined(); JSON& operator*(); JSON& g(); void operator=(const JSON& obj); JSON_reference operator[](size_t index); JSON_reference operator[](const std::string& key); }; /* text */ struct JSON_reference_const { const JSON& last_real; bool bad = false; bool isDefined(); const JSON& operator*(); const JSON& g(); JSON_reference_const operator[](size_t index); JSON_reference_const operator[](const std::string& key); }; } #endif