From 3c86aae616647d0b38ea4e808e15c33b5b62853f Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 27 Jul 2019 23:56:49 -0500 Subject: [PATCH] [ox/std] Fix several problems that arose when trying to use strong ints --- deps/ox/src/ox/std/strongint.hpp | 84 +++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/deps/ox/src/ox/std/strongint.hpp b/deps/ox/src/ox/std/strongint.hpp index 23eb40e3..03316ce4 100644 --- a/deps/ox/src/ox/std/strongint.hpp +++ b/deps/ox/src/ox/std/strongint.hpp @@ -6,6 +6,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + #include "types.hpp" namespace ox { @@ -58,13 +60,13 @@ class Integer { constexpr Integer operator%=(Integer i) noexcept; - constexpr Integer operator>>(Integer i) const noexcept; + constexpr Integer operator>>(int i) const noexcept; - constexpr Integer operator>>=(Integer i) noexcept; + constexpr Integer operator>>=(int i) noexcept; - constexpr Integer operator<<(Integer i) const noexcept; + constexpr Integer operator<<(int i) const noexcept; - constexpr Integer operator<<=(Integer i) noexcept; + constexpr Integer operator<<=(int i) noexcept; constexpr Integer operator|(Integer i) const noexcept; @@ -90,9 +92,10 @@ class Integer { // Postfix decrement constexpr Integer operator--(int) noexcept; - // Postfix decrement constexpr explicit operator T() const noexcept; + constexpr operator bool() const noexcept; + }; template @@ -102,117 +105,137 @@ constexpr Integer::Integer(T i) noexcept { template constexpr Integer Integer::operator=(Integer i) noexcept { - return m_i = i.m_i; + return Integer(m_i = i.m_i); } template constexpr Integer Integer::operator==(Integer i) const noexcept { - return m_i == i.m_i; + return Integer(m_i == i.m_i); } template constexpr Integer Integer::operator!=(Integer i) const noexcept { - return m_i != i.m_i; + return Integer(m_i != i.m_i); } template constexpr Integer Integer::operator<(Integer i) const noexcept { - return m_i < i.m_i; + return Integer(m_i < i.m_i); } template constexpr Integer Integer::operator>(Integer i) const noexcept { - return m_i > i.m_i; + return Integer(m_i > i.m_i); } template constexpr Integer Integer::operator<=(Integer i) const noexcept { - return m_i <= i.m_i; + return Integer(m_i <= i.m_i); } template constexpr Integer Integer::operator>=(Integer i) const noexcept { - return m_i >= i.m_i; + return Integer(m_i >= i.m_i); } template constexpr Integer Integer::operator+(Integer i) const noexcept { - return m_i + i.m_i; + return Integer(m_i + i.m_i); } template constexpr Integer Integer::operator+=(Integer i) noexcept { - return m_i += i.m_i; + return Integer(m_i += i.m_i); } template constexpr Integer Integer::operator-(Integer i) const noexcept { - return m_i - i.m_i; + return Integer(m_i - i.m_i); } template constexpr Integer Integer::operator-=(Integer i) noexcept { - return m_i -= i.m_i; + return Integer(m_i -= i.m_i); } template constexpr Integer Integer::operator*(Integer i) const noexcept { - return m_i * i.m_i; + return Integer(m_i * i.m_i); } template constexpr Integer Integer::operator*=(Integer i) noexcept { - return m_i *= i.m_i; + return Integer(m_i *= i.m_i); } template constexpr Integer Integer::operator/(Integer i) const noexcept { - return m_i / i.m_i; + return Integer(m_i / i.m_i); } template constexpr Integer Integer::operator/=(Integer i) noexcept { - return m_i /= i.m_i; + return Integer(m_i /= i.m_i); } template constexpr Integer Integer::operator%(Integer i) const noexcept { - return m_i % i.m_i; + return Integer(m_i % i.m_i); } template constexpr Integer Integer::operator%=(Integer i) noexcept { - return m_i %= i.m_i; + return Integer(m_i %= i.m_i); +} + +template +constexpr Integer Integer::operator>>(int i) const noexcept { + return Integer(m_i >> i); +} + +template +constexpr Integer Integer::operator>>=(int i) noexcept { + return Integer(m_i >>= i); +} + +template +constexpr Integer Integer::operator<<(int i) const noexcept { + return Integer(m_i << i); +} + +template +constexpr Integer Integer::operator<<=(int i) noexcept { + return Integer(m_i <<= i); } template constexpr Integer Integer::operator|(Integer i) const noexcept { - return m_i | i.m_i; + return Integer(m_i | i.m_i); } template constexpr Integer Integer::operator|=(Integer i) noexcept { - return m_i |= i.m_i; + return Integer(m_i |= i.m_i); } template constexpr Integer Integer::operator&(Integer i) const noexcept { - return m_i & i.m_i; + return Integer(m_i & i.m_i); } template constexpr Integer Integer::operator&=(Integer i) noexcept { - return m_i &= i.m_i; + return Integer(m_i &= i.m_i); } template constexpr Integer Integer::operator^(Integer i) const noexcept { - return m_i ^ i.m_i; + return Integer(m_i ^ i.m_i); } template constexpr Integer Integer::operator^=(Integer i) noexcept { - return m_i ^= i.m_i; + return Integer(m_i ^= i.m_i); } // Prefix increment @@ -244,6 +267,11 @@ constexpr Integer::operator T() const noexcept { return m_i; } +template +constexpr Integer::operator bool() const noexcept { + return m_i; +} + using Int8 = Integer; using Int16 = Integer; using Int32 = Integer;