0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-17 15:30:52 +01:00

ircd:Ⓜ️:state: Basic util suite.

This commit is contained in:
Jason Volk 2018-02-05 11:49:40 -08:00
parent ea35ea5863
commit 9c03fcdb95
2 changed files with 73 additions and 16 deletions

View file

@ -28,9 +28,6 @@ namespace ircd::m::state
struct init; struct init;
struct node; struct node;
using id_closure = std::function<void (const string_view &)>;
using node_closure = std::function<void (const json::object &)>;
constexpr size_t ID_MAX_SZ { 64 }; constexpr size_t ID_MAX_SZ { 64 };
constexpr size_t KEY_MAX_SZ { 256 + 256 + 16 }; constexpr size_t KEY_MAX_SZ { 256 + 256 + 16 };
constexpr size_t VAL_MAX_SZ { 256 + 16 }; constexpr size_t VAL_MAX_SZ { 256 + 16 };
@ -40,11 +37,16 @@ namespace ircd::m::state
constexpr size_t NODE_MAX_DEG { NODE_MAX_KEY + 1 }; // tmp for now constexpr size_t NODE_MAX_DEG { NODE_MAX_KEY + 1 }; // tmp for now
constexpr int8_t MAX_HEIGHT { 16 }; // good for few mil at any degree :) constexpr int8_t MAX_HEIGHT { 16 }; // good for few mil at any degree :)
using id_closure = std::function<void (const string_view &)>;
using node_closure = std::function<void (const json::object &)>;
using search_closure = std::function<bool (const json::array &, const string_view &, const uint &, const uint &)>;
using iter_closure = std::function<void (const json::array &, const string_view &)>;
using iter_bool_closure = std::function<bool (const json::array &, const string_view &)>;
int keycmp(const json::array &a, const json::array &b); int keycmp(const json::array &a, const json::array &b);
json::array make_key(const mutable_buffer &out, const string_view &type, const string_view &state_key); json::array make_key(const mutable_buffer &out, const string_view &type, const string_view &state_key);
string_view set_node(db::txn &txn, const mutable_buffer &id, const json::object &node);
string_view set_node(db::txn &txn, const mutable_buffer &id, const json::object &node);
void get_node(const string_view &id, const node_closure &); void get_node(const string_view &id, const node_closure &);
string_view get_head(const mutable_buffer &out, const id::room &); string_view get_head(const mutable_buffer &out, const id::room &);
@ -54,8 +56,11 @@ namespace ircd::m::state
string_view insert(db::txn &, const mutable_buffer &head, const id::room &, const string_view &type, const string_view &state_key, const id::event &); string_view insert(db::txn &, const mutable_buffer &head, const id::room &, const string_view &type, const string_view &state_key, const id::event &);
string_view insert(db::txn &, const mutable_buffer &head, const event &); string_view insert(db::txn &, const mutable_buffer &head, const event &);
using search_closure = std::function<bool (const json::array &, const string_view &, const uint &, const uint &)>; bool dfs(const string_view &head, const search_closure &);
bool dfs(const string_view &node_id, const search_closure &); bool each(const string_view &head, const iter_bool_closure &);
bool each(const string_view &head, const string_view &type, const iter_bool_closure &);
size_t count(const string_view &head, const iter_bool_closure &);
size_t count(const string_view &head);
void get(const string_view &head, const json::array &key, const id_closure &); void get(const string_view &head, const json::array &key, const id_closure &);
void get(const string_view &head, const string_view &type, const string_view &state_key, const id_closure &); void get(const string_view &head, const string_view &type, const string_view &state_key, const id_closure &);

View file

@ -87,17 +87,69 @@ ircd::m::state::get(const string_view &head,
}); });
} }
size_t
ircd::m::state::count(const string_view &head)
{
return count(head, []
(const json::array &key, const string_view &val)
{
return true;
});
}
size_t
ircd::m::state::count(const string_view &head,
const iter_bool_closure &closure)
{
size_t ret{0};
each(head, [&ret, &closure]
(const json::array &key, const string_view &val)
{
ret += closure(key, val);
return true;
});
return ret;
}
///TODO: optimize
bool
ircd::m::state::each(const string_view &head,
const string_view &type,
const iter_bool_closure &closure)
{
return each(head, [&type, &closure]
(const json::array &key, const string_view &val)
{
if(unquote(key.at(0)) != type)
return true;
return closure(key, val);
});
}
bool
ircd::m::state::each(const string_view &head,
const iter_bool_closure &closure)
{
return dfs(head, [&closure]
(const json::array &key, const string_view &val, const uint &, const uint &)
{
return closure(key, val);
});
}
namespace ircd::m::state namespace ircd::m::state
{ {
bool _dfs_recurse(const search_closure &, const node &, int &); bool _dfs_recurse(const search_closure &, const node &, int &);
} }
bool bool
ircd::m::state::dfs(const string_view &node_id, ircd::m::state::dfs(const string_view &head,
const search_closure &closure) const search_closure &closure)
{ {
bool ret{false}; bool ret{true};
get_node(node_id, [&closure, &ret] get_node(head, [&closure, &ret]
(const auto &node) (const auto &node)
{ {
int depth(-1); int depth(-1);
@ -128,27 +180,27 @@ ircd::m::state::_dfs_recurse(const search_closure &closure,
if(!empty(child)) if(!empty(child))
{ {
bool ret{false}; bool ret{true};
get_node(child, [&closure, &depth, &ret] get_node(child, [&closure, &depth, &ret]
(const auto &node) (const auto &node)
{ {
ret = _dfs_recurse(closure, node, depth); ret = _dfs_recurse(closure, node, depth);
}); });
if(ret) if(!ret)
return true; return ret;
} }
if(rep.kn > pos) if(rep.kn > pos)
{ {
const auto &key{rep.keys[pos]}; const auto &key{rep.keys[pos]};
const auto &val{unquote(rep.vals[pos])}; const auto &val{unquote(rep.vals[pos])};
if(closure(key, val, depth, pos)) if(!closure(key, val, depth, pos))
return true; return false;
} }
} }
return false; return true;
} }
// Internal insertion operations // Internal insertion operations