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:
parent
ea35ea5863
commit
9c03fcdb95
2 changed files with 73 additions and 16 deletions
|
@ -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 &);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue