stlab.adobe.com Adobe Systems Incorporated
reverse.hpp
Go to the documentation of this file.
1 /*
2  Copyright 2005-2007 Adobe Systems Incorporated
3  Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
4  or a copy at http://stlab.adobe.com/licenses.html)
5 */
6 /*************************************************************************************************/
7 
8 #ifndef ADOBE_ALGORITHM_REVERSE_HPP
9 #define ADOBE_ALGORITHM_REVERSE_HPP
10 
11 #include <adobe/config.hpp>
12 
13 #include <boost/range/begin.hpp>
14 #include <boost/range/end.hpp>
15 #include <boost/range/iterator.hpp>
16 
18 
19 #include <algorithm>
20 #include <utility>
21 
22 /*************************************************************************************************/
23 
24 namespace adobe {
25 
26 /*************************************************************************************************/
35 /*************************************************************************************************/
36 
37 namespace unsafe {
38 
39 /*************************************************************************************************/
40 
44 template <typename I> // I models NodeIterator
45 I reverse_append(I first, I last, I result)
46 {
47  while (first != last)
48  {
49  I prior(first);
50  ++first;
51  adobe::unsafe::set_next(prior, result);
52  result = prior;
53  }
54  return result;
55 }
56 
60 template <typename R, // R models NodeRange
61  typename I> // I models NodeIterator
62 inline I reverse_append(R& range, I result)
63 {
64  return adobe::unsafe::reverse_append(boost::begin(range), boost::end(range), result);
65 }
66 
70 template <typename I> // I models NodeIterator
71 inline I reverse_nodes(I first, I last)
72 {
73  return adobe::unsafe::reverse_append(first, last, last);
74 }
75 
79 template <typename R> // R models NodeRange
80 inline typename boost::range_iterator<R>::type reverse_nodes(R& range)
81 {
82  return adobe::unsafe::reverse_nodes(boost::begin(range), boost::end(range));
83 }
84 
85 /*************************************************************************************************/
86 
87 } // namspace unsafe
88 
89 /*************************************************************************************************/
95 template <class BidirectionalRange>
96 inline void reverse(BidirectionalRange& range)
97 {
98  std::reverse(boost::begin(range), boost::end(range));
99 }
100 
106 template <class BidirectionalRange, class OutputIterator>
107 inline void reverse_copy(BidirectionalRange& range, OutputIterator result)
108 {
109  std::reverse_copy(boost::begin(range), boost::end(range), result);
110 }
111 
117 template <class BidirectionalRange, class OutputIterator>
118 inline void reverse_copy(const BidirectionalRange& range, OutputIterator result)
119 {
120  std::reverse_copy(boost::begin(range), boost::end(range), result);
121 }
122 
123 /*************************************************************************************************/
129 template <typename I> // I models Bidirectional Iterator
130 std::pair<I, I> reverse_until(I f, I m, I l)
131 {
132  while (f != m && m != l)
133  {
134  --l;
135 
136  std::iter_swap(f, l);
137 
138  ++f;
139  }
140 
141  return std::pair<I, I>(f, l);
142 }
143 
144 /*************************************************************************************************/
145 
146 } // namespace adobe
147 
148 /*************************************************************************************************/
149 
150 #endif
151 
152 /*************************************************************************************************/
std::pair< I, I > reverse_until(I f, I m, I l)
reverse implementation
Definition: reverse.hpp:130
void set_next(I x, I y)
Definition: set_next.hpp:44
void reverse(BidirectionalRange &range)
reverse implementation
Definition: reverse.hpp:96
I reverse_append(I first, I last, I result)
Definition: reverse.hpp:45
void reverse_copy(BidirectionalRange &range, OutputIterator result)
reverse implementation
Definition: reverse.hpp:107
void reverse_copy(const BidirectionalRange &range, OutputIterator result)
reverse implementation
Definition: reverse.hpp:118
I reverse_nodes(I first, I last)
Definition: reverse.hpp:71

Copyright © 2006-2007 Adobe Systems Incorporated.

Use of this website signifies your agreement to the Terms of Use and Online Privacy Policy.

Search powered by Google