#pragma once #include #include #include #include /// On overflow, the function returns unspecified value. inline NO_SANITIZE_UNDEFINED uint64_t intExp2(int x) { return 1ULL << x; } constexpr uint64_t intExp10(int x) { if (x < 0) return 0; if (x > 19) return std::numeric_limits::max(); constexpr uint64_t table[20] = { 1ULL, 10ULL, 100ULL, 1000ULL, 10000ULL, 100000ULL, 1000000ULL, 10000000ULL, 100000000ULL, 1000000000ULL, 10000000000ULL, 100000000000ULL, 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, 1000000000000000000ULL, 10000000000000000000ULL }; return table[x]; } namespace common { constexpr int exp10_i32(int x) { if (x < 0) return 0; if (x > 9) return std::numeric_limits::max(); constexpr int values[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; return values[x]; } constexpr int64_t exp10_i64(int x) { if (x < 0) return 0; if (x > 18) return std::numeric_limits::max(); constexpr int64_t values[] = { 1LL, 10LL, 100LL, 1000LL, 10000LL, 100000LL, 1000000LL, 10000000LL, 100000000LL, 1000000000LL, 10000000000LL, 100000000000LL, 1000000000000LL, 10000000000000LL, 100000000000000LL, 1000000000000000LL, 10000000000000000LL, 100000000000000000LL, 1000000000000000000LL }; return values[x]; } constexpr Int128 exp10_i128(int x) { if (x < 0) return 0; if (x > 38) return std::numeric_limits::max(); constexpr Int128 values[] = { static_cast(1LL), static_cast(10LL), static_cast(100LL), static_cast(1000LL), static_cast(10000LL), static_cast(100000LL), static_cast(1000000LL), static_cast(10000000LL), static_cast(100000000LL), static_cast(1000000000LL), static_cast(10000000000LL), static_cast(100000000000LL), static_cast(1000000000000LL), static_cast(10000000000000LL), static_cast(100000000000000LL), static_cast(1000000000000000LL), static_cast(10000000000000000LL), static_cast(100000000000000000LL), static_cast(1000000000000000000LL), static_cast(1000000000000000000LL) * 10LL, static_cast(1000000000000000000LL) * 100LL, static_cast(1000000000000000000LL) * 1000LL, static_cast(1000000000000000000LL) * 10000LL, static_cast(1000000000000000000LL) * 100000LL, static_cast(1000000000000000000LL) * 1000000LL, static_cast(1000000000000000000LL) * 10000000LL, static_cast(1000000000000000000LL) * 100000000LL, static_cast(1000000000000000000LL) * 1000000000LL, static_cast(1000000000000000000LL) * 10000000000LL, static_cast(1000000000000000000LL) * 100000000000LL, static_cast(1000000000000000000LL) * 1000000000000LL, static_cast(1000000000000000000LL) * 10000000000000LL, static_cast(1000000000000000000LL) * 100000000000000LL, static_cast(1000000000000000000LL) * 1000000000000000LL, static_cast(1000000000000000000LL) * 10000000000000000LL, static_cast(1000000000000000000LL) * 100000000000000000LL, static_cast(1000000000000000000LL) * 100000000000000000LL * 10LL, static_cast(1000000000000000000LL) * 100000000000000000LL * 100LL, static_cast(1000000000000000000LL) * 100000000000000000LL * 1000LL }; return values[x]; } inline Int256 exp10_i256(int x) { if (x < 0) return 0; if (x > 76) return std::numeric_limits::max(); using Int256 = Int256; static constexpr Int256 i10e18{1000000000000000000ll}; static const Int256 values[] = { static_cast(1ll), static_cast(10ll), static_cast(100ll), static_cast(1000ll), static_cast(10000ll), static_cast(100000ll), static_cast(1000000ll), static_cast(10000000ll), static_cast(100000000ll), static_cast(1000000000ll), static_cast(10000000000ll), static_cast(100000000000ll), static_cast(1000000000000ll), static_cast(10000000000000ll), static_cast(100000000000000ll), static_cast(1000000000000000ll), static_cast(10000000000000000ll), static_cast(100000000000000000ll), i10e18, i10e18 * 10ll, i10e18 * 100ll, i10e18 * 1000ll, i10e18 * 10000ll, i10e18 * 100000ll, i10e18 * 1000000ll, i10e18 * 10000000ll, i10e18 * 100000000ll, i10e18 * 1000000000ll, i10e18 * 10000000000ll, i10e18 * 100000000000ll, i10e18 * 1000000000000ll, i10e18 * 10000000000000ll, i10e18 * 100000000000000ll, i10e18 * 1000000000000000ll, i10e18 * 10000000000000000ll, i10e18 * 100000000000000000ll, i10e18 * 100000000000000000ll * 10ll, i10e18 * 100000000000000000ll * 100ll, i10e18 * 100000000000000000ll * 1000ll, i10e18 * 100000000000000000ll * 10000ll, i10e18 * 100000000000000000ll * 100000ll, i10e18 * 100000000000000000ll * 1000000ll, i10e18 * 100000000000000000ll * 10000000ll, i10e18 * 100000000000000000ll * 100000000ll, i10e18 * 100000000000000000ll * 1000000000ll, i10e18 * 100000000000000000ll * 10000000000ll, i10e18 * 100000000000000000ll * 100000000000ll, i10e18 * 100000000000000000ll * 1000000000000ll, i10e18 * 100000000000000000ll * 10000000000000ll, i10e18 * 100000000000000000ll * 100000000000000ll, i10e18 * 100000000000000000ll * 1000000000000000ll, i10e18 * 100000000000000000ll * 10000000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 1000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 1000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 1000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 1000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 1000000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 10000000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 10ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 100ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 1000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 10000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 100000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 1000000ll, i10e18 * 100000000000000000ll * 100000000000000000ll * 100000000000000000ll * 10000000ll, }; return values[x]; } } /// intExp10 returning the type T. template constexpr T intExp10OfSize(int x) { if constexpr (sizeof(T) <= 4) return static_cast(common::exp10_i32(x)); else if constexpr (sizeof(T) <= 8) return common::exp10_i64(x); else if constexpr (sizeof(T) <= 16) return common::exp10_i128(x); else return common::exp10_i256(x); }