stlab.adobe.com Adobe Systems Incorporated

reverse.hpp

Go to the documentation of this file.
00001 /*
00002     Copyright 2005-2007 Adobe Systems Incorporated
00003     Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
00004     or a copy at http://stlab.adobe.com/licenses.html)
00005 */
00006 /*************************************************************************************************/
00007 
00008 #ifndef ADOBE_ALGORITHM_REVERSE_HPP
00009 #define ADOBE_ALGORITHM_REVERSE_HPP
00010 
00011 #include <adobe/config.hpp>
00012 
00013 #include <boost/range/begin.hpp>
00014 #include <boost/range/end.hpp>
00015 #include <boost/range/iterator.hpp>
00016 
00017 #include <adobe/iterator/set_next.hpp>
00018 
00019 #include <algorithm>
00020 #include <utility>
00021 
00022 /*************************************************************************************************/
00023 
00024 namespace adobe {
00025 
00026 /*************************************************************************************************/
00035 /*************************************************************************************************/
00036 
00037 namespace unsafe {
00038 
00039 /*************************************************************************************************/
00040 
00044 template <typename I> // I models NodeIterator
00045 I reverse_append(I first, I last, I result)
00046 {
00047     while (first != last)
00048     {
00049         I prior(first);
00050         ++first;
00051         adobe::unsafe::set_next(prior, result);
00052         result = prior;
00053     }
00054     return result;
00055 }
00056 
00060 template <typename R, // R models NodeRange
00061           typename I> // I models NodeIterator
00062 inline I reverse_append(R& range, I result)
00063 {
00064     return adobe::unsafe::reverse_append(boost::begin(range), boost::end(range), result);
00065 }
00066 
00070 template <typename I> // I models NodeIterator
00071 inline I reverse_nodes(I first, I last)
00072 {
00073     return adobe::unsafe::reverse_append(first, last, last);
00074 }
00075 
00079 template <typename R> // R models NodeRange
00080 inline typename boost::range_iterator<R>::type reverse_nodes(R& range)
00081 {
00082     return adobe::unsafe::reverse_nodes(boost::begin(range), boost::end(range));
00083 }
00084 
00085 /*************************************************************************************************/
00086 
00087 } // namspace unsafe
00088 
00089 /*************************************************************************************************/
00095 template <class BidirectionalRange>
00096 inline void reverse(BidirectionalRange& range)
00097 {
00098     std::reverse(boost::begin(range), boost::end(range));
00099 }
00100 
00106 template <class BidirectionalRange, class OutputIterator>
00107 inline void reverse_copy(BidirectionalRange& range, OutputIterator result)
00108 {
00109     std::reverse_copy(boost::begin(range), boost::end(range), result);
00110 }
00111 
00117 template <class BidirectionalRange, class OutputIterator>
00118 inline void reverse_copy(const BidirectionalRange& range, OutputIterator result)
00119 {
00120     std::reverse_copy(boost::begin(range), boost::end(range), result);
00121 }
00122 
00123 /*************************************************************************************************/
00129 template <typename I> // I models Bidirectional Iterator
00130 std::pair<I, I> reverse_until(I f, I m, I l)
00131 {
00132     while (f != m && m != l)
00133     {
00134         --l;
00135 
00136         std::iter_swap(f, l);
00137 
00138         ++f;
00139     }
00140 
00141     return std::pair<I, I>(f, l);
00142 } 
00143  
00144 /*************************************************************************************************/
00145 
00146 } // namespace adobe
00147 
00148 /*************************************************************************************************/
00149 
00150 #endif
00151 
00152 /*************************************************************************************************/

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