Branch data Line data Source code
1 : : // Taken from https://gist.github.com/arvidsson/7231973 2 : : 3 : : #ifndef BITCOIN_REVERSE_ITERATOR_H 4 : : #define BITCOIN_REVERSE_ITERATOR_H 5 : : 6 : : /** 7 : : * Template used for reverse iteration in range-based for loops. 8 : : * 9 : : * std::vector<int> v = {1, 2, 3, 4, 5}; 10 : : * for (auto x : reverse_iterate(v)) 11 : : * std::cout << x << " "; 12 : : */ 13 : : 14 : : template <typename T> 15 : : class reverse_range 16 : : { 17 : : T &m_x; 18 : : 19 : : public: 20 : 200202 : explicit reverse_range(T &x) : m_x(x) {} 21 : : 22 : 200202 : auto begin() const -> decltype(this->m_x.rbegin()) 23 : : { 24 : 200202 : return m_x.rbegin(); 25 : : } 26 : : 27 : 200202 : auto end() const -> decltype(this->m_x.rend()) 28 : : { 29 : 200202 : return m_x.rend(); 30 : : } 31 : : }; 32 : : 33 : : template <typename T> 34 : 200202 : reverse_range<T> reverse_iterate(T &x) 35 : : { 36 : 200202 : return reverse_range<T>(x); 37 : : } 38 : : 39 : : #endif // BITCOIN_REVERSE_ITERATOR_H