28 template <
typename RBT>
using get_node_t = std::conditional_t<std::is_const<RBT>::value,
typename RBT::node
const,
typename RBT::node>;
31 template <
typename RBT> std::vector<get_node_t<RBT>> flatten2(RBT &tree) {
32 using node_t = get_node_t<RBT>;
33 std::vector<node_t> R;
34 R.reserve(tree.size());
35 std::stack<node_t> stack;
36 node_t n = tree.get_root();
38 while (n !=
nullptr) {
42 if (stack.size() == 0)
break;
51 template <
typename RBT> std::vector<get_node_t<RBT>> flatten(RBT &tree) {
52 using node_t = get_node_t<RBT>;
53 std::vector<node_t> R;
54 R.reserve(tree.size());
55 foreach (tree, [&R](node_t n) { R.push_back(n); })
64 template <
typename RBT,
typename Node>
class rbt_iterator {
66 using iterator_category = std::forward_iterator_tag;
67 using value_type = Node;
68 using difference_type = std::ptrdiff_t;
69 using pointer = Node *;
70 using reference = Node &;
74 Node current =
nullptr;
75 std::stack<Node> stack;
78 rbt_iterator() =
default;
79 rbt_iterator(RBT *tree,
bool at_end) : tree(tree), n(at_end ?
nullptr : tree->get_root()) { operator++(); }
81 rbt_iterator &operator++() {
82 while (n !=
nullptr) {
86 if (stack.size() != 0) {
96 Node &operator*() {
return current; }
97 Node &operator->() {
return current; }
99 rbt_iterator operator++(
int) {
105 bool operator==(rbt_iterator
const &other)
const {
return (other.current == current); }
106 bool operator!=(rbt_iterator
const &other)
const {
return (!
operator==(other)); }
implementation of iterators