mirror of
https://github.com/matrix-construct/construct
synced 2024-12-26 15:33:54 +01:00
ircd::json: Add merge constructor.
This commit is contained in:
parent
4d2e41970b
commit
7ae5785431
2 changed files with 27 additions and 0 deletions
|
@ -61,8 +61,11 @@ struct obj
|
|||
|
||||
explicit operator std::string() const;
|
||||
|
||||
IRCD_OVERLOAD(merge)
|
||||
|
||||
obj(std::initializer_list<member>);
|
||||
obj(const doc &d, const bool &recurse = false);
|
||||
obj(merge_t, const std::initializer_list<doc> &);
|
||||
obj() = default;
|
||||
obj(obj &&) = default;
|
||||
obj(const obj &) = delete;
|
||||
|
|
24
ircd/json.cc
24
ircd/json.cc
|
@ -559,6 +559,30 @@ ircd::json::operator<<(std::ostream &s, const obj &obj)
|
|||
return s;
|
||||
}
|
||||
|
||||
ircd::json::obj::obj(merge_t,
|
||||
const std::initializer_list<doc> &merge)
|
||||
:idx
|
||||
{
|
||||
std::accumulate(std::begin(merge), std::end(merge), size_t(0), []
|
||||
(auto sum, const auto &doc)
|
||||
{
|
||||
return sum += doc.count();
|
||||
})
|
||||
}
|
||||
{
|
||||
auto it(std::begin(idx));
|
||||
for(auto dit(std::rbegin(merge)); dit != std::rend(merge); ++dit)
|
||||
for(const doc::member &m : *dit)
|
||||
{
|
||||
*it = obj::member{m};
|
||||
++it;
|
||||
}
|
||||
|
||||
std::stable_sort(std::begin(idx), std::end(idx));
|
||||
const auto e(std::unique(std::begin(idx), std::end(idx)));
|
||||
idx.erase(e, std::end(idx));
|
||||
}
|
||||
|
||||
ircd::json::obj::obj(const doc &doc,
|
||||
const bool &recurse)
|
||||
:idx{doc.count()}
|
||||
|
|
Loading…
Reference in a new issue