1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2014-2014. 4 // Distributed under the Boost Software License, Version 1.0. 5 // (See accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 // See http://www.boost.org/libs/move for documentation. 9 // 10 ////////////////////////////////////////////////////////////////////////////// 11 12 //! \file 13 14 #ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP 15 #define BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP 16 17 #ifndef BOOST_CONFIG_HPP 18 # include <boost/config.hpp> 19 #endif 20 # 21 #if defined(BOOST_HAS_PRAGMA_ONCE) 22 # pragma once 23 #endif 24 25 #include <cstddef> 26 #include <boost/move/detail/type_traits.hpp> 27 28 #include <boost/move/detail/std_ns_begin.hpp> 29 BOOST_MOVE_STD_NS_BEG 30 31 struct input_iterator_tag; 32 struct forward_iterator_tag; 33 struct bidirectional_iterator_tag; 34 struct random_access_iterator_tag; 35 struct output_iterator_tag; 36 37 BOOST_MOVE_STD_NS_END 38 #include <boost/move/detail/std_ns_end.hpp> 39 40 namespace boost{ namespace movelib{ 41 42 template<class Iterator> 43 struct iterator_traits 44 { 45 typedef typename Iterator::difference_type difference_type; 46 typedef typename Iterator::value_type value_type; 47 typedef typename Iterator::pointer pointer; 48 typedef typename Iterator::reference reference; 49 typedef typename Iterator::iterator_category iterator_category; 50 typedef typename boost::move_detail::make_unsigned<difference_type>::type size_type; 51 }; 52 53 template<class T> 54 struct iterator_traits<T*> 55 { 56 typedef std::ptrdiff_t difference_type; 57 typedef T value_type; 58 typedef T* pointer; 59 typedef T& reference; 60 typedef std::random_access_iterator_tag iterator_category; 61 typedef typename boost::move_detail::make_unsigned<difference_type>::type size_type; 62 }; 63 64 template<class T> 65 struct iterator_traits<const T*> 66 { 67 typedef std::ptrdiff_t difference_type; 68 typedef T value_type; 69 typedef const T* pointer; 70 typedef const T& reference; 71 typedef std::random_access_iterator_tag iterator_category; 72 typedef typename boost::move_detail::make_unsigned<difference_type>::type size_type; 73 }; 74 75 }} //namespace boost { namespace movelib{ 76 77 #endif //#ifndef BOOST_MOVE_DETAIL_ITERATOR_TRAITS_HPP 78