]>
Commit | Line | Data |
---|---|---|
1 | // Copyright Neil Groves 2009. Use, modification and | |
2 | // distribution is subject to the Boost Software License, Version | |
3 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
4 | // http://www.boost.org/LICENSE_1_0.txt) | |
5 | // | |
6 | // | |
7 | // For more information, see http://www.boost.org/libs/range/ | |
8 | // | |
9 | #ifndef BOOST_RANGE_ALGORITHM_FOR_EACH_HPP_INCLUDED | |
10 | #define BOOST_RANGE_ALGORITHM_FOR_EACH_HPP_INCLUDED | |
11 | ||
12 | #include <boost/concept_check.hpp> | |
13 | #include <boost/range/begin.hpp> | |
14 | #include <boost/range/end.hpp> | |
15 | #include <boost/range/concepts.hpp> | |
16 | #include <boost/utility/enable_if.hpp> | |
17 | #include <boost/ref.hpp> | |
18 | #include <algorithm> | |
19 | ||
20 | #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) | |
21 | #include <xutility> | |
22 | #endif | |
23 | ||
24 | namespace boost | |
25 | { | |
26 | namespace range | |
27 | { | |
28 | ||
29 | #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) | |
30 | namespace for_each_detail | |
31 | { | |
32 | template<typename Iterator, typename UnaryFunction> | |
33 | inline UnaryFunction | |
34 | for_each_impl(Iterator first, Iterator last, UnaryFunction fun, | |
35 | typename ::boost::enable_if< | |
36 | is_reference_wrapper<UnaryFunction>, | |
37 | void | |
38 | >::type* = 0) | |
39 | { | |
40 | typedef typename std::_Get_unchecked_type<Iterator>::type | |
41 | unchecked_iterator; | |
42 | ||
43 | unchecked_iterator unchecked_last = std::_Unchecked(last); | |
44 | for (unchecked_iterator unchecked_first = std::_Unchecked(first); first != last; ++first) | |
45 | fun.get()(*unchecked_first); | |
46 | ||
47 | return fun; | |
48 | } | |
49 | ||
50 | template<typename Iterator, typename UnaryFunction> | |
51 | inline UnaryFunction | |
52 | for_each_impl(Iterator first, Iterator last, UnaryFunction fn, | |
53 | typename disable_if< | |
54 | is_reference_wrapper<UnaryFunction>, | |
55 | void | |
56 | >::type* = 0) | |
57 | { | |
58 | return std::for_each<Iterator, UnaryFunction>(first, last, fn); | |
59 | } | |
60 | } | |
61 | #endif | |
62 | ||
63 | /// \brief template function for_each | |
64 | /// | |
65 | /// range-based version of the for_each std algorithm | |
66 | /// | |
67 | /// \pre SinglePassRange is a model of the SinglePassRangeConcept | |
68 | /// \pre UnaryFunction is a model of the UnaryFunctionConcept | |
69 | template< class SinglePassRange, class UnaryFunction > | |
70 | inline UnaryFunction for_each(SinglePassRange & rng, UnaryFunction fun) | |
71 | { | |
72 | BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<SinglePassRange> )); | |
73 | ||
74 | #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) | |
75 | return for_each_detail::for_each_impl< | |
76 | typename range_iterator<SinglePassRange>::type, | |
77 | UnaryFunction | |
78 | >(boost::begin(rng), boost::end(rng), fun); | |
79 | #else | |
80 | return std::for_each< | |
81 | BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type, | |
82 | UnaryFunction | |
83 | >(boost::begin(rng),boost::end(rng),fun); | |
84 | #endif | |
85 | } | |
86 | ||
87 | /// \overload | |
88 | template< class SinglePassRange, class UnaryFunction > | |
89 | inline UnaryFunction for_each(const SinglePassRange& rng, UnaryFunction fun) | |
90 | { | |
91 | BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange> )); | |
92 | ||
93 | #if BOOST_WORKAROUND(BOOST_MSVC, == 1600) | |
94 | return for_each_detail::for_each_impl< | |
95 | typename range_iterator<const SinglePassRange>::type, | |
96 | UnaryFunction | |
97 | >(boost::begin(rng), boost::end(rng), fun); | |
98 | #else | |
99 | return std::for_each< | |
100 | BOOST_DEDUCED_TYPENAME range_iterator<const SinglePassRange>::type, | |
101 | UnaryFunction | |
102 | >(boost::begin(rng), boost::end(rng), fun); | |
103 | #endif | |
104 | } | |
105 | ||
106 | } // namespace range | |
107 | using range::for_each; | |
108 | } // namespace boost | |
109 | ||
110 | #endif // include guard |