Loading [MathJax]/extensions/TeX/AMSsymbols.js
Radium Engine  1.5.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
Index.hpp
1 #pragma once
2 
3 #include <Core/RaCore.hpp>
4 #include <limits>
5 
6 namespace Ra {
7 namespace Core {
8 namespace Utils {
9 
10 class RA_CORE_API Index
11 {
12  public:
13  using IntegerType = int;
14 
17  constexpr Index( IntegerType i = s_invalid );
18  constexpr Index( const Index& i );
19 
22  template <typename Integer>
23  explicit constexpr Index( Integer i );
24 
27  // ~Index() { }
28 
30  constexpr bool isValid() const;
31 
33  constexpr bool isInvalid() const;
34  constexpr void setInvalid();
35  static constexpr Index Invalid();
36  static constexpr Index Max();
37 
39  constexpr IntegerType getValue() const;
40  constexpr void setValue( const IntegerType i );
41 
43  constexpr operator IntegerType() const; // required for `array[idx]`
44 
46  constexpr Index& operator=( const Index& id );
47  constexpr Index& operator++();
48  constexpr Index& operator--();
49 
50  constexpr Index operator+( const Index& id );
51  template <typename Integer>
52  constexpr Index operator+( const Integer& i );
53 
54  constexpr Index operator-( const Index& id );
55  template <typename Integer>
56  constexpr Index operator-( const Integer& i );
57 
58  constexpr bool operator==( const Index& id );
59  template <typename Integer>
60  constexpr bool operator==( const Integer& i );
61 
62  constexpr bool operator!=( const Index& id );
63  template <typename Integer>
64  constexpr bool operator!=( const Integer& i );
65 
66  constexpr bool operator<( const Index& id1 );
67  template <typename Integer>
68  constexpr bool operator<( const Integer& i );
69 
70  constexpr bool operator<=( const Index& id1 );
71  template <typename Integer>
72  constexpr bool operator<=( const Integer& i );
73 
74  constexpr bool operator>( const Index& id1 );
75  template <typename Integer>
76  constexpr bool operator>( const Integer& i );
77 
78  constexpr bool operator>=( const Index& id1 );
79  template <typename Integer>
80  constexpr bool operator>=( const Integer& i );
81 
82  protected:
84  IntegerType m_idx { s_invalid };
85 
86  private:
88  static const IntegerType s_invalid { -1 };
89  static const IntegerType s_maxIdx { std::numeric_limits<IntegerType>::max() };
90 };
91 
93 constexpr Index::Index( IntegerType i ) : m_idx( ( i < 0 ) ? s_invalid : i ) {}
94 
95 template <typename Integer>
96 constexpr Index::Index( Integer i ) : m_idx( ( ( i < 0 ) || ( i > s_maxIdx ) ) ? s_invalid : i ) {
97  static_assert( std::is_integral<Integer>::value, "Integral required." );
98 }
99 
100 constexpr Index::Index( const Index& i ) : m_idx( i.m_idx ) {}
101 
103 constexpr bool Index::isValid() const {
104  return ( m_idx != s_invalid );
105 }
106 
108 constexpr bool Index::isInvalid() const {
109  return ( m_idx < 0 );
110 }
111 constexpr void Index::setInvalid() {
112  m_idx = s_invalid;
113 }
114 constexpr Index Index::Invalid() {
115  return Index( s_invalid );
116 }
117 constexpr Index Index::Max() {
118  return Index( s_maxIdx );
119 }
120 
122 constexpr Index::IntegerType Index::getValue() const {
123  return m_idx;
124 }
125 constexpr void Index::setValue( const IntegerType i ) {
126  m_idx = ( i < 0 ) ? s_invalid : i;
127 }
128 
131 constexpr Index::operator IntegerType() const {
132  return m_idx;
133 }
134 
136 constexpr Index& Index::operator=( const Index& id ) {
137  m_idx = id.m_idx;
138  return *this;
139 }
140 constexpr Index& Index::operator++() {
141  m_idx++;
142  if ( m_idx < 0 ) { m_idx = s_invalid; }
143  return *this;
144 }
145 constexpr Index& Index::operator--() {
146  if ( m_idx != s_invalid ) { m_idx--; }
147  return *this;
148 }
149 
150 constexpr Index Index::operator+( const Index& id ) {
151  if ( isInvalid() || id.isInvalid() ) { return Index::Invalid(); }
152  return Index( m_idx + id.m_idx );
153 }
154 template <typename Integer>
155 constexpr Index Index::operator+( const Integer& id ) {
156  static_assert( std::is_integral<Integer>::value, "Integral required." );
157  return ( *this ) + Index( id );
158 }
159 
160 constexpr Index Index::operator-( const Index& id ) {
161  if ( isInvalid() || id.isInvalid() ) { return Index::Invalid(); }
162  return Index( m_idx - id.m_idx );
163 }
164 template <typename Integer>
165 constexpr Index Index::operator-( const Integer& id ) {
166  static_assert( std::is_integral<Integer>::value, "Integral required." );
167  return ( *this ) - Index( id );
168 }
169 
170 constexpr bool Index::operator==( const Index& id ) {
171  return ( m_idx == id.m_idx );
172 }
173 template <typename Integer>
174 constexpr bool Index::operator==( const Integer& i ) {
175  static_assert( std::is_integral<Integer>::value, "Integral required." );
176  return ( *this == Index( IntegerType( i ) ) );
177 }
178 
179 constexpr bool Index::operator!=( const Index& id ) {
180  return ( !( *this == id ) );
181 }
182 template <typename Integer>
183 constexpr bool Index::operator!=( const Integer& i ) {
184  static_assert( std::is_integral<Integer>::value, "Integral required." );
185  return ( !( *this == Index( IntegerType( i ) ) ) );
186 }
187 
188 constexpr bool Index::operator<( const Index& id ) {
189  if ( isInvalid() || id.isInvalid() ) { return false; }
190  return ( m_idx < id.m_idx );
191 }
192 template <typename Integer>
193 constexpr bool Index::operator<( const Integer& i ) {
194  return ( *this < Index( IntegerType( i ) ) );
195 }
196 
197 constexpr bool Index::operator<=( const Index& id ) {
198  if ( isInvalid() || id.isInvalid() ) { return false; }
199  return ( m_idx <= id.m_idx );
200 }
201 template <typename Integer>
202 constexpr bool Index::operator<=( const Integer& i ) {
203  static_assert( std::is_integral<Integer>::value, "Integral required." );
204  return ( *this <= Index( IntegerType( i ) ) );
205 }
206 
207 constexpr bool Index::operator>( const Index& id ) {
208  if ( isInvalid() || id.isInvalid() ) { return false; }
209  return ( m_idx > id.m_idx );
210 }
211 template <typename Integer>
212 constexpr bool Index::operator>( const Integer& i ) {
213  static_assert( std::is_integral<Integer>::value, "Integral required." );
214  return ( *this > Index( IntegerType( i ) ) );
215 }
216 
217 constexpr bool Index::operator>=( const Index& id ) {
218  if ( isInvalid() || id.isInvalid() ) { return false; }
219  return ( m_idx >= id.m_idx );
220 }
221 template <typename Integer>
222 constexpr bool Index::operator>=( const Integer& i ) {
223  static_assert( std::is_integral<Integer>::value, "Integral required." );
224  return ( *this >= Index( IntegerType( i ) ) );
225 }
226 
227 } // namespace Utils
228 } // namespace Core
229 } // namespace Ra
Definition: Cage.cpp:3