Loading [MathJax]/extensions/TeX/AMSmath.js
Radium Engine  1.5.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
Iterators.hpp
1 #pragma once
2 
3 namespace Ra {
4 namespace Core {
5 
6 namespace _internalIterator {
7 template <class T>
8 struct _reversed {
9  T& t;
10  explicit _reversed( T& _t ) : t( _t ) {}
11 };
12 template <class T>
13 struct _creversed {
14  const T& t;
15  explicit _creversed( const T& _t ) : t( _t ) {}
16 };
17 } // namespace _internalIterator
18 
19 // Provide reverse iterators for range loops and std::containers:
20 // \code for (auto x: reversed(c)) ; \endcode
21 // source: https://stackoverflow.com/a/21510185
22 template <class T>
23 _internalIterator::_reversed<T> reversed( T& t ) {
24  return _internalIterator::_reversed<T>( t );
25 }
26 template <class T>
27 _internalIterator::_reversed<T const> reversed( T const& t ) {
28  return _internalIterator::_reversed<T const>( t );
29 }
30 } // namespace Core
31 } // namespace Ra
32 
33 namespace std {
34 template <class T>
35 auto begin( Ra::Core::_internalIterator::_reversed<T>& r ) -> decltype( r.t.rbegin() ) {
36  return r.t.rbegin();
37 }
38 template <class T>
39 auto end( Ra::Core::_internalIterator::_reversed<T>& r ) -> decltype( r.t.rend() ) {
40  return r.t.rend();
41 }
42 
43 template <class T>
44 auto begin( Ra::Core::_internalIterator::_creversed<T> const& cr ) -> decltype( cr.t.rbegin() ) {
45  return cr.t.rbegin();
46 }
47 template <class T>
48 auto end( Ra::Core::_internalIterator::_creversed<T> const& cr ) -> decltype( cr.t.rend() ) {
49  return cr.t.rend();
50 }
51 } // namespace std
Definition: Cage.cpp:3