Adobe Source Libraries 1.49.0
A collection of C++ libraries.
Loading...
Searching...
No Matches
reverse.hpp
Go to the documentation of this file.
1/*
2 Copyright 2013 Adobe
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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
24namespace adobe {
25
26/**************************************************************************************************/
35/**************************************************************************************************/
36
37namespace unsafe {
38
39/**************************************************************************************************/
40
44template <typename I> // I models NodeIterator
45I reverse_append(I first, I last, I result) {
46 while (first != last) {
47 I prior(first);
48 ++first;
49 adobe::unsafe::set_next(prior, result);
50 result = prior;
51 }
52 return result;
53}
54
58template <typename R, // R models NodeRange
59 typename I>
60// I models NodeIterator
61inline I reverse_append(R& range, I result) {
62 return adobe::unsafe::reverse_append(boost::begin(range), boost::end(range), result);
63}
64
68template <typename I> // I models NodeIterator
69inline I reverse_nodes(I first, I last) {
70 return adobe::unsafe::reverse_append(first, last, last);
71}
72
76template <typename R> // R models NodeRange
77inline typename boost::range_iterator<R>::type reverse_nodes(R& range) {
78 return adobe::unsafe::reverse_nodes(boost::begin(range), boost::end(range));
79}
80
81/**************************************************************************************************/
82
83} // namespace unsafe
84
85/**************************************************************************************************/
91template <class BidirectionalRange>
92inline void reverse(BidirectionalRange& range) {
93 std::reverse(boost::begin(range), boost::end(range));
94}
95
101template <class BidirectionalRange, class OutputIterator>
102inline void reverse_copy(BidirectionalRange& range, OutputIterator result) {
103 std::reverse_copy(boost::begin(range), boost::end(range), result);
104}
105
111template <class BidirectionalRange, class OutputIterator>
112inline void reverse_copy(const BidirectionalRange& range, OutputIterator result) {
113 std::reverse_copy(boost::begin(range), boost::end(range), result);
114}
115
116/**************************************************************************************************/
122template <typename I> // I models Bidirectional Iterator
123std::pair<I, I> reverse_until(I f, I m, I l) {
124 while (f != m && m != l) {
125 --l;
126
127 std::iter_swap(f, l);
128
129 ++f;
130 }
131
132 return std::pair<I, I>(f, l);
133}
134
135/**************************************************************************************************/
136
137} // namespace adobe
138
139/**************************************************************************************************/
140
141#endif
142
143/**************************************************************************************************/
void set_next(I x, I y)
Definition set_next.hpp:44
I reverse_nodes(I first, I last)
Definition reverse.hpp:69
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:102
std::pair< I, I > reverse_until(I f, I m, I l)
reverse implementation
Definition reverse.hpp:123
void reverse(BidirectionalRange &range)
reverse implementation
Definition reverse.hpp:92