slist_node.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Olaf Krzikalla 2004-2006.
  4. // (C) Copyright Ion Gaztanaga 2006-2013
  5. //
  6. // Distributed under the Boost Software License, Version 1.0.
  7. // (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // See http://www.boost.org/libs/intrusive for documentation.
  11. //
  12. /////////////////////////////////////////////////////////////////////////////
  13. #ifndef BOOST_INTRUSIVE_SLIST_NODE_HPP
  14. #define BOOST_INTRUSIVE_SLIST_NODE_HPP
  15. #include <boost/intrusive/detail/config_begin.hpp>
  16. #include <boost/intrusive/detail/utilities.hpp>
  17. #include <boost/intrusive/detail/assert.hpp>
  18. #include <boost/intrusive/pointer_traits.hpp>
  19. namespace boost {
  20. namespace intrusive {
  21. template<class VoidPointer>
  22. struct slist_node
  23. {
  24. typedef typename pointer_traits
  25. <VoidPointer>::template rebind_pointer<slist_node>::type node_ptr;
  26. node_ptr next_;
  27. };
  28. // slist_node_traits can be used with circular_slist_algorithms and supplies
  29. // a slist_node holding the pointers needed for a singly-linked list
  30. // it is used by slist_base_hook and slist_member_hook
  31. template<class VoidPointer>
  32. struct slist_node_traits
  33. {
  34. typedef slist_node<VoidPointer> node;
  35. typedef typename pointer_traits
  36. <VoidPointer>::template rebind_pointer<node>::type node_ptr;
  37. typedef typename pointer_traits
  38. <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
  39. static node_ptr get_next(const const_node_ptr & n)
  40. { return n->next_; }
  41. static node_ptr get_next(const node_ptr & n)
  42. { return n->next_; }
  43. static void set_next(const node_ptr & n, const node_ptr & next)
  44. { n->next_ = next; }
  45. };
  46. // slist_iterator provides some basic functions for a
  47. // node oriented bidirectional iterator:
  48. template<class RealValueTraits, bool IsConst>
  49. class slist_iterator
  50. : public iiterator<RealValueTraits, IsConst, std::forward_iterator_tag>::iterator_base
  51. {
  52. protected:
  53. typedef iiterator
  54. <RealValueTraits, IsConst, std::forward_iterator_tag> types_t;
  55. static const bool stateful_value_traits = types_t::stateful_value_traits;
  56. typedef RealValueTraits real_value_traits;
  57. typedef typename types_t::node_traits node_traits;
  58. typedef typename types_t::node node;
  59. typedef typename types_t::node_ptr node_ptr;
  60. typedef typename types_t::void_pointer void_pointer;
  61. public:
  62. typedef typename types_t::value_type value_type;
  63. typedef typename types_t::pointer pointer;
  64. typedef typename types_t::reference reference;
  65. typedef typename pointer_traits
  66. <void_pointer>::template rebind_pointer
  67. <const real_value_traits>::type const_real_value_traits_ptr;
  68. slist_iterator()
  69. {}
  70. explicit slist_iterator(const node_ptr & nodeptr, const const_real_value_traits_ptr &traits_ptr)
  71. : members_(nodeptr, traits_ptr)
  72. {}
  73. slist_iterator(slist_iterator<RealValueTraits, false> const& other)
  74. : members_(other.pointed_node(), other.get_real_value_traits())
  75. {}
  76. const node_ptr &pointed_node() const
  77. { return members_.nodeptr_; }
  78. slist_iterator &operator=(const node_ptr &node)
  79. { members_.nodeptr_ = node; return static_cast<slist_iterator&>(*this); }
  80. const_real_value_traits_ptr get_real_value_traits() const
  81. { return pointer_traits<const_real_value_traits_ptr>::static_cast_from(members_.get_ptr()); }
  82. public:
  83. slist_iterator& operator++()
  84. {
  85. members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
  86. return static_cast<slist_iterator&> (*this);
  87. }
  88. slist_iterator operator++(int)
  89. {
  90. slist_iterator result (*this);
  91. members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
  92. return result;
  93. }
  94. friend bool operator== (const slist_iterator& l, const slist_iterator& r)
  95. { return l.pointed_node() == r.pointed_node(); }
  96. friend bool operator!= (const slist_iterator& l, const slist_iterator& r)
  97. { return !(l == r); }
  98. reference operator*() const
  99. { return *operator->(); }
  100. pointer operator->() const
  101. { return this->get_real_value_traits()->to_value_ptr(members_.nodeptr_); }
  102. slist_iterator<RealValueTraits, false> unconst() const
  103. { return slist_iterator<RealValueTraits, false>(this->pointed_node(), this->get_real_value_traits()); }
  104. private:
  105. iiterator_members<node_ptr, stateful_value_traits> members_;
  106. };
  107. } //namespace intrusive
  108. } //namespace boost
  109. #include <boost/intrusive/detail/config_end.hpp>
  110. #endif //BOOST_INTRUSIVE_SLIST_NODE_HPP