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_MOVE_DETAIL_ITERATOR_TO_RAW_POINTER_HPP 11 #define BOOST_MOVE_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/move/detail/iterator_traits.hpp> 22 #include <boost/move/detail/to_raw_pointer.hpp> 23 #include <boost/move/detail/pointer_element.hpp> 24 25 namespace boost { 26 namespace movelib { 27 namespace detail { 28 29 template <class T> iterator_to_pointer(T * i)30BOOST_MOVE_FORCEINLINE T* iterator_to_pointer(T* i) 31 { return i; } 32 33 template <class Iterator> 34 BOOST_MOVE_FORCEINLINE typename boost::movelib::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::movelib::iterator_traits<Iterator>::pointer pointer; 42 typedef typename boost::movelib::pointer_element<pointer>::type element_type; 43 typedef element_type* type; 44 }; 45 46 } //namespace detail { 47 48 template <class Iterator> 49 BOOST_MOVE_FORCEINLINE typename boost::movelib::detail::iterator_to_element_ptr<Iterator>::type iterator_to_raw_pointer(const Iterator & i)50 iterator_to_raw_pointer(const Iterator &i) 51 { 52 return ::boost::movelib::to_raw_pointer 53 ( ::boost::movelib::detail::iterator_to_pointer(i) ); 54 } 55 56 } //namespace movelib { 57 } //namespace boost { 58 59 #endif //#ifndef BOOST_MOVE_DETAIL_ITERATOR_TO_RAW_POINTER_HPP 60