diff --git a/deps/ox/src/ox/std/CMakeLists.txt b/deps/ox/src/ox/std/CMakeLists.txt index 389e2e60..6db2b3b9 100644 --- a/deps/ox/src/ox/std/CMakeLists.txt +++ b/deps/ox/src/ox/std/CMakeLists.txt @@ -49,6 +49,7 @@ install( random.hpp stacktrace.hpp string.hpp + strongint.hpp strops.hpp std.hpp stddef.hpp diff --git a/deps/ox/src/ox/std/std.hpp b/deps/ox/src/ox/std/std.hpp index d0f7914c..9a59a4a6 100644 --- a/deps/ox/src/ox/std/std.hpp +++ b/deps/ox/src/ox/std/std.hpp @@ -20,6 +20,7 @@ #include "random.hpp" #include "stacktrace.hpp" #include "stddef.hpp" +#include "strongint.hpp" #include "strops.hpp" #include "string.hpp" #include "typeinfo.hpp" diff --git a/deps/ox/src/ox/std/strongint.hpp b/deps/ox/src/ox/std/strongint.hpp new file mode 100644 index 00000000..23eb40e3 --- /dev/null +++ b/deps/ox/src/ox/std/strongint.hpp @@ -0,0 +1,257 @@ +/* + * Copyright 2015 - 2019 gtalent2@gmail.com + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "types.hpp" + +namespace ox { + +/** + * Integer is a strongly typed integer wrapper used to create strongly typed + * integers. + */ +template +class Integer { + private: + T m_i; + + public: + constexpr Integer() noexcept = default; + + constexpr explicit Integer(T i) noexcept; + + constexpr Integer operator=(Integer i) noexcept; + + constexpr Integer operator==(Integer i) const noexcept; + + constexpr Integer operator!=(Integer i) const noexcept; + + constexpr Integer operator<(Integer i) const noexcept; + + constexpr Integer operator>(Integer i) const noexcept; + + constexpr Integer operator<=(Integer i) const noexcept; + + constexpr Integer operator>=(Integer i) const noexcept; + + constexpr Integer operator+(Integer i) const noexcept; + + constexpr Integer operator+=(Integer i) noexcept; + + constexpr Integer operator-(Integer i) const noexcept; + + constexpr Integer operator-=(Integer i) noexcept; + + constexpr Integer operator*(Integer i) const noexcept; + + constexpr Integer operator*=(Integer i) noexcept; + + constexpr Integer operator/(Integer i) const noexcept; + + constexpr Integer operator/=(Integer i) noexcept; + + constexpr Integer operator%(Integer i) const noexcept; + + constexpr Integer operator%=(Integer i) noexcept; + + constexpr Integer operator>>(Integer i) const noexcept; + + constexpr Integer operator>>=(Integer i) noexcept; + + constexpr Integer operator<<(Integer i) const noexcept; + + constexpr Integer operator<<=(Integer i) noexcept; + + constexpr Integer operator|(Integer i) const noexcept; + + constexpr Integer operator|=(Integer i) noexcept; + + constexpr Integer operator&(Integer i) const noexcept; + + constexpr Integer operator&=(Integer i) noexcept; + + constexpr Integer operator^(Integer i) const noexcept; + + constexpr Integer operator^=(Integer i) noexcept; + + // Prefix increment + constexpr Integer operator++() noexcept; + + // Postfix increment + constexpr Integer operator++(int) noexcept; + + // Prefix decrement + constexpr Integer operator--() noexcept; + + // Postfix decrement + constexpr Integer operator--(int) noexcept; + + // Postfix decrement + constexpr explicit operator T() const noexcept; + +}; + +template +constexpr Integer::Integer(T i) noexcept { + m_i = i; +} + +template +constexpr Integer Integer::operator=(Integer i) noexcept { + return m_i = i.m_i; +} + +template +constexpr Integer Integer::operator==(Integer i) const noexcept { + return m_i == i.m_i; +} + +template +constexpr Integer Integer::operator!=(Integer i) const noexcept { + return m_i != i.m_i; +} + +template +constexpr Integer Integer::operator<(Integer i) const noexcept { + return m_i < i.m_i; +} + +template +constexpr Integer Integer::operator>(Integer i) const noexcept { + return m_i > i.m_i; +} + +template +constexpr Integer Integer::operator<=(Integer i) const noexcept { + return m_i <= i.m_i; +} + +template +constexpr Integer Integer::operator>=(Integer i) const noexcept { + return m_i >= i.m_i; +} + +template +constexpr Integer Integer::operator+(Integer i) const noexcept { + return m_i + i.m_i; +} + +template +constexpr Integer Integer::operator+=(Integer i) noexcept { + return m_i += i.m_i; +} + +template +constexpr Integer Integer::operator-(Integer i) const noexcept { + return m_i - i.m_i; +} + +template +constexpr Integer Integer::operator-=(Integer i) noexcept { + return m_i -= i.m_i; +} + +template +constexpr Integer Integer::operator*(Integer i) const noexcept { + return m_i * i.m_i; +} + +template +constexpr Integer Integer::operator*=(Integer i) noexcept { + return m_i *= i.m_i; +} + +template +constexpr Integer Integer::operator/(Integer i) const noexcept { + return m_i / i.m_i; +} + +template +constexpr Integer Integer::operator/=(Integer i) noexcept { + return m_i /= i.m_i; +} + +template +constexpr Integer Integer::operator%(Integer i) const noexcept { + return m_i % i.m_i; +} + +template +constexpr Integer Integer::operator%=(Integer i) noexcept { + return m_i %= i.m_i; +} + +template +constexpr Integer Integer::operator|(Integer i) const noexcept { + return m_i | i.m_i; +} + +template +constexpr Integer Integer::operator|=(Integer i) noexcept { + return m_i |= i.m_i; +} + +template +constexpr Integer Integer::operator&(Integer i) const noexcept { + return m_i & i.m_i; +} + +template +constexpr Integer Integer::operator&=(Integer i) noexcept { + return m_i &= i.m_i; +} + +template +constexpr Integer Integer::operator^(Integer i) const noexcept { + return m_i ^ i.m_i; +} + +template +constexpr Integer Integer::operator^=(Integer i) noexcept { + return m_i ^= i.m_i; +} + +// Prefix increment +template +constexpr inline Integer Integer::operator++() noexcept { + return Integer(++m_i); +} + +// Postfix increment +template +constexpr inline Integer Integer::operator++(int) noexcept { + return Integer(m_i++); +} + +// Prefix decrement +template +constexpr inline Integer Integer::operator--() noexcept { + return Integer(--m_i); +} + +// Postfix decrement +template +constexpr inline Integer Integer::operator--(int) noexcept { + return Integer(m_i--); +} + +template +constexpr Integer::operator T() const noexcept { + return m_i; +} + +using Int8 = Integer; +using Int16 = Integer; +using Int32 = Integer; +using Int64 = Integer; + +using Uint8 = Integer; +using Uint16 = Integer; +using Uint32 = Integer; +using Uint64 = Integer; + +}