diff options
Diffstat (limited to 'src/util/integer_cln_imp.cpp')
-rw-r--r-- | src/util/integer_cln_imp.cpp | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/src/util/integer_cln_imp.cpp b/src/util/integer_cln_imp.cpp index e09708ae5..149e02edc 100644 --- a/src/util/integer_cln_imp.cpp +++ b/src/util/integer_cln_imp.cpp @@ -483,16 +483,6 @@ unsigned int Integer::getUnsignedInt() const return cln::cl_I_to_uint(d_value); } -bool Integer::fitsSignedLong() const -{ - return d_value <= s_signedLongMax && d_value >= s_signedLongMin; -} - -bool Integer::fitsUnsignedLong() const -{ - return sgn() >= 0 && d_value <= s_unsignedLongMax; -} - long Integer::getLong() const { // ensure there isn't overflow @@ -517,6 +507,53 @@ unsigned long Integer::getUnsignedLong() const return cln::cl_I_to_ulong(d_value); } +int64_t Integer::getSigned64() const +{ + if constexpr (sizeof(int64_t) == sizeof(signed long int)) + { + return getLong(); + } + else + { + if (std::numeric_limits<long>::min() <= d_value + && d_value <= std::numeric_limits<long>::max()) + { + return getLong(); + } + // ensure there isn't overflow + CheckArgument(d_value <= std::numeric_limits<int64_t>::max(), + this, + "Overflow detected in Integer::getSigned64()"); + CheckArgument(d_value >= std::numeric_limits<int64_t>::min(), + this, + "Overflow detected in Integer::getSigned64()"); + return std::stoll(toString()); + } +} +uint64_t Integer::getUnsigned64() const +{ + if constexpr (sizeof(uint64_t) == sizeof(unsigned long int)) + { + return getUnsignedLong(); + } + else + { + if (std::numeric_limits<unsigned long>::min() <= d_value + && d_value <= std::numeric_limits<unsigned long>::max()) + { + return getUnsignedLong(); + } + // ensure there isn't overflow + CheckArgument(d_value <= std::numeric_limits<uint64_t>::max(), + this, + "Overflow detected in Integer::getSigned64()"); + CheckArgument(d_value >= std::numeric_limits<uint64_t>::min(), + this, + "Overflow detected in Integer::getSigned64()"); + return std::stoull(toString()); + } +} + size_t Integer::hash() const { return equal_hashcode(d_value); } bool Integer::testBit(unsigned n) const { return cln::logbitp(n, d_value); } |