1 ///////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2006-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 13 #ifndef BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP 14 #define BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP 15 16 #include <boost/intrusive/detail/config_begin.hpp> 17 #include <boost/intrusive/intrusive_fwd.hpp> 18 19 #include <boost/intrusive/link_mode.hpp> 20 #include <boost/intrusive/detail/parent_from_member.hpp> 21 #include <boost/move/detail/to_raw_pointer.hpp> 22 #include <boost/intrusive/pointer_traits.hpp> 23 24 #if defined(BOOST_HAS_PRAGMA_ONCE) 25 # pragma once 26 #endif 27 28 namespace boost { 29 namespace intrusive { 30 31 //!This value traits template is used to create value traits 32 //!from user defined node traits where value_traits::value_type will 33 //!store a node_traits::node 34 template< class T, class NodeTraits 35 , typename NodeTraits::node T::* PtrToMember 36 , link_mode_type LinkMode 37 #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED 38 = safe_link 39 #endif 40 > 41 struct member_value_traits 42 { 43 public: 44 typedef NodeTraits node_traits; 45 typedef T value_type; 46 typedef typename node_traits::node node; 47 typedef typename node_traits::node_ptr node_ptr; 48 typedef typename node_traits::const_node_ptr const_node_ptr; 49 typedef pointer_traits<node_ptr> node_ptr_traits; 50 typedef typename pointer_traits<node_ptr>::template 51 rebind_pointer<T>::type pointer; 52 typedef typename pointer_traits<node_ptr>::template 53 rebind_pointer<const T>::type const_pointer; 54 //typedef typename pointer_traits<pointer>::reference reference; 55 //typedef typename pointer_traits<const_pointer>::reference const_reference; 56 typedef value_type & reference; 57 typedef const value_type & const_reference; 58 static const link_mode_type link_mode = LinkMode; 59 to_node_ptrboost::intrusive::member_value_traits60 BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value) 61 { return pointer_traits<node_ptr>::pointer_to(value.*PtrToMember); } 62 to_node_ptrboost::intrusive::member_value_traits63 BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value) 64 { return pointer_traits<const_node_ptr>::pointer_to(value.*PtrToMember); } 65 to_value_ptrboost::intrusive::member_value_traits66 BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(const node_ptr &n) 67 { 68 return pointer_traits<pointer>::pointer_to(*detail::parent_from_member<value_type, node> 69 (boost::movelib::to_raw_pointer(n), PtrToMember)); 70 } 71 to_value_ptrboost::intrusive::member_value_traits72 BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const const_node_ptr &n) 73 { 74 return pointer_traits<const_pointer>::pointer_to(*detail::parent_from_member<value_type, node> 75 (boost::movelib::to_raw_pointer(n), PtrToMember)); 76 77 } 78 }; 79 80 } //namespace intrusive 81 } //namespace boost 82 83 #include <boost/intrusive/detail/config_end.hpp> 84 85 #endif //BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP 86