Chris@16: // Copyright Neil Groves 2009. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: #ifndef BOOST_RANGE_ALGORITHM_FOR_EACH_HPP_INCLUDED Chris@16: #define BOOST_RANGE_ALGORITHM_FOR_EACH_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) Chris@16: #include Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace range Chris@16: { Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) Chris@16: namespace for_each_detail Chris@16: { Chris@16: template Chris@16: inline UnaryFunction Chris@16: for_each_impl(Iterator first, Iterator last, UnaryFunction fun, Chris@101: typename ::boost::enable_if< Chris@16: is_reference_wrapper, Chris@16: void Chris@16: >::type* = 0) Chris@16: { Chris@16: typedef typename std::_Get_unchecked_type::type Chris@16: unchecked_iterator; Chris@16: Chris@16: unchecked_iterator unchecked_last = std::_Unchecked(last); Chris@16: for (unchecked_iterator unchecked_first = std::_Unchecked(first); first != last; ++first) Chris@16: fun.get()(*unchecked_first); Chris@16: Chris@16: return fun; Chris@16: } Chris@16: Chris@16: template Chris@16: inline UnaryFunction Chris@16: for_each_impl(Iterator first, Iterator last, UnaryFunction fn, Chris@16: typename disable_if< Chris@16: is_reference_wrapper, Chris@16: void Chris@16: >::type* = 0) Chris@16: { Chris@16: return std::for_each(first, last, fn); Chris@16: } Chris@16: } Chris@16: #endif Chris@16: Chris@16: /// \brief template function for_each Chris@16: /// Chris@16: /// range-based version of the for_each std algorithm Chris@16: /// Chris@16: /// \pre SinglePassRange is a model of the SinglePassRangeConcept Chris@16: /// \pre UnaryFunction is a model of the UnaryFunctionConcept Chris@16: template< class SinglePassRange, class UnaryFunction > Chris@16: inline UnaryFunction for_each(SinglePassRange & rng, UnaryFunction fun) Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept )); Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) Chris@16: return for_each_detail::for_each_impl< Chris@16: typename range_iterator::type, Chris@16: UnaryFunction Chris@16: >(boost::begin(rng), boost::end(rng), fun); Chris@16: #else Chris@16: return std::for_each< Chris@16: BOOST_DEDUCED_TYPENAME range_iterator::type, Chris@16: UnaryFunction Chris@16: >(boost::begin(rng),boost::end(rng),fun); Chris@16: #endif Chris@16: } Chris@16: Chris@16: /// \overload Chris@16: template< class SinglePassRange, class UnaryFunction > Chris@16: inline UnaryFunction for_each(const SinglePassRange& rng, UnaryFunction fun) Chris@16: { Chris@16: BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept )); Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) Chris@16: return for_each_detail::for_each_impl< Chris@16: typename range_iterator::type, Chris@16: UnaryFunction Chris@16: >(boost::begin(rng), boost::end(rng), fun); Chris@16: #else Chris@16: return std::for_each< Chris@16: BOOST_DEDUCED_TYPENAME range_iterator::type, Chris@16: UnaryFunction Chris@16: >(boost::begin(rng), boost::end(rng), fun); Chris@16: #endif Chris@16: } Chris@16: Chris@16: } // namespace range Chris@16: using range::for_each; Chris@16: } // namespace boost Chris@16: Chris@16: #endif // include guard