0
0
Fork 0
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:
Jason Volk 2017-09-08 03:08:29 -07:00
parent 1a59218bad
commit b715b99b0c
6 changed files with 171 additions and 143 deletions

View file

@ -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"

View file

@ -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
{

View file

@ -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
View 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;
}

View file

@ -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));
}

View file

@ -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;