[ox/std] Fix several problems that arose when trying to use strong ints
This commit is contained in:
parent
6485a780a7
commit
3c86aae616
84
deps/ox/src/ox/std/strongint.hpp
vendored
84
deps/ox/src/ox/std/strongint.hpp
vendored
@ -6,6 +6,8 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include "types.hpp"
|
#include "types.hpp"
|
||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
@ -58,13 +60,13 @@ class Integer {
|
|||||||
|
|
||||||
constexpr Integer<T> operator%=(Integer<T> i) noexcept;
|
constexpr Integer<T> operator%=(Integer<T> i) noexcept;
|
||||||
|
|
||||||
constexpr Integer<T> operator>>(Integer<T> i) const noexcept;
|
constexpr Integer<T> operator>>(int i) const noexcept;
|
||||||
|
|
||||||
constexpr Integer<T> operator>>=(Integer<T> i) noexcept;
|
constexpr Integer<T> operator>>=(int i) noexcept;
|
||||||
|
|
||||||
constexpr Integer<T> operator<<(Integer<T> i) const noexcept;
|
constexpr Integer<T> operator<<(int i) const noexcept;
|
||||||
|
|
||||||
constexpr Integer<T> operator<<=(Integer<T> i) noexcept;
|
constexpr Integer<T> operator<<=(int i) noexcept;
|
||||||
|
|
||||||
constexpr Integer<T> operator|(Integer<T> i) const noexcept;
|
constexpr Integer<T> operator|(Integer<T> i) const noexcept;
|
||||||
|
|
||||||
@ -90,9 +92,10 @@ class Integer {
|
|||||||
// Postfix decrement
|
// Postfix decrement
|
||||||
constexpr Integer<T> operator--(int) noexcept;
|
constexpr Integer<T> operator--(int) noexcept;
|
||||||
|
|
||||||
// Postfix decrement
|
|
||||||
constexpr explicit operator T() const noexcept;
|
constexpr explicit operator T() const noexcept;
|
||||||
|
|
||||||
|
constexpr operator bool() const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -102,117 +105,137 @@ constexpr Integer<T>::Integer(T i) noexcept {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator=(Integer<T> i) noexcept {
|
||||||
return m_i = i.m_i;
|
return Integer<T>(m_i = i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator==(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator==(Integer<T> i) const noexcept {
|
||||||
return m_i == i.m_i;
|
return Integer<T>(m_i == i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator!=(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator!=(Integer<T> i) const noexcept {
|
||||||
return m_i != i.m_i;
|
return Integer<T>(m_i != i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator<(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator<(Integer<T> i) const noexcept {
|
||||||
return m_i < i.m_i;
|
return Integer<T>(m_i < i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator>(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator>(Integer<T> i) const noexcept {
|
||||||
return m_i > i.m_i;
|
return Integer<T>(m_i > i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator<=(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator<=(Integer<T> i) const noexcept {
|
||||||
return m_i <= i.m_i;
|
return Integer<T>(m_i <= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator>=(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator>=(Integer<T> i) const noexcept {
|
||||||
return m_i >= i.m_i;
|
return Integer<T>(m_i >= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator+(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator+(Integer<T> i) const noexcept {
|
||||||
return m_i + i.m_i;
|
return Integer<T>(m_i + i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator+=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator+=(Integer<T> i) noexcept {
|
||||||
return m_i += i.m_i;
|
return Integer<T>(m_i += i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator-(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator-(Integer<T> i) const noexcept {
|
||||||
return m_i - i.m_i;
|
return Integer<T>(m_i - i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator-=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator-=(Integer<T> i) noexcept {
|
||||||
return m_i -= i.m_i;
|
return Integer<T>(m_i -= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator*(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator*(Integer<T> i) const noexcept {
|
||||||
return m_i * i.m_i;
|
return Integer<T>(m_i * i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator*=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator*=(Integer<T> i) noexcept {
|
||||||
return m_i *= i.m_i;
|
return Integer<T>(m_i *= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator/(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator/(Integer<T> i) const noexcept {
|
||||||
return m_i / i.m_i;
|
return Integer<T>(m_i / i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator/=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator/=(Integer<T> i) noexcept {
|
||||||
return m_i /= i.m_i;
|
return Integer<T>(m_i /= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator%(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator%(Integer<T> i) const noexcept {
|
||||||
return m_i % i.m_i;
|
return Integer<T>(m_i % i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator%=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator%=(Integer<T> i) noexcept {
|
||||||
return m_i %= i.m_i;
|
return Integer<T>(m_i %= i.m_i);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Integer<T> Integer<T>::operator>>(int i) const noexcept {
|
||||||
|
return Integer<T>(m_i >> i);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Integer<T> Integer<T>::operator>>=(int i) noexcept {
|
||||||
|
return Integer<T>(m_i >>= i);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Integer<T> Integer<T>::operator<<(int i) const noexcept {
|
||||||
|
return Integer<T>(m_i << i);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Integer<T> Integer<T>::operator<<=(int i) noexcept {
|
||||||
|
return Integer<T>(m_i <<= i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator|(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator|(Integer<T> i) const noexcept {
|
||||||
return m_i | i.m_i;
|
return Integer<T>(m_i | i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator|=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator|=(Integer<T> i) noexcept {
|
||||||
return m_i |= i.m_i;
|
return Integer<T>(m_i |= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator&(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator&(Integer<T> i) const noexcept {
|
||||||
return m_i & i.m_i;
|
return Integer<T>(m_i & i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator&=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator&=(Integer<T> i) noexcept {
|
||||||
return m_i &= i.m_i;
|
return Integer<T>(m_i &= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator^(Integer<T> i) const noexcept {
|
constexpr Integer<T> Integer<T>::operator^(Integer<T> i) const noexcept {
|
||||||
return m_i ^ i.m_i;
|
return Integer<T>(m_i ^ i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Integer<T> Integer<T>::operator^=(Integer<T> i) noexcept {
|
constexpr Integer<T> Integer<T>::operator^=(Integer<T> i) noexcept {
|
||||||
return m_i ^= i.m_i;
|
return Integer<T>(m_i ^= i.m_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefix increment
|
// Prefix increment
|
||||||
@ -244,6 +267,11 @@ constexpr Integer<T>::operator T() const noexcept {
|
|||||||
return m_i;
|
return m_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr Integer<T>::operator bool() const noexcept {
|
||||||
|
return m_i;
|
||||||
|
}
|
||||||
|
|
||||||
using Int8 = Integer<int8_t>;
|
using Int8 = Integer<int8_t>;
|
||||||
using Int16 = Integer<int16_t>;
|
using Int16 = Integer<int16_t>;
|
||||||
using Int32 = Integer<int32_t>;
|
using Int32 = Integer<int32_t>;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user