Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file iterator.hpp Chris@16: /// Proto callables for std functions found in \ Chris@16: // Chris@16: // Copyright 2012 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012 Chris@16: #define BOOST_PROTO_FUNCTIONAL_STD_ITERATOR_HPP_EAN_27_08_2012 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace proto { namespace functional Chris@16: { Chris@16: Chris@16: // A PolymorphicFunctionObject wrapping std::advance Chris@16: struct advance Chris@16: { Chris@16: BOOST_PROTO_CALLABLE() Chris@16: Chris@16: typedef void result_type; Chris@16: Chris@16: template Chris@16: void operator()(InputIterator &x, Distance n) const Chris@16: { Chris@16: std::advance(x, n); Chris@16: } Chris@16: }; Chris@16: Chris@16: // A PolymorphicFunctionObject wrapping std::distance Chris@16: struct distance Chris@16: { Chris@16: BOOST_PROTO_CALLABLE() Chris@16: Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename std::iterator_traits< Chris@16: typename boost::remove_const< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: >::difference_type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename std::iterator_traits::difference_type Chris@16: operator()(InputIterator first, InputIterator last) const Chris@16: { Chris@16: return std::distance(first, last); Chris@16: } Chris@16: }; Chris@16: Chris@16: // A PolymorphicFunctionObject wrapping std::next Chris@16: struct next Chris@16: { Chris@16: BOOST_PROTO_CALLABLE() Chris@16: Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename boost::remove_const< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename boost::remove_const< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: ForwardIterator operator()(ForwardIterator x) const Chris@16: { Chris@16: return std::advance( Chris@16: x Chris@16: , static_cast::difference_type>(1) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: ForwardIterator operator()( Chris@16: ForwardIterator x Chris@16: , typename std::iterator_traits::difference_type n Chris@16: ) const Chris@16: { Chris@16: return std::advance(x, n); Chris@16: } Chris@16: }; Chris@16: Chris@16: // A PolymorphicFunctionObject wrapping std::prior Chris@16: struct prior Chris@16: { Chris@16: BOOST_PROTO_CALLABLE() Chris@16: Chris@16: template Chris@16: struct result; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename boost::remove_const< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct result Chris@16: { Chris@16: typedef Chris@16: typename boost::remove_const< Chris@16: typename boost::remove_reference::type Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: BidirectionalIterator operator()(BidirectionalIterator x) const Chris@16: { Chris@16: return std::advance( Chris@16: x Chris@16: , -static_cast::difference_type>(1) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: BidirectionalIterator operator()( Chris@16: BidirectionalIterator x Chris@16: , typename std::iterator_traits::difference_type n Chris@16: ) const Chris@16: { Chris@16: return std::advance(x, -n); Chris@16: } Chris@16: }; Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif