Line data Source code
1 : // Copyright (c) 2017-2020 The PIVX Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #ifndef PIVX_REVERSE_ITERATE_H 6 : #define PIVX_REVERSE_ITERATE_H 7 : 8 : /** 9 : * Template used for reverse iteration in C++11 range-based for loops. 10 : * 11 : * std::vector<int> v = {1, 2, 3, 4, 5}; 12 : * for (auto x : reverse_iterate(v)) 13 : * std::cout << x << " "; 14 : */ 15 : 16 : template <typename T> 17 : class reverse_range 18 : { 19 : T &m_x; 20 : 21 : public: 22 98092 : explicit reverse_range(T &x) : m_x(x) {} 23 : 24 98092 : auto begin() const -> decltype(this->m_x.rbegin()) 25 : { 26 98092 : return m_x.rbegin(); 27 : } 28 : 29 98092 : auto end() const -> decltype(this->m_x.rend()) 30 : { 31 98092 : return m_x.rend(); 32 : } 33 : }; 34 : 35 : template <typename T> 36 98092 : reverse_range<T> reverse_iterate(T &x) 37 : { 38 98092 : return reverse_range<T>(x); 39 : } 40 : 41 : #endif // PIVX_REVERSE_ITERATE_H