0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-05 01:58:35 +02:00

ircd::json: Improve value ctor suite; maintain type of object/array; copy std::string.

This commit is contained in:
Jason Volk 2018-04-04 14:12:14 -07:00
parent c35d74b7fd
commit 43e77537c6

View file

@ -56,7 +56,7 @@ namespace ircd::json
///
struct ircd::json::value
{
union // xxx std::variant
union
{
int64_t integer;
double floating;
@ -85,19 +85,23 @@ struct ircd::json::value
explicit operator int64_t() const;
explicit operator std::string() const; ///< NOTE full stringify() of value
template<size_t N> value(const char (&)[N], const enum type &);
value(const string_view &sv, const enum type &);
value(const char *const &, const enum type &);
explicit value(const int64_t &);
explicit value(const double &);
explicit value(const bool &);
template<size_t N> value(const char (&)[N]);
value(const string_view &sv);
value(const char *const &s);
value(const struct member *const &, const size_t &len);
value(std::unique_ptr<const struct member[]> &&, const size_t &len); // alloc = true
value(const struct value *const &, const size_t &len);
value(std::unique_ptr<const struct value[]> &&, const size_t &len); // alloc = true
template<size_t N> value(const char (&)[N], const enum type &);
template<size_t N> value(const char (&)[N]);
explicit value(const std::string &, const enum type &);
explicit value(const std::string &);
value(const string_view &sv, const enum type &);
value(const string_view &sv);
value(const json::object &);
value(const json::array &);
value(const char *const &, const enum type &);
value(const char *const &s);
explicit value(const int64_t &);
explicit value(const double &);
explicit value(const bool &);
value(const members &); // alloc = true
value(const nullptr_t &);
value();
@ -144,6 +148,22 @@ ircd::json::value::value(const string_view &sv,
,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)
@ -160,6 +180,21 @@ 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<size_t N>
ircd::json::value::value(const char (&str)[N])
:value{string_view{str, strnlen(str, N)}}