43 if (!transform.isObject()) {
48 while (currentPtr->isObject() &&
49 currentPtr->isMember(routing_keys::child())) {
50 auto const ¤t = *currentPtr;
51 pushLevelBack(current);
52 currentPtr = &(current[routing_keys::child()]);
57 Json::Value newLayer{transform};
58 if (newLayer.isObject()) {
59 container().insert(begin(), newLayer);
68 return recompose(leaf.empty() ? Json::nullValue : Json::Value(leaf));
71 void GeneralizedTransform::pushLevelBack(Json::Value level) {
72 if (level.isMember(routing_keys::child())) {
73 level.removeMember(routing_keys::child());
75 container().emplace_back(std::move(level));
78 template <
typename Container>
class ReverseFacade {
80 ReverseFacade(Container
const &c) : m_container(c) {}
82 ReverseFacade &operator=(ReverseFacade
const &) =
delete;
84 using const_iterator =
typename Container::const_reverse_iterator;
85 const_iterator begin()
const {
return m_container.rbegin(); }
86 const_iterator end()
const {
return m_container.rend(); }
89 Container
const &m_container;
91 template <
typename Container>
92 inline ReverseFacade<Container> reverse(Container
const &c) {
93 return ReverseFacade<Container>(c);
96 Json::Value GeneralizedTransform::recompose(Json::Value leaf)
const {
97 if (container().
empty()) {
100 Json::Value state{leaf};
101 for (
auto const &level : reverse(container())) {
102 Json::Value nextLevel{level};
103 if (!state.isNull()) {
104 nextLevel[routing_keys::child()] = state;
106 state = std::move(nextLevel);
t_< detail::transform_< List, Fun >> transform