3 #include <Core/RaCore.hpp>
10 class RA_CORE_API Index
13 using IntegerType = int;
17 constexpr Index( IntegerType i = s_invalid );
18 constexpr Index(
const Index& i );
22 template <
typename Integer>
23 explicit constexpr Index( Integer i );
30 constexpr
bool isValid()
const;
33 constexpr
bool isInvalid()
const;
34 constexpr
void setInvalid();
35 static constexpr Index Invalid();
36 static constexpr Index Max();
39 constexpr IntegerType getValue()
const;
40 constexpr
void setValue(
const IntegerType i );
43 constexpr
operator IntegerType()
const;
46 constexpr Index& operator=(
const Index&
id );
47 constexpr Index& operator++();
48 constexpr Index& operator--();
50 constexpr Index operator+(
const Index&
id );
51 template <
typename Integer>
52 constexpr Index operator+(
const Integer& i );
54 constexpr Index operator-(
const Index&
id );
55 template <
typename Integer>
56 constexpr Index operator-(
const Integer& i );
58 constexpr
bool operator==(
const Index&
id );
59 template <
typename Integer>
60 constexpr
bool operator==(
const Integer& i );
62 constexpr
bool operator!=(
const Index&
id );
63 template <
typename Integer>
64 constexpr
bool operator!=(
const Integer& i );
66 constexpr
bool operator<(
const Index& id1 );
67 template <
typename Integer>
68 constexpr
bool operator<(
const Integer& i );
70 constexpr
bool operator<=(
const Index& id1 );
71 template <
typename Integer>
72 constexpr
bool operator<=(
const Integer& i );
74 constexpr
bool operator>(
const Index& id1 );
75 template <
typename Integer>
76 constexpr
bool operator>(
const Integer& i );
78 constexpr
bool operator>=(
const Index& id1 );
79 template <
typename Integer>
80 constexpr
bool operator>=(
const Integer& i );
84 IntegerType m_idx { s_invalid };
88 static const IntegerType s_invalid { -1 };
89 static const IntegerType s_maxIdx { std::numeric_limits<IntegerType>::max() };
93 constexpr Index::Index( IntegerType i ) : m_idx( ( i < 0 ) ? s_invalid : i ) {}
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." );
100 constexpr Index::Index(
const Index& i ) : m_idx( i.m_idx ) {}
103 constexpr
bool Index::isValid()
const {
104 return ( m_idx != s_invalid );
108 constexpr
bool Index::isInvalid()
const {
109 return ( m_idx < 0 );
111 constexpr
void Index::setInvalid() {
114 constexpr Index Index::Invalid() {
115 return Index( s_invalid );
117 constexpr Index Index::Max() {
118 return Index( s_maxIdx );
122 constexpr Index::IntegerType Index::getValue()
const {
125 constexpr
void Index::setValue(
const IntegerType i ) {
126 m_idx = ( i < 0 ) ? s_invalid : i;
131 constexpr Index::operator IntegerType()
const {
136 constexpr Index& Index::operator=(
const Index&
id ) {
140 constexpr Index& Index::operator++() {
142 if ( m_idx < 0 ) { m_idx = s_invalid; }
145 constexpr Index& Index::operator--() {
146 if ( m_idx != s_invalid ) { m_idx--; }
150 constexpr Index Index::operator+(
const Index&
id ) {
151 if ( isInvalid() ||
id.isInvalid() ) {
return Index::Invalid(); }
152 return Index( m_idx +
id.m_idx );
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 );
160 constexpr Index Index::operator-(
const Index&
id ) {
161 if ( isInvalid() ||
id.isInvalid() ) {
return Index::Invalid(); }
162 return Index( m_idx -
id.m_idx );
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 );
170 constexpr
bool Index::operator==(
const Index&
id ) {
171 return ( m_idx ==
id.m_idx );
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 ) ) );
179 constexpr
bool Index::operator!=(
const Index&
id ) {
180 return ( !( *
this ==
id ) );
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 ) ) ) );
188 constexpr
bool Index::operator<(
const Index&
id ) {
189 if ( isInvalid() ||
id.isInvalid() ) {
return false; }
190 return ( m_idx <
id.m_idx );
192 template <
typename Integer>
193 constexpr
bool Index::operator<(
const Integer& i ) {
194 return ( *
this < Index( IntegerType( i ) ) );
197 constexpr
bool Index::operator<=(
const Index&
id ) {
198 if ( isInvalid() ||
id.isInvalid() ) {
return false; }
199 return ( m_idx <=
id.m_idx );
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 ) ) );
207 constexpr
bool Index::operator>(
const Index&
id ) {
208 if ( isInvalid() ||
id.isInvalid() ) {
return false; }
209 return ( m_idx >
id.m_idx );
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 ) ) );
217 constexpr
bool Index::operator>=(
const Index&
id ) {
218 if ( isInvalid() ||
id.isInvalid() ) {
return false; }
219 return ( m_idx >=
id.m_idx );
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 ) ) );