// // json.hpp // json // // Created by Sam Jaffe on 1/30/16. // Copyright © 2016 Sam Jaffe. All rights reserved. // #ifndef json_hpp #define json_hpp #include "../variant/variant.hpp" #include "json_common.hpp" #include #define JSON_TYPE_LIST \ X(object) \ X(array) \ X(string) \ X(double) \ X(int) \ X(uint) \ X(bool) namespace json { namespace { const constexpr json::int_jt INT_JT_MAX_LAST_DIGIT = (0x7FFFFFFF % 10); const constexpr json::int_jt INT_JT_MAX = json::uint_jt(-1) - 1; const constexpr json::int_jt INT_JT_MIN = json::int_jt(~(json::uint_jt(-1) / 2)); const constexpr json::uint_jt INT_JT_OVER = json::uint_jt(INT_JT_MAX) + 1; const constexpr json::uint_jt UINT_JT_MAX = json::uint_jt(0) - 1; // const constexpr json::uint_jt UINT_JT_MIN = 0; } class value; namespace parser { void parse(value&, char const*); } class value { public: using object_jt = std::map; using array_jt = std::vector; using string_jt = json::string_jt; using double_jt = json::double_jt; using int_jt = json::int_jt; using uint_jt = json::uint_jt; using bool_jt = json::bool_jt; private: static const value null_value; using data_t = variant; data_t data; public: #define X(type) bool is_##type() const { return data.is(); } JSON_TYPE_LIST #undef X bool is_null() const { return !data.valid(); } value() = default; value(value const&) = default; value(value &&) = default; value& operator=(value const&) = default; value& operator=(value &&) = default; #define X(type) value(type##_jt val) { data.set(std::move(val)); } JSON_TYPE_LIST #undef X #define X(type) value(type##_jt && val) { data.set(std::forward(val)); } JSON_TYPE_LIST #undef X #define X(type) value& operator=(type##_jt val) { data.set(std::move(val)); return *this; } JSON_TYPE_LIST #undef X void parse(char const* data); void parse(std::string const& str); void parse(std::istream & in); void clear() { data = data_t(); } value& operator[](const size_t idx); value const& operator[](const size_t idx) const; value& operator[](std::string const& key); value const& operator[](std::string const& key) const; string_jt const& as_string() const; double_jt as_double() const; int_jt as_int() const; uint_jt as_uint() const; bool_jt as_bool() const; operator string_jt const&() const { return as_string(); } operator double_jt() const { return as_double(); } operator int_jt() const { return as_int(); } operator uint_jt() const { return as_uint(); } operator bool_jt() const { return as_bool(); } }; #undef JSON_TYPE_LIST } #endif /* json_hpp */