diff --git a/include/ircd/json/value.h b/include/ircd/json/value.h index b43b6e3c4..e27ff6735 100644 --- a/include/ircd/json/value.h +++ b/include/ircd/json/value.h @@ -137,64 +137,6 @@ ircd::json::value::value() ,floats{false} {} -inline -ircd::json::value::value(const string_view &sv, - const enum type &type) -:string{sv.data()} -,len{sv.size()} -,type{type} -,serial{type == STRING? surrounds(sv, '"') : true} -,alloc{false} -,floats{false} -{} - -inline -ircd::json::value::value(const std::string &s, - const enum type &type) -:string{nullptr} -,len{0} -,type{type} -,serial{type == STRING? surrounds(s, '"') : true} -,alloc{true} -,floats{false} -{ - create_string(s.size(), [&s](const mutable_buffer &buf) - { - copy(buf, string_view{s}); - }); -} - -inline -ircd::json::value::value(const char *const &str, - const enum type &type) -:value{string_view{str}, type} -{} - -inline -ircd::json::value::value(const char *const &str) -:value{string_view{str}} -{} - -inline -ircd::json::value::value(const string_view &sv) -:value{sv, json::type(sv, std::nothrow)} -{} - -inline -ircd::json::value::value(const std::string &s) -:value{s, json::type(s, std::nothrow)} -{} - -inline -ircd::json::value::value(const json::object &sv) -:value{sv, OBJECT} -{} - -inline -ircd::json::value::value(const json::array &sv) -:value{sv, ARRAY} -{} - template ircd::json::value::value(const char (&str)[N]) :value{string_view{str, strnlen(str, N)}} @@ -205,142 +147,3 @@ ircd::json::value::value(const char (&str)[N], const enum type &type) :value{string_view{str, strnlen(str, N)}, type} {} - -inline -ircd::json::value::value(const nullptr_t &) -:value -{ - literal_null, type::LITERAL -}{} - -inline -ircd::json::value::value(const bool &boolean) -:value -{ - boolean? literal_true : literal_false, type::LITERAL -}{} - -inline -ircd::json::value::value(const struct value *const &array, - const size_t &len) -:array{array} -,len{len} -,type{ARRAY} -,serial{false} -,alloc{false} -,floats{false} -{ -} - -inline -ircd::json::value::value(std::unique_ptr &&array, - const size_t &len) -:array{array.get()} -,len{len} -,type{ARRAY} -,serial{false} -,alloc{true} -,floats{false} -{ - array.release(); -} - -inline -ircd::json::value::value(const struct member *const &object, - const size_t &len) -:object{object} -,len{len} -,type{OBJECT} -,serial{false} -,alloc{false} -,floats{false} -{} - -inline -ircd::json::value::value(std::unique_ptr &&object, - const size_t &len) -:object{object.get()} -,len{len} -,type{OBJECT} -,serial{false} -,alloc{true} -,floats{false} -{ - object.release(); -} - -inline -ircd::json::value::value(const int64_t &integer) -:integer{integer} -,len{0} -,type{NUMBER} -,serial{false} -,alloc{false} -,floats{false} -{} - -inline -ircd::json::value::value(const double &floating) -:floating{floating} -,len{0} -,type{NUMBER} -,serial{false} -,alloc{false} -,floats{true} -{} - -inline -ircd::json::value::value(value &&other) -noexcept -:integer{other.integer} -,len{other.len} -,type{other.type} -,serial{other.serial} -,alloc{other.alloc} -,floats{other.floats} -{ - other.alloc = false; -} - -inline ircd::json::value & -ircd::json::value::operator=(value &&other) -noexcept -{ - this->~value(); - integer = other.integer; - len = other.len; - type = other.type; - serial = other.serial; - alloc = other.alloc; - other.alloc = false; - floats = other.floats; - return *this; -} - -inline bool -ircd::json::defined(const value &a) -{ - return !a.undefined(); -} - -inline enum ircd::json::type -ircd::json::type(const value &a) -{ - return a.type; -} - -inline size_t -ircd::json::serialized(const bool &b) -{ - constexpr const size_t t - { - strlen("true") - }; - - constexpr const size_t f - { - strlen("false") - }; - - return b? t : f; -} diff --git a/ircd/json.cc b/ircd/json.cc index 3fc6ecb1b..9daf39b6f 100644 --- a/ircd/json.cc +++ b/ircd/json.cc @@ -1772,10 +1772,165 @@ ircd::json::serialized(const value &v) throw type_error("deciding the size of a type[%u] is undefined", int(v.type)); } +size_t +ircd::json::serialized(const bool &b) +{ + constexpr const size_t t + { + strlen("true") + }; + + constexpr const size_t f + { + strlen("false") + }; + + return b? t : f; +} + +bool +ircd::json::defined(const value &a) +{ + return !a.undefined(); +} + +enum ircd::json::type +ircd::json::type(const value &a) +{ + return a.type; +} + // -// json::value +// value::value // +ircd::json::value::value(const string_view &sv, + const enum type &type) +:string{sv.data()} +,len{sv.size()} +,type{type} +,serial{type == STRING? surrounds(sv, '"') : true} +,alloc{false} +,floats{false} +{} + +ircd::json::value::value(const std::string &s, + const enum type &type) +:string{nullptr} +,len{0} +,type{type} +,serial{type == STRING? surrounds(s, '"') : true} +,alloc{true} +,floats{false} +{ + const string_view sv{s}; + create_string(serialized(sv), [&sv] + (mutable_buffer buf) + { + json::stringify(buf, sv); + }); +} + +ircd::json::value::value(const char *const &str, + const enum type &type) +:value{string_view{str}, type} +{} + +ircd::json::value::value(const char *const &str) +:value{string_view{str}} +{} + +ircd::json::value::value(const string_view &sv) +:value{sv, json::type(sv, std::nothrow)} +{} + +ircd::json::value::value(const std::string &s) +:value{s, json::type(s, std::nothrow)} +{} + +ircd::json::value::value(const json::object &sv) +:value{sv, OBJECT} +{} + +ircd::json::value::value(const json::array &sv) +:value{sv, ARRAY} +{} + +ircd::json::value::value(const nullptr_t &) +:value +{ + literal_null, type::LITERAL +}{} + +ircd::json::value::value(const bool &boolean) +:value +{ + boolean? literal_true : literal_false, type::LITERAL +}{} + +ircd::json::value::value(const struct value *const &array, + const size_t &len) +:array{array} +,len{len} +,type{ARRAY} +,serial{false} +,alloc{false} +,floats{false} +{ +} + +ircd::json::value::value(std::unique_ptr &&array, + const size_t &len) +:array{array.get()} +,len{len} +,type{ARRAY} +,serial{false} +,alloc{true} +,floats{false} +{ + array.release(); +} + +ircd::json::value::value(const struct member *const &object, + const size_t &len) +:object{object} +,len{len} +,type{OBJECT} +,serial{false} +,alloc{false} +,floats{false} +{} + +ircd::json::value::value(std::unique_ptr &&object, + const size_t &len) +:object{object.get()} +,len{len} +,type{OBJECT} +,serial{false} +,alloc{true} +,floats{false} +{ + object.release(); +} + +ircd::json::value::value(const int64_t &integer) +:integer{integer} +,len{0} +,type{NUMBER} +,serial{false} +,alloc{false} +,floats{false} +{} + +ircd::json::value::value(const double &floating) +:floating{floating} +,len{0} +,type{NUMBER} +,serial{false} +,alloc{false} +,floats{true} +{} + ircd::json::value::value(const json::members &members) :string{nullptr} ,len{serialized(members)} @@ -1856,6 +2011,33 @@ ircd::json::value::value(const value &other) } } +ircd::json::value::value(value &&other) +noexcept +:integer{other.integer} +,len{other.len} +,type{other.type} +,serial{other.serial} +,alloc{other.alloc} +,floats{other.floats} +{ + other.alloc = false; +} + +ircd::json::value & +ircd::json::value::operator=(value &&other) +noexcept +{ + this->~value(); + integer = other.integer; + len = other.len; + type = other.type; + serial = other.serial; + alloc = other.alloc; + other.alloc = false; + floats = other.floats; + return *this; +} + ircd::json::value & ircd::json::value::operator=(const value &other) {