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)
7 // For more information, see http://www.boost.org/libs/range/
9 #ifndef BOOST_RANGE_ALGORITHM_SWAP_RANGES_HPP_INCLUDED
10 #define BOOST_RANGE_ALGORITHM_SWAP_RANGES_HPP_INCLUDED
12 #include <boost/assert.hpp>
13 #include <boost/concept_check.hpp>
14 #include <boost/iterator/iterator_categories.hpp>
15 #include <boost/range/begin.hpp>
16 #include <boost/range/end.hpp>
17 #include <boost/range/concepts.hpp>
18 #include <boost/range/iterator.hpp>
23 namespace range_detail
25 template<class Iterator1, class Iterator2>
26 void swap_ranges_impl(Iterator1 it1, Iterator1 last1,
27 Iterator2 it2, Iterator2 last2,
28 single_pass_traversal_tag,
29 single_pass_traversal_tag)
31 ignore_unused_variable_warning(last2);
32 for (; it1 != last1; ++it1, ++it2)
34 BOOST_ASSERT( it2 != last2 );
35 std::iter_swap(it1, it2);
39 template<class Iterator1, class Iterator2>
40 void swap_ranges_impl(Iterator1 it1, Iterator1 last1,
41 Iterator2 it2, Iterator2 last2,
42 random_access_traversal_tag,
43 random_access_traversal_tag)
45 ignore_unused_variable_warning(last2);
46 BOOST_ASSERT( last2 - it2 >= last1 - it1 );
47 std::swap_ranges(it1, last1, it2);
50 template<class Iterator1, class Iterator2>
51 void swap_ranges_impl(Iterator1 first1, Iterator1 last1,
52 Iterator2 first2, Iterator2 last2)
54 swap_ranges_impl(first1, last1, first2, last2,
55 BOOST_DEDUCED_TYPENAME iterator_traversal<Iterator1>::type(),
56 BOOST_DEDUCED_TYPENAME iterator_traversal<Iterator2>::type());
58 } // namespace range_detail
63 /// \brief template function swap_ranges
65 /// range-based version of the swap_ranges std algorithm
67 /// \pre SinglePassRange1 is a model of the SinglePassRangeConcept
68 /// \pre SinglePassRange2 is a model of the SinglePassRangeConcept
69 template< class SinglePassRange1, class SinglePassRange2 >
70 inline SinglePassRange2&
71 swap_ranges(SinglePassRange1& range1, SinglePassRange2& range2)
73 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange1>));
74 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange2>));
76 boost::range_detail::swap_ranges_impl(
77 boost::begin(range1), boost::end(range1),
78 boost::begin(range2), boost::end(range2));
84 template< class SinglePassRange1, class SinglePassRange2 >
85 inline SinglePassRange2&
86 swap_ranges(const SinglePassRange1& range1, SinglePassRange2& range2)
88 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange1>));
89 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange2>));
91 boost::range_detail::swap_ranges_impl(
92 boost::begin(range1), boost::end(range1),
93 boost::begin(range2), boost::end(range2));
99 template< class SinglePassRange1, class SinglePassRange2 >
100 inline const SinglePassRange2&
101 swap_ranges(SinglePassRange1& range1, const SinglePassRange2& range2)
103 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange1>));
104 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange2>));
106 boost::range_detail::swap_ranges_impl(
107 boost::begin(range1), boost::end(range1),
108 boost::begin(range2), boost::end(range2));
114 template< class SinglePassRange1, class SinglePassRange2 >
115 inline const SinglePassRange2&
116 swap_ranges(const SinglePassRange1& range1, const SinglePassRange2& range2)
118 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange1>));
119 BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<const SinglePassRange2>));
121 boost::range_detail::swap_ranges_impl(
122 boost::begin(range1), boost::end(range1),
123 boost::begin(range2), boost::end(range2));
129 using range::swap_ranges;
132 #endif // include guard