Add reverse iterators to `Node`/`TNode` (#6825)
authorAndres Noetzli <andres.noetzli@gmail.com>
Fri, 2 Jul 2021 04:44:47 +0000 (21:44 -0700)
committerGitHub <noreply@github.com>
Fri, 2 Jul 2021 04:44:47 +0000 (04:44 +0000)
commit89cfae28cfa8013db596f2cb766b07e2188c5610
tree68f0c86390b3ffb9ba67975e13d7937c23adbb78
parentb4e98013a8e2572545ec3f637dd1caa06e3f7207
Add reverse iterators to `Node`/`TNode` (#6825)

This feature is useful for example for succinctly inserting children of
a node in the reverse order. To make this work, the commit fixes the
declaration of `reference` in the `NodeValue::iterator`. The
`std::reverse_iterator` adapter expects the `reference` type to match
the return type of `operator*` in the corresponding iterator (as
mandated by the standard). Despite its name, `reference` does not have
to be a C++ reference. Note that we cannot actually make it a C++
reference because `NodeValue::iterator` wraps the `NodeValue*` in a
`Node`/`TNode` in `operator*`.
src/expr/node.h
src/expr/node_value.h
test/unit/node/node_black.cpp