toctave

t(iny)octave
git clone https://0xff.ir/g/toctave.git
Log | Files | Refs | README

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 /*************************************************************************************************/