Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / intrusive / member_value_traits.hpp
index 0462dbd..96c50ee 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2012
+// (C) Copyright Ion Gaztanaga  2006-2013
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
 #ifndef BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP
 #define BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP
 
+#if defined(_MSC_VER)
+#  pragma once
+#endif
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/intrusive_fwd.hpp>
+
 #include <boost/intrusive/link_mode.hpp>
-#include <iterator>
 #include <boost/intrusive/detail/parent_from_member.hpp>
 #include <boost/intrusive/pointer_traits.hpp>
 
@@ -26,7 +32,11 @@ namespace intrusive {
 //!store a node_traits::node
 template< class T, class NodeTraits
         , typename NodeTraits::node T::* PtrToMember
-        , link_mode_type LinkMode = safe_link>
+        , link_mode_type LinkMode
+   #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+   = safe_link
+   #endif
+>
 struct member_value_traits
 {
    public:
@@ -35,6 +45,7 @@ struct member_value_traits
    typedef typename node_traits::node                                   node;
    typedef typename node_traits::node_ptr                               node_ptr;
    typedef typename node_traits::const_node_ptr                         const_node_ptr;
+   typedef pointer_traits<node_ptr>                                     node_ptr_traits;
    typedef typename pointer_traits<node_ptr>::template
       rebind_pointer<T>::type                                           pointer;
    typedef typename pointer_traits<node_ptr>::template
@@ -46,25 +57,28 @@ struct member_value_traits
    static const link_mode_type link_mode = LinkMode;
 
    static node_ptr to_node_ptr(reference value)
-   {  return node_ptr(&(value.*PtrToMember));   }
+   {  return pointer_traits<node_ptr>::pointer_to(value.*PtrToMember);   }
 
    static const_node_ptr to_node_ptr(const_reference value)
-   {  return node_ptr(&(value.*PtrToMember));   }
+   {  return pointer_traits<const_node_ptr>::pointer_to(value.*PtrToMember);   }
 
    static pointer to_value_ptr(const node_ptr &n)
    {
-      return pointer(detail::parent_from_member<value_type, node>
+      return pointer_traits<pointer>::pointer_to(*detail::parent_from_member<value_type, node>
          (boost::intrusive::detail::to_raw_pointer(n), PtrToMember));
    }
 
    static const_pointer to_value_ptr(const const_node_ptr &n)
    {
-      return pointer(detail::parent_from_member<value_type, node>
+      return pointer_traits<const_pointer>::pointer_to(*detail::parent_from_member<value_type, node>
          (boost::intrusive::detail::to_raw_pointer(n), PtrToMember));
+
    }
 };
 
 } //namespace intrusive
 } //namespace boost
 
+#include <boost/intrusive/detail/config_end.hpp>
+
 #endif //BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP