tree_node.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2007-2013
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. //
  9. // See http://www.boost.org/libs/intrusive for documentation.
  10. //
  11. /////////////////////////////////////////////////////////////////////////////
  12. #ifndef BOOST_INTRUSIVE_TREE_NODE_HPP
  13. #define BOOST_INTRUSIVE_TREE_NODE_HPP
  14. #include <boost/intrusive/detail/config_begin.hpp>
  15. #include <iterator>
  16. #include <boost/intrusive/detail/utilities.hpp>
  17. #include <boost/intrusive/options.hpp>
  18. #include <boost/intrusive/pointer_traits.hpp>
  19. #include <boost/intrusive/detail/mpl.hpp>
  20. #include <boost/intrusive/bstree_algorithms.hpp>
  21. namespace boost {
  22. namespace intrusive {
  23. template<class VoidPointer>
  24. struct tree_node
  25. {
  26. typedef typename pointer_traits
  27. <VoidPointer>::template rebind_pointer
  28. <tree_node<VoidPointer> >::type node_ptr;
  29. node_ptr parent_, left_, right_;
  30. };
  31. template<class VoidPointer>
  32. struct tree_node_traits
  33. {
  34. typedef tree_node<VoidPointer> node;
  35. typedef typename pointer_traits<VoidPointer>::template
  36. rebind_pointer<node>::type node_ptr;
  37. typedef typename pointer_traits<VoidPointer>::template
  38. rebind_pointer<const node>::type const_node_ptr;
  39. static node_ptr get_parent(const const_node_ptr & n)
  40. { return n->parent_; }
  41. static node_ptr get_parent(const node_ptr & n)
  42. { return n->parent_; }
  43. static void set_parent(const node_ptr & n, const node_ptr & p)
  44. { n->parent_ = p; }
  45. static node_ptr get_left(const const_node_ptr & n)
  46. { return n->left_; }
  47. static node_ptr get_left(const node_ptr & n)
  48. { return n->left_; }
  49. static void set_left(const node_ptr & n, const node_ptr & l)
  50. { n->left_ = l; }
  51. static node_ptr get_right(const const_node_ptr & n)
  52. { return n->right_; }
  53. static node_ptr get_right(const node_ptr & n)
  54. { return n->right_; }
  55. static void set_right(const node_ptr & n, const node_ptr & r)
  56. { n->right_ = r; }
  57. };
  58. /////////////////////////////////////////////////////////////////////////////
  59. // //
  60. // Implementation of the tree iterator //
  61. // //
  62. /////////////////////////////////////////////////////////////////////////////
  63. // tree_iterator provides some basic functions for a
  64. // node oriented bidirectional iterator:
  65. template<class RealValueTraits, bool IsConst>
  66. class tree_iterator
  67. : public iiterator<RealValueTraits, IsConst, std::bidirectional_iterator_tag>::iterator_base
  68. {
  69. protected:
  70. typedef iiterator< RealValueTraits, IsConst
  71. , std::bidirectional_iterator_tag> types_t;
  72. typedef RealValueTraits real_value_traits;
  73. typedef typename types_t::node_traits node_traits;
  74. typedef typename types_t::node node;
  75. typedef typename types_t::node_ptr node_ptr;
  76. typedef typename types_t::void_pointer void_pointer;
  77. static const bool stateful_value_traits = types_t::stateful_value_traits;
  78. typedef typename pointer_traits
  79. <void_pointer>::template rebind_pointer
  80. <const real_value_traits>::type const_real_value_traits_ptr;
  81. public:
  82. typedef typename types_t::value_type value_type;
  83. typedef typename types_t::pointer pointer;
  84. typedef typename types_t::reference reference;
  85. typedef bstree_algorithms<node_traits> node_algorithms;
  86. tree_iterator()
  87. {}
  88. explicit tree_iterator(const node_ptr & nodeptr, const const_real_value_traits_ptr &traits_ptr)
  89. : members_(nodeptr, traits_ptr)
  90. {}
  91. tree_iterator(tree_iterator<real_value_traits, false> const& other)
  92. : members_(other.pointed_node(), other.get_real_value_traits())
  93. {}
  94. const node_ptr &pointed_node() const
  95. { return members_.nodeptr_; }
  96. tree_iterator &operator=(const node_ptr &nodeptr)
  97. { members_.nodeptr_ = nodeptr; return static_cast<tree_iterator&>(*this); }
  98. public:
  99. tree_iterator& operator++()
  100. {
  101. members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
  102. return static_cast<tree_iterator&> (*this);
  103. }
  104. tree_iterator operator++(int)
  105. {
  106. tree_iterator result (*this);
  107. members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
  108. return result;
  109. }
  110. tree_iterator& operator--()
  111. {
  112. members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
  113. return static_cast<tree_iterator&> (*this);
  114. }
  115. tree_iterator operator--(int)
  116. {
  117. tree_iterator result (*this);
  118. members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
  119. return result;
  120. }
  121. friend bool operator== (const tree_iterator& l, const tree_iterator& r)
  122. { return l.pointed_node() == r.pointed_node(); }
  123. friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
  124. { return !(l == r); }
  125. reference operator*() const
  126. { return *operator->(); }
  127. pointer operator->() const
  128. { return this->get_real_value_traits()->to_value_ptr(members_.nodeptr_); }
  129. const_real_value_traits_ptr get_real_value_traits() const
  130. {
  131. return pointer_traits<const_real_value_traits_ptr>::static_cast_from(members_.get_ptr());
  132. }
  133. tree_iterator end_iterator_from_it() const
  134. {
  135. return tree_iterator(node_algorithms::get_header(this->pointed_node()), this->get_real_value_traits());
  136. }
  137. tree_iterator<real_value_traits, false> unconst() const
  138. { return tree_iterator<real_value_traits, false>(this->pointed_node(), this->get_real_value_traits()); }
  139. private:
  140. iiterator_members<node_ptr, stateful_value_traits> members_;
  141. };
  142. } //namespace intrusive
  143. } //namespace boost
  144. #include <boost/intrusive/detail/config_end.hpp>
  145. #endif //BOOST_INTRUSIVE_TREE_NODE_HPP