1 ///////////////////////////////////////////////////////////////////////////////
3 /// Proto callables for std functions found in \<iterator\>
5 // Copyright 2012 Eric Niebler. Distributed under the Boost
6 // Software License, Version 1.0. (See accompanying file
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 #ifndef BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012
10 #define BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012
13 #include <boost/type_traits/remove_const.hpp>
14 #include <boost/type_traits/remove_reference.hpp>
15 #include <boost/proto/proto_fwd.hpp>
17 namespace boost { namespace proto { namespace functional
20 // A PolymorphicFunctionObject wrapping std::advance
23 BOOST_PROTO_CALLABLE()
25 typedef void result_type;
27 template<typename InputIterator, typename Distance>
28 void operator()(InputIterator &x, Distance n) const
34 // A PolymorphicFunctionObject wrapping std::distance
37 BOOST_PROTO_CALLABLE()
39 template<typename Sig>
42 template<typename This, typename InputIter1, typename InputIter2>
43 struct result<This(InputIter1, InputIter2)>
46 typename std::iterator_traits<
47 typename boost::remove_const<
48 typename boost::remove_reference<InputIter1>::type
54 template<typename InputIterator>
55 typename std::iterator_traits<InputIterator>::difference_type
56 operator()(InputIterator first, InputIterator last) const
58 return std::distance(first, last);
62 // A PolymorphicFunctionObject wrapping std::next
65 BOOST_PROTO_CALLABLE()
67 template<typename Sig>
70 template<typename This, typename ForwardIterator>
71 struct result<This(ForwardIterator)>
74 typename boost::remove_const<
75 typename boost::remove_reference<ForwardIterator>::type
80 template<typename This, typename ForwardIterator, typename Distance>
81 struct result<This(ForwardIterator, Distance)>
84 typename boost::remove_const<
85 typename boost::remove_reference<ForwardIterator>::type
90 template<typename ForwardIterator>
91 ForwardIterator operator()(ForwardIterator x) const
95 , static_cast<typename std::iterator_traits<ForwardIterator>::difference_type>(1)
99 template<typename ForwardIterator>
100 ForwardIterator operator()(
102 , typename std::iterator_traits<ForwardIterator>::difference_type n
105 return std::advance(x, n);
109 // A PolymorphicFunctionObject wrapping std::prior
112 BOOST_PROTO_CALLABLE()
114 template<typename Sig>
117 template<typename This, typename BidirectionalIterator>
118 struct result<This(BidirectionalIterator)>
121 typename boost::remove_const<
122 typename boost::remove_reference<BidirectionalIterator>::type
127 template<typename This, typename BidirectionalIterator, typename Distance>
128 struct result<This(BidirectionalIterator, Distance)>
131 typename boost::remove_const<
132 typename boost::remove_reference<BidirectionalIterator>::type
137 template<typename BidirectionalIterator>
138 BidirectionalIterator operator()(BidirectionalIterator x) const
142 , -static_cast<typename std::iterator_traits<BidirectionalIterator>::difference_type>(1)
146 template<typename BidirectionalIterator>
147 BidirectionalIterator operator()(
148 BidirectionalIterator x
149 , typename std::iterator_traits<BidirectionalIterator>::difference_type n
152 return std::advance(x, -n);