mirror of
https://github.com/matrix-construct/construct
synced 2025-03-13 21:10:32 +01:00
ircd::json: Upgrade index::member to json::member.
This commit is contained in:
parent
1a59218bad
commit
b715b99b0c
6 changed files with 171 additions and 143 deletions
|
@ -88,25 +88,8 @@ namespace ircd::json
|
|||
#include "json/array.h"
|
||||
#include "json/object.h"
|
||||
#include "json/value.h"
|
||||
#include "json/member.h"
|
||||
#include "json/index.h"
|
||||
|
||||
namespace ircd::json
|
||||
{
|
||||
size_t size(const index::member *const &begin, const index::member *const &end);
|
||||
object serialize(const index::member *const *const &begin, const index::member *const *const &end, char *&start, char *const &stop);
|
||||
object serialize(const index::member *const &begin, const index::member *const &end, char *&start, char *const &stop);
|
||||
size_t print(char *const &buf, const size_t &max, const index::member *const &begin, const index::member *const &end);
|
||||
std::string string(const index::member *const &begin, const index::member *const &end);
|
||||
|
||||
using members = std::initializer_list<index::member>;
|
||||
object serialize(const members &, char *&start, char *const &stop);
|
||||
size_t print(char *const &buf, const size_t &max, const members &);
|
||||
std::string string(const members &);
|
||||
|
||||
array serialize(const std::vector<json::object> &, char *&start, char *const &stop);
|
||||
string_view stringify(char *const &buf, const size_t &max, const members &);
|
||||
}
|
||||
|
||||
#include "json/tuple.h"
|
||||
#include "json/builder.h"
|
||||
|
||||
|
|
|
@ -29,10 +29,8 @@
|
|||
//
|
||||
struct ircd::json::builder
|
||||
{
|
||||
using member = index::member;
|
||||
using members = std::initializer_list<member>;
|
||||
using member_closure = std::function<void (const index::member &)>;
|
||||
using member_closure_bool = std::function<bool (const index::member &)>;
|
||||
using member_closure = std::function<void (const member &)>;
|
||||
using member_closure_bool = std::function<bool (const member &)>;
|
||||
|
||||
const builder *parent;
|
||||
member m;
|
||||
|
@ -43,7 +41,7 @@ struct ircd::json::builder
|
|||
size_t count(const member_closure_bool &) const;
|
||||
size_t count() const;
|
||||
|
||||
const index::member *find(const string_view &key) const;
|
||||
const member *find(const string_view &key) const;
|
||||
const json::value &at(const string_view &key) const;
|
||||
|
||||
builder(const builder *const &parent, const members *const &);
|
||||
|
@ -59,7 +57,7 @@ ircd::json::stringify(char *const &buf,
|
|||
{
|
||||
size_t i(0);
|
||||
const auto num(builder.count());
|
||||
const builder::member *m[num];
|
||||
const member *m[num];
|
||||
builder.for_each([&i, &m]
|
||||
(const auto &member)
|
||||
{
|
||||
|
@ -125,7 +123,7 @@ const
|
|||
return ret;
|
||||
}
|
||||
|
||||
inline const ircd::json::index::member *
|
||||
inline const ircd::json::member *
|
||||
ircd::json::builder::find(const string_view &key)
|
||||
const
|
||||
{
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
struct ircd::json::index
|
||||
{
|
||||
struct member;
|
||||
using member = json::member;
|
||||
struct const_iterator;
|
||||
|
||||
using key_type = value;
|
||||
|
@ -75,26 +75,6 @@ struct ircd::json::index
|
|||
friend std::ostream &operator<<(std::ostream &, const index &);
|
||||
};
|
||||
|
||||
struct ircd::json::index::member
|
||||
:std::pair<value, value>
|
||||
{
|
||||
template<class K> member(const K &k, std::initializer_list<member> v);
|
||||
template<class K, class V> member(const K &k, V&& v);
|
||||
explicit member(const string_view &k);
|
||||
explicit member(const object::member &m);
|
||||
member() = default;
|
||||
|
||||
friend bool operator==(const member &a, const member &b);
|
||||
friend bool operator!=(const member &a, const member &b);
|
||||
friend bool operator<(const member &a, const member &b);
|
||||
|
||||
friend bool operator==(const member &a, const string_view &b);
|
||||
friend bool operator!=(const member &a, const string_view &b);
|
||||
friend bool operator<(const member &a, const string_view &b);
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &, const member &);
|
||||
};
|
||||
|
||||
struct ircd::json::index::const_iterator
|
||||
{
|
||||
using value_type = const member;
|
||||
|
@ -187,77 +167,6 @@ const
|
|||
return { std::end(idx) };
|
||||
}
|
||||
|
||||
template<class K,
|
||||
class V>
|
||||
ircd::json::index::member::member(const K &k,
|
||||
V&& v)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
value { k }, value { std::forward<V>(v) }
|
||||
}
|
||||
{}
|
||||
|
||||
template<class K>
|
||||
ircd::json::index::member::member(const K &k,
|
||||
std::initializer_list<member> v)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
value { k }, value { std::make_unique<index>(std::move(v)) }
|
||||
}
|
||||
{}
|
||||
|
||||
inline
|
||||
ircd::json::index::member::member(const object::member &m)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
m.first, value { m.second, type(m.second) }
|
||||
}
|
||||
{}
|
||||
|
||||
inline
|
||||
ircd::json::index::member::member(const string_view &k)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
k, string_view{}
|
||||
}
|
||||
{}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator<(const index::member &a, const index::member &b)
|
||||
{
|
||||
return a.first < b.first;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator!=(const index::member &a, const index::member &b)
|
||||
{
|
||||
return a.first != b.first;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator==(const index::member &a, const index::member &b)
|
||||
{
|
||||
return a.first == b.first;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator<(const index::member &a, const string_view &b)
|
||||
{
|
||||
return string_view(a.first.string, a.first.len) < b;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator!=(const index::member &a, const string_view &b)
|
||||
{
|
||||
return string_view(a.first.string, a.first.len) != b;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator==(const index::member &a, const string_view &b)
|
||||
{
|
||||
return string_view(a.first.string, a.first.len) == b;
|
||||
}
|
||||
|
||||
inline bool
|
||||
ircd::json::operator<(const index::const_iterator &a, const index::const_iterator &b)
|
||||
{
|
||||
|
|
133
include/ircd/json/member.h
Normal file
133
include/ircd/json/member.h
Normal file
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (C) 2017 Charybdis Development Team
|
||||
* Copyright (C) 2017 Jason Volk <jason@zemos.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice is present in all copies.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#define HAVE_IRCD_JSON_MEMBER_H
|
||||
|
||||
namespace ircd::json
|
||||
{
|
||||
struct member;
|
||||
|
||||
size_t size(const member *const &begin, const member *const &end);
|
||||
object serialize(const member *const *const &begin, const member *const *const &end, char *&start, char *const &stop);
|
||||
object serialize(const member *const &begin, const member *const &end, char *&start, char *const &stop);
|
||||
size_t print(char *const &buf, const size_t &max, const member *const &begin, const member *const &end);
|
||||
std::string string(const member *const &begin, const member *const &end);
|
||||
|
||||
using members = std::initializer_list<member>;
|
||||
object serialize(const members &, char *&start, char *const &stop);
|
||||
size_t print(char *const &buf, const size_t &max, const members &);
|
||||
std::string string(const members &);
|
||||
|
||||
array serialize(const std::vector<json::object> &, char *&start, char *const &stop);
|
||||
string_view stringify(char *const &buf, const size_t &max, const members &);
|
||||
}
|
||||
|
||||
struct ircd::json::member
|
||||
:std::pair<value, value>
|
||||
{
|
||||
template<class K> member(const K &k, std::initializer_list<member> v);
|
||||
template<class K, class V> member(const K &k, V&& v);
|
||||
explicit member(const string_view &k);
|
||||
explicit member(const object::member &m);
|
||||
member() = default;
|
||||
|
||||
friend bool operator==(const member &a, const member &b);
|
||||
friend bool operator!=(const member &a, const member &b);
|
||||
friend bool operator<(const member &a, const member &b);
|
||||
|
||||
friend bool operator==(const member &a, const string_view &b);
|
||||
friend bool operator!=(const member &a, const string_view &b);
|
||||
friend bool operator<(const member &a, const string_view &b);
|
||||
|
||||
friend std::ostream &operator<<(std::ostream &, const member &);
|
||||
};
|
||||
|
||||
template<class K,
|
||||
class V>
|
||||
ircd::json::member::member(const K &k,
|
||||
V&& v)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
value { k }, value { std::forward<V>(v) }
|
||||
}
|
||||
{}
|
||||
|
||||
template<class K>
|
||||
ircd::json::member::member(const K &k,
|
||||
std::initializer_list<member> v)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
value { k }, value { std::make_unique<index>(std::move(v)) }
|
||||
}
|
||||
{}
|
||||
|
||||
inline
|
||||
ircd::json::member::member(const object::member &m)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
m.first, value { m.second, type(m.second) }
|
||||
}
|
||||
{}
|
||||
|
||||
inline
|
||||
ircd::json::member::member(const string_view &k)
|
||||
:std::pair<value, value>
|
||||
{
|
||||
k, string_view{}
|
||||
}
|
||||
{}
|
||||
|
||||
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;
|
||||
}
|
|
@ -30,6 +30,11 @@
|
|||
// extremely minimal: only the size of the values it stores. This is because
|
||||
// the member keys and type data are all static or dealt with at compile time.
|
||||
//
|
||||
// The member structure for the tuple is called `property` because json::member
|
||||
// is already used to pair together runtime oriented json::values. This system
|
||||
// only decays into runtime members and values when compile-time logic cannot
|
||||
// be achieved.
|
||||
//
|
||||
// Create and use a tuple to efficiently extract members from a json::object.
|
||||
// The tuple will populate its own members during a single-pass iteration of
|
||||
// the JSON input. If the JSON does not contain a member specified in the
|
||||
|
@ -48,13 +53,13 @@ struct tuple_base
|
|||
{
|
||||
// class must be empty for EBO
|
||||
|
||||
struct member;
|
||||
struct property;
|
||||
};
|
||||
|
||||
//
|
||||
// Non-template common base for all tuple members
|
||||
// Non-template common base for all tuple properties
|
||||
//
|
||||
struct tuple_base::member
|
||||
struct tuple_base::property
|
||||
{
|
||||
};
|
||||
|
||||
|
@ -74,7 +79,7 @@ struct tuple
|
|||
static constexpr size_t size();
|
||||
|
||||
tuple(const json::object &);
|
||||
tuple(const std::initializer_list<json::index::member> &);
|
||||
tuple(const std::initializer_list<member> &);
|
||||
tuple() = default;
|
||||
};
|
||||
|
||||
|
@ -87,13 +92,13 @@ tuple<T...>::size()
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// tuple member template. Specify a list of these in the tuple template to
|
||||
// tuple property template. Specify a list of these in the tuple template to
|
||||
// form the members of the object.
|
||||
//
|
||||
template<const char *const &name,
|
||||
class T>
|
||||
struct member
|
||||
:tuple_base::member
|
||||
struct property
|
||||
:tuple_base::property
|
||||
{
|
||||
using key_type = const char *const &;
|
||||
using value_type = T;
|
||||
|
@ -104,20 +109,20 @@ struct member
|
|||
operator const T &() const;
|
||||
operator T &();
|
||||
|
||||
member(T&& value);
|
||||
member() = default;
|
||||
property(T&& value);
|
||||
property() = default;
|
||||
};
|
||||
|
||||
template<const char *const &name,
|
||||
class T>
|
||||
member<name, T>::member(T&& value)
|
||||
property<name, T>::property(T&& value)
|
||||
:value{value}
|
||||
{
|
||||
}
|
||||
|
||||
template<const char *const &name,
|
||||
class T>
|
||||
member<name, T>::operator
|
||||
property<name, T>::operator
|
||||
T &()
|
||||
{
|
||||
return value;
|
||||
|
@ -125,7 +130,7 @@ T &()
|
|||
|
||||
template<const char *const &name,
|
||||
class T>
|
||||
member<name, T>::operator
|
||||
property<name, T>::operator
|
||||
const T &()
|
||||
const
|
||||
{
|
||||
|
@ -630,7 +635,7 @@ tuple<T...>::tuple(const json::object &object)
|
|||
}
|
||||
|
||||
template<class... T>
|
||||
tuple<T...>::tuple(const std::initializer_list<json::index::member> &members)
|
||||
tuple<T...>::tuple(const std::initializer_list<member> &members)
|
||||
{
|
||||
std::for_each(std::begin(members), std::end(members), [this]
|
||||
(const auto &member)
|
||||
|
@ -721,7 +726,7 @@ serialize(const tuple<T...> &tuple,
|
|||
char *&start,
|
||||
char *const &stop)
|
||||
{
|
||||
std::array<index::member, tuple.size()> members;
|
||||
std::array<member, tuple.size()> members;
|
||||
_member_transform(tuple, begin(members), end(members));
|
||||
return serialize(begin(members), end(members), start, stop);
|
||||
}
|
||||
|
@ -732,7 +737,7 @@ print(char *const &buf,
|
|||
const size_t &max,
|
||||
const tuple<T...> &tuple)
|
||||
{
|
||||
std::array<index::member, tuple.size()> members;
|
||||
std::array<member, tuple.size()> members;
|
||||
_member_transform(tuple, begin(members), end(members));
|
||||
return print(buf, max, begin(members), end(members));
|
||||
}
|
||||
|
@ -741,7 +746,7 @@ template<class... T>
|
|||
std::string
|
||||
string(const tuple<T...> &tuple)
|
||||
{
|
||||
std::array<index::member, tuple.size()> members;
|
||||
std::array<member, tuple.size()> members;
|
||||
_member_transform(tuple, begin(members), end(members));
|
||||
return string(begin(members), end(members));
|
||||
}
|
||||
|
|
|
@ -65,16 +65,16 @@ namespace ircd::m::name
|
|||
struct ircd::m::event
|
||||
:json::tuple
|
||||
<
|
||||
json::member<name::event_id, string_view>,
|
||||
json::member<name::content, string_view>,
|
||||
json::member<name::origin_server_ts, time_t>,
|
||||
json::member<name::sender, string_view>,
|
||||
json::member<name::type, string_view>,
|
||||
json::member<name::room_id, string_view>,
|
||||
json::member<name::state_key, string_view>,
|
||||
json::member<name::prev_ids, string_view>,
|
||||
json::member<name::unsigned_, string_view>,
|
||||
json::member<name::signatures, string_view>
|
||||
json::property<name::event_id, string_view>,
|
||||
json::property<name::content, string_view>,
|
||||
json::property<name::origin_server_ts, time_t>,
|
||||
json::property<name::sender, string_view>,
|
||||
json::property<name::type, string_view>,
|
||||
json::property<name::room_id, string_view>,
|
||||
json::property<name::state_key, string_view>,
|
||||
json::property<name::prev_ids, string_view>,
|
||||
json::property<name::unsigned_, string_view>,
|
||||
json::property<name::signatures, string_view>
|
||||
>
|
||||
{
|
||||
using super_type::tuple;
|
||||
|
|
Loading…
Add table
Reference in a new issue