0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2025-03-16 22:41:46 +01:00

ircd::json: Eliminate double-references; optimize ABI.

ircd::json: Inline trivial functions; value optimize.
This commit is contained in:
Jason Volk 2023-02-11 20:39:48 -08:00
parent 45a3b8765f
commit b0217fd371
9 changed files with 245 additions and 253 deletions

View file

@ -19,12 +19,12 @@ namespace ircd::json
bool operator!(const array &);
size_t size(const array &);
size_t serialized(const string_view *const &begin, const string_view *const &end);
size_t serialized(const std::string *const &begin, const std::string *const &end);
size_t serialized(const string_view *begin, const string_view *end);
size_t serialized(const std::string *begin, const std::string *end);
size_t serialized(const array &);
string_view stringify(mutable_buffer &buf, const string_view *const &begin, const string_view *const &end);
string_view stringify(mutable_buffer &buf, const std::string *const &begin, const std::string *const &end);
string_view stringify(mutable_buffer &buf, const string_view *begin, const string_view *end);
string_view stringify(mutable_buffer &buf, const std::string *begin, const std::string *end);
string_view stringify(mutable_buffer &, const array &);
std::ostream &operator<<(std::ostream &, const array &);
}
@ -62,8 +62,8 @@ struct ircd::json::array
size_t size() const;
template<class T> T at(const size_t &i) const;
string_view at(const size_t &i) const;
string_view operator[](const size_t &i) const;
string_view at(const size_t i) const;
string_view operator[](const size_t i) const;
explicit operator std::string() const;
@ -109,3 +109,21 @@ const
assert(sv.size() > 2 || sv.empty() || sv == empty_array || sv == empty_object);
return sv.size() <= 2 || sv == literal_null;
}
inline size_t
ircd::json::size(const array &array)
{
return array.size();
}
inline bool
ircd::json::operator!(const array &array)
{
return empty(array);
}
inline bool
ircd::json::empty(const array &array)
{
return array.empty();
}

View file

@ -22,13 +22,13 @@ namespace ircd::json
bool operator<(const member &a, const member &b);
bool operator<(const member &a, const string_view &b);
bool sorted(const member *const &begin, const member *const &end);
bool sorted(const member *begin, const member *end);
size_t serialized(const member *const &begin, const member *const &end);
size_t serialized(const member *begin, const member *end);
size_t serialized(const members &);
size_t serialized(const member &);
string_view stringify(mutable_buffer &, const member *const &begin, const member *const &end);
string_view stringify(mutable_buffer &, const member *begin, const member *end);
string_view stringify(mutable_buffer &, const members &);
string_view stringify(mutable_buffer &, const member &);
@ -86,3 +86,65 @@ ircd::json::member::member(const string_view &k)
k, value{}
}
{}
inline ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const members &list)
{
return stringify(buf, std::begin(list), std::end(list));
}
inline ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const member &m)
{
return stringify(buf, &m, &m + 1);
}
inline size_t
ircd::json::serialized(const members &m)
{
return serialized(std::begin(m), std::end(m));
}
inline size_t
ircd::json::serialized(const member &member)
{
return serialized(member.first) + 1 + serialized(member.second);
}
inline bool
ircd::json::operator<(const member &a, const member &b)
{
return a.first < b.first;
}
inline bool
ircd::json::operator!=(const member &a, const member &b)
{
return a.first != b.first;
}
inline bool
ircd::json::operator==(const member &a, const member &b)
{
return a.first == b.first;
}
inline bool
ircd::json::operator<(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} < b;
}
inline bool
ircd::json::operator!=(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} != b;
}
inline bool
ircd::json::operator==(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} == b;
}

View file

@ -257,6 +257,13 @@ catch(const bad_lex_cast &e)
return def;
}
inline size_t
ircd::json::object::size()
const
{
return count();
}
inline ircd::json::object::const_iterator
ircd::json::object::end()
const
@ -272,3 +279,21 @@ const
assert(sv.size() > 2 || (sv.empty() || sv == empty_object));
return sv.size() <= 2 || sv == literal_null;
}
inline size_t
ircd::json::size(const object &object)
{
return object.size();
}
inline bool
ircd::json::operator!(const object &object)
{
return empty(object);
}
inline bool
ircd::json::empty(const object &object)
{
return object.empty();
}

