1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2014-2015. Distributed under the Boost 4 // Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // See http://www.boost.org/libs/container for documentation. 8 // 9 ////////////////////////////////////////////////////////////////////////////// 10 #ifndef BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP 11 #define BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP 12 13 #ifndef BOOST_CONFIG_HPP 14 # include <boost/config.hpp> 15 #endif 16 17 #if defined(BOOST_HAS_PRAGMA_ONCE) 18 # pragma once 19 #endif 20 21 #include <boost/container/detail/iterator.hpp> 22 #include <boost/container/detail/to_raw_pointer.hpp> 23 #include <boost/intrusive/pointer_traits.hpp> 24 25 namespace boost { 26 namespace container { 27 namespace container_detail { 28 29 template <class T> iterator_to_pointer(T * i)30inline T* iterator_to_pointer(T* i) 31 { return i; } 32 33 template <class Iterator> 34 inline typename boost::container::iterator_traits<Iterator>::pointer iterator_to_pointer(const Iterator & i)35 iterator_to_pointer(const Iterator &i) 36 { return i.operator->(); } 37 38 template <class Iterator> 39 struct iterator_to_element_ptr 40 { 41 typedef typename boost::container::iterator_traits<Iterator>::pointer pointer; 42 typedef typename boost::intrusive::pointer_traits<pointer>::element_type element_type; 43 typedef element_type* type; 44 }; 45 46 template <class Iterator> 47 inline typename iterator_to_element_ptr<Iterator>::type iterator_to_raw_pointer(const Iterator & i)48 iterator_to_raw_pointer(const Iterator &i) 49 { 50 return ::boost::intrusive::detail::to_raw_pointer 51 ( ::boost::container::container_detail::iterator_to_pointer(i) ); 52 } 53 54 } //namespace container_detail { 55 } //namespace container { 56 } //namespace boost { 57 58 #endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATOR_TO_RAW_POINTER_HPP 59