nonhook_node.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Matei David 2014-2014.
  4. // (C) Copyright Ion Gaztanaga 2014-2014.
  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_DETAIL_NONHOOK_NODE_HPP
  14. #define BOOST_INTRUSIVE_DETAIL_NONHOOK_NODE_HPP
  15. #include <boost/intrusive/detail/config_begin.hpp>
  16. #include <boost/intrusive/pointer_traits.hpp>
  17. #include <boost/intrusive/detail/parent_from_member.hpp>
  18. #include <boost/move/detail/to_raw_pointer.hpp>
  19. #include <boost/static_assert.hpp>
  20. #include <boost/detail/lightweight_test.hpp>
  21. namespace boost{
  22. namespace intrusive{
  23. //This node will only be used in safe or auto unlink modes
  24. //so test it's been properly released
  25. template < typename NodeTraits, template <typename> class Node_Algorithms >
  26. struct nonhook_node_member : public NodeTraits::node
  27. {
  28. typedef NodeTraits node_traits;
  29. typedef typename node_traits::node node;
  30. typedef typename node_traits::node_ptr node_ptr;
  31. typedef typename node_traits::const_node_ptr const_node_ptr;
  32. typedef Node_Algorithms< node_traits > node_algorithms;
  33. nonhook_node_member()
  34. {
  35. node_algorithms::init(pointer_traits<node_ptr>::pointer_to(static_cast< node& >(*this)));
  36. }
  37. nonhook_node_member(const nonhook_node_member& rhs)
  38. {
  39. BOOST_TEST(!rhs.is_linked());
  40. node_algorithms::init(pointer_traits<node_ptr>::pointer_to(static_cast< node& >(*this)));
  41. }
  42. nonhook_node_member& operator = (const nonhook_node_member& rhs)
  43. {
  44. BOOST_TEST(!this->is_linked() && !rhs.is_linked());
  45. return *this;
  46. }
  47. ~nonhook_node_member()
  48. {
  49. BOOST_TEST(!this->is_linked());
  50. node_algorithms::init(pointer_traits<node_ptr>::pointer_to(static_cast< node& >(*this)));
  51. }
  52. void swap_nodes(nonhook_node_member& other)
  53. {
  54. node_algorithms::swap_nodes(pointer_traits<node_ptr>::pointer_to(static_cast< node& >(*this)),
  55. pointer_traits<node_ptr>::pointer_to(static_cast< node& >(other)));
  56. }
  57. bool is_linked() const
  58. {
  59. return !node_algorithms::unique(pointer_traits<const_node_ptr>::pointer_to(static_cast< const node& >(*this)));
  60. }
  61. };
  62. template < typename T, typename NonHook_Member, NonHook_Member T::* P, link_mode_type Link_Mode >
  63. struct nonhook_node_member_value_traits
  64. {
  65. typedef T value_type;
  66. typedef typename NonHook_Member::node_traits node_traits;
  67. typedef typename node_traits::node node;
  68. typedef typename node_traits::node_ptr node_ptr;
  69. typedef typename node_traits::const_node_ptr const_node_ptr;
  70. typedef typename pointer_traits<node_ptr>::
  71. template rebind_pointer<T>::type pointer;
  72. typedef typename pointer_traits<node_ptr>::
  73. template rebind_pointer<const T>::type const_pointer;
  74. typedef T & reference;
  75. typedef const T & const_reference;
  76. static const link_mode_type link_mode = Link_Mode;
  77. BOOST_STATIC_ASSERT((Link_Mode == safe_link || Link_Mode == auto_unlink));
  78. static node_ptr to_node_ptr(reference value)
  79. {
  80. return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(value.*P));
  81. }
  82. static const_node_ptr to_node_ptr(const_reference value)
  83. {
  84. return pointer_traits<const_node_ptr>::pointer_to(static_cast<const node&>(value.*P));
  85. }
  86. static pointer to_value_ptr(node_ptr n)
  87. {
  88. return pointer_traits<pointer>::pointer_to
  89. (*detail::parent_from_member<T, NonHook_Member>
  90. (static_cast<NonHook_Member*>(boost::movelib::to_raw_pointer(n)), P));
  91. }
  92. static const_pointer to_value_ptr(const_node_ptr n)
  93. {
  94. return pointer_traits<const_pointer>::pointer_to
  95. (*detail::parent_from_member<T, NonHook_Member>
  96. (static_cast<const NonHook_Member*>(boost::movelib::to_raw_pointer(n)), P));
  97. }
  98. };
  99. }
  100. }
  101. #endif