View file

@ -20,10 +20,10 @@ namespace ircd::json
bool operator<(const object::member &, const object::member &);
bool operator>(const object::member &, const object::member &);
bool sorted(const object::member *const &, const object::member *const &);
size_t serialized(const object::member *const &, const object::member *const &);
bool sorted(const object::member *, const object::member *);
size_t serialized(const object::member *, const object::member *);
size_t serialized(const object::member &);
string_view stringify(mutable_buffer &, const object::member *const &, const object::member *const &);
string_view stringify(mutable_buffer &, const object::member *, const object::member *);
string_view stringify(mutable_buffer &, const object::member &);
std::ostream &operator<<(std::ostream &, const object::member &);
}

View file

@ -316,6 +316,18 @@ ircd::json::stack::member::append(const json::tuple<T...> &t)
});
}
inline void
ircd::json::stack::member::_pre_append()
{
assert(!vc);
}
inline void
ircd::json::stack::member::_post_append()
{
vc |= true;
}
template<class... T>
void
ircd::json::stack::array::append(const json::tuple<T...> &t)
@ -332,6 +344,12 @@ ircd::json::stack::array::append(const json::tuple<T...> &t)
});
}
inline void
ircd::json::stack::array::_post_append()
{
++vc;
}
template<class... T>
void
ircd::json::stack::object::append(const json::tuple<T...> &t)

View file

@ -65,3 +65,17 @@ ircd::json::strung::strung(T&&... t)
})
}
{}
inline ircd::json::strung::operator
json::array()
const
{
return string_view{*this};
}
inline ircd::json::strung::operator
json::object()
const
{
return string_view{*this};
}

View file

