reverse.hpp (3084B)
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 STLAB_ALGORITHM_REVERSE_HPP 9 #define STLAB_ALGORITHM_REVERSE_HPP 10 11 #include <algorithm> 12 #include <utility> 13 14 #include <stlab/iterator/set_next.hpp> 15 16 /*************************************************************************************************/ 17 18 namespace stlab { 19 20 /*************************************************************************************************/ 21 22 namespace unsafe { 23 24 /*************************************************************************************************/ 25 26 template <typename I> // I models NodeIterator 27 I reverse_append(I first, I last, I result) { 28 while (first != last) { 29 I prior(first); 30 ++first; 31 stlab::unsafe::set_next(prior, result); 32 result = prior; 33 } 34 return result; 35 } 36 37 template <typename R, // R models NodeRange 38 typename I> // I models NodeIterator 39 inline I reverse_append(R& range, I result) { 40 return stlab::unsafe::reverse_append(std::begin(range), std::end(range), result); 41 } 42 43 template <typename I> // I models NodeIterator 44 inline I reverse_nodes(I first, I last) { 45 return stlab::unsafe::reverse_append(first, last, last); 46 } 47 48 template <typename R> // R models NodeRange 49 inline typename R::iterator reverse_nodes(R& range) { 50 return stlab::unsafe::reverse_nodes(std::begin(range), std::end(range)); 51 } 52 53 /*************************************************************************************************/ 54 55 } // namspace unsafe 56 57 /*************************************************************************************************/ 58 59 template <class BidirectionalRange> 60 inline void reverse(BidirectionalRange& range) { 61 std::reverse(std::begin(range), std::end(range)); 62 } 63 64 template <class BidirectionalRange, class OutputIterator> 65 inline void reverse_copy(BidirectionalRange& range, OutputIterator result) { 66 std::reverse_copy(std::begin(range), std::end(range), result); 67 } 68 69 template <class BidirectionalRange, class OutputIterator> 70 inline void reverse_copy(const BidirectionalRange& range, OutputIterator result) { 71 std::reverse_copy(std::begin(range), std::end(range), result); 72 } 73 74 /*************************************************************************************************/ 75 76 template <typename I> // I models BidirectionalIterator 77 std::pair<I, I> reverse_until(I f, I m, I l) { 78 while (f != m && m != l) { 79 --l; 80 81 std::iter_swap(f, l); 82 83 ++f; 84 } 85 86 return std::pair<I, I>(f, l); 87 } 88 89 /*************************************************************************************************/ 90 91 } // namespace stlab 92 93 /*************************************************************************************************/ 94 95 #endif // STLAB_ALGORITHM_REVERSE_HPP 96 97 /*************************************************************************************************/