annotate DEPENDENCIES/generic/include/boost/proto/functional/std/iterator.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 ///////////////////////////////////////////////////////////////////////////////
Chris@16 2 /// \file iterator.hpp
Chris@16 3 /// Proto callables for std functions found in \<iterator\>
Chris@16 4 //
Chris@16 5 // Copyright 2012 Eric Niebler. Distributed under the Boost
Chris@16 6 // Software License, Version 1.0. (See accompanying file
Chris@16 7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 #ifndef BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012
Chris@16 10 #define BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012
Chris@16 11
Chris@16 12 #include <iterator>
Chris@16 13 #include <boost/type_traits/remove_const.hpp>
Chris@16 14 #include <boost/type_traits/remove_reference.hpp>
Chris@16 15 #include <boost/proto/proto_fwd.hpp>
Chris@16 16
Chris@16 17 namespace boost { namespace proto { namespace functional
Chris@16 18 {
Chris@16 19
Chris@16 20 // A PolymorphicFunctionObject wrapping std::advance
Chris@16 21 struct advance
Chris@16 22 {
Chris@16 23 BOOST_PROTO_CALLABLE()
Chris@16 24
Chris@16 25 typedef void result_type;
Chris@16 26
Chris@16 27 template<typename InputIterator, typename Distance>
Chris@16 28 void operator()(InputIterator &x, Distance n) const
Chris@16 29 {
Chris@16 30 std::advance(x, n);
Chris@16 31 }
Chris@16 32 };
Chris@16 33
Chris@16 34 // A PolymorphicFunctionObject wrapping std::distance
Chris@16 35 struct distance
Chris@16 36 {
Chris@16 37 BOOST_PROTO_CALLABLE()
Chris@16 38
Chris@16 39 template<typename Sig>
Chris@16 40 struct result;
Chris@16 41
Chris@16 42 template<typename This, typename InputIter1, typename InputIter2>
Chris@16 43 struct result<This(InputIter1, InputIter2)>
Chris@16 44 {
Chris@16 45 typedef
Chris@16 46 typename std::iterator_traits<
Chris@16 47 typename boost::remove_const<
Chris@16 48 typename boost::remove_reference<InputIter1>::type
Chris@16 49 >::type
Chris@16 50 >::difference_type
Chris@16 51 type;
Chris@16 52 };
Chris@16 53
Chris@16 54 template<typename InputIterator>
Chris@16 55 typename std::iterator_traits<InputIterator>::difference_type
Chris@16 56 operator()(InputIterator first, InputIterator last) const
Chris@16 57 {
Chris@16 58 return std::distance(first, last);
Chris@16 59 }
Chris@16 60 };
Chris@16 61
Chris@16 62 // A PolymorphicFunctionObject wrapping std::next
Chris@16 63 struct next
Chris@16 64 {
Chris@16 65 BOOST_PROTO_CALLABLE()
Chris@16 66
Chris@16 67 template<typename Sig>
Chris@16 68 struct result;
Chris@16 69
Chris@16 70 template<typename This, typename ForwardIterator>
Chris@16 71 struct result<This(ForwardIterator)>
Chris@16 72 {
Chris@16 73 typedef
Chris@16 74 typename boost::remove_const<
Chris@16 75 typename boost::remove_reference<ForwardIterator>::type
Chris@16 76 >::type
Chris@16 77 type;
Chris@16 78 };
Chris@16 79
Chris@16 80 template<typename This, typename ForwardIterator, typename Distance>
Chris@16 81 struct result<This(ForwardIterator, Distance)>
Chris@16 82 {
Chris@16 83 typedef
Chris@16 84 typename boost::remove_const<
Chris@16 85 typename boost::remove_reference<ForwardIterator>::type
Chris@16 86 >::type
Chris@16 87 type;
Chris@16 88 };
Chris@16 89
Chris@16 90 template<typename ForwardIterator>
Chris@16 91 ForwardIterator operator()(ForwardIterator x) const
Chris@16 92 {
Chris@16 93 return std::advance(
Chris@16 94 x
Chris@16 95 , static_cast<typename std::iterator_traits<ForwardIterator>::difference_type>(1)
Chris@16 96 );
Chris@16 97 }
Chris@16 98
Chris@16 99 template<typename ForwardIterator>
Chris@16 100 ForwardIterator operator()(
Chris@16 101 ForwardIterator x
Chris@16 102 , typename std::iterator_traits<ForwardIterator>::difference_type n
Chris@16 103 ) const
Chris@16 104 {
Chris@16 105 return std::advance(x, n);
Chris@16 106 }
Chris@16 107 };
Chris@16 108
Chris@16 109 // A PolymorphicFunctionObject wrapping std::prior
Chris@16 110 struct prior
Chris@16 111 {
Chris@16 112 BOOST_PROTO_CALLABLE()
Chris@16 113
Chris@16 114 template<typename Sig>
Chris@16 115 struct result;
Chris@16 116
Chris@16 117 template<typename This, typename BidirectionalIterator>
Chris@16 118 struct result<This(BidirectionalIterator)>
Chris@16 119 {
Chris@16 120 typedef
Chris@16 121 typename boost::remove_const<
Chris@16 122 typename boost::remove_reference<BidirectionalIterator>::type
Chris@16 123 >::type
Chris@16 124 type;
Chris@16 125 };
Chris@16 126
Chris@16 127 template<typename This, typename BidirectionalIterator, typename Distance>
Chris@16 128 struct result<This(BidirectionalIterator, Distance)>
Chris@16 129 {
Chris@16 130 typedef
Chris@16 131 typename boost::remove_const<
Chris@16 132 typename boost::remove_reference<BidirectionalIterator>::type
Chris@16 133 >::type
Chris@16 134 type;
Chris@16 135 };
Chris@16 136
Chris@16 137 template<typename BidirectionalIterator>
Chris@16 138 BidirectionalIterator operator()(BidirectionalIterator x) const
Chris@16 139 {
Chris@16 140 return std::advance(
Chris@16 141 x
Chris@16 142 , -static_cast<typename std::iterator_traits<BidirectionalIterator>::difference_type>(1)
Chris@16 143 );
Chris@16 144 }
Chris@16 145
Chris@16 146 template<typename BidirectionalIterator>
Chris@16 147 BidirectionalIterator operator()(
Chris@16 148 BidirectionalIterator x
Chris@16 149 , typename std::iterator_traits<BidirectionalIterator>::difference_type n
Chris@16 150 ) const
Chris@16 151 {
Chris@16 152 return std::advance(x, -n);
Chris@16 153 }
Chris@16 154 };
Chris@16 155
Chris@16 156 }}}
Chris@16 157
Chris@16 158 #endif