@ -22,11 +22,11 @@ namespace ircd::json
size_t serialized(const bool &);
size_t serialized(const value &);
size_t serialized(const value *const &begin, const value *const &end);
size_t serialized(const value *begin, const value *end);
size_t serialized(const values &);
string_view stringify(mutable_buffer &, const value &);
string_view stringify(mutable_buffer &, const value *const &begin, const value *const &end);
string_view stringify(mutable_buffer &, const value *begin, const value *end);
std::ostream &operator<<(std::ostream &, const value &);
bool operator==(const value &a, const value &b);
@ -366,6 +366,18 @@ ircd::json::operator!=(const value &a, const value &b)
return !operator==(a, b);
}
inline size_t
ircd::json::serialized(const bool &b)
{
constexpr const size_t tf[2]
{
_constexpr_strlen("false"),
_constexpr_strlen("true"),
};
return tf[b];
}
inline bool
ircd::json::defined(const value &a)
{

View file

@ -47,8 +47,8 @@ struct ircd::json::vector
const_iterator begin() const;
const_iterator find(size_t i) const;
value_type at(const size_t &i) const;
value_type operator[](const size_t &i) const;
value_type at(const size_t i) const;
value_type operator[](const size_t i) const;
bool empty() const;
operator bool() const;
@ -60,9 +60,49 @@ struct ircd::json::vector
#include "vector_iterator.h"
inline size_t
ircd::json::vector::size()
const
{
return count();
}
inline ircd::json::vector::operator
bool()
const
{
return !empty();
}
inline bool
ircd::json::vector::empty()
const
{
const string_view &sv{*this};
return sv.empty();
}
inline ircd::json::vector::const_iterator
ircd::json::vector::end()
const
{
return { string_view::end(), string_view::end() };
}
inline bool
ircd::json::operator!(const vector &v)
{
return v.empty();
}
inline size_t
ircd::json::size(const vector &v)
{
return v.size();
}
inline bool
ircd::json::empty(const vector &v)
{
return v.empty();
}

View file

@ -1675,12 +1675,6 @@ ircd::json::stack::array::_pre_append()
s->rethrow_exception();
}
void
ircd::json::stack::array::_post_append()
{
++vc;
}
//
// member
//
@ -1848,18 +1842,6 @@ ircd::json::stack::member::append(const json::value &value)
});
}
void
ircd::json::stack::member::_pre_append()
{
assert(!vc);
}
void
ircd::json::stack::member::_post_append()
{
vc |= true;
}
//
// stack::checkpoint
//
@ -2395,59 +2377,11 @@ ircd::json::iov::defaults::defaults(iov &iov,
{
}
///////////////////////////////////////////////////////////////////////////////
//
// json/strung.h
//
ircd::json::strung::operator
json::array()
const
{
return string_view{*this};
}
ircd::json::strung::operator
json::object()
const
{
return string_view{*this};
}
///////////////////////////////////////////////////////////////////////////////
//
// json/vector.h
//
bool
ircd::json::operator!(const vector &v)
{
return v.empty();
}
size_t
ircd::json::size(const vector &v)
{
return v.size();
}
bool
ircd::json::empty(const vector &v)
{
return v.empty();
}
//
// vector::vector
//
size_t
ircd::json::vector::size()
const
{
return count();
}
size_t
ircd::json::vector::count()
const
@ -2455,39 +2389,22 @@ const
return std::distance(begin(), end());
}
ircd::json::vector::operator
bool()
const
{
return !empty();
}
bool
ircd::json::vector::empty()
const
{
const string_view &sv
{
*static_cast<const string_view *>(this)
};
return sv.empty();
}
ircd::json::vector::value_type
ircd::json::vector::operator[](const size_t &i)
ircd::json::vector::operator[](const size_t i)
const
{
const auto it(find(i));
return it != end()? *it : object{};
return it != end()?
*it:
object{};
}
ircd::json::vector::value_type
ircd::json::vector::at(const size_t &i)
ircd::json::vector::at(const size_t i)
const
{
const auto it(find(i));
if(it == end())
if(unlikely(it == end()))
throw not_found
{
"indice %zu", i
@ -2640,24 +2557,6 @@ ircd::json::sorted(const object &object)
return true;
}
size_t
ircd::json::size(const object &object)
{
return object.size();
}
bool
ircd::json::operator!(const object &object)
{
return empty(object);
}
bool
ircd::json::empty(const object &object)
{
return object.empty();
}
//
// object
//
@ -2681,7 +2580,14 @@ ircd::json::object::get(const string_view &key,
const string_view &def)
const
{
return get<string_view>(key, def);
const auto it
{
find(key)
};
return it != end()?
it->second:
def;
}
ircd::json::object::operator std::string()
@ -2712,13 +2618,6 @@ const
return find(key) != end();
}
size_t
ircd::json::object::size()
const
{
return count();
}
size_t
ircd::json::object::count()
const
@ -2887,8 +2786,8 @@ ircd::json::serialized(const object::member &member)
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const object::member *const &b,
const object::member *const &e)
const object::member *const b,
const object::member *const e)
{
const size_t mc(object_member_arrays_ctr);
assert(mc < object_member_arrays.size());
@ -2935,8 +2834,8 @@ ircd::json::_stringify(mutable_buffer &buf,
}
size_t
ircd::json::serialized(const object::member *const &begin,
const object::member *const &end)
ircd::json::serialized(const object::member *const begin,
const object::member *const end)
{
const size_t ret(1 + (begin == end));
return std::accumulate(begin, end, ret, []
@ -2947,8 +2846,8 @@ ircd::json::serialized(const object::member *const &begin,
}
bool
ircd::json::sorted(const object::member *const &begin,
const object::member *const &end)
ircd::json::sorted(const object::member *const begin,
const object::member *const end)
{
return std::is_sorted(begin, end, []
(const object::member &a, const object::member &b)
@ -2992,52 +2891,34 @@ ircd::json::serialized(const array &v)
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const std::string *const &b,
const std::string *const &e)
const std::string *const b,
const std::string *const e)
{
return array::stringify(buf, b, e);
}
size_t
ircd::json::serialized(const std::string *const &b,
const std::string *const &e)
ircd::json::serialized(const std::string *const b,
const std::string *const e)
{
return array::serialized(b, e);
}
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const string_view *const &b,
const string_view *const &e)
const string_view *const b,
const string_view *const e)
{
return array::stringify(buf, b, e);
}
size_t
ircd::json::serialized(const string_view *const &b,
const string_view *const &e)
ircd::json::serialized(const string_view *const b,
const string_view *const e)
{
return array::serialized(b, e);
}
size_t
ircd::json::size(const array &array)
{
return array.size();
}
bool
ircd::json::operator!(const array &array)
{
return empty(array);
}
bool
ircd::json::empty(const array &array)
{
return array.empty();
}
//
// array::array
//
@ -3132,7 +3013,7 @@ const
}
ircd::string_view
ircd::json::array::operator[](const size_t &i)
ircd::json::array::operator[](const size_t i)
const
{
const auto it(find(i));
@ -3140,7 +3021,7 @@ const
}
ircd::string_view
ircd::json::array::at(const size_t &i)
ircd::json::array::at(const size_t i)
const
{
const auto it(find(i));
@ -3216,20 +3097,6 @@ ircd::json::array::const_iterator::operator++()
// json/member.h
//
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const members &list)
{
return stringify(buf, std::begin(list), std::end(list));
}
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const member &m)
{
return stringify(buf, &m, &m + 1);
}
namespace ircd::json
{
using member_array = std::array<const member *, object::max_sorted_members>;
@ -3242,8 +3109,8 @@ namespace ircd::json
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const member *const &b,
const member *const &e)
const member *const b,
const member *const e)
{
static const auto less_member
{
@ -3300,14 +3167,8 @@ ircd::json::stringify(mutable_buffer &buf,
}
size_t
ircd::json::serialized(const members &m)
{
return serialized(std::begin(m), std::end(m));
}
size_t
ircd::json::serialized(const member *const &begin,
const member *const &end)
ircd::json::serialized(const member *const begin,
const member *const end)
{
const size_t ret(1 + (begin == end));
return std::accumulate(begin, end, ret, []
@ -3317,15 +3178,9 @@ ircd::json::serialized(const member *const &begin,
});
}
size_t
ircd::json::serialized(const member &member)
{
return serialized(member.first) + 1 + serialized(member.second);
}
bool
ircd::json::sorted(const member *const &begin,
const member *const &end)
ircd::json::sorted(const member *const begin,
const member *const end)
{
return std::is_sorted(begin, end, []
(const member &a, const member &b)
@ -3334,42 +3189,6 @@ ircd::json::sorted(const member *const &begin,
});
}
bool
ircd::json::operator<(const member &a, const member &b)
{
return a.first < b.first;
}
bool
ircd::json::operator!=(const member &a, const member &b)
{
return a.first != b.first;
}
bool
ircd::json::operator==(const member &a, const member &b)
{
return a.first == b.first;
}
bool
ircd::json::operator<(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} < b;
}
bool
ircd::json::operator!=(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} != b;
}
bool
ircd::json::operator==(const member &a, const string_view &b)
{
return string_view{a.first.string, a.first.len} == b;
}
///////////////////////////////////////////////////////////////////////////////
//
// json/string.h
@ -4124,8 +3943,8 @@ ircd::json::operator<<(std::ostream &s, const value &v)
ircd::string_view
ircd::json::stringify(mutable_buffer &buf,
const value *const &b,
const value *const &e)
const value *const b,
const value *const e)
{
static const auto print_value
{
@ -4249,8 +4068,8 @@ ircd::json::serialized(const values &v)
}
size_t
ircd::json::serialized(const value *const &begin,
const value *const &end)
ircd::json::serialized(const value *const begin,
const value *const end)
{
// One opening '[' and either one ']' or comma count.
const size_t ret(1 + (begin == end));
@ -4320,22 +4139,6 @@ ircd::json::serialized(const value &v)
};
}
size_t
ircd::json::serialized(const bool &b)
{
static constexpr const size_t t
{
_constexpr_strlen("true")
};
static constexpr const size_t f
{
_constexpr_strlen("false")
};
return b? t : f;
}
//
// value::value
//