From b356b219b6ad8c26108e1cb7a2ac8d46e805bf0d Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 30 Jul 2026 08:53:49 -0400 Subject: [PATCH 1/4] Drop the _t from the type names --- .github/workflows/amalgamate.yml | 2 +- .github/workflows/ci.yml | 6 +- README.md | 4 +- .../data/benchmarks-linux-arm32/i128.json | 262 +- .../data/benchmarks-linux-arm32/u128.json | 274 +- .../data/benchmarks-linux-arm64/i128.json | 260 +- .../data/benchmarks-linux-arm64/u128.json | 272 +- .../data/benchmarks-linux-ppc64le/i128.json | 260 +- .../data/benchmarks-linux-ppc64le/u128.json | 272 +- .../data/benchmarks-linux-s390x/i128.json | 260 +- .../data/benchmarks-linux-s390x/u128.json | 272 +- .../ROOT/data/benchmarks-linux-x64/i128.json | 260 +- .../ROOT/data/benchmarks-linux-x64/u128.json | 272 +- .../ROOT/data/benchmarks-linux-x86/i128.json | 262 +- .../ROOT/data/benchmarks-linux-x86/u128.json | 274 +- .../data/benchmarks-macos-arm64/i128.json | 260 +- .../data/benchmarks-macos-arm64/u128.json | 272 +- .../data/benchmarks-windows-arm64/i128.json | 260 +- .../data/benchmarks-windows-arm64/u128.json | 272 +- .../data/benchmarks-windows-x64/i128.json | 260 +- .../data/benchmarks-windows-x64/u128.json | 272 +- .../data/benchmarks-windows-x86/i128.json | 260 +- .../data/benchmarks-windows-x86/u128.json | 272 +- doc/modules/ROOT/nav.adoc | 36 +- doc/modules/ROOT/pages/api_reference.adoc | 50 +- doc/modules/ROOT/pages/bit.adoc | 28 +- doc/modules/ROOT/pages/charconv.adoc | 12 +- .../ROOT/pages/comp_to_multiprecision.adoc | 4 +- doc/modules/ROOT/pages/config.adoc | 2 +- doc/modules/ROOT/pages/cstdlib.adoc | 12 +- doc/modules/ROOT/pages/design.adoc | 12 +- doc/modules/ROOT/pages/examples.adoc | 126 +- doc/modules/ROOT/pages/file_structure.adoc | 4 +- doc/modules/ROOT/pages/hash.adoc | 22 +- doc/modules/ROOT/pages/i128_benchmarks.adoc | 28 +- doc/modules/ROOT/pages/int128_t.adoc | 254 +- doc/modules/ROOT/pages/literals.adoc | 20 +- doc/modules/ROOT/pages/mixed_type_ops.adoc | 108 +- doc/modules/ROOT/pages/numeric.adoc | 60 +- doc/modules/ROOT/pages/printer.adoc | 18 +- doc/modules/ROOT/pages/random.adoc | 6 +- doc/modules/ROOT/pages/release_notes.adoc | 26 +- doc/modules/ROOT/pages/stream.adoc | 8 +- doc/modules/ROOT/pages/string.adoc | 8 +- doc/modules/ROOT/pages/u128_benchmarks.adoc | 28 +- doc/modules/ROOT/pages/uint128_t.adoc | 244 +- doc/modules/ROOT/pages/utilities.adoc | 46 +- doc/render_benchmarks.py | 4 +- examples/basic_arithmetic.cpp | 16 +- examples/bit.cpp | 8 +- examples/charconv.cpp | 30 +- examples/checked_arithmetic.cpp | 28 +- examples/construction.cpp | 68 +- examples/container_hash.cpp | 50 +- examples/cstdlib.cpp | 26 +- examples/cuda.cu | 2 +- examples/cuda_primality.cu | 14 +- examples/fmt_format.cpp | 24 +- examples/hello_world.cpp | 4 +- examples/integer_comparison.cpp | 26 +- examples/integer_division.cpp | 24 +- examples/math_and_random.cpp | 16 +- examples/mixed_type_arithmetic.cpp | 10 +- examples/numeric_algorithms.cpp | 46 +- examples/rollover.cpp | 24 +- examples/saturating_arithmetic.cpp | 22 +- examples/stream.cpp | 42 +- examples/sycl.cpp | 2 +- examples/sycl_accumulate.cpp | 30 +- examples/to_string.cpp | 34 +- extra/int128.natvis | 10 +- extra/int128_printer_gdb.py | 26 +- extra/int128_printer_lldb.py | 20 +- extra/int128_printer_msvc.cpp | 8 +- extra/int128_printer_msvc.natvis | 4 +- extra/single_include/boost/int128.hpp | 2232 ++++++++--------- include/boost/int128/bit.hpp | 42 +- include/boost/int128/charconv.hpp | 210 +- include/boost/int128/climits.hpp | 6 +- include/boost/int128/cstdlib.hpp | 22 +- include/boost/int128/detail/clz.hpp | 2 +- include/boost/int128/detail/common_mul.hpp | 2 +- include/boost/int128/detail/config.hpp | 28 +- include/boost/int128/detail/conversions.hpp | 186 +- include/boost/int128/detail/fwd.hpp | 4 +- include/boost/int128/detail/int128_imp.hpp | 694 ++--- .../boost/int128/detail/mini_from_chars.hpp | 20 +- include/boost/int128/detail/mini_to_chars.hpp | 12 +- include/boost/int128/detail/uint128_imp.hpp | 768 +++--- include/boost/int128/fmt_format.hpp | 28 +- include/boost/int128/format.hpp | 24 +- include/boost/int128/hash.hpp | 16 +- include/boost/int128/iostream.hpp | 2 +- include/boost/int128/literals.hpp | 32 +- include/boost/int128/numeric.hpp | 252 +- include/boost/int128/random.hpp | 40 +- include/boost/int128/string.hpp | 4 +- include/boost/int128/utilities.hpp | 116 +- module/int128.cppm | 8 +- module/quick_test.cpp | 2 +- test/benchmark_i128.cpp | 46 +- test/benchmark_results.hpp | 6 +- test/benchmark_u128.cpp | 50 +- .../literals_base_prefix_fail.cpp | 2 +- .../utilities_comparison_fail.cpp | 2 +- test/decimal_github_issue_1260.cpp | 20 +- .../test_fuzzing_add_versus_wide_int.cpp | 6 +- .../test_fuzzing_div_versus_wide_int.cpp | 6 +- .../test_fuzzing_mul_versus_wide_int.cpp | 6 +- .../test_fuzzing_sub_versus_wide_int.cpp | 6 +- test/github_issue_207.cpp | 6 +- test/github_issue_210.cpp | 2 +- test/github_issue_221.cpp | 4 +- test/github_issue_272.cpp | 4 +- test/github_issue_377.cpp | 68 +- test/github_issue_432.cpp | 50 +- test/limits_link_1.cpp | 4 +- test/limits_link_2.cpp | 4 +- test/sycl_test.hpp | 6 +- test/test_bit.cpp | 48 +- test/test_bit_ceil.cu | 2 +- test/test_bit_ceil_sycl.cpp | 6 +- test/test_bit_floor.cu | 2 +- test/test_bit_floor_sycl.cpp | 6 +- test/test_bit_width.cu | 2 +- test/test_bit_width_sycl.cpp | 6 +- test/test_boundaries.cpp | 34 +- test/test_builtin_parity.cpp | 208 +- test/test_byteswap.cu | 2 +- test/test_byteswap_sycl.cpp | 6 +- test/test_ckd.cpp | 144 +- test/test_climits.cpp | 6 +- test/test_consteval_funcs.cpp | 6 +- test/test_constexpr_boundaries.cpp | 30 +- test/test_container_hash.cpp | 112 +- test/test_countl_one.cu | 2 +- test/test_countl_one_sycl.cpp | 6 +- test/test_countl_zero.cu | 2 +- test/test_countl_zero_sycl.cpp | 6 +- test/test_countr_one.cu | 2 +- test/test_countr_one_sycl.cpp | 6 +- test/test_countr_zero.cu | 2 +- test/test_countr_zero_sycl.cpp | 6 +- test/test_cross_type_assign.cpp | 144 +- test/test_div.cpp | 48 +- test/test_div_primitives.cpp | 20 +- test/test_fmt_format.cpp | 36 +- test/test_format.cpp | 36 +- test/test_from_chars_bases.cpp | 108 +- test/test_gcd_lcm.cpp | 30 +- test/test_has_single_bit.cu | 2 +- test/test_has_single_bit_sycl.cpp | 6 +- test/test_hash.cpp | 124 +- test/test_i128.cpp | 204 +- test/test_i128_no_sign_conv.cpp | 80 +- test/test_int_div.cpp | 280 +-- test/test_integer_comparison.cpp | 212 +- test/test_ipow.cpp | 146 +- test/test_isqrt.cpp | 120 +- test/test_layout.cpp | 76 +- test/test_limits_i128.cpp | 52 +- test/test_limits_u128.cpp | 52 +- test/test_literals.cpp | 98 +- test/test_midpoint.cpp | 28 +- test/test_mixed_type_sign_compare.cpp | 20 +- test/test_mixed_type_sign_conversion.cpp | 24 +- test/test_num_digits.cpp | 20 +- test/test_popcount.cu | 2 +- test/test_popcount_sycl.cpp | 6 +- test/test_powm.cpp | 162 +- test/test_rotl.cu | 2 +- test/test_rotl_sycl.cpp | 6 +- test/test_rotr.cu | 2 +- test/test_rotr_sycl.cpp | 6 +- test/test_saturating_arith.cpp | 170 +- test/test_sign_compare.cpp | 4 +- test/test_signed_add.cu | 2 +- test/test_signed_add_sycl.cpp | 6 +- test/test_signed_and.cu | 2 +- test/test_signed_and_sycl.cpp | 6 +- test/test_signed_cstdlib_div.cu | 2 +- test/test_signed_cstdlib_div_sycl.cpp | 6 +- test/test_signed_div.cu | 2 +- test/test_signed_div_sycl.cpp | 6 +- test/test_signed_eq.cu | 2 +- test/test_signed_eq_sycl.cpp | 6 +- test/test_signed_from_chars.cu | 2 +- test/test_signed_from_chars_bases.cu | 2 +- test/test_signed_from_chars_bases_sycl.cpp | 10 +- test/test_signed_from_chars_sycl.cpp | 4 +- test/test_signed_gcd.cu | 2 +- test/test_signed_gcd_sycl.cpp | 6 +- test/test_signed_ge.cu | 2 +- test/test_signed_ge_sycl.cpp | 6 +- test/test_signed_gt.cu | 2 +- test/test_signed_gt_sycl.cpp | 6 +- test/test_signed_lcm.cu | 2 +- test/test_signed_lcm_sycl.cpp | 6 +- test/test_signed_le.cu | 2 +- test/test_signed_le_sycl.cpp | 6 +- test/test_signed_left_shift.cu | 2 +- test/test_signed_left_shift_sycl.cpp | 6 +- test/test_signed_literals.cu | 8 +- test/test_signed_literals_sycl.cpp | 6 +- test/test_signed_lt.cu | 2 +- test/test_signed_lt_sycl.cpp | 6 +- test/test_signed_midpoint.cu | 2 +- test/test_signed_midpoint_sycl.cpp | 6 +- test/test_signed_mod.cu | 2 +- test/test_signed_mod_sycl.cpp | 6 +- test/test_signed_mul.cu | 2 +- test/test_signed_mul_sycl.cpp | 6 +- test/test_signed_ne.cu | 2 +- test/test_signed_ne_sycl.cpp | 6 +- test/test_signed_not.cu | 2 +- test/test_signed_not_sycl.cpp | 6 +- test/test_signed_or.cu | 2 +- test/test_signed_or_sycl.cpp | 6 +- test/test_signed_right_shift.cu | 2 +- test/test_signed_right_shift_sycl.cpp | 6 +- test/test_signed_saturating_add.cu | 2 +- test/test_signed_saturating_add_sycl.cpp | 6 +- test/test_signed_saturating_div.cu | 2 +- test/test_signed_saturating_div_sycl.cpp | 6 +- test/test_signed_saturating_mul.cu | 2 +- test/test_signed_saturating_mul_sycl.cpp | 6 +- test/test_signed_saturating_sub.cu | 2 +- test/test_signed_saturating_sub_sycl.cpp | 6 +- test/test_signed_sub.cu | 2 +- test/test_signed_sub_sycl.cpp | 6 +- test/test_signed_to_chars.cu | 2 +- test/test_signed_to_chars_bases.cu | 2 +- test/test_signed_to_chars_bases_sycl.cpp | 10 +- test/test_signed_to_chars_sycl.cpp | 4 +- test/test_signed_to_unsigned_conversion.cu | 4 +- ...est_signed_to_unsigned_conversion_sycl.cpp | 8 +- test/test_signed_xor.cu | 2 +- test/test_signed_xor_sycl.cpp | 6 +- test/test_spaceship_operator.cpp | 4 +- test/test_stream.cpp | 64 +- test/test_to_string.cpp | 16 +- test/test_u128.cpp | 220 +- test/test_u128_no_sign_conv.cpp | 78 +- test/test_unsigned_add.cu | 2 +- test/test_unsigned_add_sycl.cpp | 6 +- test/test_unsigned_and.cu | 2 +- test/test_unsigned_and_sycl.cpp | 6 +- test/test_unsigned_cstdlib_div.cu | 2 +- test/test_unsigned_cstdlib_div_sycl.cpp | 6 +- test/test_unsigned_div.cu | 2 +- test/test_unsigned_div_sycl.cpp | 6 +- test/test_unsigned_eq.cu | 2 +- test/test_unsigned_eq_sycl.cpp | 6 +- test/test_unsigned_from_chars.cu | 2 +- test/test_unsigned_from_chars_bases.cu | 2 +- test/test_unsigned_from_chars_bases_sycl.cpp | 10 +- test/test_unsigned_from_chars_sycl.cpp | 4 +- test/test_unsigned_gcd.cu | 2 +- test/test_unsigned_gcd_sycl.cpp | 6 +- test/test_unsigned_ge.cu | 2 +- test/test_unsigned_ge_sycl.cpp | 6 +- test/test_unsigned_gt.cu | 2 +- test/test_unsigned_gt_sycl.cpp | 6 +- test/test_unsigned_lcm.cu | 2 +- test/test_unsigned_lcm_sycl.cpp | 6 +- test/test_unsigned_le.cu | 2 +- test/test_unsigned_le_sycl.cpp | 6 +- test/test_unsigned_left_shift.cu | 2 +- test/test_unsigned_left_shift_sycl.cpp | 6 +- test/test_unsigned_literals.cu | 8 +- test/test_unsigned_literals_sycl.cpp | 6 +- test/test_unsigned_lt.cu | 2 +- test/test_unsigned_lt_sycl.cpp | 6 +- test/test_unsigned_midpoint.cu | 2 +- test/test_unsigned_midpoint_sycl.cpp | 6 +- test/test_unsigned_mod.cu | 2 +- test/test_unsigned_mod_sycl.cpp | 6 +- test/test_unsigned_mul.cu | 2 +- test/test_unsigned_mul_sycl.cpp | 6 +- test/test_unsigned_ne.cu | 2 +- test/test_unsigned_ne_sycl.cpp | 6 +- test/test_unsigned_not.cu | 2 +- test/test_unsigned_not_sycl.cpp | 6 +- test/test_unsigned_or.cu | 2 +- test/test_unsigned_or_sycl.cpp | 6 +- test/test_unsigned_right_shift.cu | 2 +- test/test_unsigned_right_shift_sycl.cpp | 6 +- test/test_unsigned_saturating_add.cu | 2 +- test/test_unsigned_saturating_add_sycl.cpp | 6 +- test/test_unsigned_saturating_div.cu | 2 +- test/test_unsigned_saturating_div_sycl.cpp | 6 +- test/test_unsigned_saturating_mul.cu | 2 +- test/test_unsigned_saturating_mul_sycl.cpp | 6 +- test/test_unsigned_saturating_sub.cu | 2 +- test/test_unsigned_saturating_sub_sycl.cpp | 6 +- test/test_unsigned_sub.cu | 2 +- test/test_unsigned_sub_sycl.cpp | 6 +- test/test_unsigned_to_chars.cu | 2 +- test/test_unsigned_to_chars_bases.cu | 2 +- test/test_unsigned_to_chars_bases_sycl.cpp | 10 +- test/test_unsigned_to_chars_sycl.cpp | 4 +- test/test_unsigned_to_signed_conversion.cu | 4 +- ...est_unsigned_to_signed_conversion_sycl.cpp | 8 +- test/test_unsigned_xor.cu | 2 +- test/test_unsigned_xor_sycl.cpp | 6 +- test/test_x64_msvc_div.cpp | 20 +- 306 files changed, 8037 insertions(+), 8037 deletions(-) diff --git a/.github/workflows/amalgamate.yml b/.github/workflows/amalgamate.yml index 221c878c..8fcfd239 100644 --- a/.github/workflows/amalgamate.yml +++ b/.github/workflows/amalgamate.yml @@ -66,7 +66,7 @@ jobs: return 2; } - if (saturating_add(a, b) != (std::numeric_limits::max)()) + if (saturating_add(a, b) != (std::numeric_limits::max)()) { return 3; } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13a58ba7..deede299 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -997,7 +997,7 @@ jobs: #include int main() { using namespace boost::int128; - uint128_t d{456}; + uint128 d{456}; std::cout << "Value: " << d << "\n"; return 0; } @@ -1075,7 +1075,7 @@ jobs: #include int main() { using namespace boost::int128; - uint128_t d{42}; + uint128 d{42}; std::cout << "Value: " << d << "\n"; return 0; } @@ -1145,7 +1145,7 @@ jobs: #include int main() { using namespace boost::int128; - uint128_t d{123}; + uint128 d{123}; std::cout << "Value: " << d << "\n"; return 0; } diff --git a/README.md b/README.md index 4a2936f1..230aaeff 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ Int128 provides 2 types: namespace boost { namespace int128 { -struct uint128_t; -struct int128_t; +struct uint128; +struct int128; } //namespace int128 } //namespace boost diff --git a/doc/modules/ROOT/data/benchmarks-linux-arm32/i128.json b/doc/modules/ROOT/data/benchmarks-linux-arm32/i128.json index 1c7c19a9..7aef0e9c 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-arm32/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-arm32/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "ARM32", @@ -8,136 +8,136 @@ "cxxstd": 202002, "elements": 2000000, "repetitions": 5, - "baseline": "boost::mp::int128_t", - "implementations": ["int128_t", "boost::mp::int128_t"], + "baseline": "boost::mp::int128", + "implementations": ["int128", "boost::mp::int128"], "results": [ - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 134350}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 138077}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 222230}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 217297}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 216908}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 216912}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1149622}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 278729}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 285825}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 299308}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 280007}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 253360}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 277894}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1677063}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 86697}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 923569}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 83835}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1144519}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 128954}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2168225}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 2572613}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2921784}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 2466122}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2693782}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 9025625}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 15392895}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 11982284}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 13221533}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 160078}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 161518}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 205651}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 204640}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 204467}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 206841}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1143762}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 132801}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 141461}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 209310}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 211931}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 212082}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 212542}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1120664}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 85241}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 853523}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 84261}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 786805}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 128173}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1455716}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 1233721}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2497533}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1250773}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1980038}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 132251}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 135318}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 161514}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 158944}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 158727}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 161057}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 908257}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 97395}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 98065}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 173039}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 178417}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 179433}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 176556}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 903588}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 85174}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1367981}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 83658}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1265644}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 128209}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1673418}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 5017049}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 8160044}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 5084379}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 7667723}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 132223}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 137506}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 161094}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 158872}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 158867}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 161458}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 910483}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 96907}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 97982}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 120163}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 122889}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 123602}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 121651}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 683654}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 85173}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1315375}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 84214}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1219488}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 128434}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1673819}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 5004822}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 8132982}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 5026178}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 7704325}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 166397}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 169127}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 215562}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 216792}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 216358}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 214771}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1199464}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 154986}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 157386}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 206950}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 210651}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 209776}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 209331}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1149576}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 90313}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1105341}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 83826}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1065408}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 128179}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1710617}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 3477343}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 5506901}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 3495645}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 5094644}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 123323}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 1295215}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 337779}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 428232} + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 134350}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 138077}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 222230}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 217297}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 216908}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 216912}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1149622}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 278729}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 285825}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 299308}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 280007}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 253360}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 277894}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1677063}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 86697}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 923569}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 83835}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1144519}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 128954}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2168225}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 2572613}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2921784}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 2466122}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2693782}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 9025625}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 15392895}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 11982284}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 13221533}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 160078}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 161518}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 205651}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 204640}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 204467}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 206841}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1143762}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 132801}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 141461}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 209310}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 211931}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 212082}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 212542}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1120664}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 85241}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 853523}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 84261}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 786805}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 128173}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1455716}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 1233721}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2497533}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 1250773}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1980038}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 132251}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 135318}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 161514}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 158944}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 158727}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 161057}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 908257}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 97395}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 98065}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 173039}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 178417}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 179433}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 176556}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 903588}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 85174}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1367981}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 83658}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1265644}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 128209}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1673418}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 5017049}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 8160044}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 5084379}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 7667723}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 132223}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 137506}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 161094}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 158872}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 158867}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 161458}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 910483}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 96907}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 97982}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 120163}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 122889}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 123602}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 121651}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 683654}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 85173}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1315375}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 84214}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1219488}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 128434}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1673819}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 5004822}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 8132982}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 5026178}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 7704325}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 166397}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 169127}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 215562}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 216792}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 216358}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 214771}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 1199464}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 154986}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 157386}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 206950}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 210651}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 209776}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 209331}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1149576}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 90313}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1105341}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 83826}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1065408}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 128179}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1710617}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 3477343}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 5506901}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 3495645}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 5094644}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 123323}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 1295215}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 337779}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 428232} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-arm32/u128.json b/doc/modules/ROOT/data/benchmarks-linux-arm32/u128.json index 3e32f774..0f34035c 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-arm32/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-arm32/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "ARM32", @@ -8,142 +8,142 @@ "cxxstd": 202002, "elements": 2000000, "repetitions": 5, - "baseline": "boost::mp::uint128_t", - "implementations": ["uint128_t", "boost::mp::uint128_t"], + "baseline": "boost::mp::uint128", + "implementations": ["uint128", "boost::mp::uint128"], "results": [ - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 134379}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 141343}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 133014}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 132984}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 183283}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 129518}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 858327}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 135825}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 135131}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 270504}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 169292}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 197207}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 232584}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1142287}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 85389}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 766402}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 83905}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 960055}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 128535}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1912473}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 2116587}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 3581345}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 2605169}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 3202358}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 9235748}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 17825351}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 12149180}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 13809296}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 158519}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 168311}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 223533}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 257842}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 256611}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 223227}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1288596}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 111101}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 118299}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 170152}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 168970}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 171541}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 171499}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 912095}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 85300}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 675836}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 83679}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1053537}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 128326}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1363954}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1231058}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2779046}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1322017}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2210105}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 130547}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 141121}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 127599}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 127631}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 148344}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 123623}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 799324}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 73393}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 74891}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 84092}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 91127}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 130979}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 101400}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 556348}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 85277}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1162360}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 83656}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1335382}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 128223}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1567199}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 5004368}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 9435352}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 5128364}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 8666811}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 130553}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 141128}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 127560}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 127680}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 148152}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 123703}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 799311}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 72683}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 74765}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 79298}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 82812}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 82274}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 79529}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 471895}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 85306}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1117033}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 84183}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1261257}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 128219}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1581059}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 5015024}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 9441546}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 5080978}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 8694361}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 189726}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 199325}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 173706}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 179331}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 223638}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 181896}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1148095}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 99631}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 103730}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 133612}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 133587}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 135249}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 132038}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 738322}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 85164}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 970287}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 83783}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1257721}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 128178}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1306808}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 3858870}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 6092878}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 4059654}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 5190052}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 152838}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 1267952}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 223346}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 342923}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 56537}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 1914860}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 56461}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 980008}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 56443}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 979710} + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 134379}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 141343}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 133014}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 132984}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 183283}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 129518}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 858327}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 135825}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 135131}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 270504}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 169292}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 197207}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 232584}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1142287}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 85389}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 766402}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 83905}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 960055}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 128535}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1912473}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 2116587}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 3581345}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 2605169}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 3202358}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 9235748}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 17825351}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 12149180}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 13809296}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 158519}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 168311}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 223533}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 257842}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 256611}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 223227}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 1288596}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 111101}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 118299}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 170152}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 168970}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 171541}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 171499}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 912095}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 85300}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 675836}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 83679}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1053537}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 128326}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1363954}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 1231058}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2779046}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 1322017}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2210105}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 130547}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 141121}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 127599}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 127631}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 148344}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 123623}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 799324}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 73393}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 74891}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 84092}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 91127}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 130979}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 101400}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 556348}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 85277}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1162360}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 83656}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1335382}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 128223}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1567199}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 5004368}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 9435352}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 5128364}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 8666811}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 130553}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 141128}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 127560}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 127680}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 148152}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 123703}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 799311}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 72683}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 74765}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 79298}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 82812}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 82274}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 79529}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 471895}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 85306}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1117033}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 84183}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1261257}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 128219}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1581059}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 5015024}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 9441546}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 5080978}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 8694361}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 189726}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 199325}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 173706}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 179331}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 223638}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 181896}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 1148095}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 99631}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 103730}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 133612}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 133587}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 135249}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 132038}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 738322}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 85164}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 970287}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 83783}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1257721}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 128178}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1306808}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 3858870}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 6092878}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 4059654}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 5190052}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 152838}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 1267952}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 223346}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 342923}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 56537}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 1914860}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 56461}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 980008}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 56443}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 979710} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-arm64/i128.json b/doc/modules/ROOT/data/benchmarks-linux-arm64/i128.json index a3d0638f..4df57f56 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-arm64/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-arm64/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "__int128", - "implementations": ["__int128", "int128_t", "boost::mp::int128_t", "absl::int128"], + "implementations": ["__int128", "int128", "boost::mp::int128", "absl::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "__int128", "microseconds": 92810}, {"group": "two_word", "operation": "ne", "implementation": "__int128", "microseconds": 92239}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "__int128", "microseconds": 244637}, {"group": "two_word", "operation": "ge", "implementation": "__int128", "microseconds": 244070}, {"group": "two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 1159153}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 93959}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 93658}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 94106}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 91792}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 93133}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 90845}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 557613}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 327932}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 317258}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 292964}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 283789}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 290141}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 293354}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1805584}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 93959}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 93658}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 94106}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 91792}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 93133}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 90845}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 557613}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 327932}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 317258}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 292964}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 283789}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 290141}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 293354}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1805584}, {"group": "two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 90714}, {"group": "two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 95936}, {"group": "two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 240911}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 239174}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 1155865}, {"group": "two_word", "operation": "add", "implementation": "__int128", "microseconds": 88108}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 89265}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 175781}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 89265}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 175781}, {"group": "two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 85922}, {"group": "two_word", "operation": "sub", "implementation": "__int128", "microseconds": 88357}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 86946}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 322766}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 86946}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 322766}, {"group": "two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 84589}, {"group": "two_word", "operation": "mul", "implementation": "__int128", "microseconds": 83740}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 86761}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 194017}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 86761}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 194017}, {"group": "two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 87777}, {"group": "two_word", "operation": "div", "implementation": "__int128", "microseconds": 550352}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 592011}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 642713}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 592011}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 642713}, {"group": "two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 560147}, {"group": "two_word", "operation": "mod", "implementation": "__int128", "microseconds": 559528}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 598346}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 672336}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 598346}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 672336}, {"group": "two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 552913}, {"group": "two_word", "operation": "div64", "implementation": "__int128", "microseconds": 1264553}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 1531117}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 1532307}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 1531117}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 1532307}, {"group": "two_word", "operation": "div64", "implementation": "absl::int128", "microseconds": 1262547}, {"group": "two_word", "operation": "div32", "implementation": "__int128", "microseconds": 1331800}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 1176858}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 1326673}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 1176858}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 1326673}, {"group": "two_word", "operation": "div32", "implementation": "absl::int128", "microseconds": 1331749}, {"group": "one_word", "operation": "eq", "implementation": "__int128", "microseconds": 94381}, {"group": "one_word", "operation": "ne", "implementation": "__int128", "microseconds": 99818}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "__int128", "microseconds": 267378}, {"group": "one_word", "operation": "ge", "implementation": "__int128", "microseconds": 265864}, {"group": "one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 1270872}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 93362}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 93447}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 92168}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 93627}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 102926}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 97595}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 573270}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 328261}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 334685}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 294791}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 293743}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 306734}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 292688}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1851027}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 93362}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 93447}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 92168}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 93627}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 102926}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 97595}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 573270}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 328261}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 334685}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 294791}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 293743}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 306734}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 292688}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1851027}, {"group": "one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 99726}, {"group": "one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 96601}, {"group": "one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 308026}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 265397}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 1304508}, {"group": "one_word", "operation": "add", "implementation": "__int128", "microseconds": 85737}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 85352}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 378084}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 85352}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 378084}, {"group": "one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 88824}, {"group": "one_word", "operation": "sub", "implementation": "__int128", "microseconds": 87850}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 85238}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 442516}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 85238}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 442516}, {"group": "one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 91059}, {"group": "one_word", "operation": "mul", "implementation": "__int128", "microseconds": 85492}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 86360}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 194243}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 86360}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 194243}, {"group": "one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 87837}, {"group": "one_word", "operation": "div", "implementation": "__int128", "microseconds": 562225}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 330268}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 735908}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 330268}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 735908}, {"group": "one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 558200}, {"group": "one_word", "operation": "mod", "implementation": "__int128", "microseconds": 548690}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 297050}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 726252}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 297050}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 726252}, {"group": "one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 542242}, {"group": "two_one_word", "operation": "eq", "implementation": "__int128", "microseconds": 94231}, {"group": "two_one_word", "operation": "ne", "implementation": "__int128", "microseconds": 91661}, @@ -122,20 +122,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "__int128", "microseconds": 96112}, {"group": "two_one_word", "operation": "ge", "implementation": "__int128", "microseconds": 89252}, {"group": "two_one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 551299}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 91087}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 91450}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 90824}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 90781}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 93442}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 90822}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 548513}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 180933}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 175641}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 168580}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 167965}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 166762}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 168868}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1028861}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 91087}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 91450}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 90824}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 90781}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 93442}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 90822}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 548513}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 180933}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 175641}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 168580}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 167965}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 166762}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 168868}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1028861}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 90112}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 91515}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 91970}, @@ -144,24 +144,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 90578}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 549481}, {"group": "two_one_word", "operation": "add", "implementation": "__int128", "microseconds": 84996}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 82149}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 170077}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 82149}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 170077}, {"group": "two_one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 83718}, {"group": "two_one_word", "operation": "sub", "implementation": "__int128", "microseconds": 82952}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 81958}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 170687}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 81958}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 170687}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 85156}, {"group": "two_one_word", "operation": "mul", "implementation": "__int128", "microseconds": 83962}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 84762}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 192107}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 84762}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 192107}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 86570}, {"group": "two_one_word", "operation": "div", "implementation": "__int128", "microseconds": 747051}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 819306}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 907036}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 819306}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 907036}, {"group": "two_one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 745494}, {"group": "two_one_word", "operation": "mod", "implementation": "__int128", "microseconds": 755976}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 814190}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 877777}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 814190}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 877777}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 755490}, {"group": "one_two_word", "operation": "eq", "implementation": "__int128", "microseconds": 91959}, {"group": "one_two_word", "operation": "ne", "implementation": "__int128", "microseconds": 93179}, @@ -170,20 +170,20 @@ {"group": "one_two_word", "operation": "gt", "implementation": "__int128", "microseconds": 94037}, {"group": "one_two_word", "operation": "ge", "implementation": "__int128", "microseconds": 91801}, {"group": "one_two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 552142}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 91478}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 90697}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 89118}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 88834}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 90209}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 86919}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 537374}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 185126}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 171807}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 162455}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 162560}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 164047}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 163226}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1009355}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 91478}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 90697}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 89118}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 88834}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 90209}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 86919}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 537374}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 185126}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 171807}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 162455}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 162560}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 164047}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 163226}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1009355}, {"group": "one_two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 93054}, {"group": "one_two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 92550}, {"group": "one_two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 89629}, @@ -192,24 +192,24 @@ {"group": "one_two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 92219}, {"group": "one_two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 547388}, {"group": "one_two_word", "operation": "add", "implementation": "__int128", "microseconds": 84567}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 83491}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 172641}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 83491}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 172641}, {"group": "one_two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 85516}, {"group": "one_two_word", "operation": "sub", "implementation": "__int128", "microseconds": 84074}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 82595}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 175309}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 82595}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 175309}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 84927}, {"group": "one_two_word", "operation": "mul", "implementation": "__int128", "microseconds": 82821}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 83126}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 190585}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 83126}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 190585}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 85741}, {"group": "one_two_word", "operation": "div", "implementation": "__int128", "microseconds": 747268}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 818962}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 908127}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 818962}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 908127}, {"group": "one_two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 744227}, {"group": "one_two_word", "operation": "mod", "implementation": "__int128", "microseconds": 755923}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 809486}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 880374}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 809486}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 880374}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 756424}, {"group": "random_width", "operation": "eq", "implementation": "__int128", "microseconds": 92793}, {"group": "random_width", "operation": "ne", "implementation": "__int128", "microseconds": 92767}, @@ -218,20 +218,20 @@ {"group": "random_width", "operation": "gt", "implementation": "__int128", "microseconds": 341953}, {"group": "random_width", "operation": "ge", "implementation": "__int128", "microseconds": 346719}, {"group": "random_width", "operation": "comparisons", "implementation": "__int128", "microseconds": 1548448}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 93743}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 93068}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 189078}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 191149}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 223589}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 187857}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 978632}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 427108}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 420579}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 380888}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 377691}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 373834}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 378206}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2358441}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 93743}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 93068}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 189078}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 191149}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 223589}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 187857}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 978632}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 427108}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 420579}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 380888}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 377691}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 373834}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 378206}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2358441}, {"group": "random_width", "operation": "eq", "implementation": "absl::int128", "microseconds": 101443}, {"group": "random_width", "operation": "ne", "implementation": "absl::int128", "microseconds": 98404}, {"group": "random_width", "operation": "lt", "implementation": "absl::int128", "microseconds": 351608}, @@ -240,32 +240,32 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::int128", "microseconds": 347625}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 1576854}, {"group": "random_width", "operation": "add", "implementation": "__int128", "microseconds": 86459}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 87101}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 221898}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 87101}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 221898}, {"group": "random_width", "operation": "add", "implementation": "absl::int128", "microseconds": 88399}, {"group": "random_width", "operation": "sub", "implementation": "__int128", "microseconds": 87087}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 85946}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 455419}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 85946}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 455419}, {"group": "random_width", "operation": "sub", "implementation": "absl::int128", "microseconds": 86913}, {"group": "random_width", "operation": "mul", "implementation": "__int128", "microseconds": 84919}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 84091}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 187422}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 84091}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 187422}, {"group": "random_width", "operation": "mul", "implementation": "absl::int128", "microseconds": 83956}, {"group": "random_width", "operation": "div", "implementation": "__int128", "microseconds": 814967}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 767734}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 966484}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 767734}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 966484}, {"group": "random_width", "operation": "div", "implementation": "absl::int128", "microseconds": 812755}, {"group": "random_width", "operation": "mod", "implementation": "__int128", "microseconds": 839380}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 767831}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 953283}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 767831}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 953283}, {"group": "random_width", "operation": "mod", "implementation": "absl::int128", "microseconds": 841903}, {"group": "random_width", "operation": "shl", "implementation": "__int128", "microseconds": 96550}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 96402}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 196535}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 96402}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 196535}, {"group": "random_width", "operation": "shl", "implementation": "absl::int128", "microseconds": 94459}, {"group": "random_width", "operation": "shr", "implementation": "__int128", "microseconds": 123826}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 125975}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 179188}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 125975}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 179188}, {"group": "random_width", "operation": "shr", "implementation": "absl::int128", "microseconds": 120637} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-arm64/u128.json b/doc/modules/ROOT/data/benchmarks-linux-arm64/u128.json index fe2d1606..807c32f9 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-arm64/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-arm64/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "unsigned __int128", - "implementations": ["unsigned __int128", "uint128_t", "boost::mp::uint128_t", "absl::uint128"], + "implementations": ["unsigned __int128", "uint128", "boost::mp::uint128", "absl::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 96801}, {"group": "two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 96082}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 244191}, {"group": "two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 241682}, {"group": "two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 1161574}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 97805}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 95817}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 94158}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 92586}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 92867}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 94307}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 567670}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 267582}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 273524}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 244110}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 243705}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 243242}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 240731}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1513008}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 97805}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 95817}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 94158}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 92586}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 92867}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 94307}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 567670}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 267582}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 273524}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 244110}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 243705}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 243242}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 240731}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1513008}, {"group": "two_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 99060}, {"group": "two_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 95700}, {"group": "two_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 244708}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 240854}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1172962}, {"group": "two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 86249}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 88105}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 85598}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 88105}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 85598}, {"group": "two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 86037}, {"group": "two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 86948}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 87315}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 86824}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 87315}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 86824}, {"group": "two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 87684}, {"group": "two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86032}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 85119}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 83537}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 85119}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 83537}, {"group": "two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 86042}, {"group": "two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 493501}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 541863}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 521749}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 541863}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 521749}, {"group": "two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 487186}, {"group": "two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 525969}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 562398}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 562015}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 562398}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 562015}, {"group": "two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 515464}, {"group": "two_word", "operation": "div64", "implementation": "unsigned __int128", "microseconds": 1355397}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 1574228}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 1354652}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 1574228}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 1354652}, {"group": "two_word", "operation": "div64", "implementation": "absl::uint128", "microseconds": 1364685}, {"group": "two_word", "operation": "div32", "implementation": "unsigned __int128", "microseconds": 1321763}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 1233252}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 1321807}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 1233252}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 1321807}, {"group": "two_word", "operation": "div32", "implementation": "absl::uint128", "microseconds": 1321967}, {"group": "one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 92051}, {"group": "one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 93937}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 262234}, {"group": "one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 277312}, {"group": "one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 1243734}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 95163}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 93344}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 95720}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 93386}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 95602}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 93001}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 566356}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 272521}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 278180}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 267528}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 270616}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 263357}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 273757}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1626063}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 95163}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 93344}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 95720}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 93386}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 95602}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 93001}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 566356}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 272521}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 278180}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 267528}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 270616}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 263357}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 273757}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1626063}, {"group": "one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 97822}, {"group": "one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 99060}, {"group": "one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 251911}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 267916}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1237959}, {"group": "one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 88077}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 85541}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 85793}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 85541}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 85793}, {"group": "one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 86958}, {"group": "one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 86856}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 89014}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 89227}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 89014}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 89227}, {"group": "one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 88207}, {"group": "one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 85139}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 87745}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 89291}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 87745}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 89291}, {"group": "one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 89372}, {"group": "one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 533785}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 281659}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 564345}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 281659}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 564345}, {"group": "one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 521453}, {"group": "one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 557004}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 273201}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 571544}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 273201}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 571544}, {"group": "two_one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 96163}, {"group": "two_one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 97740}, {"group": "two_one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 99260}, @@ -121,20 +121,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 92743}, {"group": "two_one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 96355}, {"group": "two_one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 576158}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 96780}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 93933}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 93654}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 95099}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 94698}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 95868}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 570146}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 108534}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 109212}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 96563}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 91327}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 90544}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 92831}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 589126}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 96780}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 93933}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 93654}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 95099}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 94698}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 95868}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 570146}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 108534}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 109212}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 96563}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 91327}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 90544}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 92831}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 589126}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 94204}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 94709}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 95971}, @@ -143,24 +143,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 94882}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 571079}, {"group": "two_one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 89155}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 88529}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 87142}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 88529}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 87142}, {"group": "two_one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 87942}, {"group": "two_one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 88961}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 88498}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 89095}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 88498}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 89095}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 89704}, {"group": "two_one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 89008}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 92265}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 90371}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 92265}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 90371}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 90639}, {"group": "two_one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 750350}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 821321}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 769254}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 821321}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 769254}, {"group": "two_one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 743601}, {"group": "two_one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 808167}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 826311}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 818923}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 826311}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 818923}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 803169}, {"group": "one_two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 93773}, {"group": "one_two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 94523}, @@ -169,39 +169,39 @@ {"group": "one_two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 91070}, {"group": "one_two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 95221}, {"group": "one_two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 564016}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 102034}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 97014}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 97099}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 95353}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 93043}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 93361}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 578018}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 107889}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 113665}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 96942}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 90981}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 89575}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 91579}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 590768}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 102034}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 97014}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 97099}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 95353}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 93043}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 93361}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 578018}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 107889}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 113665}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 96942}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 90981}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 89575}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 91579}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 590768}, {"group": "one_two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 89012}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 86165}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 88076}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 86165}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 88076}, {"group": "one_two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 87448}, {"group": "one_two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 87915}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 87620}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 87610}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 87620}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 87610}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 86748}, {"group": "one_two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 84979}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 85988}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 84912}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 85988}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 84912}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 87784}, {"group": "one_two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 747812}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 821471}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 770100}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 821471}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 770100}, {"group": "one_two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 742130}, {"group": "one_two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 806102}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 827260}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 819027}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 827260}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 819027}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 802308}, {"group": "random_width", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 95922}, {"group": "random_width", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 95308}, @@ -210,20 +210,20 @@ {"group": "random_width", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 338503}, {"group": "random_width", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 343466}, {"group": "random_width", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 1551148}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 97318}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 95404}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 190356}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 189786}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 189707}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 191920}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 954612}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 363832}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 357504}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 342125}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 342123}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 339635}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 345500}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 2090864}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 97318}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 95404}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 190356}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 189786}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 189707}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 191920}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 954612}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 363832}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 357504}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 342125}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 342123}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 339635}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 345500}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 2090864}, {"group": "random_width", "operation": "eq", "implementation": "absl::uint128", "microseconds": 94406}, {"group": "random_width", "operation": "ne", "implementation": "absl::uint128", "microseconds": 94266}, {"group": "random_width", "operation": "lt", "implementation": "absl::uint128", "microseconds": 342078}, @@ -232,44 +232,44 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::uint128", "microseconds": 346528}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1559081}, {"group": "random_width", "operation": "add", "implementation": "unsigned __int128", "microseconds": 88531}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 87204}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 87303}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 87204}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 87303}, {"group": "random_width", "operation": "add", "implementation": "absl::uint128", "microseconds": 87544}, {"group": "random_width", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 89194}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 90112}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 90873}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 90112}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 90873}, {"group": "random_width", "operation": "sub", "implementation": "absl::uint128", "microseconds": 87986}, {"group": "random_width", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86854}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 87632}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 88376}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 87632}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 88376}, {"group": "random_width", "operation": "mul", "implementation": "absl::uint128", "microseconds": 91189}, {"group": "random_width", "operation": "div", "implementation": "unsigned __int128", "microseconds": 732287}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 652951}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 766334}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 652951}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 766334}, {"group": "random_width", "operation": "div", "implementation": "absl::uint128", "microseconds": 722710}, {"group": "random_width", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 768287}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 662783}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 801508}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 662783}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 801508}, {"group": "random_width", "operation": "mod", "implementation": "absl::uint128", "microseconds": 758006}, {"group": "random_width", "operation": "shl", "implementation": "unsigned __int128", "microseconds": 100133}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 96703}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 102252}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 96703}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 102252}, {"group": "random_width", "operation": "shl", "implementation": "absl::uint128", "microseconds": 101008}, {"group": "random_width", "operation": "shr", "implementation": "unsigned __int128", "microseconds": 121744}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 122306}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 137232}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 122306}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 137232}, {"group": "random_width", "operation": "shr", "implementation": "absl::uint128", "microseconds": 129332}, {"group": "random_width", "operation": "and", "implementation": "unsigned __int128", "microseconds": 90304}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 91037}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 85571}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 91037}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 85571}, {"group": "random_width", "operation": "and", "implementation": "absl::uint128", "microseconds": 85928}, {"group": "random_width", "operation": "or", "implementation": "unsigned __int128", "microseconds": 85344}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 89197}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 86644}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 89197}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 86644}, {"group": "random_width", "operation": "or", "implementation": "absl::uint128", "microseconds": 88350}, {"group": "random_width", "operation": "xor", "implementation": "unsigned __int128", "microseconds": 92293}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 96052}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 90375}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 96052}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 90375}, {"group": "random_width", "operation": "xor", "implementation": "absl::uint128", "microseconds": 95313} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-ppc64le/i128.json b/doc/modules/ROOT/data/benchmarks-linux-ppc64le/i128.json index a4e3c65f..160561d8 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-ppc64le/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-ppc64le/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "ppc64le", @@ -9,7 +9,7 @@ "elements": 2000000, "repetitions": 5, "baseline": "__int128", - "implementations": ["__int128", "int128_t", "boost::mp::int128_t"], + "implementations": ["__int128", "int128", "boost::mp::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "__int128", "microseconds": 26864}, {"group": "two_word", "operation": "ne", "implementation": "__int128", "microseconds": 27009}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "__int128", "microseconds": 100523}, {"group": "two_word", "operation": "ge", "implementation": "__int128", "microseconds": 102917}, {"group": "two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 459794}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 77762}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 39509}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 67544}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 64008}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 63831}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 67331}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 381032}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 364361}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 160359}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 100099}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 105102}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 158090}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 99608}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 989542}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 77762}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 39509}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 67544}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 64008}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 63831}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 67331}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 381032}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 364361}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 160359}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 100099}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 105102}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 158090}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 99608}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 989542}, {"group": "two_word", "operation": "add", "implementation": "__int128", "microseconds": 25189}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 16398}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 141533}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 16398}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 141533}, {"group": "two_word", "operation": "sub", "implementation": "__int128", "microseconds": 105040}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 14722}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 213498}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 14722}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 213498}, {"group": "two_word", "operation": "mul", "implementation": "__int128", "microseconds": 16428}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 16394}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 123948}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 16394}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 123948}, {"group": "two_word", "operation": "div", "implementation": "__int128", "microseconds": 553701}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 773416}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 626008}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 773416}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 626008}, {"group": "two_word", "operation": "mod", "implementation": "__int128", "microseconds": 571472}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1002259}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 606271}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 1002259}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 606271}, {"group": "two_word", "operation": "div64", "implementation": "__int128", "microseconds": 799859}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 464233}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 1112953}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 464233}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 1112953}, {"group": "two_word", "operation": "div32", "implementation": "__int128", "microseconds": 711942}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 306547}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 696290}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 306547}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 696290}, {"group": "one_word", "operation": "eq", "implementation": "__int128", "microseconds": 26654}, {"group": "one_word", "operation": "ne", "implementation": "__int128", "microseconds": 26854}, {"group": "one_word", "operation": "lt", "implementation": "__int128", "microseconds": 117819}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "__int128", "microseconds": 90342}, {"group": "one_word", "operation": "ge", "implementation": "__int128", "microseconds": 128999}, {"group": "one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 483970}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 206909}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 46406}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 106080}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 68942}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 105957}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 106091}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 640793}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 472771}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 189717}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 168966}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 180580}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 205538}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 167614}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1385641}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 206909}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 46406}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 106080}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 68942}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 105957}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 106091}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 640793}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 472771}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 189717}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 168966}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 180580}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 205538}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 167614}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1385641}, {"group": "one_word", "operation": "add", "implementation": "__int128", "microseconds": 25007}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 16260}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 146183}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 16260}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 146183}, {"group": "one_word", "operation": "sub", "implementation": "__int128", "microseconds": 104772}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 14608}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 293091}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 14608}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 293091}, {"group": "one_word", "operation": "mul", "implementation": "__int128", "microseconds": 16165}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 16316}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 88763}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 16316}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 88763}, {"group": "one_word", "operation": "div", "implementation": "__int128", "microseconds": 565334}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 338201}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 604060}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 338201}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 604060}, {"group": "one_word", "operation": "mod", "implementation": "__int128", "microseconds": 657120}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 481117}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 688930}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 481117}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 688930}, {"group": "two_one_word", "operation": "eq", "implementation": "__int128", "microseconds": 26765}, {"group": "two_one_word", "operation": "ne", "implementation": "__int128", "microseconds": 26738}, {"group": "two_one_word", "operation": "lt", "implementation": "__int128", "microseconds": 42601}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "__int128", "microseconds": 42781}, {"group": "two_one_word", "operation": "ge", "implementation": "__int128", "microseconds": 40903}, {"group": "two_one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 221124}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 32010}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 39238}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 67236}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 63782}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 63808}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 67391}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 333846}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 326994}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 103070}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 82459}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 71271}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 74974}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 83561}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 742841}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 32010}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 39238}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 67236}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 63782}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 63808}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 67391}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 333846}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 326994}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 103070}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 82459}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 71271}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 74974}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 83561}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 742841}, {"group": "two_one_word", "operation": "add", "implementation": "__int128", "microseconds": 24957}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 16254}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 110034}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 16254}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 110034}, {"group": "two_one_word", "operation": "sub", "implementation": "__int128", "microseconds": 104878}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 14652}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 117085}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 14652}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 117085}, {"group": "two_one_word", "operation": "mul", "implementation": "__int128", "microseconds": 16214}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 16287}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 88624}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 16287}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 88624}, {"group": "two_one_word", "operation": "div", "implementation": "__int128", "microseconds": 577321}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 502335}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 599187}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 502335}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 599187}, {"group": "two_one_word", "operation": "mod", "implementation": "__int128", "microseconds": 591000}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 676605}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 625565}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 676605}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 625565}, {"group": "one_two_word", "operation": "eq", "implementation": "__int128", "microseconds": 26767}, {"group": "one_two_word", "operation": "ne", "implementation": "__int128", "microseconds": 26727}, {"group": "one_two_word", "operation": "lt", "implementation": "__int128", "microseconds": 42636}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "__int128", "microseconds": 42691}, {"group": "one_two_word", "operation": "ge", "implementation": "__int128", "microseconds": 40987}, {"group": "one_two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 221180}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 32082}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 39277}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 67327}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 63742}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 63772}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 67300}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 333966}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 326911}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 102816}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 81734}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 71290}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 74854}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 82631}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 740904}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 32082}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 39277}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 67327}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 63742}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 63772}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 67300}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 333966}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 326911}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 102816}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 81734}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 71290}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 74854}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 82631}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 740904}, {"group": "one_two_word", "operation": "add", "implementation": "__int128", "microseconds": 24994}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 16223}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 109873}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 16223}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 109873}, {"group": "one_two_word", "operation": "sub", "implementation": "__int128", "microseconds": 104652}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 14501}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 117271}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 14501}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 117271}, {"group": "one_two_word", "operation": "mul", "implementation": "__int128", "microseconds": 16208}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 16301}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 88677}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 16301}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 88677}, {"group": "one_two_word", "operation": "div", "implementation": "__int128", "microseconds": 577583}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 456790}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 598170}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 456790}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 598170}, {"group": "one_two_word", "operation": "mod", "implementation": "__int128", "microseconds": 587225}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 593808}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 589766}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 593808}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 589766}, {"group": "random_width", "operation": "eq", "implementation": "__int128", "microseconds": 26675}, {"group": "random_width", "operation": "ne", "implementation": "__int128", "microseconds": 26752}, {"group": "random_width", "operation": "lt", "implementation": "__int128", "microseconds": 96469}, @@ -168,40 +168,40 @@ {"group": "random_width", "operation": "gt", "implementation": "__int128", "microseconds": 91548}, {"group": "random_width", "operation": "ge", "implementation": "__int128", "microseconds": 95090}, {"group": "random_width", "operation": "comparisons", "implementation": "__int128", "microseconds": 428645}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 97740}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 60478}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 76063}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 75804}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 75196}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 76806}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 462487}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 388496}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 137411}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 122871}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 124370}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 124399}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 123025}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1021098}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 97740}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 60478}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 76063}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 75804}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 75196}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 76806}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 462487}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 388496}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 137411}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 122871}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 124370}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 124399}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 123025}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1021098}, {"group": "random_width", "operation": "add", "implementation": "__int128", "microseconds": 24939}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 16225}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 118021}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 16225}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 118021}, {"group": "random_width", "operation": "sub", "implementation": "__int128", "microseconds": 104630}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 14546}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 172685}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 14546}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 172685}, {"group": "random_width", "operation": "mul", "implementation": "__int128", "microseconds": 16136}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 16268}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 88742}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 16268}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 88742}, {"group": "random_width", "operation": "div", "implementation": "__int128", "microseconds": 614489}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 509815}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 629501}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 509815}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 629501}, {"group": "random_width", "operation": "mod", "implementation": "__int128", "microseconds": 627865}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 686382}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 642930}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 686382}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 642930}, {"group": "random_width", "operation": "shl", "implementation": "__int128", "microseconds": 82607}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 39393}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 287824}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 39393}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 287824}, {"group": "random_width", "operation": "shr", "implementation": "__int128", "microseconds": 132436}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 128904}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 186647} + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 128904}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 186647} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-ppc64le/u128.json b/doc/modules/ROOT/data/benchmarks-linux-ppc64le/u128.json index f013a1e2..ef37ffd0 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-ppc64le/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-ppc64le/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "ppc64le", @@ -9,7 +9,7 @@ "elements": 2000000, "repetitions": 5, "baseline": "unsigned __int128", - "implementations": ["unsigned __int128", "uint128_t", "boost::mp::uint128_t"], + "implementations": ["unsigned __int128", "uint128", "boost::mp::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 26830}, {"group": "two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 26989}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 67944}, {"group": "two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 71812}, {"group": "two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 357540}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 77816}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 39310}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 53887}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 56997}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 53426}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 53497}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 336050}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 169130}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 82036}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 67392}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 92386}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 68019}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 71497}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 552276}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 77816}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 39310}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 53887}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 56997}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 53426}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 53497}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 336050}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 169130}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 82036}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 67392}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 92386}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 68019}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 71497}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 552276}, {"group": "two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 25099}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 16352}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 25100}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 16352}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 25100}, {"group": "two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 25093}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 14600}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 25144}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 14600}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 25144}, {"group": "two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 16322}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 16404}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 16587}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 16404}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 16587}, {"group": "two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 524951}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 645297}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 479663}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 645297}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 479663}, {"group": "two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 484689}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 695620}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 544036}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 695620}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 544036}, {"group": "two_word", "operation": "div64", "implementation": "unsigned __int128", "microseconds": 921021}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 471234}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 767221}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 471234}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 767221}, {"group": "two_word", "operation": "div32", "implementation": "unsigned __int128", "microseconds": 645581}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 254559}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 644957}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 254559}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 644957}, {"group": "one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 26660}, {"group": "one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 26778}, {"group": "one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 83459}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 83815}, {"group": "one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 175367}, {"group": "one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 540328}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 207081}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 91216}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 69327}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 60896}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 60782}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 102399}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 592086}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 260941}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 233740}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 111309}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 144146}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 84244}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 175348}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1010174}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 207081}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 91216}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 69327}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 60896}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 60782}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 102399}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 592086}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 260941}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 233740}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 111309}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 144146}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 84244}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 175348}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1010174}, {"group": "one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 25144}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 16289}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 25069}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 16289}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 25069}, {"group": "one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 25085}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 14795}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 24955}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 14795}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 24955}, {"group": "one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 16193}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 16250}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 16237}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 16250}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 16237}, {"group": "one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 534118}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 345292}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 540302}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 345292}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 540302}, {"group": "one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 612959}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 335049}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 527806}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 335049}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 527806}, {"group": "two_one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 26695}, {"group": "two_one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 26865}, {"group": "two_one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 42707}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 42707}, {"group": "two_one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 40926}, {"group": "two_one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 221456}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 32161}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 39223}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 53385}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 56893}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 53243}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 53321}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 288637}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 128675}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 64695}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 42673}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 40914}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 42948}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 40855}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 361301}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 32161}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 39223}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 53385}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 56893}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 53243}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 53321}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 288637}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 128675}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 64695}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 42673}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 40914}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 42948}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 40855}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 361301}, {"group": "two_one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 24956}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 16206}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 24971}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 16206}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 24971}, {"group": "two_one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 25015}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 14509}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 25015}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 14509}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 25015}, {"group": "two_one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 16213}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 16351}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 16260}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 16351}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 16260}, {"group": "two_one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 568862}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 498599}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 580362}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 498599}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 580362}, {"group": "two_one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 567562}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 498324}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 571027}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 498324}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 571027}, {"group": "one_two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 26712}, {"group": "one_two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 26780}, {"group": "one_two_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 42768}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 42679}, {"group": "one_two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 40857}, {"group": "one_two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 221410}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 32001}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 39253}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 53352}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 56701}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 53294}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 53204}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 288281}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 128845}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 62240}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 42701}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 40902}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 42697}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 40932}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 358862}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 32001}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 39253}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 53352}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 56701}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 53294}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 53204}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 288281}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 128845}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 62240}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 42701}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 40902}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 42697}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 40932}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 358862}, {"group": "one_two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 24945}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 16211}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 24945}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 16211}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 24945}, {"group": "one_two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 25128}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 14538}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 24958}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 14538}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 24958}, {"group": "one_two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 16244}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 16369}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 16281}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 16369}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 16281}, {"group": "one_two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 568591}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 445037}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 578649}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 445037}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 578649}, {"group": "one_two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 560923}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 452171}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 570974}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 452171}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 570974}, {"group": "random_width", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 26732}, {"group": "random_width", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 26806}, {"group": "random_width", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 91952}, @@ -168,49 +168,49 @@ {"group": "random_width", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 88204}, {"group": "random_width", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 92998}, {"group": "random_width", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 415221}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 99375}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 60525}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 72996}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 73720}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 73630}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 72537}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 453245}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 197997}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 131536}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 91715}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 88032}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 88017}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 92685}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 690480}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 99375}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 60525}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 72996}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 73720}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 73630}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 72537}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 453245}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 197997}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 131536}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 91715}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 88032}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 88017}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 92685}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 690480}, {"group": "random_width", "operation": "add", "implementation": "unsigned __int128", "microseconds": 25106}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 16257}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 24998}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 16257}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 24998}, {"group": "random_width", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 25044}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 14548}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 24982}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 14548}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 24982}, {"group": "random_width", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 17000}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 16304}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 16310}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 16304}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 16310}, {"group": "random_width", "operation": "div", "implementation": "unsigned __int128", "microseconds": 581682}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 489550}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 589757}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 489550}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 589757}, {"group": "random_width", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 581990}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 490872}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 590958}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 490872}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 590958}, {"group": "random_width", "operation": "shl", "implementation": "unsigned __int128", "microseconds": 83000}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 39488}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 105992}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 39488}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 105992}, {"group": "random_width", "operation": "shr", "implementation": "unsigned __int128", "microseconds": 123969}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 100428}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 217117}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 100428}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 217117}, {"group": "random_width", "operation": "and", "implementation": "unsigned __int128", "microseconds": 18163}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 18064}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 16413}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 18064}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 16413}, {"group": "random_width", "operation": "or", "implementation": "unsigned __int128", "microseconds": 18079}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 18170}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 16390}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 18170}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 16390}, {"group": "random_width", "operation": "xor", "implementation": "unsigned __int128", "microseconds": 18150}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 18059}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 16322} + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 18059}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 16322} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-s390x/i128.json b/doc/modules/ROOT/data/benchmarks-linux-s390x/i128.json index 8c6c5375..1e3969a5 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-s390x/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-s390x/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "s390x", @@ -9,7 +9,7 @@ "elements": 2000000, "repetitions": 5, "baseline": "__int128", - "implementations": ["__int128", "int128_t", "boost::mp::int128_t", "absl::int128"], + "implementations": ["__int128", "int128", "boost::mp::int128", "absl::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "__int128", "microseconds": 56727}, {"group": "two_word", "operation": "ne", "implementation": "__int128", "microseconds": 57262}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "__int128", "microseconds": 102570}, {"group": "two_word", "operation": "ge", "implementation": "__int128", "microseconds": 118450}, {"group": "two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 626091}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81899}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 75435}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 69586}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 69605}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 69540}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 69905}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 436946}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 297585}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 383939}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 289701}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 318982}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 324624}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 290134}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1906672}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 81899}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 75435}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 69586}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 69605}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 69540}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 69905}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 436946}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 297585}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 383939}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 289701}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 318982}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 324624}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 290134}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1906672}, {"group": "two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 50337}, {"group": "two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 50670}, {"group": "two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 87172}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 98795}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 473776}, {"group": "two_word", "operation": "add", "implementation": "__int128", "microseconds": 50657}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 44155}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 253381}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 44155}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 253381}, {"group": "two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 36856}, {"group": "two_word", "operation": "sub", "implementation": "__int128", "microseconds": 51086}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 41560}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 281461}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 41560}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 281461}, {"group": "two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 41423}, {"group": "two_word", "operation": "mul", "implementation": "__int128", "microseconds": 54010}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 36548}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 150820}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 36548}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 150820}, {"group": "two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 36688}, {"group": "two_word", "operation": "div", "implementation": "__int128", "microseconds": 711176}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 902634}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 884308}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 902634}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 884308}, {"group": "two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 710205}, {"group": "two_word", "operation": "mod", "implementation": "__int128", "microseconds": 757463}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 959350}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 825496}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 959350}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 825496}, {"group": "two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 751829}, {"group": "two_word", "operation": "div64", "implementation": "__int128", "microseconds": 910658}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 533352}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 962878}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 533352}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 962878}, {"group": "two_word", "operation": "div64", "implementation": "absl::int128", "microseconds": 911621}, {"group": "two_word", "operation": "div32", "implementation": "__int128", "microseconds": 1308868}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 470698}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 1419660}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 470698}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 1419660}, {"group": "two_word", "operation": "div32", "implementation": "absl::int128", "microseconds": 1311482}, {"group": "one_word", "operation": "eq", "implementation": "__int128", "microseconds": 56557}, {"group": "one_word", "operation": "ne", "implementation": "__int128", "microseconds": 57194}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "__int128", "microseconds": 283565}, {"group": "one_word", "operation": "ge", "implementation": "__int128", "microseconds": 155161}, {"group": "one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 1117414}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 75210}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 220386}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 250258}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 228754}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 248155}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 229071}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1252320}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 348679}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 485819}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 314896}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 344651}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 349420}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 316169}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2160075}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 75210}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 220386}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 250258}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 228754}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 248155}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 229071}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1252320}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 348679}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 485819}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 314896}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 344651}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 349420}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 316169}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2160075}, {"group": "one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 50418}, {"group": "one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 50533}, {"group": "one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 134821}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 136664}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 644180}, {"group": "one_word", "operation": "add", "implementation": "__int128", "microseconds": 50673}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 44432}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 273057}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 44432}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 273057}, {"group": "one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 36949}, {"group": "one_word", "operation": "sub", "implementation": "__int128", "microseconds": 50569}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 41340}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 370113}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 41340}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 370113}, {"group": "one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 41290}, {"group": "one_word", "operation": "mul", "implementation": "__int128", "microseconds": 53766}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 36509}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 150725}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 36509}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 150725}, {"group": "one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 36494}, {"group": "one_word", "operation": "div", "implementation": "__int128", "microseconds": 801301}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 439455}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 966825}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 439455}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 966825}, {"group": "one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 802018}, {"group": "one_word", "operation": "mod", "implementation": "__int128", "microseconds": 851725}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 440544}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 889861}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 440544}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 889861}, {"group": "one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 856274}, {"group": "two_one_word", "operation": "eq", "implementation": "__int128", "microseconds": 56522}, {"group": "two_one_word", "operation": "ne", "implementation": "__int128", "microseconds": 57245}, @@ -122,20 +122,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "__int128", "microseconds": 100623}, {"group": "two_one_word", "operation": "ge", "implementation": "__int128", "microseconds": 115749}, {"group": "two_one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 581236}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81849}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 75332}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 69477}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 69268}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 69287}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 69589}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 435178}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 273946}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 352476}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 260750}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 288767}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 294371}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 257406}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1728211}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 81849}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 75332}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 69477}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 69268}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 69287}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 69589}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 435178}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 273946}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 352476}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 260750}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 288767}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 294371}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 257406}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1728211}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 50265}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 50567}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 84583}, @@ -144,24 +144,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 97052}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 464807}, {"group": "two_one_word", "operation": "add", "implementation": "__int128", "microseconds": 50626}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 44162}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 253091}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 44162}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 253091}, {"group": "two_one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 36862}, {"group": "two_one_word", "operation": "sub", "implementation": "__int128", "microseconds": 50667}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 41306}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 281089}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 41306}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 281089}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 41604}, {"group": "two_one_word", "operation": "mul", "implementation": "__int128", "microseconds": 53773}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 36487}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 150619}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 36487}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 150619}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 36467}, {"group": "two_one_word", "operation": "div", "implementation": "__int128", "microseconds": 720219}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 654373}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 894659}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 654373}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 894659}, {"group": "two_one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 717749}, {"group": "two_one_word", "operation": "mod", "implementation": "__int128", "microseconds": 762502}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 678746}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 829480}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 678746}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 829480}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 757477}, {"group": "one_two_word", "operation": "eq", "implementation": "__int128", "microseconds": 56507}, {"group": "one_two_word", "operation": "ne", "implementation": "__int128", "microseconds": 57147}, @@ -170,20 +170,20 @@ {"group": "one_two_word", "operation": "gt", "implementation": "__int128", "microseconds": 100567}, {"group": "one_two_word", "operation": "ge", "implementation": "__int128", "microseconds": 115820}, {"group": "one_two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 580541}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81783}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 75317}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 69509}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 69400}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 69236}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 69812}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 435437}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 269202}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 352030}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 259880}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 288977}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 294023}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 257600}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1722106}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 81783}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 75317}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 69509}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 69400}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 69236}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 69812}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 435437}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 269202}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 352030}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 259880}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 288977}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 294023}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 257600}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1722106}, {"group": "one_two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 50213}, {"group": "one_two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 50548}, {"group": "one_two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 84693}, @@ -192,24 +192,24 @@ {"group": "one_two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 96999}, {"group": "one_two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 464566}, {"group": "one_two_word", "operation": "add", "implementation": "__int128", "microseconds": 50634}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 44066}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 253253}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 44066}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 253253}, {"group": "one_two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 36805}, {"group": "one_two_word", "operation": "sub", "implementation": "__int128", "microseconds": 50696}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 41373}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 282131}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 41373}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 282131}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 41352}, {"group": "one_two_word", "operation": "mul", "implementation": "__int128", "microseconds": 53815}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 36419}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 150530}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 36419}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 150530}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 36472}, {"group": "one_two_word", "operation": "div", "implementation": "__int128", "microseconds": 719639}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 646241}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 894470}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 646241}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 894470}, {"group": "one_two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 716229}, {"group": "one_two_word", "operation": "mod", "implementation": "__int128", "microseconds": 761179}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 678548}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 834617}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 678548}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 834617}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 757677}, {"group": "random_width", "operation": "eq", "implementation": "__int128", "microseconds": 56807}, {"group": "random_width", "operation": "ne", "implementation": "__int128", "microseconds": 57079}, @@ -218,20 +218,20 @@ {"group": "random_width", "operation": "gt", "implementation": "__int128", "microseconds": 158511}, {"group": "random_width", "operation": "ge", "implementation": "__int128", "microseconds": 131614}, {"group": "random_width", "operation": "comparisons", "implementation": "__int128", "microseconds": 785777}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 80237}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 117647}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 133763}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 120672}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 127326}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 128756}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 708911}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 326608}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 426773}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 311517}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 338998}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 342167}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 312727}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2059404}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 80237}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 117647}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 133763}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 120672}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 127326}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 128756}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 708911}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 326608}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 426773}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 311517}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 338998}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 342167}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 312727}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2059404}, {"group": "random_width", "operation": "eq", "implementation": "absl::int128", "microseconds": 50285}, {"group": "random_width", "operation": "ne", "implementation": "absl::int128", "microseconds": 50525}, {"group": "random_width", "operation": "lt", "implementation": "absl::int128", "microseconds": 103496}, @@ -240,32 +240,32 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::int128", "microseconds": 111341}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 525305}, {"group": "random_width", "operation": "add", "implementation": "__int128", "microseconds": 50685}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 44057}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 258246}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 44057}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 258246}, {"group": "random_width", "operation": "add", "implementation": "absl::int128", "microseconds": 37090}, {"group": "random_width", "operation": "sub", "implementation": "__int128", "microseconds": 50668}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 41357}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 303965}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 41357}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 303965}, {"group": "random_width", "operation": "sub", "implementation": "absl::int128", "microseconds": 41352}, {"group": "random_width", "operation": "mul", "implementation": "__int128", "microseconds": 53734}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 36512}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 150617}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 36512}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 150617}, {"group": "random_width", "operation": "mul", "implementation": "absl::int128", "microseconds": 36708}, {"group": "random_width", "operation": "div", "implementation": "__int128", "microseconds": 752827}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 682729}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 919962}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 682729}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 919962}, {"group": "random_width", "operation": "div", "implementation": "absl::int128", "microseconds": 752655}, {"group": "random_width", "operation": "mod", "implementation": "__int128", "microseconds": 802322}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 720485}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 851901}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 720485}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 851901}, {"group": "random_width", "operation": "mod", "implementation": "absl::int128", "microseconds": 796760}, {"group": "random_width", "operation": "shl", "implementation": "__int128", "microseconds": 54070}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 50781}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 172707}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 50781}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 172707}, {"group": "random_width", "operation": "shl", "implementation": "absl::int128", "microseconds": 54046}, {"group": "random_width", "operation": "shr", "implementation": "__int128", "microseconds": 69663}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 64780}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 181796}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 64780}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 181796}, {"group": "random_width", "operation": "shr", "implementation": "absl::int128", "microseconds": 69833} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-s390x/u128.json b/doc/modules/ROOT/data/benchmarks-linux-s390x/u128.json index d9a351aa..2ff366f1 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-s390x/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-s390x/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "s390x", @@ -9,7 +9,7 @@ "elements": 2000000, "repetitions": 5, "baseline": "unsigned __int128", - "implementations": ["unsigned __int128", "uint128_t", "boost::mp::uint128_t", "absl::uint128"], + "implementations": ["unsigned __int128", "uint128", "boost::mp::uint128", "absl::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 57495}, {"group": "two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 57313}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 102470}, {"group": "two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 118244}, {"group": "two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 559538}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 81912}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 75556}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 75872}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 66165}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75799}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 69252}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 445813}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 185557}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 192243}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 358525}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 118439}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 104782}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 119630}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1080788}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 81912}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 75556}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 75872}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 66165}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 75799}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 69252}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 445813}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 185557}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 192243}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 358525}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 118439}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 104782}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 119630}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1080788}, {"group": "two_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 235480}, {"group": "two_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 230227}, {"group": "two_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 161688}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 166922}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1130592}, {"group": "two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 50741}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 44208}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 50797}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 44208}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 50797}, {"group": "two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 50678}, {"group": "two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 50734}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 41426}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 50649}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 41426}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 50649}, {"group": "two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 53736}, {"group": "two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53906}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 36529}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 50612}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 36529}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 50612}, {"group": "two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 106966}, {"group": "two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 614561}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 792604}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 636003}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 792604}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 636003}, {"group": "two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 685691}, {"group": "two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 618877}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 745641}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 639231}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 745641}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 639231}, {"group": "two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 667796}, {"group": "two_word", "operation": "div64", "implementation": "unsigned __int128", "microseconds": 877356}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 485703}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 865957}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 485703}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 865957}, {"group": "two_word", "operation": "div64", "implementation": "absl::uint128", "microseconds": 905854}, {"group": "two_word", "operation": "div32", "implementation": "unsigned __int128", "microseconds": 1187952}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 385198}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 1188209}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 385198}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 1188209}, {"group": "two_word", "operation": "div32", "implementation": "absl::uint128", "microseconds": 1217091}, {"group": "one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 56699}, {"group": "one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 57234}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 147347}, {"group": "one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 154939}, {"group": "one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 719759}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 75322}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 220203}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 113026}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 110008}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 110264}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 113021}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 742395}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 231581}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 308935}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 375002}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 155312}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 147284}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 155122}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1373694}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 75322}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 220203}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 113026}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 110008}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 110264}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 113021}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 742395}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 231581}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 308935}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 375002}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 155312}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 147284}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 155122}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1373694}, {"group": "one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 235283}, {"group": "one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 229676}, {"group": "one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 208026}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 204752}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1297332}, {"group": "one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 50806}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 44074}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 50822}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 44074}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 50822}, {"group": "one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 50518}, {"group": "one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 50608}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 41346}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 50440}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 41346}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 50440}, {"group": "one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 53564}, {"group": "one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53808}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 36402}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 50639}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 36402}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 50639}, {"group": "one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 106601}, {"group": "one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 716138}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 407624}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 736640}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 407624}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 736640}, {"group": "one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 758885}, {"group": "one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 730455}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 410003}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 738935}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 410003}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 738935}, {"group": "two_one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 56921}, {"group": "two_one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 57101}, {"group": "two_one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 100502}, @@ -121,20 +121,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 100504}, {"group": "two_one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 115874}, {"group": "two_one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 547354}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 81713}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 75377}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 75695}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 66043}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75540}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 69367}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 444215}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 152220}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 168481}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 323079}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 115992}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 100527}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 115724}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 976676}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 81713}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 75377}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 75695}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 66043}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 75540}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 69367}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 444215}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 152220}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 168481}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 323079}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 115992}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 100527}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 115724}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 976676}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 235523}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 229884}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 160914}, @@ -143,24 +143,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 165786}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1125500}, {"group": "two_one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 50913}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 44081}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 51030}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 44081}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 51030}, {"group": "two_one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 50487}, {"group": "two_one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 50723}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 41412}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 50602}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 41412}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 50602}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 53480}, {"group": "two_one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53729}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 36350}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 50394}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 36350}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 50394}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 106855}, {"group": "two_one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 656814}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 545190}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 679933}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 545190}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 679933}, {"group": "two_one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 702448}, {"group": "two_one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 671222}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 571953}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 690624}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 571953}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 690624}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 718346}, {"group": "one_two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 56857}, {"group": "one_two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 57359}, @@ -169,39 +169,39 @@ {"group": "one_two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 100474}, {"group": "one_two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 116171}, {"group": "one_two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 547591}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 81801}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 75603}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 76057}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 66202}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 76057}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 69314}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 445408}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 152331}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 168375}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 321871}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 115911}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 100499}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 115797}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 975177}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 81801}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 75603}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 76057}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 66202}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 76057}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 69314}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 445408}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 152331}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 168375}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 321871}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 115911}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 100499}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 115797}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 975177}, {"group": "one_two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 50691}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 44109}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 50893}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 44109}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 50893}, {"group": "one_two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 50498}, {"group": "one_two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 50635}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 41302}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 50893}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 41302}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 50893}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 53572}, {"group": "one_two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53815}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 36396}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 50518}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 36396}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 50518}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 106635}, {"group": "one_two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 656513}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 544792}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 678546}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 544792}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 678546}, {"group": "one_two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 702273}, {"group": "one_two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 673970}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 572193}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 690791}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 572193}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 690791}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 719162}, {"group": "random_width", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 56735}, {"group": "random_width", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 57067}, @@ -210,20 +210,20 @@ {"group": "random_width", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 115995}, {"group": "random_width", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 131584}, {"group": "random_width", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 609693}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 80563}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 117782}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 90604}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 79266}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 89337}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 81156}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 539203}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 213157}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 244537}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 383142}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 128398}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 116128}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 132127}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1218003}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 80563}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 117782}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 90604}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 79266}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 89337}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 81156}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 539203}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 213157}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 244537}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 383142}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 128398}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 116128}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 132127}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1218003}, {"group": "random_width", "operation": "eq", "implementation": "absl::uint128", "microseconds": 235736}, {"group": "random_width", "operation": "ne", "implementation": "absl::uint128", "microseconds": 229333}, {"group": "random_width", "operation": "lt", "implementation": "absl::uint128", "microseconds": 176182}, @@ -232,44 +232,44 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::uint128", "microseconds": 178007}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 1178669}, {"group": "random_width", "operation": "add", "implementation": "unsigned __int128", "microseconds": 50814}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 44087}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 50939}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 44087}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 50939}, {"group": "random_width", "operation": "add", "implementation": "absl::uint128", "microseconds": 50573}, {"group": "random_width", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 50584}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 41277}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 50738}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 41277}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 50738}, {"group": "random_width", "operation": "sub", "implementation": "absl::uint128", "microseconds": 53373}, {"group": "random_width", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53604}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 36614}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 50442}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 36614}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 50442}, {"group": "random_width", "operation": "mul", "implementation": "absl::uint128", "microseconds": 106646}, {"group": "random_width", "operation": "div", "implementation": "unsigned __int128", "microseconds": 782276}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 608192}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 813958}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 608192}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 813958}, {"group": "random_width", "operation": "div", "implementation": "absl::uint128", "microseconds": 830929}, {"group": "random_width", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 812511}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 607793}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 840997}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 607793}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 840997}, {"group": "random_width", "operation": "mod", "implementation": "absl::uint128", "microseconds": 874632}, {"group": "random_width", "operation": "shl", "implementation": "unsigned __int128", "microseconds": 54107}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 52548}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 104906}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 52548}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 104906}, {"group": "random_width", "operation": "shl", "implementation": "absl::uint128", "microseconds": 89258}, {"group": "random_width", "operation": "shr", "implementation": "unsigned __int128", "microseconds": 83670}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 66248}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 111752}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 66248}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 111752}, {"group": "random_width", "operation": "shr", "implementation": "absl::uint128", "microseconds": 81776}, {"group": "random_width", "operation": "and", "implementation": "unsigned __int128", "microseconds": 51934}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 50505}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 51912}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 50505}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 51912}, {"group": "random_width", "operation": "and", "implementation": "absl::uint128", "microseconds": 121147}, {"group": "random_width", "operation": "or", "implementation": "unsigned __int128", "microseconds": 51950}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 50695}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 51843}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 50695}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 51843}, {"group": "random_width", "operation": "or", "implementation": "absl::uint128", "microseconds": 120345}, {"group": "random_width", "operation": "xor", "implementation": "unsigned __int128", "microseconds": 50519}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 50636}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 50504}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 50636}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 50504}, {"group": "random_width", "operation": "xor", "implementation": "absl::uint128", "microseconds": 132533} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-x64/i128.json b/doc/modules/ROOT/data/benchmarks-linux-x64/i128.json index 73d194bb..1c30e25e 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-x64/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-x64/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "x64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "__int128", - "implementations": ["__int128", "int128_t", "boost::mp::int128_t", "absl::int128"], + "implementations": ["__int128", "int128", "boost::mp::int128", "absl::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "__int128", "microseconds": 102391}, {"group": "two_word", "operation": "ne", "implementation": "__int128", "microseconds": 102395}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "__int128", "microseconds": 94245}, {"group": "two_word", "operation": "ge", "implementation": "__int128", "microseconds": 90604}, {"group": "two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 574653}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81177}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 89994}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 84390}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 84064}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 83899}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 83022}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 506698}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 374846}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 382438}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 363007}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 109952}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 111908}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 360541}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1702868}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 81177}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 89994}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 84390}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 84064}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 83899}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 83022}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 506698}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 374846}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 382438}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 363007}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 109952}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 111908}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 360541}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1702868}, {"group": "two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 101434}, {"group": "two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 88747}, {"group": "two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 84430}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 81642}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 522121}, {"group": "two_word", "operation": "add", "implementation": "__int128", "microseconds": 65920}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 61808}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 143341}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 61808}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 143341}, {"group": "two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 61955}, {"group": "two_word", "operation": "sub", "implementation": "__int128", "microseconds": 65931}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 71163}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 474092}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 71163}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 474092}, {"group": "two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 71211}, {"group": "two_word", "operation": "mul", "implementation": "__int128", "microseconds": 86777}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 74570}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 196914}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 74570}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 196914}, {"group": "two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 75043}, {"group": "two_word", "operation": "div", "implementation": "__int128", "microseconds": 1078930}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1103523}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1009801}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 1103523}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1009801}, {"group": "two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 1047021}, {"group": "two_word", "operation": "mod", "implementation": "__int128", "microseconds": 781633}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 867853}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 766518}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 867853}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 766518}, {"group": "two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 757506}, {"group": "two_word", "operation": "div64", "implementation": "__int128", "microseconds": 581804}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 687098}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 994200}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 687098}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 994200}, {"group": "two_word", "operation": "div64", "implementation": "absl::int128", "microseconds": 606581}, {"group": "two_word", "operation": "div32", "implementation": "__int128", "microseconds": 687745}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 687074}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 695194}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 687074}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 695194}, {"group": "two_word", "operation": "div32", "implementation": "absl::int128", "microseconds": 687922}, {"group": "one_word", "operation": "eq", "implementation": "__int128", "microseconds": 102486}, {"group": "one_word", "operation": "ne", "implementation": "__int128", "microseconds": 102555}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "__int128", "microseconds": 94197}, {"group": "one_word", "operation": "ge", "implementation": "__int128", "microseconds": 90667}, {"group": "one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 574990}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 82191}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 89993}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 81959}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 82066}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 84504}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 89306}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 510194}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 387565}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 383804}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 363613}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 110071}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 110600}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 360765}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1716605}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 82191}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 89993}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 81959}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 82066}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 84504}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 89306}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 510194}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 387565}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 383804}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 363613}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 110071}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 110600}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 360765}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1716605}, {"group": "one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 87593}, {"group": "one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 87807}, {"group": "one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 83181}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 83398}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 507310}, {"group": "one_word", "operation": "add", "implementation": "__int128", "microseconds": 66199}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 61789}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 262369}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 61789}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 262369}, {"group": "one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 61592}, {"group": "one_word", "operation": "sub", "implementation": "__int128", "microseconds": 66035}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 71276}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 689871}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 71276}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 689871}, {"group": "one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 71173}, {"group": "one_word", "operation": "mul", "implementation": "__int128", "microseconds": 86781}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 74000}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 195539}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 74000}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 195539}, {"group": "one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 75062}, {"group": "one_word", "operation": "div", "implementation": "__int128", "microseconds": 415102}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 486423}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 389401}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 486423}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 389401}, {"group": "one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 388593}, {"group": "one_word", "operation": "mod", "implementation": "__int128", "microseconds": 414106}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 599197}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 511277}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 599197}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 511277}, {"group": "one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 388401}, {"group": "two_one_word", "operation": "eq", "implementation": "__int128", "microseconds": 102198}, {"group": "two_one_word", "operation": "ne", "implementation": "__int128", "microseconds": 102379}, @@ -122,20 +122,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "__int128", "microseconds": 94178}, {"group": "two_one_word", "operation": "ge", "implementation": "__int128", "microseconds": 90520}, {"group": "two_one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 574294}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81041}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 89153}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 82356}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 81590}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 81586}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 81893}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 497771}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 110474}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 125435}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 102279}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 110556}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 110586}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 101215}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 660719}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 81041}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 89153}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 82356}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 81590}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 81586}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 81893}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 497771}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 110474}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 125435}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 102279}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 110556}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 110586}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 101215}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 660719}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 88509}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 89195}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 84093}, @@ -144,24 +144,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 83304}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 514589}, {"group": "two_one_word", "operation": "add", "implementation": "__int128", "microseconds": 66097}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 62691}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 144126}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 62691}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 144126}, {"group": "two_one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 62609}, {"group": "two_one_word", "operation": "sub", "implementation": "__int128", "microseconds": 66014}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 71286}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 179874}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 71286}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 179874}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 71402}, {"group": "two_one_word", "operation": "mul", "implementation": "__int128", "microseconds": 86792}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 74571}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 195821}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 74571}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 195821}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 74294}, {"group": "two_one_word", "operation": "div", "implementation": "__int128", "microseconds": 545027}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 343997}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 654288}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 343997}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 654288}, {"group": "two_one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 505516}, {"group": "two_one_word", "operation": "mod", "implementation": "__int128", "microseconds": 553185}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 344857}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 699846}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 344857}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 699846}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 523339}, {"group": "one_two_word", "operation": "eq", "implementation": "__int128", "microseconds": 102109}, {"group": "one_two_word", "operation": "ne", "implementation": "__int128", "microseconds": 102289}, @@ -170,20 +170,20 @@ {"group": "one_two_word", "operation": "gt", "implementation": "__int128", "microseconds": 94305}, {"group": "one_two_word", "operation": "ge", "implementation": "__int128", "microseconds": 90616}, {"group": "one_two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 574206}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 81043}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 89708}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 84195}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 84083}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 83643}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 83995}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 506815}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 110974}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 126016}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 100292}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 110463}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 110329}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 101099}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 659342}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 81043}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 89708}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 84195}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 84083}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 83643}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 83995}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 506815}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 110974}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 126016}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 100292}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 110463}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 110329}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 101099}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 659342}, {"group": "one_two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 86746}, {"group": "one_two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 87235}, {"group": "one_two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 83669}, @@ -192,24 +192,24 @@ {"group": "one_two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 83406}, {"group": "one_two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 507620}, {"group": "one_two_word", "operation": "add", "implementation": "__int128", "microseconds": 66053}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 59843}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 143311}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 59843}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 143311}, {"group": "one_two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 61114}, {"group": "one_two_word", "operation": "sub", "implementation": "__int128", "microseconds": 66010}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 71236}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 178688}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 71236}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 178688}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 71258}, {"group": "one_two_word", "operation": "mul", "implementation": "__int128", "microseconds": 86601}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 73840}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 195508}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 73840}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 195508}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 74528}, {"group": "one_two_word", "operation": "div", "implementation": "__int128", "microseconds": 545464}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 344066}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 654027}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 344066}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 654027}, {"group": "one_two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 506277}, {"group": "one_two_word", "operation": "mod", "implementation": "__int128", "microseconds": 569127}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 344896}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 701083}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 344896}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 701083}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 523250}, {"group": "random_width", "operation": "eq", "implementation": "__int128", "microseconds": 102201}, {"group": "random_width", "operation": "ne", "implementation": "__int128", "microseconds": 102463}, @@ -218,20 +218,20 @@ {"group": "random_width", "operation": "gt", "implementation": "__int128", "microseconds": 94445}, {"group": "random_width", "operation": "ge", "implementation": "__int128", "microseconds": 90604}, {"group": "random_width", "operation": "comparisons", "implementation": "__int128", "microseconds": 575065}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 81127}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 88253}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 82206}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 83247}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 81874}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 83578}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 500451}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 371894}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 381005}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 367895}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 110356}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 110715}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 361118}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1703153}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 81127}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 88253}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 82206}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 83247}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 81874}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 83578}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 500451}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 371894}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 381005}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 367895}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 110356}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 110715}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 361118}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1703153}, {"group": "random_width", "operation": "eq", "implementation": "absl::int128", "microseconds": 87797}, {"group": "random_width", "operation": "ne", "implementation": "absl::int128", "microseconds": 87663}, {"group": "random_width", "operation": "lt", "implementation": "absl::int128", "microseconds": 84201}, @@ -240,32 +240,32 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::int128", "microseconds": 81401}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 503204}, {"group": "random_width", "operation": "add", "implementation": "__int128", "microseconds": 65874}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 60371}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 176054}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 60371}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 176054}, {"group": "random_width", "operation": "add", "implementation": "absl::int128", "microseconds": 60901}, {"group": "random_width", "operation": "sub", "implementation": "__int128", "microseconds": 65944}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 72082}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 569596}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 72082}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 569596}, {"group": "random_width", "operation": "sub", "implementation": "absl::int128", "microseconds": 71309}, {"group": "random_width", "operation": "mul", "implementation": "__int128", "microseconds": 86629}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 74522}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 196324}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 74522}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 196324}, {"group": "random_width", "operation": "mul", "implementation": "absl::int128", "microseconds": 74967}, {"group": "random_width", "operation": "div", "implementation": "__int128", "microseconds": 999372}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 978885}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 985280}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 978885}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 985280}, {"group": "random_width", "operation": "div", "implementation": "absl::int128", "microseconds": 970981}, {"group": "random_width", "operation": "mod", "implementation": "__int128", "microseconds": 940401}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 963188}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1010396}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 963188}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1010396}, {"group": "random_width", "operation": "mod", "implementation": "absl::int128", "microseconds": 918835}, {"group": "random_width", "operation": "shl", "implementation": "__int128", "microseconds": 452496}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 449417}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 187973}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 449417}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 187973}, {"group": "random_width", "operation": "shl", "implementation": "absl::int128", "microseconds": 452632}, {"group": "random_width", "operation": "shr", "implementation": "__int128", "microseconds": 462957}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 459922}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 157373}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 459922}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 157373}, {"group": "random_width", "operation": "shr", "implementation": "absl::int128", "microseconds": 461838} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-x64/u128.json b/doc/modules/ROOT/data/benchmarks-linux-x64/u128.json index b0c2fc9e..1b9a5f0e 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-x64/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-x64/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "x64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "unsigned __int128", - "implementations": ["unsigned __int128", "uint128_t", "boost::mp::uint128_t", "absl::uint128"], + "implementations": ["unsigned __int128", "uint128", "boost::mp::uint128", "absl::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 102180}, {"group": "two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 102201}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 74739}, {"group": "two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 74954}, {"group": "two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 503941}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 99148}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 134743}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 75844}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 75883}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75728}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 75735}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 537246}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 389733}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 410653}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 74738}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 74720}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 74940}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 74984}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1099931}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 99148}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 134743}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 75844}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 75883}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 75728}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 75735}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 537246}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 389733}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 410653}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 74738}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 74720}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 74940}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 74984}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1099931}, {"group": "two_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 98927}, {"group": "two_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 98655}, {"group": "two_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 76277}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 76480}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 503733}, {"group": "two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 66072}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 61766}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 66009}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 61766}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 66009}, {"group": "two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 61818}, {"group": "two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 65986}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 71192}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 69312}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 71192}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 69312}, {"group": "two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 66692}, {"group": "two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86322}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 74746}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 86343}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 74746}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 86343}, {"group": "two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 75511}, {"group": "two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 946171}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 891648}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 981047}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 891648}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 981047}, {"group": "two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 968211}, {"group": "two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 744246}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 697299}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 754132}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 697299}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 754132}, {"group": "two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 761108}, {"group": "two_word", "operation": "div64", "implementation": "unsigned __int128", "microseconds": 734551}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 687104}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 721411}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 687104}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 721411}, {"group": "two_word", "operation": "div64", "implementation": "absl::uint128", "microseconds": 718386}, {"group": "two_word", "operation": "div32", "implementation": "unsigned __int128", "microseconds": 687412}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 687027}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 687415}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 687027}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 687415}, {"group": "two_word", "operation": "div32", "implementation": "absl::uint128", "microseconds": 687498}, {"group": "one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 102207}, {"group": "one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 102501}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 74798}, {"group": "one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 74743}, {"group": "one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 504031}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 98951}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 135152}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 75431}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 75639}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75635}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 75741}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 536743}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 391268}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 410397}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 74777}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 74799}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 74829}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 74723}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1100966}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 98951}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 135152}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 75431}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 75639}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 75635}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 75741}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 536743}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 391268}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 410397}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 74777}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 74799}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 74829}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 74723}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1100966}, {"group": "one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 98648}, {"group": "one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 101349}, {"group": "one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 89346}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 76502}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 519117}, {"group": "one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 66042}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 60005}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 65979}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 60005}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 65979}, {"group": "one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 61841}, {"group": "one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 66307}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 71214}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 65975}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 71214}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 65975}, {"group": "one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 64268}, {"group": "one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86607}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 75219}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 86348}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 75219}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 86348}, {"group": "one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 75628}, {"group": "one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 353094}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 392174}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 380971}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 392174}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 380971}, {"group": "one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 381099}, {"group": "one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 317709}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 402571}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 317707}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 402571}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 317707}, {"group": "two_one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 102168}, {"group": "two_one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 102209}, {"group": "two_one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 74766}, @@ -121,20 +121,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 74668}, {"group": "two_one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 74770}, {"group": "two_one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 503584}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 99005}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 135103}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 76077}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 76022}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75972}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 75973}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 538304}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 170939}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 181399}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 74831}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 75078}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 74760}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 74729}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 651890}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 99005}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 135103}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 76077}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 76022}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 75972}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 75973}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 538304}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 170939}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 181399}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 74831}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 75078}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 74760}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 74729}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 651890}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 98817}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 98817}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 76343}, @@ -143,24 +143,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 76569}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 503898}, {"group": "two_one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 66123}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 60596}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 65947}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 60596}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 65947}, {"group": "two_one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 60957}, {"group": "two_one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 65905}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 71452}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 65866}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 71452}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 65866}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 64344}, {"group": "two_one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86301}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 74341}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 86398}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 74341}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 86398}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 74454}, {"group": "two_one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 516551}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 343719}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 549618}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 343719}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 549618}, {"group": "two_one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 549145}, {"group": "two_one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 518088}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 344174}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 531107}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 344174}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 531107}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 550184}, {"group": "one_two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 102327}, {"group": "one_two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 102119}, @@ -169,39 +169,39 @@ {"group": "one_two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 74642}, {"group": "one_two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 74877}, {"group": "one_two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 503666}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 98870}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 134243}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 75707}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 76055}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 75961}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 75818}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 536809}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 170136}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 180426}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 74714}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 74863}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 75011}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 74710}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 650023}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 98870}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 134243}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 75707}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 76055}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 75961}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 75818}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 536809}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 170136}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 180426}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 74714}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 74863}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 75011}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 74710}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 650023}, {"group": "one_two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 66124}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 60882}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 66471}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 60882}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 66471}, {"group": "one_two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 60477}, {"group": "one_two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 66345}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 71197}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 65892}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 71197}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 65892}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 64178}, {"group": "one_two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86252}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 74715}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 86366}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 74715}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 86366}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 75143}, {"group": "one_two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 517067}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 345744}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 557815}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 345744}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 557815}, {"group": "one_two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 548693}, {"group": "one_two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 518752}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 343766}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 520799}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 343766}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 520799}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 550093}, {"group": "random_width", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 104652}, {"group": "random_width", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 103064}, @@ -210,20 +210,20 @@ {"group": "random_width", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 87467}, {"group": "random_width", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 80705}, {"group": "random_width", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 538116}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 101406}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 139756}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 76147}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 76035}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 76003}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 75612}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 545110}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 390030}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 410462}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 74879}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 74850}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 74745}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 75022}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1100158}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 101406}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 139756}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 76147}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 76035}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 76003}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 75612}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 545110}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 390030}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 410462}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 74879}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 74850}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 74745}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 75022}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1100158}, {"group": "random_width", "operation": "eq", "implementation": "absl::uint128", "microseconds": 99083}, {"group": "random_width", "operation": "ne", "implementation": "absl::uint128", "microseconds": 99002}, {"group": "random_width", "operation": "lt", "implementation": "absl::uint128", "microseconds": 76428}, @@ -232,44 +232,44 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::uint128", "microseconds": 76373}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 504183}, {"group": "random_width", "operation": "add", "implementation": "unsigned __int128", "microseconds": 66230}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 60477}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 65991}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 60477}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 65991}, {"group": "random_width", "operation": "add", "implementation": "absl::uint128", "microseconds": 60608}, {"group": "random_width", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 65810}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 71192}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 65943}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 71192}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 65943}, {"group": "random_width", "operation": "sub", "implementation": "absl::uint128", "microseconds": 64127}, {"group": "random_width", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 86476}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 74446}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 86230}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 74446}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 86230}, {"group": "random_width", "operation": "mul", "implementation": "absl::uint128", "microseconds": 74626}, {"group": "random_width", "operation": "div", "implementation": "unsigned __int128", "microseconds": 908484}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 761299}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 940478}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 761299}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 940478}, {"group": "random_width", "operation": "div", "implementation": "absl::uint128", "microseconds": 928884}, {"group": "random_width", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 837475}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 697322}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 858246}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 697322}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 858246}, {"group": "random_width", "operation": "mod", "implementation": "absl::uint128", "microseconds": 856182}, {"group": "random_width", "operation": "shl", "implementation": "unsigned __int128", "microseconds": 452524}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 450311}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 493541}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 450311}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 493541}, {"group": "random_width", "operation": "shl", "implementation": "absl::uint128", "microseconds": 450092}, {"group": "random_width", "operation": "shr", "implementation": "unsigned __int128", "microseconds": 461906}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 459608}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 489951}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 459608}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 489951}, {"group": "random_width", "operation": "shr", "implementation": "absl::uint128", "microseconds": 460259}, {"group": "random_width", "operation": "and", "implementation": "unsigned __int128", "microseconds": 73511}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 66344}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 65909}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 66344}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 65909}, {"group": "random_width", "operation": "and", "implementation": "absl::uint128", "microseconds": 62649}, {"group": "random_width", "operation": "or", "implementation": "unsigned __int128", "microseconds": 65779}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 65826}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 66054}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 65826}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 66054}, {"group": "random_width", "operation": "or", "implementation": "absl::uint128", "microseconds": 62402}, {"group": "random_width", "operation": "xor", "implementation": "unsigned __int128", "microseconds": 65919}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 66049}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 66151}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 66049}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 66151}, {"group": "random_width", "operation": "xor", "implementation": "absl::uint128", "microseconds": 62279} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-x86/i128.json b/doc/modules/ROOT/data/benchmarks-linux-x86/i128.json index bbe3917f..cea3768f 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-x86/i128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-x86/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "linux", "arch": "x86", @@ -8,136 +8,136 @@ "cxxstd": 202002, "elements": 10000000, "repetitions": 5, - "baseline": "boost::mp::int128_t", - "implementations": ["int128_t", "boost::mp::int128_t"], + "baseline": "boost::mp::int128", + "implementations": ["int128", "boost::mp::int128"], "results": [ - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 206732}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 201844}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 238905}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 241413}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 239626}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 259249}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1388042}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 250645}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 264995}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 308256}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 265899}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 254326}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 247423}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1591746}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 190304}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 793455}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 194264}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1109671}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 207054}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1623280}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1803776}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1730520}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1961114}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2005625}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 1945944}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 5605530}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 1172449}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 1724061}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 160497}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 163099}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 201509}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 208734}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 228393}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 245318}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1207756}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 239353}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 247143}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 247898}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 250834}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 251459}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 255974}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1492872}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 193624}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 854728}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 209357}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 942925}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 213098}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1217478}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 1041397}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1419785}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 852671}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1179562}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 187811}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 189702}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 224110}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 227138}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 209343}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 214176}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1252469}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 178974}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 178545}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 175817}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 178681}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 177141}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 182037}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1071359}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 148169}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1006479}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 150980}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1055332}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 187906}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1409860}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 1473828}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 3130361}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1520415}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2966092}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 198033}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 190608}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 223712}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 234831}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 255021}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 258814}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1361237}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 235036}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 242531}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 237766}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 232575}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 221998}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 230367}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1400470}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 177107}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 999331}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 150235}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1052818}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 162625}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1406308}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1474105}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 3139189}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1521882}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2965033}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 259046}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 255796}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 320994}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 321884}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 322941}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 322447}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1803323}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 358685}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 350283}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 368821}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 369128}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 358482}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 360790}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2166376}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 159907}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1198244}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 178360}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1416733}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 213890}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1726368}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 1711915}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2680645}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 1706134}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2539888}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 359283}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 1508102}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 431065}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 935102} + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 206732}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 201844}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 238905}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 241413}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 239626}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 259249}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1388042}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 250645}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 264995}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 308256}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 265899}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 254326}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 247423}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1591746}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 190304}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 793455}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 194264}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1109671}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 207054}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1623280}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 1803776}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1730520}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 1961114}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2005625}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 1945944}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 5605530}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 1172449}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 1724061}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 160497}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 163099}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 201509}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 208734}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 228393}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 245318}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1207756}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 239353}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 247143}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 247898}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 250834}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 251459}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 255974}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1492872}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 193624}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 854728}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 209357}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 942925}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 213098}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1217478}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 1041397}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1419785}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 852671}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1179562}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 187811}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 189702}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 224110}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 227138}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 209343}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 214176}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1252469}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 178974}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 178545}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 175817}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 178681}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 177141}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 182037}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1071359}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 148169}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1006479}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 150980}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1055332}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 187906}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1409860}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 1473828}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 3130361}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 1520415}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2966092}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 198033}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 190608}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 223712}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 234831}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 255021}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 258814}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1361237}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 235036}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 242531}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 237766}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 232575}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 221998}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 230367}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1400470}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 177107}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 999331}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 150235}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1052818}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 162625}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1406308}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 1474105}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 3139189}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 1521882}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2965033}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 259046}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 255796}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 320994}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 321884}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 322941}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 322447}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 1803323}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 358685}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 350283}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 368821}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 369128}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 358482}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 360790}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2166376}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 159907}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1198244}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 178360}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1416733}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 213890}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1726368}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 1711915}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2680645}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 1706134}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2539888}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 359283}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 1508102}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 431065}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 935102} ] } diff --git a/doc/modules/ROOT/data/benchmarks-linux-x86/u128.json b/doc/modules/ROOT/data/benchmarks-linux-x86/u128.json index 4abaa6d4..47aca8c6 100644 --- a/doc/modules/ROOT/data/benchmarks-linux-x86/u128.json +++ b/doc/modules/ROOT/data/benchmarks-linux-x86/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "linux", "arch": "x86", @@ -8,142 +8,142 @@ "cxxstd": 202002, "elements": 10000000, "repetitions": 5, - "baseline": "boost::mp::uint128_t", - "implementations": ["uint128_t", "boost::mp::uint128_t"], + "baseline": "boost::mp::uint128", + "implementations": ["uint128", "boost::mp::uint128"], "results": [ - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 200888}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 193692}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 222158}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 227645}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 227519}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 222873}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1295053}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 233110}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 246585}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 245769}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 240565}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 247803}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 237422}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1451483}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 197949}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 699561}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 208011}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 828979}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 216433}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1278542}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1539923}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1667096}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1636958}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1669997}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 2126752}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 5883895}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 1342484}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 1636937}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 172764}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 165836}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 192707}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 196071}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 194572}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 230567}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1152736}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 226080}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 239707}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 238034}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 239073}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 246198}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 239121}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1428414}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 196541}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 675613}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 202223}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 819395}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 222406}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 890098}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 896995}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1367415}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 747721}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1099155}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 198664}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 193669}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 225050}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 215438}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 220471}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 223561}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1277090}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 237101}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 238512}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 233937}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 235274}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 240901}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 234252}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1420194}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 199771}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 820305}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 153948}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 912704}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 164921}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1072714}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1511993}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 3281900}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1501929}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 3081208}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 198420}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 195319}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 221136}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 228299}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 225206}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 213353}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1281946}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 231322}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 230158}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 241217}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 252128}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 242163}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 236963}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1434172}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 191943}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 858000}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 199164}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 928124}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 210911}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1182181}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1507080}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 3274762}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1493873}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 3079699}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 262905}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 264109}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 400115}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 384551}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 402552}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 397861}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 2112319}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 284531}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 289013}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 276892}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 250781}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 229823}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 237304}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1568536}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 143659}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1144222}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 156320}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1382478}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 203481}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1221882}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 1558822}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2170543}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 1526280}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1873501}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 373576}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 1471433}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 461914}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 788282}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 140836}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 1000528}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 141054}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 799976}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 142252}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 804843} + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 200888}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 193692}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 222158}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 227645}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 227519}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 222873}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 1295053}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 233110}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 246585}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 245769}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 240565}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 247803}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 237422}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1451483}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 197949}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 699561}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 208011}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 828979}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 216433}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1278542}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 1539923}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1667096}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 1636958}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1669997}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 2126752}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 5883895}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 1342484}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 1636937}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 172764}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 165836}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 192707}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 196071}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 194572}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 230567}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 1152736}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 226080}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 239707}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 238034}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 239073}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 246198}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 239121}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1428414}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 196541}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 675613}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 202223}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 819395}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 222406}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 890098}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 896995}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1367415}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 747721}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1099155}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 198664}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 193669}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 225050}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 215438}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 220471}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 223561}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 1277090}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 237101}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 238512}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 233937}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 235274}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 240901}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 234252}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1420194}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 199771}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 820305}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 153948}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 912704}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 164921}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1072714}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 1511993}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 3281900}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 1501929}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 3081208}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 198420}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 195319}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 221136}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 228299}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 225206}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 213353}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 1281946}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 231322}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 230158}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 241217}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 252128}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 242163}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 236963}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1434172}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 191943}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 858000}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 199164}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 928124}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 210911}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1182181}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 1507080}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 3274762}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 1493873}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 3079699}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 262905}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 264109}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 400115}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 384551}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 402552}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 397861}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 2112319}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 284531}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 289013}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 276892}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 250781}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 229823}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 237304}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1568536}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 143659}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1144222}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 156320}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1382478}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 203481}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1221882}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 1558822}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2170543}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 1526280}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1873501}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 373576}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 1471433}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 461914}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 788282}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 140836}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 1000528}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 141054}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 799976}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 142252}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 804843} ] } diff --git a/doc/modules/ROOT/data/benchmarks-macos-arm64/i128.json b/doc/modules/ROOT/data/benchmarks-macos-arm64/i128.json index 905899d6..55ee82a4 100644 --- a/doc/modules/ROOT/data/benchmarks-macos-arm64/i128.json +++ b/doc/modules/ROOT/data/benchmarks-macos-arm64/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "macos", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "__int128", - "implementations": ["__int128", "int128_t", "boost::mp::int128_t", "absl::int128"], + "implementations": ["__int128", "int128", "boost::mp::int128", "absl::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "__int128", "microseconds": 73476}, {"group": "two_word", "operation": "ne", "implementation": "__int128", "microseconds": 60101}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "__int128", "microseconds": 65278}, {"group": "two_word", "operation": "ge", "implementation": "__int128", "microseconds": 62970}, {"group": "two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 397838}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 103017}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 70747}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 58788}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 68241}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 53835}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 56456}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 411262}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 128842}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 120132}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 166192}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 189449}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 205541}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 160480}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 970791}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 103017}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 70747}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 58788}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 68241}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 53835}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 56456}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 411262}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 128842}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 120132}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 166192}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 189449}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 205541}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 160480}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 970791}, {"group": "two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 64809}, {"group": "two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 78086}, {"group": "two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 62129}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 63494}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 401999}, {"group": "two_word", "operation": "add", "implementation": "__int128", "microseconds": 59006}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 73178}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 409567}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 73178}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 409567}, {"group": "two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 54699}, {"group": "two_word", "operation": "sub", "implementation": "__int128", "microseconds": 69502}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 57679}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 419699}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 57679}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 419699}, {"group": "two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 63942}, {"group": "two_word", "operation": "mul", "implementation": "__int128", "microseconds": 67404}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 56790}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 205690}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 56790}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 205690}, {"group": "two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 60062}, {"group": "two_word", "operation": "div", "implementation": "__int128", "microseconds": 1149568}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1317759}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1614328}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 1317759}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1614328}, {"group": "two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 1133300}, {"group": "two_word", "operation": "mod", "implementation": "__int128", "microseconds": 1282159}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1470751}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1659016}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 1470751}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1659016}, {"group": "two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 1251267}, {"group": "two_word", "operation": "div64", "implementation": "__int128", "microseconds": 2229623}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 1954282}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 3286996}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 1954282}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 3286996}, {"group": "two_word", "operation": "div64", "implementation": "absl::int128", "microseconds": 2103592}, {"group": "two_word", "operation": "div32", "implementation": "__int128", "microseconds": 938883}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 557681}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 1226292}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 557681}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 1226292}, {"group": "two_word", "operation": "div32", "implementation": "absl::int128", "microseconds": 975977}, {"group": "one_word", "operation": "eq", "implementation": "__int128", "microseconds": 77981}, {"group": "one_word", "operation": "ne", "implementation": "__int128", "microseconds": 73126}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "__int128", "microseconds": 64805}, {"group": "one_word", "operation": "ge", "implementation": "__int128", "microseconds": 70196}, {"group": "one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 417374}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 110608}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 85577}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 55125}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 61920}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 71874}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 62032}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 447779}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 122345}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 96088}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 198669}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 188831}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 220922}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 172761}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 999828}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 110608}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 85577}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 55125}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 61920}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 71874}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 62032}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 447779}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 122345}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 96088}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 198669}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 188831}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 220922}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 172761}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 999828}, {"group": "one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 94704}, {"group": "one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 101422}, {"group": "one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 60831}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 73656}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 456657}, {"group": "one_word", "operation": "add", "implementation": "__int128", "microseconds": 73888}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 56333}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 429181}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 56333}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 429181}, {"group": "one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 64790}, {"group": "one_word", "operation": "sub", "implementation": "__int128", "microseconds": 64633}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 59336}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 508577}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 59336}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 508577}, {"group": "one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 65479}, {"group": "one_word", "operation": "mul", "implementation": "__int128", "microseconds": 69670}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 68957}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 255544}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 68957}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 255544}, {"group": "one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 68925}, {"group": "one_word", "operation": "div", "implementation": "__int128", "microseconds": 965857}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 746675}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1248135}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 746675}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1248135}, {"group": "one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 862523}, {"group": "one_word", "operation": "mod", "implementation": "__int128", "microseconds": 941603}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 753248}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1500164}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 753248}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1500164}, {"group": "one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 945527}, {"group": "two_one_word", "operation": "eq", "implementation": "__int128", "microseconds": 104339}, {"group": "two_one_word", "operation": "ne", "implementation": "__int128", "microseconds": 72673}, @@ -122,20 +122,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "__int128", "microseconds": 82091}, {"group": "two_one_word", "operation": "ge", "implementation": "__int128", "microseconds": 135785}, {"group": "two_one_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 553738}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 97805}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 70456}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 81018}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 64783}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 73920}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 56601}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 444763}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 235336}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 125649}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 158293}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 205007}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 212302}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 147691}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1084599}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 97805}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 70456}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 81018}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 64783}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 73920}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 56601}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 444763}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 235336}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 125649}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 158293}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 205007}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 212302}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 147691}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1084599}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 69760}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 58258}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 69526}, @@ -144,24 +144,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 63410}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 430856}, {"group": "two_one_word", "operation": "add", "implementation": "__int128", "microseconds": 98295}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 89001}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 464442}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 89001}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 464442}, {"group": "two_one_word", "operation": "add", "implementation": "absl::int128", "microseconds": 68244}, {"group": "two_one_word", "operation": "sub", "implementation": "__int128", "microseconds": 61378}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 61834}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 516184}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 61834}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 516184}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 70252}, {"group": "two_one_word", "operation": "mul", "implementation": "__int128", "microseconds": 70705}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 77657}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 292257}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 77657}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 292257}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 86897}, {"group": "two_one_word", "operation": "div", "implementation": "__int128", "microseconds": 1321540}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 1350442}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1902685}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 1350442}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1902685}, {"group": "two_one_word", "operation": "div", "implementation": "absl::int128", "microseconds": 1208431}, {"group": "two_one_word", "operation": "mod", "implementation": "__int128", "microseconds": 1277355}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1223377}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1960399}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 1223377}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1960399}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 1244970}, {"group": "one_two_word", "operation": "eq", "implementation": "__int128", "microseconds": 68344}, {"group": "one_two_word", "operation": "ne", "implementation": "__int128", "microseconds": 63223}, @@ -170,20 +170,20 @@ {"group": "one_two_word", "operation": "gt", "implementation": "__int128", "microseconds": 65436}, {"group": "one_two_word", "operation": "ge", "implementation": "__int128", "microseconds": 60786}, {"group": "one_two_word", "operation": "comparisons", "implementation": "__int128", "microseconds": 375394}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 77884}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 60692}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 75333}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 56330}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 47802}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 51713}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 369996}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 212408}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 117919}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 182669}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 186439}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 177522}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 132252}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1009500}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 77884}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 60692}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 75333}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 56330}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 47802}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 51713}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 369996}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 212408}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 117919}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 182669}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 186439}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 177522}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 132252}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1009500}, {"group": "one_two_word", "operation": "eq", "implementation": "absl::int128", "microseconds": 52820}, {"group": "one_two_word", "operation": "ne", "implementation": "absl::int128", "microseconds": 62624}, {"group": "one_two_word", "operation": "lt", "implementation": "absl::int128", "microseconds": 55587}, @@ -192,24 +192,24 @@ {"group": "one_two_word", "operation": "ge", "implementation": "absl::int128", "microseconds": 71032}, {"group": "one_two_word", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 360174}, {"group": "one_two_word", "operation": "add", "implementation": "__int128", "microseconds": 56406}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 75147}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 428020}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 75147}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 428020}, {"group": "one_two_word", "operation": "add", "implementation": "absl::int128", "microseconds": 63299}, {"group": "one_two_word", "operation": "sub", "implementation": "__int128", "microseconds": 50998}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 46246}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 456154}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 46246}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 456154}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::int128", "microseconds": 59507}, {"group": "one_two_word", "operation": "mul", "implementation": "__int128", "microseconds": 54984}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 69009}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 229872}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 69009}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 229872}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::int128", "microseconds": 75284}, {"group": "one_two_word", "operation": "div", "implementation": "__int128", "microseconds": 1281193}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1365693}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2086751}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 1365693}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2086751}, {"group": "one_two_word", "operation": "div", "implementation": "absl::int128", "microseconds": 1279185}, {"group": "one_two_word", "operation": "mod", "implementation": "__int128", "microseconds": 1300703}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1368650}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2005592}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 1368650}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2005592}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::int128", "microseconds": 1307973}, {"group": "random_width", "operation": "eq", "implementation": "__int128", "microseconds": 71421}, {"group": "random_width", "operation": "ne", "implementation": "__int128", "microseconds": 63788}, @@ -218,20 +218,20 @@ {"group": "random_width", "operation": "gt", "implementation": "__int128", "microseconds": 137680}, {"group": "random_width", "operation": "ge", "implementation": "__int128", "microseconds": 66115}, {"group": "random_width", "operation": "comparisons", "implementation": "__int128", "microseconds": 479219}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 68982}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 58046}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 57557}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 67658}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 53944}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 51777}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 358275}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 137971}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 117750}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 165821}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 197630}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 257801}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 157725}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1035078}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 68982}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 58046}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 57557}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 67658}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 53944}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 51777}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 358275}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 137971}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 117750}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 165821}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 197630}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 257801}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 157725}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1035078}, {"group": "random_width", "operation": "eq", "implementation": "absl::int128", "microseconds": 82748}, {"group": "random_width", "operation": "ne", "implementation": "absl::int128", "microseconds": 66609}, {"group": "random_width", "operation": "lt", "implementation": "absl::int128", "microseconds": 66824}, @@ -240,32 +240,32 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::int128", "microseconds": 54727}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::int128", "microseconds": 405457}, {"group": "random_width", "operation": "add", "implementation": "__int128", "microseconds": 152489}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 90873}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 444144}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 90873}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 444144}, {"group": "random_width", "operation": "add", "implementation": "absl::int128", "microseconds": 72358}, {"group": "random_width", "operation": "sub", "implementation": "__int128", "microseconds": 51306}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 75991}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 383429}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 75991}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 383429}, {"group": "random_width", "operation": "sub", "implementation": "absl::int128", "microseconds": 87675}, {"group": "random_width", "operation": "mul", "implementation": "__int128", "microseconds": 60826}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 49480}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 205901}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 49480}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 205901}, {"group": "random_width", "operation": "mul", "implementation": "absl::int128", "microseconds": 64798}, {"group": "random_width", "operation": "div", "implementation": "__int128", "microseconds": 1363999}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 1378656}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1893255}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 1378656}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1893255}, {"group": "random_width", "operation": "div", "implementation": "absl::int128", "microseconds": 1372411}, {"group": "random_width", "operation": "mod", "implementation": "__int128", "microseconds": 1534656}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 1435001}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2223197}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 1435001}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2223197}, {"group": "random_width", "operation": "mod", "implementation": "absl::int128", "microseconds": 1490100}, {"group": "random_width", "operation": "shl", "implementation": "__int128", "microseconds": 199478}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 139037}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 506876}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 139037}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 506876}, {"group": "random_width", "operation": "shl", "implementation": "absl::int128", "microseconds": 110991}, {"group": "random_width", "operation": "shr", "implementation": "__int128", "microseconds": 130830}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 109148}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 720869}, + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 109148}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 720869}, {"group": "random_width", "operation": "shr", "implementation": "absl::int128", "microseconds": 104365} ] } diff --git a/doc/modules/ROOT/data/benchmarks-macos-arm64/u128.json b/doc/modules/ROOT/data/benchmarks-macos-arm64/u128.json index 1a2e37b8..33165d7a 100644 --- a/doc/modules/ROOT/data/benchmarks-macos-arm64/u128.json +++ b/doc/modules/ROOT/data/benchmarks-macos-arm64/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "macos", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "unsigned __int128", - "implementations": ["unsigned __int128", "uint128_t", "boost::mp::uint128_t", "absl::uint128"], + "implementations": ["unsigned __int128", "uint128", "boost::mp::uint128", "absl::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 60786}, {"group": "two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 64443}, @@ -18,20 +18,20 @@ {"group": "two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 66152}, {"group": "two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 69586}, {"group": "two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 409438}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 81896}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 84114}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 64131}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 52577}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 66351}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 66535}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 415911}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 56559}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 67889}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 66209}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 56444}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 66846}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 62253}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 376387}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 81896}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 84114}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 64131}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 52577}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 66351}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 66535}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 415911}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 56559}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 67889}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 66209}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 56444}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 66846}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 62253}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 376387}, {"group": "two_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 76463}, {"group": "two_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 65337}, {"group": "two_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 63150}, @@ -40,32 +40,32 @@ {"group": "two_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 63335}, {"group": "two_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 405580}, {"group": "two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 55684}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 67332}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 54281}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 67332}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 54281}, {"group": "two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 52733}, {"group": "two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 76469}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 60012}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 46709}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 60012}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 46709}, {"group": "two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 61725}, {"group": "two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 47658}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 40978}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 53387}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 40978}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 53387}, {"group": "two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 55605}, {"group": "two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 958627}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1154465}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1436461}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 1154465}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1436461}, {"group": "two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 990067}, {"group": "two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 1007225}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1163413}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1474333}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 1163413}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1474333}, {"group": "two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 1029152}, {"group": "two_word", "operation": "div64", "implementation": "unsigned __int128", "microseconds": 2060983}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 1916412}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 2646237}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 1916412}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 2646237}, {"group": "two_word", "operation": "div64", "implementation": "absl::uint128", "microseconds": 2106147}, {"group": "two_word", "operation": "div32", "implementation": "unsigned __int128", "microseconds": 616506}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 438747}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 778995}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 438747}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 778995}, {"group": "two_word", "operation": "div32", "implementation": "absl::uint128", "microseconds": 557879}, {"group": "one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 52857}, {"group": "one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 52457}, @@ -74,20 +74,20 @@ {"group": "one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 55680}, {"group": "one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 62266}, {"group": "one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 341774}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 58885}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 59616}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 56870}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 53502}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 56789}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 59089}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 345001}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 62430}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 56342}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 121429}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 82364}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 85422}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 59900}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 468231}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 58885}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 59616}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 56870}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 53502}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 56789}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 59089}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 345001}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 62430}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 56342}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 121429}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 82364}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 85422}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 59900}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 468231}, {"group": "one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 67989}, {"group": "one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 90690}, {"group": "one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 74748}, @@ -96,24 +96,24 @@ {"group": "one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 63930}, {"group": "one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 418876}, {"group": "one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 76376}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 49947}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 55011}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 49947}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 55011}, {"group": "one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 66672}, {"group": "one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 63359}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 49234}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 69777}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 49234}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 69777}, {"group": "one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 70446}, {"group": "one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 60872}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 56277}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 56845}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 56277}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 56845}, {"group": "one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 50889}, {"group": "one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 688937}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 548323}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1093889}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 548323}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1093889}, {"group": "one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 667721}, {"group": "one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 663412}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 491001}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 950134}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 491001}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 950134}, {"group": "two_one_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 54976}, {"group": "two_one_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 63214}, {"group": "two_one_word", "operation": "lt", "implementation": "unsigned __int128", "microseconds": 68055}, @@ -121,20 +121,20 @@ {"group": "two_one_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 63111}, {"group": "two_one_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 73310}, {"group": "two_one_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 394640}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 86933}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 56313}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 59658}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 57797}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 53082}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 50804}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 364924}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 76026}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 57338}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 51297}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 60913}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 59118}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 57931}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 362816}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 86933}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 56313}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 59658}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 57797}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 53082}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 50804}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 364924}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 76026}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 57338}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 51297}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 60913}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 59118}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 57931}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 362816}, {"group": "two_one_word", "operation": "eq", "implementation": "absl::uint128", "microseconds": 69930}, {"group": "two_one_word", "operation": "ne", "implementation": "absl::uint128", "microseconds": 53263}, {"group": "two_one_word", "operation": "lt", "implementation": "absl::uint128", "microseconds": 47902}, @@ -143,24 +143,24 @@ {"group": "two_one_word", "operation": "ge", "implementation": "absl::uint128", "microseconds": 51172}, {"group": "two_one_word", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 349631}, {"group": "two_one_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 45930}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 45229}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 45220}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 45229}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 45220}, {"group": "two_one_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 46222}, {"group": "two_one_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 52292}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 48065}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 49447}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 48065}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 49447}, {"group": "two_one_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 60147}, {"group": "two_one_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 49595}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 65067}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 62332}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 65067}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 62332}, {"group": "two_one_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 56557}, {"group": "two_one_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 1137959}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1222870}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1717067}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 1222870}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1717067}, {"group": "two_one_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 1271174}, {"group": "two_one_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 1334879}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1188264}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1764790}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 1188264}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1764790}, {"group": "two_one_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 1343218}, {"group": "one_two_word", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 76885}, {"group": "one_two_word", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 67424}, @@ -169,39 +169,39 @@ {"group": "one_two_word", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 57997}, {"group": "one_two_word", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 62133}, {"group": "one_two_word", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 434712}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 80623}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 66188}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 67302}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 62479}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 65322}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 69813}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 411943}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 52093}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 57838}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 54105}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 55315}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 68877}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 66885}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 355334}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 80623}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 66188}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 67302}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 62479}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 65322}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 69813}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 411943}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 52093}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 57838}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 54105}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 55315}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 68877}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 66885}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 355334}, {"group": "one_two_word", "operation": "add", "implementation": "unsigned __int128", "microseconds": 58536}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 77709}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 55825}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 77709}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 55825}, {"group": "one_two_word", "operation": "add", "implementation": "absl::uint128", "microseconds": 52110}, {"group": "one_two_word", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 71027}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 61288}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 51859}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 61288}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 51859}, {"group": "one_two_word", "operation": "sub", "implementation": "absl::uint128", "microseconds": 57252}, {"group": "one_two_word", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 53122}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 69045}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 46087}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 69045}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 46087}, {"group": "one_two_word", "operation": "mul", "implementation": "absl::uint128", "microseconds": 56764}, {"group": "one_two_word", "operation": "div", "implementation": "unsigned __int128", "microseconds": 1296994}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1109370}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1578808}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 1109370}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1578808}, {"group": "one_two_word", "operation": "div", "implementation": "absl::uint128", "microseconds": 1196651}, {"group": "one_two_word", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 1302309}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1134083}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1623809}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 1134083}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1623809}, {"group": "one_two_word", "operation": "mod", "implementation": "absl::uint128", "microseconds": 1262976}, {"group": "random_width", "operation": "eq", "implementation": "unsigned __int128", "microseconds": 73300}, {"group": "random_width", "operation": "ne", "implementation": "unsigned __int128", "microseconds": 51536}, @@ -210,20 +210,20 @@ {"group": "random_width", "operation": "gt", "implementation": "unsigned __int128", "microseconds": 56088}, {"group": "random_width", "operation": "ge", "implementation": "unsigned __int128", "microseconds": 62242}, {"group": "random_width", "operation": "comparisons", "implementation": "unsigned __int128", "microseconds": 363881}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 52898}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 61077}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 61663}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 53087}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 58924}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 63455}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 351327}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 60823}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 64153}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 60861}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 61569}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 77590}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 77781}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 403043}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 52898}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 61077}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 61663}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 53087}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 58924}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 63455}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 351327}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 60823}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 64153}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 60861}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 61569}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 77590}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 77781}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 403043}, {"group": "random_width", "operation": "eq", "implementation": "absl::uint128", "microseconds": 54777}, {"group": "random_width", "operation": "ne", "implementation": "absl::uint128", "microseconds": 73326}, {"group": "random_width", "operation": "lt", "implementation": "absl::uint128", "microseconds": 64262}, @@ -232,44 +232,44 @@ {"group": "random_width", "operation": "ge", "implementation": "absl::uint128", "microseconds": 57035}, {"group": "random_width", "operation": "comparisons", "implementation": "absl::uint128", "microseconds": 373414}, {"group": "random_width", "operation": "add", "implementation": "unsigned __int128", "microseconds": 67797}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 58792}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 64948}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 58792}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 64948}, {"group": "random_width", "operation": "add", "implementation": "absl::uint128", "microseconds": 53003}, {"group": "random_width", "operation": "sub", "implementation": "unsigned __int128", "microseconds": 49226}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 45231}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 63076}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 45231}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 63076}, {"group": "random_width", "operation": "sub", "implementation": "absl::uint128", "microseconds": 67021}, {"group": "random_width", "operation": "mul", "implementation": "unsigned __int128", "microseconds": 68952}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 54470}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 64614}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 54470}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 64614}, {"group": "random_width", "operation": "mul", "implementation": "absl::uint128", "microseconds": 59419}, {"group": "random_width", "operation": "div", "implementation": "unsigned __int128", "microseconds": 1400576}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 1477954}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1752490}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 1477954}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1752490}, {"group": "random_width", "operation": "div", "implementation": "absl::uint128", "microseconds": 1315311}, {"group": "random_width", "operation": "mod", "implementation": "unsigned __int128", "microseconds": 1376647}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 1462446}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2062026}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 1462446}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2062026}, {"group": "random_width", "operation": "mod", "implementation": "absl::uint128", "microseconds": 1672512}, {"group": "random_width", "operation": "shl", "implementation": "unsigned __int128", "microseconds": 436660}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 132331}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 118733}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 132331}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 118733}, {"group": "random_width", "operation": "shl", "implementation": "absl::uint128", "microseconds": 84840}, {"group": "random_width", "operation": "shr", "implementation": "unsigned __int128", "microseconds": 136232}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 121592}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 143771}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 121592}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 143771}, {"group": "random_width", "operation": "shr", "implementation": "absl::uint128", "microseconds": 80725}, {"group": "random_width", "operation": "and", "implementation": "unsigned __int128", "microseconds": 46467}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 59021}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 52932}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 59021}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 52932}, {"group": "random_width", "operation": "and", "implementation": "absl::uint128", "microseconds": 53076}, {"group": "random_width", "operation": "or", "implementation": "unsigned __int128", "microseconds": 51337}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 54828}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 54796}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 54828}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 54796}, {"group": "random_width", "operation": "or", "implementation": "absl::uint128", "microseconds": 58223}, {"group": "random_width", "operation": "xor", "implementation": "unsigned __int128", "microseconds": 59883}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 50005}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 44337}, + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 50005}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 44337}, {"group": "random_width", "operation": "xor", "implementation": "absl::uint128", "microseconds": 49840} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-arm64/i128.json b/doc/modules/ROOT/data/benchmarks-windows-arm64/i128.json index af9759a9..ab57c75b 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-arm64/i128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-arm64/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "windows", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "std::_Signed128", - "implementations": ["std::_Signed128", "int128_t", "boost::mp::int128_t"], + "implementations": ["std::_Signed128", "int128", "boost::mp::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 100222}, {"group": "two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 108474}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 116926}, {"group": "two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 120792}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 670574}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 97530}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 103068}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 104838}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 108207}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 113598}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 114446}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 642081}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 207652}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 262103}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 489455}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 493449}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 490611}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 477418}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2421071}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 97530}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 103068}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 104838}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 108207}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 113598}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 114446}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 642081}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 207652}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 262103}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 489455}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 493449}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 490611}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 477418}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2421071}, {"group": "two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 87229}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 88643}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1318976}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 88643}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1318976}, {"group": "two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 85935}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 86270}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1674347}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 86270}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1674347}, {"group": "two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 506067}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 82019}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2455795}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 82019}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2455795}, {"group": "two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1026881}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1307573}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2551063}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 1307573}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2551063}, {"group": "two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1286303}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1446105}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2792552}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 1446105}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2792552}, {"group": "two_word", "operation": "div64", "implementation": "std::_Signed128", "microseconds": 2761992}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 1577765}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 8520176}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 1577765}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 8520176}, {"group": "two_word", "operation": "div32", "implementation": "std::_Signed128", "microseconds": 1131440}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 1183154}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 3675370}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 1183154}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 3675370}, {"group": "one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 97330}, {"group": "one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 98554}, {"group": "one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 136462}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 144510}, {"group": "one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 148576}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 772965}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 92953}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 104822}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 135547}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 130967}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 135904}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 136383}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 736968}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 209855}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 257388}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 491415}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 493472}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 489518}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 476588}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2418595}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 92953}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 104822}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 135547}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 130967}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 135904}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 136383}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 736968}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 209855}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 257388}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 491415}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 493472}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 489518}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 476588}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2418595}, {"group": "one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 86251}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 86666}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1345155}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 86666}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1345155}, {"group": "one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 86212}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 86134}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1404998}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 86134}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1404998}, {"group": "one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 505621}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 81402}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1905949}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 81402}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1905949}, {"group": "one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 462091}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 838271}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1434688}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 838271}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1434688}, {"group": "one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 744522}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 880466}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1513323}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 880466}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1513323}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 102044}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 100393}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 98887}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 119721}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 119709}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 659718}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 92176}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 97987}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 108773}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 112245}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 113307}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 109162}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 633970}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 176063}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 196559}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 247440}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 246920}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 244052}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 241320}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1352750}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 92176}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 97987}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 108773}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 112245}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 113307}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 109162}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 633970}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 176063}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 196559}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 247440}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 246920}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 244052}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 241320}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1352750}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 89432}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 84833}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1472602}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 84833}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1472602}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 88620}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 85499}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1516699}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 85499}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1516699}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 506083}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 80945}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2167853}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 80945}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2167853}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1768555}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 1531715}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 4677254}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 1531715}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 4677254}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 2184443}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1509547}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 4432211}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 1509547}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 4432211}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 100596}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 104724}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 99626}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 118222}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 121375}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 662639}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 96091}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 98817}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 104346}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 113204}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 113908}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 111725}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 638399}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 175174}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 192445}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 248600}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 248641}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 244903}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 245032}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1355159}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 96091}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 98817}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 104346}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 113204}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 113908}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 111725}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 638399}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 175174}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 192445}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 248600}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 248641}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 244903}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 245032}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1355159}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 89500}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 84797}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1471006}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 84797}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1471006}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 85844}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 85481}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1515757}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 85481}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1515757}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 506811}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 80841}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2190521}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 80841}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2190521}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1767688}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1530445}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 4678695}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 1530445}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 4678695}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 2182962}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1511529}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 4431483}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 1511529}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 4431483}, {"group": "random_width", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 99541}, {"group": "random_width", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 101111}, {"group": "random_width", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 257069}, @@ -168,40 +168,40 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 247939}, {"group": "random_width", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 243754}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 1191566}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 92235}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 99200}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 226153}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 257049}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 224185}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 226041}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1125261}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 391406}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 395930}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 517486}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 522564}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 523292}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 520699}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2871780}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 92235}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 99200}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 226153}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 257049}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 224185}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 226041}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 1125261}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 391406}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 395930}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 517486}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 522564}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 523292}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 520699}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2871780}, {"group": "random_width", "operation": "add", "implementation": "std::_Signed128", "microseconds": 86160}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 84055}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1598093}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 84055}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1598093}, {"group": "random_width", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 88263}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 87934}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1769736}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 87934}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1769736}, {"group": "random_width", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 505934}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 81566}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2395038}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 81566}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2395038}, {"group": "random_width", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1506403}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 1480602}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 3622476}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 1480602}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 3622476}, {"group": "random_width", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1722778}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 1447734}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 3555076}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 1447734}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 3555076}, {"group": "random_width", "operation": "shl", "implementation": "std::_Signed128", "microseconds": 321391}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 295187}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 1744143}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 295187}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 1744143}, {"group": "random_width", "operation": "shr", "implementation": "std::_Signed128", "microseconds": 314415}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 303113}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 1180367} + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 303113}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 1180367} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-arm64/u128.json b/doc/modules/ROOT/data/benchmarks-windows-arm64/u128.json index a51925cf..6bd02db8 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-arm64/u128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-arm64/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "windows", "arch": "ARM64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "std::_Unsigned128", - "implementations": ["std::_Unsigned128", "uint128_t", "boost::mp::uint128_t"], + "implementations": ["std::_Unsigned128", "uint128", "boost::mp::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 100360}, {"group": "two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 101552}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 120464}, {"group": "two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 123267}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 666098}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 94201}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 101220}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 138902}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 141856}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 145539}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 141501}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 763613}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 162195}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 226487}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 455039}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 454108}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 509980}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 460324}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 2268555}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 94201}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 101220}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 138902}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 141856}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 145539}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 141501}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 763613}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 162195}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 226487}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 455039}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 454108}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 509980}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 460324}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 2268555}, {"group": "two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 85243}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 88185}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1210617}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 88185}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1210617}, {"group": "two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 91544}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 87401}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1390577}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 87401}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1390577}, {"group": "two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 455541}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 81048}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1998709}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 81048}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1998709}, {"group": "two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1040396}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 911416}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2312577}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 911416}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2312577}, {"group": "two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1226865}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 978268}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2260183}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 978268}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2260183}, {"group": "two_word", "operation": "div64", "implementation": "std::_Unsigned128", "microseconds": 2782425}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 1628674}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 8196306}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 1628674}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 8196306}, {"group": "two_word", "operation": "div32", "implementation": "std::_Unsigned128", "microseconds": 1137917}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 1199014}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 3691618}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 1199014}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 3691618}, {"group": "one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 92569}, {"group": "one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 98239}, {"group": "one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 137748}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 144451}, {"group": "one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 147857}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 766566}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 99248}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 108100}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 137525}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 136559}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 145550}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 147027}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 774380}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 165125}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 225860}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 454895}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 447587}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 510614}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 462241}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 2266716}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 99248}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 108100}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 137525}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 136559}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 145550}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 147027}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 774380}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 165125}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 225860}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 454895}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 447587}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 510614}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 462241}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 2266716}, {"group": "one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 95555}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 93772}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1090814}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 93772}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1090814}, {"group": "one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 86278}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 85063}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1323505}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 85063}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1323505}, {"group": "one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 454907}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 89410}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1427067}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 89410}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1427067}, {"group": "one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 353794}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 464183}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1216283}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 464183}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1216283}, {"group": "one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 673643}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 534781}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1265672}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 534781}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1265672}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 100045}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 102545}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 102844}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 119678}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 124118}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 667393}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 93796}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 102504}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 137236}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 137667}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 143743}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 144346}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 759708}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 127968}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 162206}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 173116}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 192679}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 190475}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 173552}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1020437}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 93796}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 102504}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 137236}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 137667}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 143743}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 144346}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 759708}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 127968}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 162206}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 173116}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 192679}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 190475}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 173552}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1020437}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 87418}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 87337}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1248195}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 87337}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1248195}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 90329}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 86841}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1388005}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 86841}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1388005}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 456045}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 81626}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1734186}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 81626}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1734186}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1765475}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1026385}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4451739}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 1026385}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4451739}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 2120280}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 954960}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4187624}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 954960}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4187624}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 98930}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 101913}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 104964}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 121994}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 126166}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 675754}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 98353}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 106028}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 136914}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 138517}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 142954}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 144139}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 767301}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 127480}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 162637}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 170810}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 199572}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 195143}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 173631}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1029634}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 98353}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 106028}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 136914}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 138517}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 142954}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 144139}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 767301}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 127480}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 162637}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 170810}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 199572}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 195143}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 173631}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1029634}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 85972}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 87724}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1249922}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 87724}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1249922}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 90283}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 87827}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1387555}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 87827}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1387555}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 456049}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 97489}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1737327}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 97489}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1737327}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1766496}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1027438}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4457200}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 1027438}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4457200}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 2122346}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 954656}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4188477}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 954656}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4188477}, {"group": "random_width", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 99891}, {"group": "random_width", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 98800}, {"group": "random_width", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 287160}, @@ -168,49 +168,49 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 254488}, {"group": "random_width", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 244334}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 1262216}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 91780}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 103496}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 138065}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 137683}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 139323}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 142637}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 753322}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 233263}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 278490}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 295541}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 326875}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 323186}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 299314}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1757122}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 91780}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 103496}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 138065}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 137683}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 139323}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 142637}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 753322}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 233263}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 278490}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 295541}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 326875}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 323186}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 299314}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1757122}, {"group": "random_width", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 86038}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 84791}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1535904}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 84791}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1535904}, {"group": "random_width", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 86521}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 87885}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1712929}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 87885}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1712929}, {"group": "random_width", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 458107}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 82947}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1780541}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 82947}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1780541}, {"group": "random_width", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1334323}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 920483}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2843970}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 920483}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2843970}, {"group": "random_width", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1491426}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 915935}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2420312}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 915935}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2420312}, {"group": "random_width", "operation": "shl", "implementation": "std::_Unsigned128", "microseconds": 321758}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 310332}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 1841484}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 310332}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 1841484}, {"group": "random_width", "operation": "shr", "implementation": "std::_Unsigned128", "microseconds": 306783}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 345569}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 1047658}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 345569}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 1047658}, {"group": "random_width", "operation": "and", "implementation": "std::_Unsigned128", "microseconds": 79688}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 86011}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 1450863}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 86011}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 1450863}, {"group": "random_width", "operation": "or", "implementation": "std::_Unsigned128", "microseconds": 80450}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 85630}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 1383602}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 85630}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 1383602}, {"group": "random_width", "operation": "xor", "implementation": "std::_Unsigned128", "microseconds": 81021}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 85832}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 1382799} + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 85832}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 1382799} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-x64/i128.json b/doc/modules/ROOT/data/benchmarks-windows-x64/i128.json index 9dfcc630..96797e4c 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-x64/i128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-x64/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "windows", "arch": "x64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "std::_Signed128", - "implementations": ["std::_Signed128", "int128_t", "boost::mp::int128_t"], + "implementations": ["std::_Signed128", "int128", "boost::mp::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 97495}, {"group": "two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 95312}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 123457}, {"group": "two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 121013}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 667643}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 101883}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 99937}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 116216}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 97760}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 113131}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 102515}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 631930}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 269282}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 254759}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 359854}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 341488}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 341010}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 366251}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1933005}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 101883}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 99937}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 116216}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 97760}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 113131}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 102515}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 631930}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 269282}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 254759}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 359854}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 341488}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 341010}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 366251}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1933005}, {"group": "two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 115772}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 111073}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1620723}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 111073}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1620723}, {"group": "two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 108075}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 108740}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 2107567}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 108740}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 2107567}, {"group": "two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 198154}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 114653}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 3100514}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 114653}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 3100514}, {"group": "two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1090822}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 1163678}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2711779}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 1163678}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2711779}, {"group": "two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1221749}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 1291719}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 3170071}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 1291719}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 3170071}, {"group": "two_word", "operation": "div64", "implementation": "std::_Signed128", "microseconds": 610230}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 611281}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 9872432}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 611281}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 9872432}, {"group": "two_word", "operation": "div32", "implementation": "std::_Signed128", "microseconds": 609932}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 609887}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 3374887}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 609887}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 3374887}, {"group": "one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 103741}, {"group": "one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 104789}, {"group": "one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 141945}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 142440}, {"group": "one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 142794}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 778930}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 103637}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 101572}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 121346}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 121731}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 120832}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 119015}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 688546}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 273014}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 257839}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 362908}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 345074}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 345548}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 368476}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1953220}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 103637}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 101572}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 121346}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 121731}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 120832}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 119015}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 688546}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 273014}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 257839}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 362908}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 345074}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 345548}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 368476}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1953220}, {"group": "one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 116371}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 108525}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1618900}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 108525}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1618900}, {"group": "one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 110491}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 106162}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1781745}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 106162}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1781745}, {"group": "one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 197400}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 115300}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2354709}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 115300}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2354709}, {"group": "one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 600573}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 895385}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 1844891}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 895385}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 1844891}, {"group": "one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 819666}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 969214}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 1941634}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 969214}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 1941634}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 99479}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 98439}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 114749}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 114376}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 114981}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 658517}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 97184}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 98170}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 114603}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 97205}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 114679}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 100322}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 622582}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 219806}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 238385}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 304845}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 306355}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 303720}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 313890}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1687523}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 97184}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 98170}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 114603}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 97205}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 114679}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 100322}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 622582}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 219806}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 238385}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 304845}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 306355}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 303720}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 313890}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1687523}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 114803}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 104457}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1806624}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 104457}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1806624}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 109890}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 104679}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1848928}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 104679}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1848928}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 196724}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 113169}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2816832}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 113169}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2816832}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 603576}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 674930}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 5336228}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 674930}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 5336228}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 644142}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 673970}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 4985368}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 673970}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 4985368}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 99479}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 99015}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 113526}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 115012}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 115202}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 657561}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 98572}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 95348}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 113729}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 95252}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 112561}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 98615}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 614494}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 221104}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 240347}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 305976}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 304259}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 303680}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 317493}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1693337}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 98572}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 95348}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 113729}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 95252}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 112561}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 98615}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 614494}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 221104}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 240347}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 305976}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 304259}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 303680}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 317493}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1693337}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 115722}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 108572}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1797225}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 108572}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1797225}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 108863}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 104455}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1848277}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 104455}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1848277}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 197836}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 112819}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2818948}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 112819}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2818948}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 601841}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 675605}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 5323383}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 675605}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 5323383}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 633730}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 668714}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 5008368}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 668714}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 5008368}, {"group": "random_width", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 97415}, {"group": "random_width", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 98415}, {"group": "random_width", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 289640}, @@ -168,40 +168,40 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 290749}, {"group": "random_width", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 293934}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 1361518}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 98375}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 98496}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 278763}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 259587}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 281881}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 253539}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1271189}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 533768}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 531635}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 809954}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 814279}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 813798}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 811431}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 4315263}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 98375}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 98496}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 278763}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 259587}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 281881}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 253539}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 1271189}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 533768}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 531635}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 809954}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 814279}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 813798}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 811431}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 4315263}, {"group": "random_width", "operation": "add", "implementation": "std::_Signed128", "microseconds": 115135}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 107633}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 2089612}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 107633}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 2089612}, {"group": "random_width", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 108885}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 105990}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 2265849}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 105990}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 2265849}, {"group": "random_width", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 196081}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 113761}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 3024735}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 113761}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 3024735}, {"group": "random_width", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1031262}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 1241974}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 4191052}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 1241974}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 4191052}, {"group": "random_width", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1080810}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 1327820}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 4139305}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 1327820}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 4139305}, {"group": "random_width", "operation": "shl", "implementation": "std::_Signed128", "microseconds": 464726}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 103932}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 2655037}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 103932}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 2655037}, {"group": "random_width", "operation": "shr", "implementation": "std::_Signed128", "microseconds": 473398}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 432674}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 1681082} + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 432674}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 1681082} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-x64/u128.json b/doc/modules/ROOT/data/benchmarks-windows-x64/u128.json index bbe2bac8..c5e1d9be 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-x64/u128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-x64/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "windows", "arch": "x64", @@ -9,7 +9,7 @@ "elements": 20000000, "repetitions": 5, "baseline": "std::_Unsigned128", - "implementations": ["std::_Unsigned128", "uint128_t", "boost::mp::uint128_t"], + "implementations": ["std::_Unsigned128", "uint128", "boost::mp::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 99690}, {"group": "two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 116143}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 106317}, {"group": "two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 114639}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 654754}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 114310}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 114871}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 97782}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 104084}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 98415}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 114000}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 643878}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 200390}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 181371}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 214257}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 214424}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 215604}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 191635}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1218167}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 114310}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 114871}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 97782}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 104084}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 98415}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 114000}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 643878}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 200390}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 181371}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 214257}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 214424}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 215604}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 191635}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1218167}, {"group": "two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 108441}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 102224}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1441775}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 102224}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1441775}, {"group": "two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 114883}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 95112}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1634898}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 95112}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1634898}, {"group": "two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 117160}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 114334}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 2957779}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 114334}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 2957779}, {"group": "two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1220856}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1062009}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2412835}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 1062009}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2412835}, {"group": "two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1275215}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1211307}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2383395}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 1211307}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2383395}, {"group": "two_word", "operation": "div64", "implementation": "std::_Unsigned128", "microseconds": 611657}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 614509}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 9023185}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 614509}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 9023185}, {"group": "two_word", "operation": "div32", "implementation": "std::_Unsigned128", "microseconds": 614595}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 610867}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 3017187}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 610867}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 3017187}, {"group": "one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 97504}, {"group": "one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 114033}, {"group": "one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 117999}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 121589}, {"group": "one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 123625}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 695180}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 124444}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 141853}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 126322}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 119953}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 111180}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 109911}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 734137}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 188909}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 179914}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 215960}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 213735}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 212586}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 188648}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1200219}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 124444}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 141853}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 126322}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 119953}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 111180}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 109911}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 734137}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 188909}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 179914}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 215960}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 213735}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 212586}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 188648}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1200219}, {"group": "one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 107074}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 100304}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1267610}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 100304}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1267610}, {"group": "one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 115493}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 94631}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1565102}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 94631}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1565102}, {"group": "one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 114100}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 112700}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1785347}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 112700}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1785347}, {"group": "one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 416742}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 730582}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 1593038}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 730582}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 1593038}, {"group": "one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 860796}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 811574}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 1598772}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 811574}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 1598772}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 98028}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 113216}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 100272}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 106586}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 116835}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 652029}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 117223}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 114823}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 101384}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 99924}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 98469}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 115111}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 647378}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 164198}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 164490}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 162760}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 164844}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 165327}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 163970}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 985944}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 117223}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 114823}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 101384}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 99924}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 98469}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 115111}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 647378}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 164198}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 164490}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 162760}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 164844}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 165327}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 163970}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 985944}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 107315}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 101098}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1440567}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 101098}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1440567}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 118363}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 101239}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1566603}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 101239}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1566603}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 113629}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 115814}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 2490772}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 115814}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 2490772}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 474242}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 377992}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4892882}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 377992}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4892882}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 458773}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 473292}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4712981}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 473292}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4712981}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 93991}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 112260}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 96608}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 108021}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 116539}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 642780}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 113310}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 113050}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 99388}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 95552}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 95532}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 112019}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 629316}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 162343}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 162758}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 166459}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 167110}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 167239}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 166512}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 992864}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 113310}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 113050}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 99388}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 95552}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 95532}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 112019}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 629316}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 162343}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 162758}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 166459}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 167110}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 167239}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 166512}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 992864}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 106720}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 101810}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1447051}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 101810}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1447051}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 115651}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 96136}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1562580}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 96136}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1562580}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 112725}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 113279}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 2486513}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 113279}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 2486513}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 472632}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 380700}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4898100}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 380700}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4898100}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 456450}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 466555}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4735558}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 466555}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4735558}, {"group": "random_width", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 95539}, {"group": "random_width", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 113057}, {"group": "random_width", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 261262}, @@ -168,49 +168,49 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 272217}, {"group": "random_width", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 282306}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 1313048}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 119725}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 117316}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 253233}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 244748}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 246018}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 270250}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 1251724}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 315630}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 311524}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 337312}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 336266}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 335893}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 333129}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1970110}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 119725}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 117316}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 253233}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 244748}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 246018}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 270250}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 1251724}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 315630}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 311524}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 337312}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 336266}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 335893}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 333129}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1970110}, {"group": "random_width", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 106229}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 98075}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 2153287}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 98075}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 2153287}, {"group": "random_width", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 115275}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 97252}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 2318242}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 97252}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 2318242}, {"group": "random_width", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 115091}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 112082}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 2428936}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 112082}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 2428936}, {"group": "random_width", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1127057}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 1086078}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 3340168}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 1086078}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 3340168}, {"group": "random_width", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1249176}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 1144617}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2721519}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 1144617}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2721519}, {"group": "random_width", "operation": "shl", "implementation": "std::_Unsigned128", "microseconds": 459629}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 450805}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 2786841}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 450805}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 2786841}, {"group": "random_width", "operation": "shr", "implementation": "std::_Unsigned128", "microseconds": 448761}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 487842}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 1561214}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 487842}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 1561214}, {"group": "random_width", "operation": "and", "implementation": "std::_Unsigned128", "microseconds": 93016}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 92138}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 1743660}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 92138}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 1743660}, {"group": "random_width", "operation": "or", "implementation": "std::_Unsigned128", "microseconds": 95635}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 91902}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 1567903}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 91902}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 1567903}, {"group": "random_width", "operation": "xor", "implementation": "std::_Unsigned128", "microseconds": 89233}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 87982}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 1588266} + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 87982}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 1588266} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-x86/i128.json b/doc/modules/ROOT/data/benchmarks-windows-x86/i128.json index 8136423b..b4a0acbe 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-x86/i128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-x86/i128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "int128_t", + "type": "int128", "sign": "i128", "os": "windows", "arch": "x86", @@ -9,7 +9,7 @@ "elements": 10000000, "repetitions": 5, "baseline": "std::_Signed128", - "implementations": ["std::_Signed128", "int128_t", "boost::mp::int128_t"], + "implementations": ["std::_Signed128", "int128", "boost::mp::int128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 108143}, {"group": "two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 121480}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 335263}, {"group": "two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 321083}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 1542717}, - {"group": "two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 114320}, - {"group": "two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 114796}, - {"group": "two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 306476}, - {"group": "two_word", "operation": "le", "implementation": "int128_t", "microseconds": 309236}, - {"group": "two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 306653}, - {"group": "two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 298919}, - {"group": "two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1451173}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 178058}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 175146}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 201981}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 206023}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 206765}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 205535}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1174190}, + {"group": "two_word", "operation": "eq", "implementation": "int128", "microseconds": 114320}, + {"group": "two_word", "operation": "ne", "implementation": "int128", "microseconds": 114796}, + {"group": "two_word", "operation": "lt", "implementation": "int128", "microseconds": 306476}, + {"group": "two_word", "operation": "le", "implementation": "int128", "microseconds": 309236}, + {"group": "two_word", "operation": "gt", "implementation": "int128", "microseconds": 306653}, + {"group": "two_word", "operation": "ge", "implementation": "int128", "microseconds": 298919}, + {"group": "two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1451173}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 178058}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 175146}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 201981}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 206023}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 206765}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 205535}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1174190}, {"group": "two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 131534}, - {"group": "two_word", "operation": "add", "implementation": "int128_t", "microseconds": 128545}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 895383}, + {"group": "two_word", "operation": "add", "implementation": "int128", "microseconds": 128545}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 895383}, {"group": "two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 448215}, - {"group": "two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 126293}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1216226}, + {"group": "two_word", "operation": "sub", "implementation": "int128", "microseconds": 126293}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1216226}, {"group": "two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 876906}, - {"group": "two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 150440}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2056075}, + {"group": "two_word", "operation": "mul", "implementation": "int128", "microseconds": 150440}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2056075}, {"group": "two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 1381423}, - {"group": "two_word", "operation": "div", "implementation": "int128_t", "microseconds": 3119530}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 2540283}, + {"group": "two_word", "operation": "div", "implementation": "int128", "microseconds": 3119530}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 2540283}, {"group": "two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1442995}, - {"group": "two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 3245915}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2912618}, + {"group": "two_word", "operation": "mod", "implementation": "int128", "microseconds": 3245915}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2912618}, {"group": "two_word", "operation": "div64", "implementation": "std::_Signed128", "microseconds": 6151545}, - {"group": "two_word", "operation": "div64", "implementation": "int128_t", "microseconds": 4890501}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128_t", "microseconds": 8378005}, + {"group": "two_word", "operation": "div64", "implementation": "int128", "microseconds": 4890501}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::int128", "microseconds": 8378005}, {"group": "two_word", "operation": "div32", "implementation": "std::_Signed128", "microseconds": 1009750}, - {"group": "two_word", "operation": "div32", "implementation": "int128_t", "microseconds": 2229358}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128_t", "microseconds": 2506960}, + {"group": "two_word", "operation": "div32", "implementation": "int128", "microseconds": 2229358}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::int128", "microseconds": 2506960}, {"group": "one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 111035}, {"group": "one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 122706}, {"group": "one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 313714}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 327557}, {"group": "one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 330703}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 1535024}, - {"group": "one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 115297}, - {"group": "one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 115006}, - {"group": "one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 340399}, - {"group": "one_word", "operation": "le", "implementation": "int128_t", "microseconds": 341749}, - {"group": "one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 339001}, - {"group": "one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 348986}, - {"group": "one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1601097}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 182432}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 176358}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 203754}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 206787}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 207307}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 208903}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1186259}, + {"group": "one_word", "operation": "eq", "implementation": "int128", "microseconds": 115297}, + {"group": "one_word", "operation": "ne", "implementation": "int128", "microseconds": 115006}, + {"group": "one_word", "operation": "lt", "implementation": "int128", "microseconds": 340399}, + {"group": "one_word", "operation": "le", "implementation": "int128", "microseconds": 341749}, + {"group": "one_word", "operation": "gt", "implementation": "int128", "microseconds": 339001}, + {"group": "one_word", "operation": "ge", "implementation": "int128", "microseconds": 348986}, + {"group": "one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 1601097}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 182432}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 176358}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 203754}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 206787}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 207307}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 208903}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1186259}, {"group": "one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 132131}, - {"group": "one_word", "operation": "add", "implementation": "int128_t", "microseconds": 128640}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1063235}, + {"group": "one_word", "operation": "add", "implementation": "int128", "microseconds": 128640}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1063235}, {"group": "one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 445868}, - {"group": "one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 127619}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1072151}, + {"group": "one_word", "operation": "sub", "implementation": "int128", "microseconds": 127619}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1072151}, {"group": "one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 875980}, - {"group": "one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 150148}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1421876}, + {"group": "one_word", "operation": "mul", "implementation": "int128", "microseconds": 150148}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1421876}, {"group": "one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 2780825}, - {"group": "one_word", "operation": "div", "implementation": "int128_t", "microseconds": 2080868}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 3067575}, + {"group": "one_word", "operation": "div", "implementation": "int128", "microseconds": 2080868}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 3067575}, {"group": "one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 1769676}, - {"group": "one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 2069868}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 2204244}, + {"group": "one_word", "operation": "mod", "implementation": "int128", "microseconds": 2069868}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 2204244}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 110317}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 122763}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 143448}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 146958}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 147263}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 817741}, - {"group": "two_one_word", "operation": "eq", "implementation": "int128_t", "microseconds": 115277}, - {"group": "two_one_word", "operation": "ne", "implementation": "int128_t", "microseconds": 113121}, - {"group": "two_one_word", "operation": "lt", "implementation": "int128_t", "microseconds": 130912}, - {"group": "two_one_word", "operation": "le", "implementation": "int128_t", "microseconds": 138190}, - {"group": "two_one_word", "operation": "gt", "implementation": "int128_t", "microseconds": 134127}, - {"group": "two_one_word", "operation": "ge", "implementation": "int128_t", "microseconds": 149575}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 781976}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 173523}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 173598}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 199942}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 201513}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 201332}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 201666}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1152250}, + {"group": "two_one_word", "operation": "eq", "implementation": "int128", "microseconds": 115277}, + {"group": "two_one_word", "operation": "ne", "implementation": "int128", "microseconds": 113121}, + {"group": "two_one_word", "operation": "lt", "implementation": "int128", "microseconds": 130912}, + {"group": "two_one_word", "operation": "le", "implementation": "int128", "microseconds": 138190}, + {"group": "two_one_word", "operation": "gt", "implementation": "int128", "microseconds": 134127}, + {"group": "two_one_word", "operation": "ge", "implementation": "int128", "microseconds": 149575}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "int128", "microseconds": 781976}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 173523}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 173598}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 199942}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 201513}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 201332}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 201666}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1152250}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 133021}, - {"group": "two_one_word", "operation": "add", "implementation": "int128_t", "microseconds": 130113}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1135020}, + {"group": "two_one_word", "operation": "add", "implementation": "int128", "microseconds": 130113}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1135020}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 446905}, - {"group": "two_one_word", "operation": "sub", "implementation": "int128_t", "microseconds": 127915}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1157655}, + {"group": "two_one_word", "operation": "sub", "implementation": "int128", "microseconds": 127915}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1157655}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 876507}, - {"group": "two_one_word", "operation": "mul", "implementation": "int128_t", "microseconds": 151060}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1753229}, + {"group": "two_one_word", "operation": "mul", "implementation": "int128", "microseconds": 151060}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1753229}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 4330283}, - {"group": "two_one_word", "operation": "div", "implementation": "int128_t", "microseconds": 2863451}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 4399611}, + {"group": "two_one_word", "operation": "div", "implementation": "int128", "microseconds": 2863451}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 4399611}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 3164534}, - {"group": "two_one_word", "operation": "mod", "implementation": "int128_t", "microseconds": 2917767}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 3890306}, + {"group": "two_one_word", "operation": "mod", "implementation": "int128", "microseconds": 2917767}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 3890306}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 108192}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 121769}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 141535}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 147002}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 148116}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 813264}, - {"group": "one_two_word", "operation": "eq", "implementation": "int128_t", "microseconds": 115209}, - {"group": "one_two_word", "operation": "ne", "implementation": "int128_t", "microseconds": 113481}, - {"group": "one_two_word", "operation": "lt", "implementation": "int128_t", "microseconds": 130203}, - {"group": "one_two_word", "operation": "le", "implementation": "int128_t", "microseconds": 138620}, - {"group": "one_two_word", "operation": "gt", "implementation": "int128_t", "microseconds": 126340}, - {"group": "one_two_word", "operation": "ge", "implementation": "int128_t", "microseconds": 143148}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "int128_t", "microseconds": 767531}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 173677}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 172441}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 194442}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 198482}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 198579}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 199208}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 1137542}, + {"group": "one_two_word", "operation": "eq", "implementation": "int128", "microseconds": 115209}, + {"group": "one_two_word", "operation": "ne", "implementation": "int128", "microseconds": 113481}, + {"group": "one_two_word", "operation": "lt", "implementation": "int128", "microseconds": 130203}, + {"group": "one_two_word", "operation": "le", "implementation": "int128", "microseconds": 138620}, + {"group": "one_two_word", "operation": "gt", "implementation": "int128", "microseconds": 126340}, + {"group": "one_two_word", "operation": "ge", "implementation": "int128", "microseconds": 143148}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "int128", "microseconds": 767531}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 173677}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 172441}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 194442}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 198482}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 198579}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 199208}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 1137542}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Signed128", "microseconds": 132199}, - {"group": "one_two_word", "operation": "add", "implementation": "int128_t", "microseconds": 129425}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1136419}, + {"group": "one_two_word", "operation": "add", "implementation": "int128", "microseconds": 129425}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1136419}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 448283}, - {"group": "one_two_word", "operation": "sub", "implementation": "int128_t", "microseconds": 125556}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1155766}, + {"group": "one_two_word", "operation": "sub", "implementation": "int128", "microseconds": 125556}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1155766}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 879154}, - {"group": "one_two_word", "operation": "mul", "implementation": "int128_t", "microseconds": 149158}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 1742092}, + {"group": "one_two_word", "operation": "mul", "implementation": "int128", "microseconds": 149158}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 1742092}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Signed128", "microseconds": 4358734}, - {"group": "one_two_word", "operation": "div", "implementation": "int128_t", "microseconds": 2884710}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 4412100}, + {"group": "one_two_word", "operation": "div", "implementation": "int128", "microseconds": 2884710}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 4412100}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 3185147}, - {"group": "one_two_word", "operation": "mod", "implementation": "int128_t", "microseconds": 2921577}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 3914892}, + {"group": "one_two_word", "operation": "mod", "implementation": "int128", "microseconds": 2921577}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 3914892}, {"group": "random_width", "operation": "eq", "implementation": "std::_Signed128", "microseconds": 110926}, {"group": "random_width", "operation": "ne", "implementation": "std::_Signed128", "microseconds": 122126}, {"group": "random_width", "operation": "lt", "implementation": "std::_Signed128", "microseconds": 472037}, @@ -168,40 +168,40 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Signed128", "microseconds": 457672}, {"group": "random_width", "operation": "ge", "implementation": "std::_Signed128", "microseconds": 448069}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Signed128", "microseconds": 2084732}, - {"group": "random_width", "operation": "eq", "implementation": "int128_t", "microseconds": 114341}, - {"group": "random_width", "operation": "ne", "implementation": "int128_t", "microseconds": 114354}, - {"group": "random_width", "operation": "lt", "implementation": "int128_t", "microseconds": 404451}, - {"group": "random_width", "operation": "le", "implementation": "int128_t", "microseconds": 406857}, - {"group": "random_width", "operation": "gt", "implementation": "int128_t", "microseconds": 436327}, - {"group": "random_width", "operation": "ge", "implementation": "int128_t", "microseconds": 469934}, - {"group": "random_width", "operation": "comparisons", "implementation": "int128_t", "microseconds": 1947041}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128_t", "microseconds": 448101}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128_t", "microseconds": 436992}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128_t", "microseconds": 499694}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128_t", "microseconds": 502800}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128_t", "microseconds": 513811}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128_t", "microseconds": 496620}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128_t", "microseconds": 2898710}, + {"group": "random_width", "operation": "eq", "implementation": "int128", "microseconds": 114341}, + {"group": "random_width", "operation": "ne", "implementation": "int128", "microseconds": 114354}, + {"group": "random_width", "operation": "lt", "implementation": "int128", "microseconds": 404451}, + {"group": "random_width", "operation": "le", "implementation": "int128", "microseconds": 406857}, + {"group": "random_width", "operation": "gt", "implementation": "int128", "microseconds": 436327}, + {"group": "random_width", "operation": "ge", "implementation": "int128", "microseconds": 469934}, + {"group": "random_width", "operation": "comparisons", "implementation": "int128", "microseconds": 1947041}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::int128", "microseconds": 448101}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::int128", "microseconds": 436992}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::int128", "microseconds": 499694}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::int128", "microseconds": 502800}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::int128", "microseconds": 513811}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::int128", "microseconds": 496620}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::int128", "microseconds": 2898710}, {"group": "random_width", "operation": "add", "implementation": "std::_Signed128", "microseconds": 131344}, - {"group": "random_width", "operation": "add", "implementation": "int128_t", "microseconds": 128063}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128_t", "microseconds": 1325852}, + {"group": "random_width", "operation": "add", "implementation": "int128", "microseconds": 128063}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::int128", "microseconds": 1325852}, {"group": "random_width", "operation": "sub", "implementation": "std::_Signed128", "microseconds": 447258}, - {"group": "random_width", "operation": "sub", "implementation": "int128_t", "microseconds": 128145}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128_t", "microseconds": 1454691}, + {"group": "random_width", "operation": "sub", "implementation": "int128", "microseconds": 128145}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::int128", "microseconds": 1454691}, {"group": "random_width", "operation": "mul", "implementation": "std::_Signed128", "microseconds": 877318}, - {"group": "random_width", "operation": "mul", "implementation": "int128_t", "microseconds": 149394}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128_t", "microseconds": 2018981}, + {"group": "random_width", "operation": "mul", "implementation": "int128", "microseconds": 149394}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::int128", "microseconds": 2018981}, {"group": "random_width", "operation": "div", "implementation": "std::_Signed128", "microseconds": 3479471}, - {"group": "random_width", "operation": "div", "implementation": "int128_t", "microseconds": 3113092}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128_t", "microseconds": 3948298}, + {"group": "random_width", "operation": "div", "implementation": "int128", "microseconds": 3113092}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::int128", "microseconds": 3948298}, {"group": "random_width", "operation": "mod", "implementation": "std::_Signed128", "microseconds": 2683535}, - {"group": "random_width", "operation": "mod", "implementation": "int128_t", "microseconds": 3157295}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128_t", "microseconds": 3620409}, + {"group": "random_width", "operation": "mod", "implementation": "int128", "microseconds": 3157295}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::int128", "microseconds": 3620409}, {"group": "random_width", "operation": "shl", "implementation": "std::_Signed128", "microseconds": 731928}, - {"group": "random_width", "operation": "shl", "implementation": "int128_t", "microseconds": 428800}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128_t", "microseconds": 1634058}, + {"group": "random_width", "operation": "shl", "implementation": "int128", "microseconds": 428800}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::int128", "microseconds": 1634058}, {"group": "random_width", "operation": "shr", "implementation": "std::_Signed128", "microseconds": 601309}, - {"group": "random_width", "operation": "shr", "implementation": "int128_t", "microseconds": 595011}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128_t", "microseconds": 1144703} + {"group": "random_width", "operation": "shr", "implementation": "int128", "microseconds": 595011}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::int128", "microseconds": 1144703} ] } diff --git a/doc/modules/ROOT/data/benchmarks-windows-x86/u128.json b/doc/modules/ROOT/data/benchmarks-windows-x86/u128.json index 0c01ad74..c7755ea1 100644 --- a/doc/modules/ROOT/data/benchmarks-windows-x86/u128.json +++ b/doc/modules/ROOT/data/benchmarks-windows-x86/u128.json @@ -1,6 +1,6 @@ { "schema": "boost.int128.benchmarks/1", - "type": "uint128_t", + "type": "uint128", "sign": "u128", "os": "windows", "arch": "x86", @@ -9,7 +9,7 @@ "elements": 10000000, "repetitions": 5, "baseline": "std::_Unsigned128", - "implementations": ["std::_Unsigned128", "uint128_t", "boost::mp::uint128_t"], + "implementations": ["std::_Unsigned128", "uint128", "boost::mp::uint128"], "results": [ {"group": "two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 111788}, {"group": "two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 122339}, @@ -18,41 +18,41 @@ {"group": "two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 330384}, {"group": "two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 334949}, {"group": "two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 1548670}, - {"group": "two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 111987}, - {"group": "two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 111075}, - {"group": "two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 107904}, - {"group": "two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 108037}, - {"group": "two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 108826}, - {"group": "two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 108928}, - {"group": "two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 657415}, - {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 159671}, - {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 158739}, - {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 163112}, - {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 163280}, - {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 166279}, - {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 169625}, - {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 981366}, + {"group": "two_word", "operation": "eq", "implementation": "uint128", "microseconds": 111987}, + {"group": "two_word", "operation": "ne", "implementation": "uint128", "microseconds": 111075}, + {"group": "two_word", "operation": "lt", "implementation": "uint128", "microseconds": 107904}, + {"group": "two_word", "operation": "le", "implementation": "uint128", "microseconds": 108037}, + {"group": "two_word", "operation": "gt", "implementation": "uint128", "microseconds": 108826}, + {"group": "two_word", "operation": "ge", "implementation": "uint128", "microseconds": 108928}, + {"group": "two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 657415}, + {"group": "two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 159671}, + {"group": "two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 158739}, + {"group": "two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 163112}, + {"group": "two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 163280}, + {"group": "two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 166279}, + {"group": "two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 169625}, + {"group": "two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 981366}, {"group": "two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 132260}, - {"group": "two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 130457}, - {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 725440}, + {"group": "two_word", "operation": "add", "implementation": "uint128", "microseconds": 130457}, + {"group": "two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 725440}, {"group": "two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 454180}, - {"group": "two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 127847}, - {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 840902}, + {"group": "two_word", "operation": "sub", "implementation": "uint128", "microseconds": 127847}, + {"group": "two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 840902}, {"group": "two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 640255}, - {"group": "two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 849501}, - {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1725572}, + {"group": "two_word", "operation": "mul", "implementation": "uint128", "microseconds": 849501}, + {"group": "two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1725572}, {"group": "two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 1303008}, - {"group": "two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 2647866}, - {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2401610}, + {"group": "two_word", "operation": "div", "implementation": "uint128", "microseconds": 2647866}, + {"group": "two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2401610}, {"group": "two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1407621}, - {"group": "two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 2757143}, - {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2465767}, + {"group": "two_word", "operation": "mod", "implementation": "uint128", "microseconds": 2757143}, + {"group": "two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2465767}, {"group": "two_word", "operation": "div64", "implementation": "std::_Unsigned128", "microseconds": 5939342}, - {"group": "two_word", "operation": "div64", "implementation": "uint128_t", "microseconds": 4769849}, - {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128_t", "microseconds": 8809478}, + {"group": "two_word", "operation": "div64", "implementation": "uint128", "microseconds": 4769849}, + {"group": "two_word", "operation": "div64", "implementation": "boost::mp::uint128", "microseconds": 8809478}, {"group": "two_word", "operation": "div32", "implementation": "std::_Unsigned128", "microseconds": 907913}, - {"group": "two_word", "operation": "div32", "implementation": "uint128_t", "microseconds": 2077709}, - {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128_t", "microseconds": 2168714}, + {"group": "two_word", "operation": "div32", "implementation": "uint128", "microseconds": 2077709}, + {"group": "two_word", "operation": "div32", "implementation": "boost::mp::uint128", "microseconds": 2168714}, {"group": "one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 109597}, {"group": "one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 122231}, {"group": "one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 330580}, @@ -60,35 +60,35 @@ {"group": "one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 329492}, {"group": "one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 326205}, {"group": "one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 1533024}, - {"group": "one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 115544}, - {"group": "one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 115732}, - {"group": "one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 114280}, - {"group": "one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 119807}, - {"group": "one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 115487}, - {"group": "one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 120178}, - {"group": "one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 701750}, - {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 160131}, - {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 156597}, - {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 162769}, - {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 163931}, - {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 164305}, - {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 168866}, - {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 977193}, + {"group": "one_word", "operation": "eq", "implementation": "uint128", "microseconds": 115544}, + {"group": "one_word", "operation": "ne", "implementation": "uint128", "microseconds": 115732}, + {"group": "one_word", "operation": "lt", "implementation": "uint128", "microseconds": 114280}, + {"group": "one_word", "operation": "le", "implementation": "uint128", "microseconds": 119807}, + {"group": "one_word", "operation": "gt", "implementation": "uint128", "microseconds": 115487}, + {"group": "one_word", "operation": "ge", "implementation": "uint128", "microseconds": 120178}, + {"group": "one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 701750}, + {"group": "one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 160131}, + {"group": "one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 156597}, + {"group": "one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 162769}, + {"group": "one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 163931}, + {"group": "one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 164305}, + {"group": "one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 168866}, + {"group": "one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 977193}, {"group": "one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 132141}, - {"group": "one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 129407}, - {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 706287}, + {"group": "one_word", "operation": "add", "implementation": "uint128", "microseconds": 129407}, + {"group": "one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 706287}, {"group": "one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 447422}, - {"group": "one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 126486}, - {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1141714}, + {"group": "one_word", "operation": "sub", "implementation": "uint128", "microseconds": 126486}, + {"group": "one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1141714}, {"group": "one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 635946}, - {"group": "one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 828587}, - {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1038315}, + {"group": "one_word", "operation": "mul", "implementation": "uint128", "microseconds": 828587}, + {"group": "one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1038315}, {"group": "one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 2611033}, - {"group": "one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 1648668}, - {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2916830}, + {"group": "one_word", "operation": "div", "implementation": "uint128", "microseconds": 1648668}, + {"group": "one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2916830}, {"group": "one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1683172}, - {"group": "one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 1658140}, - {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2094871}, + {"group": "one_word", "operation": "mod", "implementation": "uint128", "microseconds": 1658140}, + {"group": "one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2094871}, {"group": "two_one_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 109352}, {"group": "two_one_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 122157}, {"group": "two_one_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 143315}, @@ -96,35 +96,35 @@ {"group": "two_one_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 146211}, {"group": "two_one_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 147384}, {"group": "two_one_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 814792}, - {"group": "two_one_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 111456}, - {"group": "two_one_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 109635}, - {"group": "two_one_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 107279}, - {"group": "two_one_word", "operation": "le", "implementation": "uint128_t", "microseconds": 110132}, - {"group": "two_one_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 107568}, - {"group": "two_one_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 107846}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 654429}, - {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 146795}, - {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 141890}, - {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 142986}, - {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 147852}, - {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 145872}, - {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 155021}, - {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 881108}, + {"group": "two_one_word", "operation": "eq", "implementation": "uint128", "microseconds": 111456}, + {"group": "two_one_word", "operation": "ne", "implementation": "uint128", "microseconds": 109635}, + {"group": "two_one_word", "operation": "lt", "implementation": "uint128", "microseconds": 107279}, + {"group": "two_one_word", "operation": "le", "implementation": "uint128", "microseconds": 110132}, + {"group": "two_one_word", "operation": "gt", "implementation": "uint128", "microseconds": 107568}, + {"group": "two_one_word", "operation": "ge", "implementation": "uint128", "microseconds": 107846}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 654429}, + {"group": "two_one_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 146795}, + {"group": "two_one_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 141890}, + {"group": "two_one_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 142986}, + {"group": "two_one_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 147852}, + {"group": "two_one_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 145872}, + {"group": "two_one_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 155021}, + {"group": "two_one_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 881108}, {"group": "two_one_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 132415}, - {"group": "two_one_word", "operation": "add", "implementation": "uint128_t", "microseconds": 129679}, - {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 836745}, + {"group": "two_one_word", "operation": "add", "implementation": "uint128", "microseconds": 129679}, + {"group": "two_one_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 836745}, {"group": "two_one_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 448486}, - {"group": "two_one_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 129784}, - {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 962373}, + {"group": "two_one_word", "operation": "sub", "implementation": "uint128", "microseconds": 129784}, + {"group": "two_one_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 962373}, {"group": "two_one_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 640016}, - {"group": "two_one_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 838259}, - {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1497013}, + {"group": "two_one_word", "operation": "mul", "implementation": "uint128", "microseconds": 838259}, + {"group": "two_one_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1497013}, {"group": "two_one_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 4237486}, - {"group": "two_one_word", "operation": "div", "implementation": "uint128_t", "microseconds": 2544129}, - {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4572514}, + {"group": "two_one_word", "operation": "div", "implementation": "uint128", "microseconds": 2544129}, + {"group": "two_one_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4572514}, {"group": "two_one_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 3120280}, - {"group": "two_one_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 2700149}, - {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4100977}, + {"group": "two_one_word", "operation": "mod", "implementation": "uint128", "microseconds": 2700149}, + {"group": "two_one_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4100977}, {"group": "one_two_word", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 109990}, {"group": "one_two_word", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 122457}, {"group": "one_two_word", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 146899}, @@ -132,35 +132,35 @@ {"group": "one_two_word", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 146446}, {"group": "one_two_word", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 147949}, {"group": "one_two_word", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 821440}, - {"group": "one_two_word", "operation": "eq", "implementation": "uint128_t", "microseconds": 112212}, - {"group": "one_two_word", "operation": "ne", "implementation": "uint128_t", "microseconds": 110783}, - {"group": "one_two_word", "operation": "lt", "implementation": "uint128_t", "microseconds": 108143}, - {"group": "one_two_word", "operation": "le", "implementation": "uint128_t", "microseconds": 108439}, - {"group": "one_two_word", "operation": "gt", "implementation": "uint128_t", "microseconds": 108024}, - {"group": "one_two_word", "operation": "ge", "implementation": "uint128_t", "microseconds": 107744}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 655905}, - {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 145768}, - {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 141727}, - {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 143186}, - {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 147160}, - {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 148670}, - {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 154250}, - {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 881509}, + {"group": "one_two_word", "operation": "eq", "implementation": "uint128", "microseconds": 112212}, + {"group": "one_two_word", "operation": "ne", "implementation": "uint128", "microseconds": 110783}, + {"group": "one_two_word", "operation": "lt", "implementation": "uint128", "microseconds": 108143}, + {"group": "one_two_word", "operation": "le", "implementation": "uint128", "microseconds": 108439}, + {"group": "one_two_word", "operation": "gt", "implementation": "uint128", "microseconds": 108024}, + {"group": "one_two_word", "operation": "ge", "implementation": "uint128", "microseconds": 107744}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "uint128", "microseconds": 655905}, + {"group": "one_two_word", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 145768}, + {"group": "one_two_word", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 141727}, + {"group": "one_two_word", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 143186}, + {"group": "one_two_word", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 147160}, + {"group": "one_two_word", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 148670}, + {"group": "one_two_word", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 154250}, + {"group": "one_two_word", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 881509}, {"group": "one_two_word", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 132212}, - {"group": "one_two_word", "operation": "add", "implementation": "uint128_t", "microseconds": 129563}, - {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 833087}, + {"group": "one_two_word", "operation": "add", "implementation": "uint128", "microseconds": 129563}, + {"group": "one_two_word", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 833087}, {"group": "one_two_word", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 445284}, - {"group": "one_two_word", "operation": "sub", "implementation": "uint128_t", "microseconds": 128974}, - {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 954273}, + {"group": "one_two_word", "operation": "sub", "implementation": "uint128", "microseconds": 128974}, + {"group": "one_two_word", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 954273}, {"group": "one_two_word", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 635062}, - {"group": "one_two_word", "operation": "mul", "implementation": "uint128_t", "microseconds": 831912}, - {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1419132}, + {"group": "one_two_word", "operation": "mul", "implementation": "uint128", "microseconds": 831912}, + {"group": "one_two_word", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1419132}, {"group": "one_two_word", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 4247013}, - {"group": "one_two_word", "operation": "div", "implementation": "uint128_t", "microseconds": 2537809}, - {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 4568929}, + {"group": "one_two_word", "operation": "div", "implementation": "uint128", "microseconds": 2537809}, + {"group": "one_two_word", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 4568929}, {"group": "one_two_word", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 3114097}, - {"group": "one_two_word", "operation": "mod", "implementation": "uint128_t", "microseconds": 2706961}, - {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 4089359}, + {"group": "one_two_word", "operation": "mod", "implementation": "uint128", "microseconds": 2706961}, + {"group": "one_two_word", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 4089359}, {"group": "random_width", "operation": "eq", "implementation": "std::_Unsigned128", "microseconds": 109078}, {"group": "random_width", "operation": "ne", "implementation": "std::_Unsigned128", "microseconds": 121623}, {"group": "random_width", "operation": "lt", "implementation": "std::_Unsigned128", "microseconds": 545990}, @@ -168,49 +168,49 @@ {"group": "random_width", "operation": "gt", "implementation": "std::_Unsigned128", "microseconds": 588748}, {"group": "random_width", "operation": "ge", "implementation": "std::_Unsigned128", "microseconds": 569493}, {"group": "random_width", "operation": "comparisons", "implementation": "std::_Unsigned128", "microseconds": 2519936}, - {"group": "random_width", "operation": "eq", "implementation": "uint128_t", "microseconds": 222272}, - {"group": "random_width", "operation": "ne", "implementation": "uint128_t", "microseconds": 218961}, - {"group": "random_width", "operation": "lt", "implementation": "uint128_t", "microseconds": 403374}, - {"group": "random_width", "operation": "le", "implementation": "uint128_t", "microseconds": 396483}, - {"group": "random_width", "operation": "gt", "implementation": "uint128_t", "microseconds": 372956}, - {"group": "random_width", "operation": "ge", "implementation": "uint128_t", "microseconds": 391753}, - {"group": "random_width", "operation": "comparisons", "implementation": "uint128_t", "microseconds": 2006459}, - {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128_t", "microseconds": 247933}, - {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128_t", "microseconds": 257483}, - {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128_t", "microseconds": 246619}, - {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128_t", "microseconds": 249601}, - {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128_t", "microseconds": 250095}, - {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128_t", "microseconds": 264252}, - {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128_t", "microseconds": 1516713}, + {"group": "random_width", "operation": "eq", "implementation": "uint128", "microseconds": 222272}, + {"group": "random_width", "operation": "ne", "implementation": "uint128", "microseconds": 218961}, + {"group": "random_width", "operation": "lt", "implementation": "uint128", "microseconds": 403374}, + {"group": "random_width", "operation": "le", "implementation": "uint128", "microseconds": 396483}, + {"group": "random_width", "operation": "gt", "implementation": "uint128", "microseconds": 372956}, + {"group": "random_width", "operation": "ge", "implementation": "uint128", "microseconds": 391753}, + {"group": "random_width", "operation": "comparisons", "implementation": "uint128", "microseconds": 2006459}, + {"group": "random_width", "operation": "eq", "implementation": "boost::mp::uint128", "microseconds": 247933}, + {"group": "random_width", "operation": "ne", "implementation": "boost::mp::uint128", "microseconds": 257483}, + {"group": "random_width", "operation": "lt", "implementation": "boost::mp::uint128", "microseconds": 246619}, + {"group": "random_width", "operation": "le", "implementation": "boost::mp::uint128", "microseconds": 249601}, + {"group": "random_width", "operation": "gt", "implementation": "boost::mp::uint128", "microseconds": 250095}, + {"group": "random_width", "operation": "ge", "implementation": "boost::mp::uint128", "microseconds": 264252}, + {"group": "random_width", "operation": "comparisons", "implementation": "boost::mp::uint128", "microseconds": 1516713}, {"group": "random_width", "operation": "add", "implementation": "std::_Unsigned128", "microseconds": 132021}, - {"group": "random_width", "operation": "add", "implementation": "uint128_t", "microseconds": 129303}, - {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128_t", "microseconds": 1184928}, + {"group": "random_width", "operation": "add", "implementation": "uint128", "microseconds": 129303}, + {"group": "random_width", "operation": "add", "implementation": "boost::mp::uint128", "microseconds": 1184928}, {"group": "random_width", "operation": "sub", "implementation": "std::_Unsigned128", "microseconds": 505196}, - {"group": "random_width", "operation": "sub", "implementation": "uint128_t", "microseconds": 127036}, - {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128_t", "microseconds": 1526177}, + {"group": "random_width", "operation": "sub", "implementation": "uint128", "microseconds": 127036}, + {"group": "random_width", "operation": "sub", "implementation": "boost::mp::uint128", "microseconds": 1526177}, {"group": "random_width", "operation": "mul", "implementation": "std::_Unsigned128", "microseconds": 765417}, - {"group": "random_width", "operation": "mul", "implementation": "uint128_t", "microseconds": 960622}, - {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128_t", "microseconds": 1459692}, + {"group": "random_width", "operation": "mul", "implementation": "uint128", "microseconds": 960622}, + {"group": "random_width", "operation": "mul", "implementation": "boost::mp::uint128", "microseconds": 1459692}, {"group": "random_width", "operation": "div", "implementation": "std::_Unsigned128", "microseconds": 2510903}, - {"group": "random_width", "operation": "div", "implementation": "uint128_t", "microseconds": 2217091}, - {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128_t", "microseconds": 2816842}, + {"group": "random_width", "operation": "div", "implementation": "uint128", "microseconds": 2217091}, + {"group": "random_width", "operation": "div", "implementation": "boost::mp::uint128", "microseconds": 2816842}, {"group": "random_width", "operation": "mod", "implementation": "std::_Unsigned128", "microseconds": 1985290}, - {"group": "random_width", "operation": "mod", "implementation": "uint128_t", "microseconds": 2271454}, - {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128_t", "microseconds": 2458916}, + {"group": "random_width", "operation": "mod", "implementation": "uint128", "microseconds": 2271454}, + {"group": "random_width", "operation": "mod", "implementation": "boost::mp::uint128", "microseconds": 2458916}, {"group": "random_width", "operation": "shl", "implementation": "std::_Unsigned128", "microseconds": 733372}, - {"group": "random_width", "operation": "shl", "implementation": "uint128_t", "microseconds": 424985}, - {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128_t", "microseconds": 1585122}, + {"group": "random_width", "operation": "shl", "implementation": "uint128", "microseconds": 424985}, + {"group": "random_width", "operation": "shl", "implementation": "boost::mp::uint128", "microseconds": 1585122}, {"group": "random_width", "operation": "shr", "implementation": "std::_Unsigned128", "microseconds": 771271}, - {"group": "random_width", "operation": "shr", "implementation": "uint128_t", "microseconds": 547815}, - {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128_t", "microseconds": 1045069}, + {"group": "random_width", "operation": "shr", "implementation": "uint128", "microseconds": 547815}, + {"group": "random_width", "operation": "shr", "implementation": "boost::mp::uint128", "microseconds": 1045069}, {"group": "random_width", "operation": "and", "implementation": "std::_Unsigned128", "microseconds": 131113}, - {"group": "random_width", "operation": "and", "implementation": "uint128_t", "microseconds": 131871}, - {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128_t", "microseconds": 1503443}, + {"group": "random_width", "operation": "and", "implementation": "uint128", "microseconds": 131871}, + {"group": "random_width", "operation": "and", "implementation": "boost::mp::uint128", "microseconds": 1503443}, {"group": "random_width", "operation": "or", "implementation": "std::_Unsigned128", "microseconds": 131561}, - {"group": "random_width", "operation": "or", "implementation": "uint128_t", "microseconds": 131184}, - {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128_t", "microseconds": 1208348}, + {"group": "random_width", "operation": "or", "implementation": "uint128", "microseconds": 131184}, + {"group": "random_width", "operation": "or", "implementation": "boost::mp::uint128", "microseconds": 1208348}, {"group": "random_width", "operation": "xor", "implementation": "std::_Unsigned128", "microseconds": 130425}, - {"group": "random_width", "operation": "xor", "implementation": "uint128_t", "microseconds": 130219}, - {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128_t", "microseconds": 1235254} + {"group": "random_width", "operation": "xor", "implementation": "uint128", "microseconds": 130219}, + {"group": "random_width", "operation": "xor", "implementation": "boost::mp::uint128", "microseconds": 1235254} ] } diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc index bd5758ec..8c2e2bc1 100644 --- a/doc/modules/ROOT/nav.adoc +++ b/doc/modules/ROOT/nav.adoc @@ -47,24 +47,24 @@ *** xref:api_reference.adoc#api_macro_configuration[Configuration] ** xref:api_reference.adoc#api_headers[Headers] * xref:file_structure.adoc[] -* xref:uint128_t.adoc[] -** xref:uint128_t.adoc#u128_alignment[Alignment] -** xref:uint128_t.adoc#u128_operator_behavior[Operator Behavior] -** xref:uint128_t.adoc#u128_constructors[Constructors] -** xref:uint128_t.adoc#u128_conversions[Conversion Operators] -** xref:uint128_t.adoc#u128_comparison_operators[Comparison Operators] -** xref:uint128_t.adoc#u128_bitwise_operators[Bitwise Operators] -** xref:uint128_t.adoc#u128_math_operators[Mathematical Operators] -** xref:uint128_t.adoc#u128_limits[`` Support and Values] -* xref:int128_t.adoc[] -** xref:int128_t.adoc#i128_alignment[Alignment] -** xref:int128_t.adoc#i128_operator_behavior[Operator Behavior] -** xref:int128_t.adoc#i128_constructors[Constructors] -** xref:int128_t.adoc#i128_conversions[Conversion Operators] -** xref:int128_t.adoc#i128_comparison_operators[Comparison Operators] -** xref:int128_t.adoc#i128_bitwise_operators[Bitwise Operators] -** xref:int128_t.adoc#i128_math_operators[Mathematical Operators] -** xref:int128_t.adoc#i128_limits[`` Support and Values] +* xref:uint128.adoc[] +** xref:uint128.adoc#u128_alignment[Alignment] +** xref:uint128.adoc#u128_operator_behavior[Operator Behavior] +** xref:uint128.adoc#u128_constructors[Constructors] +** xref:uint128.adoc#u128_conversions[Conversion Operators] +** xref:uint128.adoc#u128_comparison_operators[Comparison Operators] +** xref:uint128.adoc#u128_bitwise_operators[Bitwise Operators] +** xref:uint128.adoc#u128_math_operators[Mathematical Operators] +** xref:uint128.adoc#u128_limits[`` Support and Values] +* xref:int128.adoc[] +** xref:int128.adoc#i128_alignment[Alignment] +** xref:int128.adoc#i128_operator_behavior[Operator Behavior] +** xref:int128.adoc#i128_constructors[Constructors] +** xref:int128.adoc#i128_conversions[Conversion Operators] +** xref:int128.adoc#i128_comparison_operators[Comparison Operators] +** xref:int128.adoc#i128_bitwise_operators[Bitwise Operators] +** xref:int128.adoc#i128_math_operators[Mathematical Operators] +** xref:int128.adoc#i128_limits[`` Support and Values] * xref:mixed_type_ops.adoc[] * xref:literals.adoc[] * xref:bit.adoc[`` (Bitwise ops)] diff --git a/doc/modules/ROOT/pages/api_reference.adoc b/doc/modules/ROOT/pages/api_reference.adoc index 14bb4fdc..9bd7b5dd 100644 --- a/doc/modules/ROOT/pages/api_reference.adoc +++ b/doc/modules/ROOT/pages/api_reference.adoc @@ -33,10 +33,10 @@ https://www.boost.org/LICENSE_1_0.txt |=== | Type | Description -| xref:uint128_t.adoc[`uint128_t`] +| xref:uint128.adoc[`uint128`] | Unsigned 128-bit integer -| xref:int128_t.adoc[`int128_t`] +| xref:int128.adoc[`int128`] | Signed 128-bit integer |=== @@ -67,23 +67,23 @@ https://www.boost.org/LICENSE_1_0.txt |=== | Structure | Description -| https://en.cppreference.com/w/cpp/types/numeric_limits[`std::numeric_limits`] -| Numeric limits specialization for `uint128_t` +| https://en.cppreference.com/w/cpp/types/numeric_limits[`std::numeric_limits`] +| Numeric limits specialization for `uint128` -| https://en.cppreference.com/w/cpp/types/numeric_limits[`std::numeric_limits`] -| Numeric limits specialization for `int128_t` +| https://en.cppreference.com/w/cpp/types/numeric_limits[`std::numeric_limits`] +| Numeric limits specialization for `int128` -| xref:hash.adoc[`std::hash`] -| Hash specialization for `uint128_t` +| xref:hash.adoc[`std::hash`] +| Hash specialization for `uint128` -| xref:hash.adoc[`std::hash`] -| Hash specialization for `int128_t` +| xref:hash.adoc[`std::hash`] +| Hash specialization for `int128` | xref:cstdlib.adoc#div_structs[`u128div_t`] -| Result type for `div(uint128_t, uint128_t)` +| Result type for `div(uint128, uint128)` | xref:cstdlib.adoc#div_structs[`i128div_t`] -| Result type for `div(int128_t, int128_t)` +| Result type for `div(int128, int128)` | xref:numeric.adoc#div_result[`div_result`] | Result type for the `div_rem_*` functions @@ -159,7 +159,7 @@ Listed by analogous STL header. |=== | Function | Description -| xref:int128_t.adoc#i128_abs[`abs`] +| xref:int128.adoc#i128_abs[`abs`] | Absolute value |=== @@ -181,11 +181,11 @@ Listed by analogous STL header. |=== | Specialization | Description -| xref:hash.adoc[`std::hash`] -| Enables `uint128_t` as a key in unordered associative containers +| xref:hash.adoc[`std::hash`] +| Enables `uint128` as a key in unordered associative containers -| xref:hash.adoc[`std::hash`] -| Enables `int128_t` as a key in unordered associative containers +| xref:hash.adoc[`std::hash`] +| Enables `int128` as a key in unordered associative containers |=== [#api_formatting] @@ -384,13 +384,13 @@ Listed by analogous STL header. | Macro | Description | `BOOST_INT128_UINT128_MAX` -| Maximum value for `uint128_t` +| Maximum value for `uint128` | `BOOST_INT128_INT128_MAX` -| Maximum value for `int128_t` +| Maximum value for `int128` | `BOOST_INT128_INT128_MIN` -| Minimum value for `int128_t` +| Minimum value for `int128` |=== === Literals @@ -488,19 +488,19 @@ Listed by analogous STL header. | Formatting integration for pass:[C++20] `` | xref:hash.adoc[``] -| `std::hash` specializations for `int128_t` and `uint128_t` +| `std::hash` specializations for `int128` and `uint128` | `` -| The xref:uint128_t.adoc[`uint128_t`] and xref:int128_t.adoc[`int128_t`] types +| The xref:uint128.adoc[`uint128`] and xref:int128.adoc[`int128`] types | xref:stream.adoc[``] -| Iostream overloads for `int128_t` and `uint128_t` +| Iostream overloads for `int128` and `uint128` | `` -| Overloads for `std::numeric_limits` for `int128_t` and `uint128_t` +| Overloads for `std::numeric_limits` for `int128` and `uint128` | xref:literals.adoc[``] -| User-defined literals for `int128_t` and `uint128_t` +| User-defined literals for `int128` and `uint128` | xref:numeric.adoc[``] | Numeric algorithms (gcd, lcm, midpoint, integer division) diff --git a/doc/modules/ROOT/pages/bit.adoc b/doc/modules/ROOT/pages/bit.adoc index 355b6978..5d739737 100644 --- a/doc/modules/ROOT/pages/bit.adoc +++ b/doc/modules/ROOT/pages/bit.adoc @@ -13,8 +13,8 @@ https://www.boost.org/LICENSE_1_0.txt #include ---- -The following are functions analogous to those found in pass:[C++20] https://en.cppreference.com/w/cpp/header/bit[] header, but for `boost::int128::uint128_t`. -None of these functions apply to signed integral types, and thus none have overloads for `boost::int128::int128_t`. +The following are functions analogous to those found in pass:[C++20] https://en.cppreference.com/w/cpp/header/bit[] header, but for `boost::int128::uint128`. +None of these functions apply to signed integral types, and thus none have overloads for `boost::int128::int128`. All of these functions are available using pass:[C++14] like the rest of the library. [#has_single_bit] @@ -28,7 +28,7 @@ Returns `true` if `x` is a power of two; otherwise `false` namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -44,7 +44,7 @@ Returns the number of consecutive `0` bits in the value `x`, starting from the m namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int countl_zero(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int countl_zero(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -60,7 +60,7 @@ Returns the number of consecutive `1` bits in the value `x`, starting from the m namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int countl_one(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int countl_one(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -77,7 +77,7 @@ If `x` is zero, returns 0 namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int bit_width(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int bit_width(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -93,7 +93,7 @@ Returns the smallest integral power of two that is not smaller than `x`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_ceil(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 bit_ceil(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -110,7 +110,7 @@ If `x` is 0 then returns 0. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_floor(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 bit_floor(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -126,7 +126,7 @@ Returns the number of consecutive `0` bits in the value `x`, starting from the l namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int countr_zero(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int countr_zero(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -142,7 +142,7 @@ Returns the number of consecutive `1` bits in the value `x`, starting from the l namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int countr_one(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int countr_one(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -159,7 +159,7 @@ This operation is also known as a left circular shift. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t rotl(uint128_t x, int s) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 rotl(uint128 x, int s) noexcept; } // namespace int128 } // namespace boost @@ -176,7 +176,7 @@ This operation is also known as a right circular shift. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t rotr(uint128_t x, int s) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 rotr(uint128 x, int s) noexcept; } // namespace int128 } // namespace boost @@ -192,7 +192,7 @@ Returns the number of `1` bits in `x`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr int popcount(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int popcount(uint128 x) noexcept; } // namespace int128 } // namespace boost @@ -208,7 +208,7 @@ Reverses the bytes in the given integer value `x`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(uint128_t x) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 byteswap(uint128 x) noexcept; } // namespace int128 } // namespace boost diff --git a/doc/modules/ROOT/pages/charconv.adoc b/doc/modules/ROOT/pages/charconv.adoc index db00fe70..ee63991b 100644 --- a/doc/modules/ROOT/pages/charconv.adoc +++ b/doc/modules/ROOT/pages/charconv.adoc @@ -47,9 +47,9 @@ struct to_chars_result }; -BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, int128::uint128_t value, int base = 10) noexcept; +BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, int128::uint128 value, int base = 10) noexcept; -BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, int128::int128_t value, int base = 10) noexcept; +BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, int128::int128 value, int base = 10) noexcept; } // namespace charconv } // namespace boost @@ -83,15 +83,15 @@ struct from_chars_result constexpr explicit operator bool() const noexcept { return ec == std::errc{}; } }; -constexpr from_chars_result from_chars(const char* first, const char* last, int128::uint128_t& value, int base = 10) noexcept; +constexpr from_chars_result from_chars(const char* first, const char* last, int128::uint128& value, int base = 10) noexcept; // Allows both std::string and std::string_view (when available) -constexpr from_chars_result from_chars(core::string_view sv, int128::uint128_t& value, int base = 10) noexcept; +constexpr from_chars_result from_chars(core::string_view sv, int128::uint128& value, int base = 10) noexcept; -constexpr from_chars_result from_chars(const char* first, const char* last, int128::int128_t& value, int base = 10) noexcept; +constexpr from_chars_result from_chars(const char* first, const char* last, int128::int128& value, int base = 10) noexcept; // Allows both std::string and std::string_view (when available) -constexpr from_chars_result from_chars(core::string_view sv, int128::int128_t& value, int base = 10) noexcept; +constexpr from_chars_result from_chars(core::string_view sv, int128::int128& value, int base = 10) noexcept; } // namespace charconv } // namespace boost diff --git a/doc/modules/ROOT/pages/comp_to_multiprecision.adoc b/doc/modules/ROOT/pages/comp_to_multiprecision.adoc index bcd86166..2fd0254a 100644 --- a/doc/modules/ROOT/pages/comp_to_multiprecision.adoc +++ b/doc/modules/ROOT/pages/comp_to_multiprecision.adoc @@ -14,6 +14,6 @@ There are several reasons why: The module weight of this library will be 5, whereas https://pdimov.github.io/boostdep-report/develop/module-weights.html[Boost.Multiprecision is 25] - Fundamentally, the designs of the types are different. In Boost.Multiprecision, `int128` and `uint128` are incident to the arbitrary precision integer `cpp_int`, not a specifically designed type. -In this library both `int128_t` and `uint128_t` are their own classes with individually implemented operators to maximize performance. +In this library both `int128` and `uint128` are their own classes with individually implemented operators to maximize performance. - In Boost.Multiprecision all types are based on a high-level template `number` to allow interoperability with each other. -Again, both `int128_t` and `uint128_t` are their own classes, and are designed to work with and act like the built-in integer types. +Again, both `int128` and `uint128` are their own classes, and are designed to work with and act like the built-in integer types. diff --git a/doc/modules/ROOT/pages/config.adoc b/doc/modules/ROOT/pages/config.adoc index 265d46e8..fffc150f 100644 --- a/doc/modules/ROOT/pages/config.adoc +++ b/doc/modules/ROOT/pages/config.adoc @@ -111,4 +111,4 @@ They are most useful for writing code that has to adapt to what the platform pro [#host_device] - `BOOST_INT128_HOST_DEVICE`: This is defined to `pass:[__host__ __device__]` when compiling for CUDA (`pass:[__CUDACC__]` with `BOOST_INT128_ENABLE_CUDA`), to `SYCL_EXTERNAL` when compiling for SYCL (`BOOST_INT128_ENABLE_SYCL`), and to nothing otherwise. -The core type operations (constructors, conversion operators, and the comparison, bitwise, arithmetic, and shift operators) and most free functions are annotated with this macro, allowing `int128_t` and `uint128_t` to be used in CUDA and SYCL device code. Host-only integrations that depend on host facilities are not annotated: `std::hash`, the iostream operators, the `std::formatter` / pass:[{fmt}] support, and the `core::string_view` overloads of `from_chars`. Under SYCL the `operator long double` conversion is additionally unavailable because the spir64 device target has no `long double`. +The core type operations (constructors, conversion operators, and the comparison, bitwise, arithmetic, and shift operators) and most free functions are annotated with this macro, allowing `int128` and `uint128` to be used in CUDA and SYCL device code. Host-only integrations that depend on host facilities are not annotated: `std::hash`, the iostream operators, the `std::formatter` / pass:[{fmt}] support, and the `core::string_view` overloads of `from_chars`. Under SYCL the `operator long double` conversion is additionally unavailable because the spir64 device target has no `long double`. diff --git a/doc/modules/ROOT/pages/cstdlib.adoc b/doc/modules/ROOT/pages/cstdlib.adoc index ed5636cc..7cf82e57 100644 --- a/doc/modules/ROOT/pages/cstdlib.adoc +++ b/doc/modules/ROOT/pages/cstdlib.adoc @@ -27,14 +27,14 @@ namespace int128 { struct u128div_t { - uint128_t quot; - uint128_t rem; + uint128 quot; + uint128 rem; }; struct i128div_t { - int128_t quot; - int128_t rem; + int128 quot; + int128 rem; }; } // namespace int128 @@ -51,9 +51,9 @@ Using the structures defined above, the `div` function computes both quotient an namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr u128div_t div(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr u128div_t div(uint128 lhs, uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr i128div_t div(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr i128div_t div(int128 lhs, int128 rhs) noexcept; } // namespace int128 } // namespace boost diff --git a/doc/modules/ROOT/pages/design.adoc b/doc/modules/ROOT/pages/design.adoc index 069f5df0..07f8cb96 100644 --- a/doc/modules/ROOT/pages/design.adoc +++ b/doc/modules/ROOT/pages/design.adoc @@ -10,7 +10,7 @@ https://www.boost.org/LICENSE_1_0.txt == Exactly 128 Bits on Every Platform -The central design goal is that `sizeof(uint128_t)` and `sizeof(int128_t)` are exactly 16 bytes on every supported platform. +The central design goal is that `sizeof(uint128)` and `sizeof(int128)` are exactly 16 bytes on every supported platform. The compiler's `pass:[__int128]` extension is only available on some 64-bit targets and is absent on MSVC, while multiprecision types typically carry an additional word of bookkeeping. By fixing the layout at two 64-bit words, the library provides a drop-in 128-bit integer whose size and alignment match a built-in type where one exists. See xref:comp_to_multiprecision.adoc[Comparison to Boost.Multiprecision] for the tradeoffs relative to a multiprecision `number`. @@ -29,19 +29,19 @@ Meeting the pass:[C++14] bar also satisfies the conceptual requirements of libra == Emulating a Built-in Integer -To behave like a built-in integer in generic code, the types provide implicit conversions to and from the built-in integer and floating-point types, and implicit conversion between `int128_t` and `uint128_t`. +To behave like a built-in integer in generic code, the types provide implicit conversions to and from the built-in integer and floating-point types, and implicit conversion between `int128` and `uint128`. The single exception is `operator bool`, which is `explicit` to match the standard library convention and to avoid unintended participation in arithmetic and overload resolution. Mixed-sign and mixed-width operations follow the usual arithmetic conversions of the language. -In particular, an operation mixing a signed and an unsigned 128-bit operand produces a `uint128_t`, identical to the value the equivalent built-in `pass:[unsigned __int128]` operation would produce, with two's-complement wrap-around. +In particular, an operation mixing a signed and an unsigned 128-bit operand produces a `uint128`, identical to the value the equivalent built-in `pass:[unsigned __int128]` operation would produce, with two's-complement wrap-around. See xref:mixed_type_ops.adoc[Mixed Type Operations] for the complete result-type rules. == Layout and Alignment Each type is a struct of two 64-bit words, `low` and `high`, whose declaration order depends on the endianness of the target so that the in-memory representation matches a native 128-bit integer. -Both words are `std::uint64_t` in both types; `int128_t` interprets the pair as two's complement and exposes `signed_high()` for the sign. -Keeping the two halves the same type is what lets a compiler treat the pair as one wide access, so loops over `int128_t` vectorize instead of being scalarized. -See xref:int128_t.adoc#i128_storage[Storage and signed_high]. +Both words are `std::uint64_t` in both types; `int128` interprets the pair as two's complement and exposes `signed_high()` for the sign. +Keeping the two halves the same type is what lets a compiler treat the pair as one wide access, so loops over `int128` vectorize instead of being scalarized. +See xref:int128.adoc#i128_storage[Storage and signed_high]. When a native 128-bit type is available the struct is over-aligned to match it, except on 32-bit x86 where the native alignment is not forced. == GPU Support diff --git a/doc/modules/ROOT/pages/examples.adoc b/doc/modules/ROOT/pages/examples.adoc index 08e186d5..371f6191 100644 --- a/doc/modules/ROOT/pages/examples.adoc +++ b/doc/modules/ROOT/pages/examples.adoc @@ -17,7 +17,7 @@ pass:[C++] has no 128-bit literal, so the first practical question about a 128-b This example covers every route: from a built-in integer, from an explicit pair of high and low 64-bit words, from the `_u128` and `_i128` user-defined literals, from the `BOOST_INT128_UINT128_C` and `BOOST_INT128_INT128_C` macros, from a string through a stream, and from floating point. The floating-point cases at the end are worth reading closely, because the conversion is total: NaN yields zero and out-of-range values saturate to the nearest limit rather than invoking undefined behavior. -.This https://github.com/cppalliance/int128/blob/develop/examples/construction.cpp[example] demonstrates the various ways to construct uint128_t and int128_t values +.This https://github.com/cppalliance/int128/blob/develop/examples/construction.cpp[example] demonstrates the various ways to construct uint128 and int128 values ==== [source, c++] ---- @@ -27,7 +27,7 @@ include::example$construction.cpp[] .Expected Output [listing] ---- -=== uint128_t Construction === +=== uint128 Construction === From builtin (42U): 42 From parts (1, 0) = 2^64: 18446744073709551616 From parts (max, max): 340282366920938463463374607431768211455 @@ -36,7 +36,7 @@ From literal 12345_U128: 12345 From BOOST_INT128_UINT128_C(max): 340282366920938463463374607431768211455 From stringstream: 12345678901234567890123456789 -=== int128_t Construction === +=== int128 Construction === From builtin (-42): -42 From parts (INT64_MIN, 0): -170141183460469231731687303715884105728 Equals numeric_limits min? true @@ -51,17 +51,17 @@ Default constructed: 0 Copy constructed: 340282366920938463463374607431768211455 === Floating-Point Construction === -uint128_t from 12345.9 (truncated): 12345 -int128_t from -12345.9 (truncated toward zero): -12345 -uint128_t from 2^100: 1267650600228229401496703205376 +uint128 from 12345.9 (truncated): 12345 +int128 from -12345.9 (truncated toward zero): -12345 +uint128 from 2^100: 1267650600228229401496703205376 === Floating-Point Edge Cases === -uint128_t from NaN: 0 -int128_t from NaN: 0 -uint128_t from -1.0 (clamped to zero): 0 -uint128_t from +infinity (saturates to UINT128_MAX): 340282366920938463463374607431768211455 -int128_t from 1e40 (saturates to INT128_MAX): 170141183460469231731687303715884105727 -int128_t from -1e40 (saturates to INT128_MIN): -170141183460469231731687303715884105728 +uint128 from NaN: 0 +int128 from NaN: 0 +uint128 from -1.0 (clamped to zero): 0 +uint128 from +infinity (saturates to UINT128_MAX): 340282366920938463463374607431768211455 +int128 from 1e40 (saturates to INT128_MAX): 170141183460469231731687303715884105727 +int128 from -1e40 (saturates to INT128_MIN): -170141183460469231731687303715884105728 ---- ==== @@ -154,13 +154,13 @@ Lower unsigned value: 36893488147419103231 === Large Values (Beyond 64-bit) === 2^64 = 18446744073709551616 2^100 = 1267650600228229401496703205376 -uint128_t max = 340282366920938463463374607431768211455 -int128_t min = -170141183460469231731687303715884105728 -int128_t max = 170141183460469231731687303715884105727 +uint128 max = 340282366920938463463374607431768211455 +int128 min = -170141183460469231731687303715884105728 +int128 max = 170141183460469231731687303715884105727 === String Conversion with std::stringstream === -uint128_t to string: "1267650600228229401496703205376" -String to uint128_t: 123456789012345678901234567890 +uint128 to string: "1267650600228229401496703205376" +String to uint128: 123456789012345678901234567890 === Round-trip Conversion === Original: 68915718020162848918556923512 @@ -174,7 +174,7 @@ Match: true == Rollover Behavior Overflow is defined for both types. -`uint128_t` wraps modulo 2^128 as any unsigned integer does, and `int128_t` wraps using two's complement rather than invoking the undefined behavior that built-in signed overflow does; both types report `is_modulo` through `std::numeric_limits`. +`uint128` wraps modulo 2^128 as any unsigned integer does, and `int128` wraps using two's complement rather than invoking the undefined behavior that built-in signed overflow does; both types report `is_modulo` through `std::numeric_limits`. This example steps over each of the four boundaries in turn. .This https://github.com/cppalliance/int128/blob/develop/examples/rollover.cpp[example] demonstrates the rollover behavior of both the unsigned and signed type @@ -187,18 +187,18 @@ include::example$rollover.cpp[] .Expected Output [listing] ---- -=== uint128_t behavior === -Max of uint128_t: 340282366920938463463374607431768211455 +=== uint128 behavior === +Max of uint128: 340282366920938463463374607431768211455 Max + 1U: 0 -Min of uint128_t: 0 +Min of uint128: 0 Min - 1U: 340282366920938463463374607431768211455 -=== int128_t behavior === -Max of int128_t: 170141183460469231731687303715884105727 +=== int128 behavior === +Max of int128: 170141183460469231731687303715884105727 Max + 1: -170141183460469231731687303715884105728 -Min of int128_t: -170141183460469231731687303715884105728 +Min of int128: -170141183460469231731687303715884105728 Min - 1: 170141183460469231731687303715884105727 ---- ==== @@ -206,7 +206,7 @@ Min - 1: 170141183460469231731687303715884105727 [#examples_bit] == Bitwise Functions () -The `` functions are provided for `uint128_t`, and every one of them is `constexpr`. +The `` functions are provided for `uint128`, and every one of them is `constexpr`. This example takes advantage of that by asserting all of its results with `static_assert`, so the whole thing is checked at compile time: if it builds, it passes. It also shows that `bit.hpp` can be included on its own, without pulling in the umbrella header. @@ -236,9 +236,9 @@ include::example$saturating_arithmetic.cpp[] [listing] ---- === Saturating Arithmetic === -uint128_t max = 340282366920938463463374607431768211455 -int128_t max = 170141183460469231731687303715884105727 -int128_t min = -170141183460469231731687303715884105728 +uint128 max = 340282366920938463463374607431768211455 +int128 max = 170141183460469231731687303715884105727 +int128 min = -170141183460469231731687303715884105728 === Saturating Addition and Subtraction === saturating_add(uint_max, uint_max) = 340282366920938463463374607431768211455 (saturates to uint_max) @@ -252,7 +252,7 @@ saturating_mul(-(int_max - 2), 5) = -170141183460469231731687303715884105728 (sa saturating_div(int_min, -1) = 170141183460469231731687303715884105727 (saturates to int_max; normally this overflows) === Saturating Casts === -saturating_cast(uint_max) = 170141183460469231731687303715884105727 (saturates to int_max) +saturating_cast(uint_max) = 170141183460469231731687303715884105727 (saturates to int_max) saturating_cast(int_max) = 9223372036854775807 (saturates to INT64_MAX) saturating_cast(uint_max) = 2147483647 (saturates to INT32_MAX) ---- @@ -390,7 +390,7 @@ ckd_mul(INT128_MAX, 2): overflow=true, wrapped=-2 ckd_mul(INT128_MIN, -1): overflow=true, wrapped=-170141183460469231731687303715884105728 === Mixed Types === -ckd_add(uint128_t{5}, int128_t{-3}): overflow=false, result=2 +ckd_add(uint128{5}, int128{-3}): overflow=false, result=2 ckd_mul(20, 20): overflow=true, wrapped=144 ---- ==== @@ -412,7 +412,7 @@ include::example$mixed_type_arithmetic.cpp[] .Expected Output [listing] ---- -=== Mixed Type Arithmetic with uint128_t === +=== Mixed Type Arithmetic with uint128 === unsigned_value = 3 unsigned_value + 1 = 4 unsigned_value - 1 = 2 @@ -421,7 +421,7 @@ unsigned_value / 3 = 1 unsigned_value % 3 = 0 unsigned_value + 5 = 8 (same as greater_unsigned_value: 8) -=== Mixed Type Arithmetic with int128_t === +=== Mixed Type Arithmetic with int128 === signed_value = -3 signed_value + 1U = -2 signed_value - 4U = -7 @@ -447,12 +447,12 @@ include::example$math_and_random.cpp[tags=**;!exclude] .Example Output (values vary per run) [listing] ---- -=== uint128_t === +=== uint128 === Mean: 22125900135088040520646253247977468 Variance: 15183108029620265677746188314852225 Median: 169775281866460752209725324063124732284 -=== int128_t === -Random int128_t: 45422201008201503618595888886744218664 +=== int128 === +Random int128: 45422201008201503618595888886744218664 ---- ==== @@ -474,10 +474,10 @@ include::example$charconv.cpp[] [listing] ---- === to_chars === -uint128_t max (decimal): 340282366920938463463374607431768211455 -int128_t min (decimal): -170141183460469231731687303715884105728 -uint128_t (hex): 0xdeadbeefcafebabe12345678 -int128_t 511 (octal): 0777 +uint128 max (decimal): 340282366920938463463374607431768211455 +int128 min (decimal): -170141183460469231731687303715884105728 +uint128 (hex): 0xdeadbeefcafebabe12345678 +int128 511 (octal): 0777 === from_chars === Parsed "340282366920938463463374607431768211455" @@ -508,10 +508,10 @@ include::example$container_hash.cpp[tags=**;!exclude] [listing] ---- === boost::hash on 128-bit types === -boost::hash matches std::hash (uint128_t): true -boost::hash matches std::hash (int128_t): true +boost::hash matches std::hash (uint128): true +boost::hash matches std::hash (int128): true -=== boost::unordered_map === +=== boost::unordered_map === Entries: 3 Label at 2^64: two to the sixty-fourth Contains 42: true @@ -521,7 +521,7 @@ Cities stored: 2 Population at (10, 20): 5000000 Same coordinate hashes equal: true -=== boost::unordered_flat_map === +=== boost::unordered_flat_map === Flat map size: 3 counts[-1] = 1 ---- @@ -532,7 +532,7 @@ counts[-1] = 1 `to_string` is the convenience route to a `std::string`, mirroring `std::to_string` for the built-in integers. This example checks that agreement directly for values inside the 64-bit range and then continues past it. -The last case is a deliberate trap: the magnitude of the most negative `int128_t` is larger than the maximum `int128_t`, so it cannot be written as a negated literal. +The last case is a deliberate trap: the magnitude of the most negative `int128` is larger than the maximum `int128`, so it cannot be written as a negated literal. The `NOTE` following the output explains what to use instead. .This https://github.com/cppalliance/int128/blob/develop/examples/to_string.cpp[example] demonstrates to_string for 128-bit integers, comparing results against std::to_string for values that fit in 64 bits @@ -545,34 +545,34 @@ include::example$to_string.cpp[] .Expected Output [listing] ---- -=== to_string with uint128_t === -uint128_t to_string(1234567890): 1234567890 +=== to_string with uint128 === +uint128 to_string(1234567890): 1234567890 std::to_string(uint64_t 1234567890): 1234567890 Match: true -uint128_t to_string(UINT64_MAX): 18446744073709551615 +uint128 to_string(UINT64_MAX): 18446744073709551615 std::to_string(UINT64_MAX): 18446744073709551615 Match: true -uint128_t max: 340282366920938463463374607431768211455 +uint128 max: 340282366920938463463374607431768211455 -=== to_string with int128_t === -int128_t to_string(-42): -42 +=== to_string with int128 === +int128 to_string(-42): -42 std::to_string(int64_t -42): -42 Match: true -int128_t to_string(INT64_MAX): 9223372036854775807 +int128 to_string(INT64_MAX): 9223372036854775807 std::to_string(INT64_MAX): 9223372036854775807 Match: true -int128_t min with string literal: 0 +int128 min with string literal: 0 -int128_t min with INT128_C macro: -170141183460469231731687303715884105728 -int128_t max: 170141183460469231731687303715884105727 +int128 min with INT128_C macro: -170141183460469231731687303715884105728 +int128 max: 170141183460469231731687303715884105727 ---- ==== -NOTE: The line `int128_t min with string literal: 0` is expected. The positive magnitude of the minimum `int128_t` value (2^127) is larger than the maximum `int128_t` value, so it cannot be written as a negated `_i128` literal. Construct it with `BOOST_INT128_INT128_C` or `(std::numeric_limits::min)()`, as the example shows. +NOTE: The line `int128 min with string literal: 0` is expected. The positive magnitude of the minimum `int128` value (2^127) is larger than the maximum `int128` value, so it cannot be written as a negated `_i128` literal. Construct it with `BOOST_INT128_INT128_C` or `(std::numeric_limits::min)()`, as the example shows. [#examples_fmt_format] == \{fmt} Library Integration @@ -639,9 +639,9 @@ Left align hex: 'ff ' Center with prefix: '****0xff****' === Large Values === -uint128_t max: 340282366920938463463374607431768211455 -uint128_t max (hex): 0xffffffffffffffffffffffffffffffff -int128_t min: -170141183460469231731687303715884105728 +uint128 max: 340282366920938463463374607431768211455 +uint128 max (hex): 0xffffffffffffffffffffffffffffffff +int128 min: -170141183460469231731687303715884105728 === Combined Format Specifiers === Hex with prefix, uppercase, padded: 0XDEADBEEFCAFEBABE12345678 @@ -740,7 +740,7 @@ All CPU and GPU computed elements match! A GPU is a natural fit for primality testing because every candidate is independent, but the arithmetic is not expressible in 64 bits. Miller-Rabin repeatedly reduces a product of two residues modulo `n`; when `n` is a 64-bit value both operands can approach `2^64`, so -the product needs a full 128 bits before it can be reduced. `uint128_t` supplies that +the product needs a full 128 bits before it can be reduced. `uint128` supplies that intermediate in device code, where `unsigned __int128` is not portably available. .This https://github.com/cppalliance/int128/blob/develop/examples/cuda_primality.cu[example] runs a deterministic Miller-Rabin test over the largest odd values representable in 64 bits, one candidate per thread, using xref:utilities.adoc#powm[`powm`] and the 128-bit product for the modular squarings. @@ -755,7 +755,7 @@ include::example$cuda_primality.cu[] ---- Full 128-bit product a * b: 159945956516994065446882290339781513595 (a * b) % n, 64-bit math: 17693923505768731003 <- the product wrapped - (a * b) % n via uint128_t: 12755662373092413040 + (a * b) % n via uint128: 12755662373092413040 [Miller-Rabin on 65536 odd candidates from 18446744073709420545 to 18446744073709551615] CUDA kernel launch with 256 blocks of 256 threads @@ -772,7 +772,7 @@ Reductions are the other common reason to reach for a wider integer on a GPU. A of 64-bit integers overflows a 64-bit accumulator, and widening to `double` only trades a wrong answer for a lossy one. Floating point also makes the result depend on the order of summation, which a parallel reduction does not control: the partitioning of the work becomes -part of the answer. Integer addition is associative, so a `uint128_t` accumulator is both +part of the answer. Integer addition is associative, so a `uint128` accumulator is both exact and independent of how the reduction is split across the device. .This https://github.com/cppalliance/int128/blob/develop/examples/sycl_accumulate.cpp[example] computes an exact dot product on the device as 1024 strided partial sums, then shows that it is bit-for-bit equal to the host result summed in either direction, while a 64-bit accumulator wraps and a `double` cannot represent even a single product. @@ -788,7 +788,7 @@ include::example$sycl_accumulate.cpp[] [Exact dot product of 1048576 pairs of 40-bit integers] SYCL device: Intel(R) ... -uint128_t accumulator, exact and 99 bits wide +uint128 accumulator, exact and 99 bits wide device, 1024 strided partials : 317117374481213326859021202374 host, ascending order : 317117374481213326859021202374 host, descending order : 317117374481213326859021202374 @@ -799,7 +799,7 @@ uint64_t accumulator, silently wrong times it wrapped past 2^64 : 17190967317 double, too few significand bits for even one product - lhs[0] * rhs[0] as uint128_t : 583389027108597783863934 (79 bits) + lhs[0] * rhs[0] as uint128 : 583389027108597783863934 (79 bits) lhs[0] * rhs[0] as double : 5.8338902710859781e+23 rounding error : 23584130 diff --git a/doc/modules/ROOT/pages/file_structure.adoc b/doc/modules/ROOT/pages/file_structure.adoc index dfd495b4..949b21df 100644 --- a/doc/modules/ROOT/pages/file_structure.adoc +++ b/doc/modules/ROOT/pages/file_structure.adoc @@ -37,10 +37,10 @@ The entire library can be consumed via ``, or by independently | C++20 `std::format` support | xref:hash.adoc[``] -| `std::hash` specializations for `int128_t` and `uint128_t` +| `std::hash` specializations for `int128` and `uint128` | xref:api_reference.adoc#api_types[``] -| Core type definitions (xref:uint128_t.adoc[`uint128_t`], xref:int128_t.adoc[`int128_t`]) +| Core type definitions (xref:uint128.adoc[`uint128`], xref:int128.adoc[`int128`]) | xref:stream.adoc[``] | Stream insertion/extraction operators diff --git a/doc/modules/ROOT/pages/hash.adoc b/doc/modules/ROOT/pages/hash.adoc index 9d06ed91..f83f660c 100644 --- a/doc/modules/ROOT/pages/hash.adoc +++ b/doc/modules/ROOT/pages/hash.adoc @@ -8,7 +8,7 @@ https://www.boost.org/LICENSE_1_0.txt = Hashing :idprefix: hash_ -The `` header provides specializations of `std::hash` for `uint128_t` and `int128_t`, allowing the library types to be used as keys in `std::unordered_map`, `std::unordered_set`, and any other container that relies on `std::hash`. +The `` header provides specializations of `std::hash` for `uint128` and `int128`, allowing the library types to be used as keys in `std::unordered_map`, `std::unordered_set`, and any other container that relies on `std::hash`. [source, c++] ---- @@ -23,15 +23,15 @@ The `` header provides specializations of `std::hash` for namespace std { template <> -struct hash +struct hash { - std::size_t operator()(boost::int128::int128_t v) const noexcept; + std::size_t operator()(boost::int128::int128 v) const noexcept; }; template <> -struct hash +struct hash { - std::size_t operator()(boost::int128::uint128_t v) const noexcept; + std::size_t operator()(boost::int128::uint128 v) const noexcept; }; } // namespace std @@ -45,7 +45,7 @@ The two finalized halves are then combined with the `boost::hash_combine` mixing == Guarantees * Two values comparing equal under `operator==` produce the same hash. -* For any non-zero `v`, `std::hash{}(v) != std::hash{}(-v)`. +* For any non-zero `v`, `std::hash{}(v) != std::hash{}(-v)`. * The mixing function is asymmetric, so `{high, low}` and `{low, high}` do not collide except by chance. [#hash_container_hash] @@ -58,9 +58,9 @@ The header also injects `hash_value` overloads into the `boost::int128` namespac namespace boost { namespace int128 { -std::size_t hash_value(uint128_t v) noexcept; +std::size_t hash_value(uint128 v) noexcept; -std::size_t hash_value(int128_t v) noexcept; +std::size_t hash_value(int128 v) noexcept; } // namespace int128 } // namespace boost @@ -82,9 +82,9 @@ See the xref:examples.adoc#examples_boost_container_hash[Boost.ContainerHash int int main() { - std::unordered_map counts {}; - counts[boost::int128::uint128_t{1, 0}] = 1; - counts[boost::int128::uint128_t{0, 1}] = 2; + std::unordered_map counts {}; + counts[boost::int128::uint128{1, 0}] = 1; + counts[boost::int128::uint128{0, 1}] = 2; return 0; } diff --git a/doc/modules/ROOT/pages/i128_benchmarks.adoc b/doc/modules/ROOT/pages/i128_benchmarks.adoc index ebcba16d..4dbdbca2 100644 --- a/doc/modules/ROOT/pages/i128_benchmarks.adoc +++ b/doc/modules/ROOT/pages/i128_benchmarks.adoc @@ -5,7 +5,7 @@ https://www.boost.org/LICENSE_1_0.txt //// [#i128_benchmarks] -= `int128_t` Benchmarks += `int128` Benchmarks :idprefix: i128_benchmarks_ == Methodology @@ -16,7 +16,7 @@ Each platform states its element count and pass count, and therefore how many op The `Comparisons` row is the total of all six relational operators (`==`, `!=`, `<`, `<=`, `>`, `>=`) over that same vector, which is why it costs roughly six arithmetic rows. On most platforms we use the builtin `\__int128` as the reference benchmark. -When this is unavailable (such as on 32-bit architectures) we use `boost::multiprecision::int128_t` (abbreviated as `boost::mp::int128_t`) as it is widely used, and known to be portable. +When this is unavailable (such as on 32-bit architectures) we use `boost::multiprecision::int128` (abbreviated as `boost::mp::int128`) as it is widely used, and known to be portable. On MSVC platforms we use as reference `std::_Signed128` from the header `<__msvc_int128.hpp>` since this is bundled with their compiler. Lastly, when available, the benchmarks are also run with `absl::int128` which is the 128-bit signed integer from the https://abseil.io[Abseil Libraries]. @@ -53,7 +53,7 @@ Measured with GCC 14.2 (pass:[C++]20): 5 passes over 20,000,000 element pairs (1 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `__int128` | `int128_t` | `boost::mp::int128_t` | `absl::int128` +| Operation | `__int128` | `int128` | `boost::mp::int128` | `absl::int128` | Comparisons | 575,065 | 500,451 | 1,703,153 | 503,204 | Addition | 65,874 | 60,371 | 176,054 | 60,901 @@ -71,7 +71,7 @@ Measured with GCC 14.2 (pass:[C++]20): 5 passes over 20,000,000 element pairs (1 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `__int128` | `int128_t` | `boost::mp::int128_t` | `absl::int128` +| Operation | `__int128` | `int128` | `boost::mp::int128` | `absl::int128` | Comparisons | 1,548,448 | 978,632 | 2,358,441 | 1,576,854 | Addition | 86,459 | 87,101 | 221,898 | 88,399 @@ -89,7 +89,7 @@ Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `__int128` | `int128_t` | `boost::mp::int128_t` | `absl::int128` +| Operation | `__int128` | `int128` | `boost::mp::int128` | `absl::int128` | Comparisons | 785,777 | 708,911 | 2,059,404 | 525,305 | Addition | 50,685 | 44,057 | 258,246 | 37,090 @@ -107,7 +107,7 @@ Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10 [cols="1,>1,>1,>1"] |=== -| Operation | `__int128` | `int128_t` | `boost::mp::int128_t` +| Operation | `__int128` | `int128` | `boost::mp::int128` | Comparisons | 428,645 | 462,487 | 1,021,098 | Addition | 24,939 | 16,225 | 118,021 @@ -121,13 +121,13 @@ image::i128_graphs/linux/ppc64le_relative_performance.png[ppc64le Relative Perfo === x86_32 -NOTE: This platform has no hardware type so we compare relative to `boost::mp::int128_t` +NOTE: This platform has no hardware type so we compare relative to `boost::mp::int128` Measured with GCC 14.2 (pass:[C++]20): 5 passes over 10,000,000 element pairs (50,000,000 operations per cell). [cols="1,>1,>1"] |=== -| Operation | `int128_t` | `boost::mp::int128_t` +| Operation | `int128` | `boost::mp::int128` | Comparisons | 1,803,323 | 2,166,376 | Addition | 159,907 | 1,198,244 @@ -141,13 +141,13 @@ image::i128_graphs/linux/x86_relative_performance.png[x86 Relative Performance, === ARM32 -NOTE: This platform has no hardware type so we compare relative to `boost::mp::int128_t` +NOTE: This platform has no hardware type so we compare relative to `boost::mp::int128` Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10,000,000 operations per cell). [cols="1,>1,>1"] |=== -| Operation | `int128_t` | `boost::mp::int128_t` +| Operation | `int128` | `boost::mp::int128` | Comparisons | 1,199,464 | 1,149,576 | Addition | 90,313 | 1,105,341 @@ -168,7 +168,7 @@ Measured with MSVC 14.51 (pass:[C++]20): 5 passes over 20,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Signed128` | `int128_t` | `boost::mp::int128_t` +| Operation | `std::_Signed128` | `int128` | `boost::mp::int128` | Comparisons | 1,361,518 | 1,271,189 | 4,315,263 | Addition | 115,135 | 107,633 | 2,089,612 @@ -186,7 +186,7 @@ Measured with MSVC 14.44 (pass:[C++]20): 5 passes over 20,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Signed128` | `int128_t` | `boost::mp::int128_t` +| Operation | `std::_Signed128` | `int128` | `boost::mp::int128` | Comparisons | 1,191,566 | 1,125,261 | 2,871,780 | Addition | 86,160 | 84,055 | 1,598,093 @@ -204,7 +204,7 @@ Measured with MSVC 14.51 (pass:[C++]20): 5 passes over 10,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Signed128` | `int128_t` | `boost::mp::int128_t` +| Operation | `std::_Signed128` | `int128` | `boost::mp::int128` | Comparisons | 2,084,732 | 1,947,041 | 2,898,710 | Addition | 131,344 | 128,063 | 1,325,852 @@ -225,7 +225,7 @@ Measured with Apple Clang 21.0 (pass:[C++]20): 5 passes over 20,000,000 element [cols="1,>1,>1,>1,>1"] |=== -| Operation | `__int128` | `int128_t` | `boost::mp::int128_t` | `absl::int128` +| Operation | `__int128` | `int128` | `boost::mp::int128` | `absl::int128` | Comparisons | 479,219 | 358,275 | 1,035,078 | 405,457 | Addition | 152,489 | 90,873 | 444,144 | 72,358 diff --git a/doc/modules/ROOT/pages/int128_t.adoc b/doc/modules/ROOT/pages/int128_t.adoc index fc9b432c..26505b1d 100644 --- a/doc/modules/ROOT/pages/int128_t.adoc +++ b/doc/modules/ROOT/pages/int128_t.adoc @@ -4,13 +4,13 @@ Distributed under the Boost Software License, Version 1.0. https://www.boost.org/LICENSE_1_0.txt //// -[#int128_t] -= int128_t -:idprefix: int128_t_ +[#int128] += int128 +:idprefix: int128_ == Description -`int128_t` is a signed 128-bit integer. +`int128` is a signed 128-bit integer. [source, c++] ---- @@ -19,7 +19,7 @@ https://www.boost.org/LICENSE_1_0.txt namespace boost { namespace int128 { -struct int128_t { +struct int128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -41,7 +41,7 @@ struct int128_t { The type provides: -* Constructors from all built-in integer types and `uint128_t` +* Constructors from all built-in integer types and `uint128` * Conversion operators to built-in integer and floating-point types * Full set of comparison operators (`<`, `<=`, `>`, `>=`, `==`, `!=`) * Bitwise operators (`~`, `|`, `&`, `^`, `<<`, `>>`) @@ -53,8 +53,8 @@ The type provides: == Storage and `signed_high` Both words are `std::uint64_t`, and the value is interpreted as two's complement across the pair. -The two halves deliberately have the *same* type: when they differ, a compiler's data-reference analysis cannot merge them into one wide access, and loops over `int128_t` come out with shuffles or fully scalarized. -Giving both words the same type makes the signed type generate the same code as `uint128_t`, which has always had uniform words. +The two halves deliberately have the *same* type: when they differ, a compiler's data-reference analysis cannot merge them into one wide access, and loops over `int128` come out with shuffles or fully scalarized. +Giving both words the same type makes the signed type generate the same code as `uint128`, which has always had uniform words. To read the high word as a signed quantity, use `signed_high()`: @@ -67,13 +67,13 @@ It is a pure reinterpretation of the stored bits and is `constexpr` on all platf [source, c++] ---- -const boost::int128::int128_t v {-1}; +const boost::int128::int128 v {-1}; v.high; // 0xFFFFFFFFFFFFFFFF, a std::uint64_t v.signed_high(); // -1, a std::int64_t ---- -The two-word constructor still takes its high word as `std::int64_t`, so `int128_t{-1, 0}` and `int128_t{INT64_MIN, 0}` are unchanged. +The two-word constructor still takes its high word as `std::int64_t`, so `int128{-1, 0}` and `int128{INT64_MIN, 0}` are unchanged. CAUTION: Code that reads `high` directly and depends on its signedness, such as `value.high < 0`, changes meaning: the comparison is now unsigned and always false. Replace those reads with `value.signed_high() < 0`, or simply compare the value itself (`value < 0`). @@ -84,7 +84,7 @@ If your platform has a native 128-bit signed integer, the struct is over-aligned [source, c++] ---- -struct alignas(alignof(__int128)) int128_t +struct alignas(alignof(__int128)) int128 ---- Otherwise (including 32-bit x86), the alignment is left up to the compiler to decide. @@ -92,16 +92,16 @@ Otherwise (including 32-bit x86), the alignment is left up to the compiler to de [#i128_operator_behavior] == Operator Behavior -All comparison, arithmetic, bitwise, and shift operators are defined between `int128_t` and any built-in integer type, signed or unsigned. +All comparison, arithmetic, bitwise, and shift operators are defined between `int128` and any built-in integer type, signed or unsigned. Their behavior follows the C++ usual arithmetic conversions and is value-identical to the corresponding builtin `__int128` operation. Specifically: -* For built-in unsigned types of lesser rank (`uint8_t` through `uint64_t`), `int128_t` is the common type and arithmetic / bitwise operations return `int128_t` with signed semantics. -* For `unsigned __int128` (same rank), the signed `int128_t` is converted to the unsigned counterpart, the operation is performed unsigned, and arithmetic / bitwise operations return `uint128_t` (the library's wrapper for `unsigned __int128`). -* For shift operators, the result type follows the LHS: `int128_t << T` and `int128_t >> T` always return `int128_t`, regardless of `T`. +* For built-in unsigned types of lesser rank (`uint8_t` through `uint64_t`), `int128` is the common type and arithmetic / bitwise operations return `int128` with signed semantics. +* For `unsigned __int128` (same rank), the signed `int128` is converted to the unsigned counterpart, the operation is performed unsigned, and arithmetic / bitwise operations return `uint128` (the library's wrapper for `unsigned __int128`). +* For shift operators, the result type follows the LHS: `int128 << T` and `int128 >> T` always return `int128`, regardless of `T`. * All comparison operators return `bool`, with the comparison performed on the operands after conversion to the common type. -NOTE: Division and remainder match `__int128` for every input except the two the built-in leaves undefined. Division or remainder by zero is likewise undefined behavior: the library adds no zero-divisor check, so it behaves like the built-in (a hardware trap on platforms that fault on integer division by zero) and is a hard compile-time error in a constant expression. The signed overflow `INT128_MIN / -1`, whose true quotient is not representable, is the one case the library defines rather than leaving undefined: it wraps to `INT128_MIN` (and `INT128_MIN % -1` is `0`), matching the two's-complement wrap the library applies to other overflowing signed operations such as `INT128_MIN * -1`. See xref:int128_t.adoc#i128_math_operators[Division] and Modulo below. +NOTE: Division and remainder match `__int128` for every input except the two the built-in leaves undefined. Division or remainder by zero is likewise undefined behavior: the library adds no zero-divisor check, so it behaves like the built-in (a hardware trap on platforms that fault on integer division by zero) and is a hard compile-time error in a constant expression. The signed overflow `INT128_MIN / -1`, whose true quotient is not representable, is the one case the library defines rather than leaving undefined: it wraps to `INT128_MIN` (and `INT128_MIN % -1` is `0`), matching the two's-complement wrap the library applies to other overflowing signed operations such as `INT128_MIN * -1`. See xref:int128.adoc#i128_math_operators[Division] and Modulo below. See xref:mixed_type_ops.adoc[Mixed Type Operations] for the full set of cross-type signatures and detailed result-type rules. @@ -113,41 +113,41 @@ See xref:mixed_type_ops.adoc[Mixed Type Operations] for the full set of cross-ty namespace boost { namespace int128 { -struct int128_t +struct int128 { ... // Defaulted basic construction - BOOST_INT128_HOST_DEVICE constexpr int128_t() noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr int128_t(const int128_t&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr int128_t(int128_t&&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator=(const int128_t&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator=(int128_t&&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr int128() noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr int128(const int128&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr int128(int128&&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr int128& operator=(const int128&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr int128& operator=(int128&&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr int128_t(const uint128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const uint128& v) noexcept; // Construct from integral types - BOOST_INT128_HOST_DEVICE constexpr int128_t(const std::int64_t hi, const std::uint64_t lo) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const std::int64_t hi, const std::uint64_t lo) noexcept; template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const SignedInteger v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const SignedInteger v) noexcept; template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const UnsignedInteger v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const UnsignedInteger v) noexcept; #ifdef BOOST_INT128_HAS_INT128 // Typically a typedef from __int128 - BOOST_INT128_HOST_DEVICE constexpr int128_t(const detail::builtin_i128 v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const detail::builtin_i128 v) noexcept; // Typically a typedef unsigned __int128 - BOOST_INT128_HOST_DEVICE constexpr int128_t(const detail::builtin_u128 v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const detail::builtin_u128 v) noexcept; #endif // BOOST_INT128_HAS_INT128 // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr int128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(Float f) noexcept; }; } // namespace int128 @@ -155,7 +155,7 @@ struct int128_t ---- None of the constructors are marked `explicit` in order to match the implicit conversion behavior of the built-in integer types. -Integer constructors are subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +Integer constructors are subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. The floating-point constructor truncates toward zero, matching `static_cast<__int128>(f)`. Edge cases mirror libgcc's `__fixXfti`: NaN yields zero, values `>= 2^127` saturate to `INT128_MAX`, and values `<= -2^127` saturate to `INT128_MIN`. @@ -168,7 +168,7 @@ Edge cases mirror libgcc's `__fixXfti`: NaN yields zero, values `>= 2^127` satur namespace boost { namespace int128 { -struct int128_t +struct int128 { ... @@ -200,9 +200,9 @@ struct int128_t ---- All conversion operators except `operator bool()` are implicit to match the behavior of built-in integer types. -`operator bool()` is explicit so that an `int128_t` cannot accidentally bind to a `bool` parameter; contextual conversions (`if (x)`, `!x`, etc.) still work. -Conversions to unsigned integers are subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. -Conversions to floating-point types may not be lossless depending on the value of the `int128_t` at time of conversion, +`operator bool()` is explicit so that an `int128` cannot accidentally bind to a `bool` parameter; contextual conversions (`if (x)`, `!x`, etc.) still work. +Conversions to unsigned integers are subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. +Conversions to floating-point types may not be lossless depending on the value of the `int128` at time of conversion, as the number of digits it represents can exceed the precision of the significand in floating point types. [#i128_comparison_operators] @@ -213,108 +213,108 @@ as the number of digits it represents can exceed the precision of the significan [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is less than the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Less Than or Equal To [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is less than or equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Greater Than [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is greater than the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Greater Than or Equal To [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is greater than or equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Equality [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Inequality [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const int128 rhs) noexcept; ---- Returns if the `lhs` value is not equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Spaceship Operator (Requires pass:[C++20]) [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const int128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Integer lhs, const int128 rhs) noexcept; ---- Returns one of the following without exception: @@ -330,7 +330,7 @@ Returns one of the following without exception: [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr int128_t operator~(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator~(const int128 rhs) noexcept ---- Returns the bitwise negation of `rhs` without exception. @@ -340,70 +340,70 @@ Returns the bitwise negation of `rhs` without exception. [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const int128 rhs) noexcept; ---- Returns the bitwise or of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === And [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const int128 rhs) noexcept; ---- Returns the bitwise and of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Xor [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const int128 rhs) noexcept; ---- Returns the bitwise xor of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Left Shift [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const Integer rhs) noexcept; template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128 rhs) noexcept; template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const int128 rhs) noexcept; // When the compiler provides native 128-bit integers, a built-in 128-bit lhs -// shifted by an int128_t returns that built-in type. +// shifted by an int128 returns that built-in type. #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128_t rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128 rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128 rhs) noexcept; #endif -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const int128 rhs) noexcept; ---- Returns the bitwise left shift of `lhs` without exception. @@ -415,30 +415,30 @@ When the count is in the range `[0, 128)` the low bits vacated by the shift are Shifting by a count that is negative or greater than or equal to `128` (the operand width in bits) is *undefined behavior*, exactly as for the built-in shift operators and the native `__int128` and `unsigned __int128` types (`[expr.shift]` in the C++ standard). No result is guaranteed, not even zero, and inside a constant expression the program is ill-formed. Delegating straight to the native shift this way keeps the in-range operation branchless and bit-for-bit compatible with the built-in types. ==== -When a built-in integer is the `lhs` and an `int128_t` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. -This operation is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +When a built-in integer is the `lhs` and an `int128` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. +This operation is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Right Shift [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const Integer rhs) noexcept; template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128 rhs) noexcept; template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator>>(const UnsignedInteger lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator>>(const UnsignedInteger lhs, const int128 rhs) noexcept; // When the compiler provides native 128-bit integers, a built-in 128-bit lhs -// shifted by an int128_t returns that built-in type. +// shifted by an int128 returns that built-in type. #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128_t rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128 rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128 rhs) noexcept; #endif -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const int128 rhs) noexcept; ---- Returns the bitwise right shift of `lhs` without exception. @@ -450,23 +450,23 @@ When the count is in the range `[0, 128)` the shift is arithmetic: the high bits Shifting by a count that is negative or greater than or equal to `128` (the operand width in bits) is *undefined behavior*, exactly as for the built-in shift operators and the native `__int128` and `unsigned __int128` types (`[expr.shift]` in the C++ standard). No result is guaranteed, not even zero or a fully sign-extended value, and inside a constant expression the program is ill-formed. Delegating straight to the native shift this way keeps the in-range operation branchless and bit-for-bit compatible with the built-in types. ==== -When a built-in integer is the `lhs` and an `int128_t` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. -This operation is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +When a built-in integer is the `lhs` and an `int128` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. +This operation is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. [#i128_math_operators] == Arithmetic Operators All of the arithmetic operators use two's-complement wrap-around on overflow. -When a result is not representable in an `int128_t` it silently rolls over modulo `2^128` rather than trapping or invoking undefined behavior, matching `std::numeric_limits::is_modulo`. +When a result is not representable in an `int128` it silently rolls over modulo `2^128` rather than trapping or invoking undefined behavior, matching `std::numeric_limits::is_modulo`. For example, `BOOST_INT128_INT128_MAX + 1` wraps to `BOOST_INT128_INT128_MIN`, and `BOOST_INT128_INT128_MIN - 1` wraps to `BOOST_INT128_INT128_MAX`. === Unary Plus and Minus [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t value) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 value) noexcept; ---- Unary `operator+` returns `value` unchanged. @@ -478,101 +478,101 @@ Negating `BOOST_INT128_INT128_MIN` wraps back to itself, matching the behavior o [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const int128 rhs) noexcept; ---- -Returns as an `int128_t` the sum of `lhs` and `rhs`. +Returns as an `int128` the sum of `lhs` and `rhs`. If the sum is greater than `BOOST_INT128_INT128_MAX`, the operation silently performs signed rollover to `BOOST_INT128_INT128_MIN`. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Subtraction [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const int128 rhs) noexcept; ---- -Returns as an `int128_t` the difference of `lhs` and `rhs`. +Returns as an `int128` the difference of `lhs` and `rhs`. If the difference is less than `BOOST_INT128_INT128_MIN`, the operation silently performs signed rollover to `BOOST_INT128_INT128_MAX`. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Multiplication [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const int128 rhs) noexcept; ---- -Returns as an `int128_t` the product of `lhs` and `rhs`. +Returns as an `int128` the product of `lhs` and `rhs`. If the product overflows, the operation silently performs signed rollover (wrapping from `BOOST_INT128_INT128_MAX` to `BOOST_INT128_INT128_MIN` or vice versa). -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Division [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const int128 rhs) noexcept; ---- -Returns as an `int128_t` the quotient of `lhs` and `rhs` without exception. +Returns as an `int128` the quotient of `lhs` and `rhs` without exception. The quotient truncates toward zero, and for any `rhs` other than `0` (and other than the overflow noted below) the result is identical to the built-in `__int128` division. Division by zero is undefined behavior, exactly as for `__int128`: the library adds no zero-divisor check (so the generated code matches the built-in and traps where the hardware faults on integer division by zero), and a zero divisor seen during constant evaluation is a hard compile-time error. The signed overflow `INT128_MIN / -1` is defined to wrap to `INT128_MIN` rather than being left undefined as it is for the built-in. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. === Modulo [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const Integer lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const Integer lhs, const int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const int128 rhs) noexcept; ---- -Returns as an `int128_t` the remainder of `lhs` and `rhs` without exception. +Returns as an `int128` the remainder of `lhs` and `rhs` without exception. The remainder takes the sign of the dividend `lhs`, and for any `rhs` other than `0` the result is identical to the built-in `__int128` remainder, so that `(lhs / rhs) * rhs + lhs % rhs == lhs`. Remainder by zero is undefined behavior, exactly as for `__int128`: the library adds no zero-divisor check (so the generated code matches the built-in and traps where the hardware faults on integer division by zero), and a zero divisor seen during constant evaluation is a hard compile-time error. The signed overflow `INT128_MIN % -1` is defined to be `0` rather than being left undefined as it is for the built-in. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128_t.adoc#i128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:int128.adoc#i128_operator_behavior[above]. [#i128_abs] === Absolute Value [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr int128_t abs(int128_t value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 abs(int128 value) noexcept; ---- -Returns the absolute value of `value` as an `int128_t`. +Returns the absolute value of `value` as an `int128`. For negative inputs the result is computed by negation, so the range of the return value is the same asymmetric range as the type itself. -The magnitude of `BOOST_INT128_INT128_MIN` is one greater than `BOOST_INT128_INT128_MAX` and is therefore not representable as a positive `int128_t`. +The magnitude of `BOOST_INT128_INT128_MIN` is one greater than `BOOST_INT128_INT128_MAX` and is therefore not representable as a positive `int128`. In that single case `abs` rolls over and returns `BOOST_INT128_INT128_MIN` unchanged, so the result remains negative. This is consistent with the two's-complement wrap-around of unary `operator-` described above. Note that calling `std::abs` on a built-in signed integer holding its minimum value is undefined behavior, whereas this overload is well-defined for every input and never traps or throws. @@ -580,7 +580,7 @@ Note that calling `std::abs` on a built-in signed integer holding its minimum va [#i128_limits] == `` Support and Values -A full specialization of `std::numeric_limits` is provided. +A full specialization of `std::numeric_limits` is provided. It is defined in xref:api_reference.adoc#api_structs[``] and is also included by the umbrella header ``. The member values match those of a built-in signed 128-bit integer. @@ -591,14 +591,14 @@ The member values match those of a built-in signed 128-bit integer. namespace std { template <> -class numeric_limits; +class numeric_limits; } // namespace std ---- === Member Functions -Each function is `static constexpr` and returns an `int128_t`. +Each function is `static constexpr` and returns an `int128`. [cols="1,2", options="header"] |=== @@ -632,7 +632,7 @@ Each function is `static constexpr` and returns an `int128_t`. | `0` |=== -NOTE: Wrap `min` and `max` in parentheses at the call site, as `(std::numeric_limits::min)()`, so the call is not intercepted by the `min`/`max` function-like macros that some platform headers define. +NOTE: Wrap `min` and `max` in parentheses at the call site, as `(std::numeric_limits::min)()`, so the call is not intercepted by the `min`/`max` function-like macros that some platform headers define. === Member Constants diff --git a/doc/modules/ROOT/pages/literals.adoc b/doc/modules/ROOT/pages/literals.adoc index 2670613c..a5f206ba 100644 --- a/doc/modules/ROOT/pages/literals.adoc +++ b/doc/modules/ROOT/pages/literals.adoc @@ -18,21 +18,21 @@ namespace boost { namespace int128 { namespace literals { -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str, std::size_t len) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str, std::size_t len) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str, std::size_t len) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str, std::size_t len) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str, std::size_t len) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str, std::size_t len) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str, std::size_t len) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str, std::size_t len) noexcept; } // namespace literals } // namespace int128 @@ -68,7 +68,7 @@ An invalid literal is rejected at compile time rather than being silently accept This includes a value that overflows the target type, a digit that is not valid for the selected base (for example `0b2` or `09`), and an empty magnitude such as `0x`. When such a literal is used in a constant expression the parse reaches `BOOST_INT128_UNREACHABLE`, which is not a constant expression and therefore is a hard compile error. -NOTE: The minimum `int128_t` value cannot be written as a negated `_i128` literal, because its positive magnitude (2^127) exceeds the maximum `int128_t` value and so fails to parse (a hard compile error in a constant expression). Use `BOOST_INT128_INT128_C(-170141183460469231731687303715884105728)`, the string form `"-170141183460469231731687303715884105728"_i128`, or `(std::numeric_limits::min)()` instead. +NOTE: The minimum `int128` value cannot be written as a negated `_i128` literal, because its positive magnitude (2^127) exceeds the maximum `int128` value and so fails to parse (a hard compile error in a constant expression). Use `BOOST_INT128_INT128_C(-170141183460469231731687303715884105728)`, the string form `"-170141183460469231731687303715884105728"_i128`, or `(std::numeric_limits::min)()` instead. See the xref:examples.adoc#examples_construction[construction examples] for usage demonstrations of both literals and macros. @@ -85,7 +85,7 @@ For values smaller than 2^64, prefer the constructor: [source, c++] ---- -constexpr uint128_t small {42U}; // direct conversion from a builtin +constexpr uint128 small {42U}; // direct conversion from a builtin const auto small_literal {42_U128}; // parses "42" and then constructs ---- diff --git a/doc/modules/ROOT/pages/mixed_type_ops.adoc b/doc/modules/ROOT/pages/mixed_type_ops.adoc index f822ac28..21be91a7 100644 --- a/doc/modules/ROOT/pages/mixed_type_ops.adoc +++ b/doc/modules/ROOT/pages/mixed_type_ops.adoc @@ -10,14 +10,14 @@ https://www.boost.org/LICENSE_1_0.txt == Conversions -Conversion between the two types is implicit: each type provides a non-explicit converting constructor from the other, so an `int128_t` converts to a `uint128_t` (and vice versa) wherever the target type is expected, as documented in the above class descriptions. +Conversion between the two types is implicit: each type provides a non-explicit converting constructor from the other, so an `int128` converts to a `uint128` (and vice versa) wherever the target type is expected, as documented in the above class descriptions. == Operator Overloads Across Types All comparison, arithmetic, bitwise, and shift operators are provided across: -* `int128_t` and `uint128_t` (cross-type), -* `int128_t` / `uint128_t` and any built-in integer type (signed or unsigned, including the compiler's 128-bit `pass:[__int128]` / `pass:[unsigned __int128]` where supported). +* `int128` and `uint128` (cross-type), +* `int128` / `uint128` and any built-in integer type (signed or unsigned, including the compiler's 128-bit `pass:[__int128]` / `pass:[unsigned __int128]` where supported). The behavior and return type of every mixed-sign overload follow the C++ usual arithmetic conversions, identical to what the equivalent built-in `pass:[__int128]` / `pass:[unsigned __int128]` operation would produce, including two's-complement wrap-around semantics. @@ -27,29 +27,29 @@ The behavior and return type of every mixed-sign overload follow the C++ usual a |=== | Operands | Common type | Result of arithmetic / bitwise -| `int128_t` and `uint128_t` (same rank, mixed sign) -| `uint128_t` -| `uint128_t` +| `int128` and `uint128` (same rank, mixed sign) +| `uint128` +| `uint128` -| `int128_t` and `pass:[unsigned __int128]` (same rank, mixed sign) -| `uint128_t` -| `uint128_t` +| `int128` and `pass:[unsigned __int128]` (same rank, mixed sign) +| `uint128` +| `uint128` -| `uint128_t` and `pass:[__int128]` (same rank, mixed sign) -| `uint128_t` -| `uint128_t` +| `uint128` and `pass:[__int128]` (same rank, mixed sign) +| `uint128` +| `uint128` -| `int128_t` and a small unsigned built-in (`uint8_t` to `uint64_t`) -| `int128_t` -| `int128_t` +| `int128` and a small unsigned built-in (`uint8_t` to `uint64_t`) +| `int128` +| `int128` -| `uint128_t` and a small signed built-in (`int8_t` to `int64_t`) -| `uint128_t` -| `uint128_t` +| `uint128` and a small signed built-in (`int8_t` to `int64_t`) +| `uint128` +| `uint128` |=== For shift operators (`pass:[<<]`, `pass:[>>]`), the result type follows the LHS type regardless of the RHS, matching the built-in shift rules. -A shift count that is negative or greater than or equal to `128` (the width of the shifted operand) is undefined behavior, exactly as for the built-in shift operators; see the xref:int128_t.adoc#i128_bitwise_operators[shift operator] reference for the precise rules. +A shift count that is negative or greater than or equal to `128` (the width of the shifted operand) is undefined behavior, exactly as for the built-in shift operators; see the xref:int128.adoc#i128_bitwise_operators[shift operator] reference for the precise rules. For comparison operators (`pass:[==]`, `pass:[!=]`, `pass:[<]`, `pass:[<=]`, `pass:[>]`, `pass:[>=]`), the return type is always `bool` and the comparison is performed on the operands after they have been converted to the common type above. @@ -64,63 +64,63 @@ namespace int128 { // Comparison Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr bool operator==(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator==(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator<(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator<(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator>(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator>(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(int128_t lhs, uint128_t rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator==(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator==(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator<(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator<(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator>(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator>(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(int128 lhs, uint128 rhs); //===================================== // Arithmetic Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(int128_t lhs, uint128_t rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(int128 lhs, uint128 rhs); //===================================== // Bitwise Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(int128_t lhs, uint128_t rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(int128 lhs, uint128 rhs); //===================================== // Shift Operators //===================================== // Result type follows the LHS. -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(uint128_t lhs, int128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(int128_t lhs, uint128_t rhs); -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(uint128_t lhs, int128_t rhs); +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(uint128 lhs, int128 rhs); +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(int128 lhs, uint128 rhs); +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(uint128 lhs, int128 rhs); } // namespace int128 } // namespace boost ---- -The cross-type arithmetic and bitwise operators return the same value as `static_cast(lhs) op static_cast(rhs)`. +The cross-type arithmetic and bitwise operators return the same value as `static_cast(lhs) op static_cast(rhs)`. The comparison operators return the same value as that expression compared with the matching unsigned operator. === Operations with built-in `pass:[__int128]` / `pass:[unsigned __int128]` -When the compiler provides 128-bit built-in integer types, all of the operators above are also available between a library type and the built-in type of opposite signedness (e.g. `uint128_t op pass:[__int128]`, `pass:[unsigned __int128] op int128_t`). -The result type follows the same rules as the table above (`uint128_t` for arithmetic and bitwise; the LHS type for shifts; `bool` for comparisons), and the produced value is identical to what an all-built-in computation would yield. +When the compiler provides 128-bit built-in integer types, all of the operators above are also available between a library type and the built-in type of opposite signedness (e.g. `uint128 op pass:[__int128]`, `pass:[unsigned __int128] op int128`). +The result type follows the same rules as the table above (`uint128` for arithmetic and bitwise; the LHS type for shifts; `bool` for comparisons), and the produced value is identical to what an all-built-in computation would yield. diff --git a/doc/modules/ROOT/pages/numeric.adoc b/doc/modules/ROOT/pages/numeric.adoc index 62ce4475..916f8ed7 100644 --- a/doc/modules/ROOT/pages/numeric.adoc +++ b/doc/modules/ROOT/pages/numeric.adoc @@ -23,21 +23,21 @@ The following functions are provided for saturating arithmetic, and they *do not namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_add(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_add(uint128 lhs, uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_add(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 saturating_add(int128 lhs, int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_sub(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_sub(uint128 lhs, uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 saturating_sub(int128 lhs, int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_mul(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_mul(uint128 lhs, uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_mul(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 saturating_mul(int128 lhs, int128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_div(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_div(uint128 lhs, uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_div(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 saturating_div(int128 lhs, int128 rhs) noexcept; } // namespace int128 } // namespace boost @@ -50,8 +50,8 @@ Division by zero is a precondition violation and therefore undefined behavior (t [#saturating_cast] == Saturating Cast -This function converts a `uint128_t` or `int128_t` to a `TargetType`, saturating rather than wrapping when the value is out of the target's range. -`TargetType` is constrained (via SFINAE) to the library's set of reduced integer types: the standard signed and unsigned integer types (excluding `bool` and plain `char`), `int128_t`, `uint128_t`, and the compiler's native 128-bit integer types where available. +This function converts a `uint128` or `int128` to a `TargetType`, saturating rather than wrapping when the value is out of the target's range. +`TargetType` is constrained (via SFINAE) to the library's set of reduced integer types: the standard signed and unsigned integer types (excluding `bool` and plain `char`), `int128`, `uint128`, and the compiler's native 128-bit integer types where available. Should the `TargetType` not be able to represent the value it is set to either `std::numeric_limits::max()` or `std::numeric_limits::min()` depending on whether the situation is overflow or underflow. [source, c++] @@ -62,10 +62,10 @@ namespace boost { namespace int128 { template -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(uint128_t value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(uint128 value) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(int128_t value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(int128 value) noexcept; } // namespace int128 } // namespace boost @@ -83,9 +83,9 @@ Computes the greatest common divisor of the magnitudes of `a` and `b`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a, uint128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 gcd(uint128 a, uint128 b) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t gcd(int128_t a, int128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 gcd(int128 a, int128 b) noexcept; } // namespace int128 } // namespace boost @@ -100,7 +100,7 @@ Both overloads are `noexcept` and usable in a constant expression. NOTE: `std::gcd` leaves the behavior undefined when `abs(a)` or `abs(b)` is not representable in the result type; this library defines that case instead. The only such operand is `BOOST_INT128_INT128_MIN`, whose magnitude `2^127` is one greater than `BOOST_INT128_INT128_MAX`. The magnitude is still computed correctly, because the two's-complement bit pattern of `BOOST_INT128_INT128_MIN` reinterpreted as unsigned is exactly `2^127`, so the divisor returned is always arithmetically correct (for example, `gcd(BOOST_INT128_INT128_MIN, 6) == 2`). -The single exception is when the divisor is itself `2^127`, which occurs only for `gcd(BOOST_INT128_INT128_MIN, 0)` and `gcd(BOOST_INT128_INT128_MIN, BOOST_INT128_INT128_MIN)`: because `2^127` is not representable as a positive `int128_t`, it is returned as the negative value `BOOST_INT128_INT128_MIN`. +The single exception is when the divisor is itself `2^127`, which occurs only for `gcd(BOOST_INT128_INT128_MIN, 0)` and `gcd(BOOST_INT128_INT128_MIN, BOOST_INT128_INT128_MIN)`: because `2^127` is not representable as a positive `int128`, it is returned as the negative value `BOOST_INT128_INT128_MIN`. [#lcm] == Least Common Multiple (LCM) @@ -114,9 +114,9 @@ Computes the least common multiple of the magnitudes of `a` and `b`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a, uint128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 lcm(uint128 a, uint128 b) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t lcm(int128_t a, int128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 lcm(int128 a, int128 b) noexcept; } // namespace int128 } // namespace boost @@ -128,8 +128,8 @@ This matches the results of https://eel.is/c++draft/numeric.ops#lcm[`std::lcm`] Both overloads are `noexcept` and usable in a constant expression. NOTE: `std::lcm` leaves the behavior undefined when `abs(a)` or `abs(b)` is not representable in the result type, or when the least common multiple itself is not representable; this library defines those cases instead of trapping or throwing. -The result is the true least common multiple of the two magnitudes reduced modulo `2^128`, consistent with the two's-complement wrap-around of the xref:int128_t.adoc#i128_math_operators[arithmetic operators]. -For the signed overload that reduced value is then interpreted as a two's-complement `int128_t` and may therefore be negative; a `BOOST_INT128_INT128_MIN` operand contributes the magnitude `2^127`, computed correctly as described for `gcd` above. +The result is the true least common multiple of the two magnitudes reduced modulo `2^128`, consistent with the two's-complement wrap-around of the xref:int128.adoc#i128_math_operators[arithmetic operators]. +For the signed overload that reduced value is then interpreted as a two's-complement `int128` and may therefore be negative; a `BOOST_INT128_INT128_MIN` operand contributes the magnitude `2^127`, computed correctly as described for `gcd` above. [#midpoint] == Midpoint @@ -143,9 +143,9 @@ Computes the midpoint of `a` and `b`, rounding towards `a`. namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t midpoint(uint128_t a, uint128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 midpoint(uint128 a, uint128 b) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(int128_t a, int128_t b) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 midpoint(int128 a, int128 b) noexcept; } // namespace int128 } // namespace boost @@ -163,7 +163,7 @@ They *do not* require C++26, and every one of them is `constexpr` and available === `div_result` Both halves of a division, mirroring `std::div_result` from the paper. -It is an aggregate, so `div_result{q, r}` and structured bindings both work. +It is an aggregate, so `div_result{q, r}` and structured bindings both work. Equality is always available; the ordering operators are available whenever the compiler supports `operator<=>`, and compare the quotient before the remainder. [source, c++] @@ -206,17 +206,17 @@ Each mode comes in three forms: `div_` returns the quotient, `div_rem_(uint128_t x, uint128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 div_(uint128 x, uint128 y) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t div_(int128_t x, int128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 div_(int128 x, int128 y) noexcept; -BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_(uint128_t x, uint128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_(uint128 x, uint128 y) noexcept; -BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_(int128_t x, int128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_(int128 x, int128 y) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t rem_euclid(uint128_t x, uint128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 rem_euclid(uint128 x, uint128 y) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t rem_euclid(int128_t x, int128_t y) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 rem_euclid(int128 x, int128 y) noexcept; } // namespace int128 } // namespace boost @@ -291,7 +291,7 @@ An exact tie is only possible when the divisor is even, so the six `ties_` modes === Semantics The remainder returned by `div_rem_` is the one that matches the quotient: `x == quotient * y + remainder` for the signed overloads. -For the unsigned overloads the same identity holds modulo 2^128^, because a quotient rounded up leaves a negative remainder that has to wrap; `div_rem_away_zero(uint128_t{7}, uint128_t{2})` therefore returns a quotient of `4` and a remainder of `BOOST_INT128_UINT128_MAX`, since `7 - 4 * 2` is `-1`. +For the unsigned overloads the same identity holds modulo 2^128^, because a quotient rounded up leaves a negative remainder that has to wrap; `div_rem_away_zero(uint128{7}, uint128{2})` therefore returns a quotient of `4` and a remainder of `BOOST_INT128_UINT128_MAX`, since `7 - 4 * 2` is `-1`. The quotient itself never overflows: rounding only moves the quotient when the division is inexact, and an inexact division has a divisor whose magnitude is at least two. The unsigned overloads exist for every mode, but a non-negative quotient collapses several of them together. @@ -299,7 +299,7 @@ The unsigned overloads exist for every mode, but a non-negative quotient collaps The full set is still provided so that generic code can name a rounding mode without also having to know the signedness of the operands. `rem_euclid` returns a value in `[0, abs(y))`, which makes it the function to reach for when wrapping a possibly negative offset into a range; `operator%` instead takes its sign from the dividend. -The signed overload is correct for `y == BOOST_INT128_INT128_MIN` even though `abs(y)` is not representable as a positive `int128_t`, because the correction is applied in unsigned arithmetic. +The signed overload is correct for `y == BOOST_INT128_INT128_MIN` even though `abs(y)` is not representable as a positive `int128`, because the correction is applied in unsigned arithmetic. `div_euclid` agrees with `div_to_neg_inf` when the divisor is positive, and with `div_to_pos_inf` when it is negative. Each `div_rem_` performs exactly one division, so it is the cheaper way to obtain both halves; computing `x / y` and `x % y` separately costs two divisions, since neither the compiler nor the library can share the work across the two operators. diff --git a/doc/modules/ROOT/pages/printer.adoc b/doc/modules/ROOT/pages/printer.adoc index beb209a3..33d96a43 100644 --- a/doc/modules/ROOT/pages/printer.adoc +++ b/doc/modules/ROOT/pages/printer.adoc @@ -8,7 +8,7 @@ https://www.boost.org/LICENSE_1_0.txt = Pretty Printers :idprefix: pretty_printers_ -Pretty printers allow debuggers to display `uint128_t` and `int128_t` values in human-readable format instead of showing the raw struct members. +Pretty printers allow debuggers to display `uint128` and `int128` values in human-readable format instead of showing the raw struct members. The library contains pretty printers for LLDB, GDB, and Visual Studio in the `extra/` folder. [#printer_lldb] @@ -23,7 +23,7 @@ command script import /path/to/int128/extra/int128_printer_lldb.py If this is successful, you should see the following message in your debugger upon startup: -`"int128_t and uint128_t pretty printers loaded successfully"` +`"int128 and uint128 pretty printers loaded successfully"` [#printer_gdb] == GDB @@ -84,31 +84,31 @@ Larger values are displayed as a synthesized hexadecimal value with a `'` digit |=== | Type | Value | Display -| `uint128_t` +| `uint128` | `42` | `42` -| `uint128_t` +| `uint128` | `2^64 + 1` | `0x0000000000000001'0000000000000001` -| `uint128_t` +| `uint128` | `uint128_max` | `0xFFFFFFFFFFFFFFFF'FFFFFFFFFFFFFFFF` -| `int128_t` +| `int128` | `42` | `42` -| `int128_t` +| `int128` | `-5` | `-5` -| `int128_t` +| `int128` | `2^64 + 1` | `0x0000000000000001'0000000000000001` -| `int128_t` +| `int128` | `int128_min` | `0x8000000000000000'0000000000000000` |=== diff --git a/doc/modules/ROOT/pages/random.adoc b/doc/modules/ROOT/pages/random.adoc index dad7f597..b1b93a2f 100644 --- a/doc/modules/ROOT/pages/random.adoc +++ b/doc/modules/ROOT/pages/random.adoc @@ -13,10 +13,10 @@ https://www.boost.org/LICENSE_1_0.txt #include ---- -Including this header specializes the traits that https://www.boost.org/doc/libs/release/libs/random/[Boost.Random] uses to reason about integer types, so that `int128_t` and `uint128_t` can be used directly with the Boost.Random engines and distributions such as `boost::random::uniform_int_distribution`. +Including this header specializes the traits that https://www.boost.org/doc/libs/release/libs/random/[Boost.Random] uses to reason about integer types, so that `int128` and `uint128` can be used directly with the Boost.Random engines and distributions such as `boost::random::uniform_int_distribution`. This header requires Boost.Random to be available. -The following specializations are provided in namespace `boost::random::traits` for both `int128_t` and `uint128_t`: +The following specializations are provided in namespace `boost::random::traits` for both `int128` and `uint128`: [cols="1,2", options="header"] |=== @@ -26,7 +26,7 @@ The following specializations are provided in namespace `boost::random::traits` | Reports both types as integral. | `is_signed` -| Reports `int128_t` as signed and `uint128_t` as unsigned. +| Reports `int128` as signed and `uint128` as unsigned. | `make_unsigned`, `make_unsigned_imp` | Provide the unsigned type mapping Boost.Random uses when generating values. diff --git a/doc/modules/ROOT/pages/release_notes.adoc b/doc/modules/ROOT/pages/release_notes.adoc index f69fb268..eb97f16a 100644 --- a/doc/modules/ROOT/pages/release_notes.adoc +++ b/doc/modules/ROOT/pages/release_notes.adoc @@ -12,14 +12,14 @@ https://www.boost.org/LICENSE_1_0.txt === New: integer division with every rounding mode -`` now provides the `div_*` family proposed for the standard library by wg21.link/p3724[P3724 (Integer division)], for both `uint128_t` and `int128_t`. +`` now provides the `div_*` family proposed for the standard library by wg21.link/p3724[P3724 (Integer division)], for both `uint128` and `int128`. `operator/` only rounds towards zero; these functions round away from zero, towards either infinity, and to nearest under each of the six tie-breaking rules, along with Euclidean division and its always non-negative remainder. [source, c++] ---- -div_to_neg_inf(int128_t{-7}, int128_t{2}); // -4, where -7 / 2 is -3 -div_ties_to_even(int128_t{-7}, int128_t{2}); // -4, breaking the tie at -3.5 -rem_euclid(int128_t{-7}, int128_t{2}); // 1, where -7 % 2 is -1 +div_to_neg_inf(int128{-7}, int128{2}); // -4, where -7 / 2 is -3 +div_ties_to_even(int128{-7}, int128{2}); // -4, breaking the tie at -3.5 +rem_euclid(int128{-7}, int128{2}); // 1, where -7 % 2 is -1 const auto res = div_rem_to_pos_inf(x, y); // res.quotient and res.remainder, one division ---- @@ -27,14 +27,14 @@ const auto res = div_rem_to_pos_inf(x, y); // res.quotient and res.remainder, Each mode also has a `div_rem_` form returning a `div_result` with both halves from a single division, and there is a standalone `rem_euclid`. See xref:numeric.adoc#int_div[Integer Division] for the full list. -=== Breaking: `int128_t::high` is now `std::uint64_t` +=== Breaking: `int128::high` is now `std::uint64_t` -`int128_t` previously stored `std::uint64_t low` and `std::int64_t high`. +`int128` previously stored `std::uint64_t low` and `std::int64_t high`. Both words are now `std::uint64_t`; the value is still interpreted as two's complement across the pair, and no bit of the representation moved. The reason is codegen. -When the two halves of the struct have different types, a compiler's data-reference analysis cannot merge them into a single wide access, so loops over `int128_t` are emitted with shuffles or scalarized outright. -Measured with GCC 14 at `-O3 -march=znver3` on `r[i] = x[i] | y[i]` over an `std::array`: +When the two halves of the struct have different types, a compiler's data-reference analysis cannot merge them into a single wide access, so loops over `int128` are emitted with shuffles or scalarized outright. +Measured with GCC 14 at `-O3 -march=znver3` on `r[i] = x[i] | y[i]` over an `std::array`: [cols="1,1,1",options="header"] |=== @@ -43,14 +43,14 @@ Measured with GCC 14 at `-O3 -march=znver3` on `r[i] = x[i] | y[i]` over an `std | `~` | 74 instructions, 10 shuffles | 20 instructions, 0 shuffles |=== -Those are now exactly the numbers `uint128_t` has always produced, since it already had uniform word types. +Those are now exactly the numbers `uint128` has always produced, since it already had uniform word types. Scalar code is unaffected or better: `a + b` drops from 20 instructions to 10, `a << n` from 17 to 12, and `a >> n` from 18 to 13. ==== What still works -* The two-word constructor is unchanged and still takes its high word as `std::int64_t`, so `int128_t{-1, 0}` and `int128_t{INT64_MIN, 0}` compile and mean exactly what they did. -* `sizeof`, `alignof`, and the in-memory byte order are unchanged. The type remains trivially copyable and standard layout, so anything that `memcpy`s an `int128_t` is unaffected. -* Every operator produces bit-identical results. Conversions to and from `uint128_t` and the native `pass:[__int128]` are unchanged. +* The two-word constructor is unchanged and still takes its high word as `std::int64_t`, so `int128{-1, 0}` and `int128{INT64_MIN, 0}` compile and mean exactly what they did. +* `sizeof`, `alignof`, and the in-memory byte order are unchanged. The type remains trivially copyable and standard layout, so anything that `memcpy`s an `int128` is unaffected. +* Every operator produces bit-identical results. Conversions to and from `uint128` and the native `pass:[__int128]` are unchanged. ==== What to change @@ -79,4 +79,4 @@ BOOST_INT128_HOST_DEVICE constexpr std::int64_t signed_high() const noexcept; It is a pure reinterpretation of the stored bits, `constexpr` everywhere, and available on device. Passing `high` to something expecting a `std::int64_t` also needs it, since the conversion is now the other direction. -See xref:int128_t.adoc#i128_storage[Storage and signed_high] for details. +See xref:int128.adoc#i128_storage[Storage and signed_high] for details. diff --git a/doc/modules/ROOT/pages/stream.adoc b/doc/modules/ROOT/pages/stream.adoc index 75ecfd49..6d05bc39 100644 --- a/doc/modules/ROOT/pages/stream.adoc +++ b/doc/modules/ROOT/pages/stream.adoc @@ -21,16 +21,16 @@ namespace boost { namespace int128 { template -std::basic_ostream& operator<<(std::basic_ostream& os, const int128_t& v); +std::basic_ostream& operator<<(std::basic_ostream& os, const int128& v); template -std::basic_istream& operator>>(std::basic_istream& is, int128_t& v); +std::basic_istream& operator>>(std::basic_istream& is, int128& v); template -std::basic_ostream& operator<<(std::basic_ostream& os, const uint128_t& v); +std::basic_ostream& operator<<(std::basic_ostream& os, const uint128& v); template -std::basic_istream& operator>>(std::basic_istream& is, uint128_t& v); +std::basic_istream& operator>>(std::basic_istream& is, uint128& v); } // namespace int128 } // namespace boost diff --git a/doc/modules/ROOT/pages/string.adoc b/doc/modules/ROOT/pages/string.adoc index 3c9ff591..9b017f10 100644 --- a/doc/modules/ROOT/pages/string.adoc +++ b/doc/modules/ROOT/pages/string.adoc @@ -22,14 +22,14 @@ The following are functions analogous to those found in `` for builtin i namespace boost { namespace int128 { -// Constrained to T being int128_t or uint128_t. +// Constrained to T being int128 or uint128. template -std::enable_if_t::value || std::is_same::value, std::string> +std::enable_if_t::value || std::is_same::value, std::string> to_string(const T& value); -// Constrained to T being int128_t or uint128_t. +// Constrained to T being int128 or uint128. template -std::enable_if_t::value || std::is_same::value, std::wstring> +std::enable_if_t::value || std::is_same::value, std::wstring> to_wstring(const T& value); } // namespace int128 diff --git a/doc/modules/ROOT/pages/u128_benchmarks.adoc b/doc/modules/ROOT/pages/u128_benchmarks.adoc index c183ec3c..734ed0c5 100644 --- a/doc/modules/ROOT/pages/u128_benchmarks.adoc +++ b/doc/modules/ROOT/pages/u128_benchmarks.adoc @@ -5,7 +5,7 @@ https://www.boost.org/LICENSE_1_0.txt //// [#u128_benchmarks] -= `uint128_t` Benchmarks += `uint128` Benchmarks :idprefix: u128_benchmarks_ == Methodology @@ -16,7 +16,7 @@ Each platform states its element count and pass count, and therefore how many op The `Comparisons` row is the total of all six relational operators (`==`, `!=`, `<`, `<=`, `>`, `>=`) over that same vector, which is why it costs roughly six arithmetic rows. On most platforms we use the builtin `unsigned \__int128` as the reference benchmark. -When this is unavailable (such as on 32-bit architectures) we use `boost::multiprecision::uint128_t` (abbreviated as `boost::mp::uint128_t`) as it is widely used, and known to be portable. +When this is unavailable (such as on 32-bit architectures) we use `boost::multiprecision::uint128` (abbreviated as `boost::mp::uint128`) as it is widely used, and known to be portable. On MSVC platforms we use as reference `std::_Unsigned128` from the header `<__msvc_int128.hpp>` since this is bundled with their compiler. Lastly, when available, the benchmarks are also run with `absl::uint128` which is the 128-bit unsigned integer from the https://abseil.io[Abseil Libraries]. @@ -53,7 +53,7 @@ Measured with GCC 14.2 (pass:[C++]20): 5 passes over 20,000,000 element pairs (1 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `unsigned __int128` | `uint128_t` | `boost::mp::uint128_t` | `absl::uint128` +| Operation | `unsigned __int128` | `uint128` | `boost::mp::uint128` | `absl::uint128` | Comparisons | 538,116 | 545,110 | 1,100,158 | 504,183 | Addition | 66,230 | 60,477 | 65,991 | 60,608 @@ -71,7 +71,7 @@ Measured with GCC 14.2 (pass:[C++]20): 5 passes over 20,000,000 element pairs (1 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `unsigned __int128` | `uint128_t` | `boost::mp::uint128_t` | `absl::uint128` +| Operation | `unsigned __int128` | `uint128` | `boost::mp::uint128` | `absl::uint128` | Comparisons | 1,551,148 | 954,612 | 2,090,864 | 1,559,081 | Addition | 88,531 | 87,204 | 87,303 | 87,544 @@ -89,7 +89,7 @@ Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10 [cols="1,>1,>1,>1,>1"] |=== -| Operation | `unsigned __int128` | `uint128_t` | `boost::mp::uint128_t` | `absl::uint128` +| Operation | `unsigned __int128` | `uint128` | `boost::mp::uint128` | `absl::uint128` | Comparisons | 609,693 | 539,203 | 1,218,003 | 1,178,669 | Addition | 50,814 | 44,087 | 50,939 | 50,573 @@ -107,7 +107,7 @@ Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10 [cols="1,>1,>1,>1"] |=== -| Operation | `unsigned __int128` | `uint128_t` | `boost::mp::uint128_t` +| Operation | `unsigned __int128` | `uint128` | `boost::mp::uint128` | Comparisons | 415,221 | 453,245 | 690,480 | Addition | 25,106 | 16,257 | 24,998 @@ -121,13 +121,13 @@ image::u128_graphs/linux/ppc64le_relative_performance.png[ppc64le Relative Perfo === x86_32 -NOTE: This platform has no hardware type so we compare relative to `boost::mp::uint128_t` +NOTE: This platform has no hardware type so we compare relative to `boost::mp::uint128` Measured with GCC 14.2 (pass:[C++]20): 5 passes over 10,000,000 element pairs (50,000,000 operations per cell). [cols="1,>1,>1"] |=== -| Operation | `uint128_t` | `boost::mp::uint128_t` +| Operation | `uint128` | `boost::mp::uint128` | Comparisons | 2,112,319 | 1,568,536 | Addition | 143,659 | 1,144,222 @@ -141,13 +141,13 @@ image::u128_graphs/linux/x86_relative_performance.png[x86 Relative Performance, === ARM32 -NOTE: This platform has no hardware type so we compare relative to `boost::mp::uint128_t` +NOTE: This platform has no hardware type so we compare relative to `boost::mp::uint128` Measured with GCC 12.2 (pass:[C++]20): 5 passes over 2,000,000 element pairs (10,000,000 operations per cell). [cols="1,>1,>1"] |=== -| Operation | `uint128_t` | `boost::mp::uint128_t` +| Operation | `uint128` | `boost::mp::uint128` | Comparisons | 1,148,095 | 738,322 | Addition | 85,164 | 970,287 @@ -168,7 +168,7 @@ Measured with MSVC 14.51 (pass:[C++]20): 5 passes over 20,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Unsigned128` | `uint128_t` | `boost::mp::uint128_t` +| Operation | `std::_Unsigned128` | `uint128` | `boost::mp::uint128` | Comparisons | 1,313,048 | 1,251,724 | 1,970,110 | Addition | 106,229 | 98,075 | 2,153,287 @@ -186,7 +186,7 @@ Measured with MSVC 14.44 (pass:[C++]20): 5 passes over 20,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Unsigned128` | `uint128_t` | `boost::mp::uint128_t` +| Operation | `std::_Unsigned128` | `uint128` | `boost::mp::uint128` | Comparisons | 1,262,216 | 753,322 | 1,757,122 | Addition | 86,038 | 84,791 | 1,535,904 @@ -204,7 +204,7 @@ Measured with MSVC 14.51 (pass:[C++]20): 5 passes over 10,000,000 element pairs [cols="1,>1,>1,>1"] |=== -| Operation | `std::_Unsigned128` | `uint128_t` | `boost::mp::uint128_t` +| Operation | `std::_Unsigned128` | `uint128` | `boost::mp::uint128` | Comparisons | 2,519,936 | 2,006,459 | 1,516,713 | Addition | 132,021 | 129,303 | 1,184,928 @@ -225,7 +225,7 @@ Measured with Apple Clang 21.0 (pass:[C++]20): 5 passes over 20,000,000 element [cols="1,>1,>1,>1,>1"] |=== -| Operation | `unsigned __int128` | `uint128_t` | `boost::mp::uint128_t` | `absl::uint128` +| Operation | `unsigned __int128` | `uint128` | `boost::mp::uint128` | `absl::uint128` | Comparisons | 363,881 | 351,327 | 403,043 | 373,414 | Addition | 67,797 | 58,792 | 64,948 | 53,003 diff --git a/doc/modules/ROOT/pages/uint128_t.adoc b/doc/modules/ROOT/pages/uint128_t.adoc index 347c7d18..5f85b8f8 100644 --- a/doc/modules/ROOT/pages/uint128_t.adoc +++ b/doc/modules/ROOT/pages/uint128_t.adoc @@ -4,13 +4,13 @@ Distributed under the Boost Software License, Version 1.0. https://www.boost.org/LICENSE_1_0.txt //// -[#uint128_t] -= uint128_t -:idprefix: uint128_t_ +[#uint128] += uint128 +:idprefix: uint128_ == Description -`uint128_t` is an unsigned 128-bit integer. +`uint128` is an unsigned 128-bit integer. [source, c++] ---- @@ -19,7 +19,7 @@ https://www.boost.org/LICENSE_1_0.txt namespace boost { namespace int128 { -struct uint128_t { +struct uint128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -39,7 +39,7 @@ struct uint128_t { The type provides: -* Constructors from all built-in integer types and `int128_t` +* Constructors from all built-in integer types and `int128` * Conversion operators to built-in integer and floating-point types * Full set of comparison operators (`<`, `<=`, `>`, `>=`, `==`, `!=`) * Bitwise operators (`~`, `|`, `&`, `^`, `<<`, `>>`) @@ -54,7 +54,7 @@ If your platform has a native 128-bit unsigned integer, the struct is over-align [source, c++] ---- -struct alignas(alignof(unsigned __int128)) uint128_t +struct alignas(alignof(unsigned __int128)) uint128 ---- Otherwise (including 32-bit x86), the alignment is left up to the compiler to decide. @@ -62,17 +62,17 @@ Otherwise (including 32-bit x86), the alignment is left up to the compiler to de [#u128_operator_behavior] == Operator Behavior -All comparison, arithmetic, bitwise, and shift operators are defined between `uint128_t` and any built-in integer type, signed or unsigned. +All comparison, arithmetic, bitwise, and shift operators are defined between `uint128` and any built-in integer type, signed or unsigned. Their behavior follows the C++ usual arithmetic conversions and is value-identical to the corresponding builtin `unsigned __int128` operation. Specifically: -* The signed operand (whether a small `intN_t` or `__int128`) is converted to `uint128_t` (sign-extended for negatives), and the operation is performed unsigned with two's-complement wrap-around semantics. Arithmetic and bitwise operations return `uint128_t`. -* For shift operators, the result type follows the LHS: `uint128_t << T` and `uint128_t >> T` always return `uint128_t`, regardless of `T`. +* The signed operand (whether a small `intN_t` or `__int128`) is converted to `uint128` (sign-extended for negatives), and the operation is performed unsigned with two's-complement wrap-around semantics. Arithmetic and bitwise operations return `uint128`. +* For shift operators, the result type follows the LHS: `uint128 << T` and `uint128 >> T` always return `uint128`, regardless of `T`. * All comparison operators return `bool`, with the comparison performed on the operands after conversion to the common type. -For example, `uint128_t{5} > -1` returns `false` because the signed `-1` converts to a value greater than `5` under unsigned 128-bit arithmetic, exactly as `(unsigned __int128){5} > -1` would. +For example, `uint128{5} > -1` returns `false` because the signed `-1` converts to a value greater than `5` under unsigned 128-bit arithmetic, exactly as `(unsigned __int128){5} > -1` would. -NOTE: The results match `unsigned __int128` for every input with a non-zero divisor. Division or remainder by zero is the one exception, and it is handled exactly as the built-in type handles it: as undefined behavior. The library performs no zero-divisor check, so a `uint128_t` divided or taken modulo by zero behaves like the built-in operation (a hardware trap on platforms that fault on integer division by zero), and in a constant expression it is a hard compile-time error just as `1u / 0u` is. See xref:uint128_t.adoc#u128_math_operators[Division] and Modulo below. +NOTE: The results match `unsigned __int128` for every input with a non-zero divisor. Division or remainder by zero is the one exception, and it is handled exactly as the built-in type handles it: as undefined behavior. The library performs no zero-divisor check, so a `uint128` divided or taken modulo by zero behaves like the built-in operation (a hardware trap on platforms that fault on integer division by zero), and in a constant expression it is a hard compile-time error just as `1u / 0u` is. See xref:uint128.adoc#u128_math_operators[Division] and Modulo below. See xref:mixed_type_ops.adoc[Mixed Type Operations] for the full set of cross-type signatures and detailed result-type rules. @@ -84,41 +84,41 @@ See xref:mixed_type_ops.adoc[Mixed Type Operations] for the full set of cross-ty namespace boost { namespace int128 { -struct uint128_t +struct uint128 { ... // Defaulted basic construction - BOOST_INT128_HOST_DEVICE constexpr uint128_t() noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const uint128_t&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr uint128_t(uint128_t&&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator=(const uint128_t&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator=(uint128_t&&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr uint128() noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr uint128(const uint128&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr uint128(uint128&&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator=(const uint128&) noexcept = default; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator=(uint128&&) noexcept = default; - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const int128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const int128& v) noexcept; // Construct from integral types - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const std::uint64_t hi, const std::uint64_t lo) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const std::uint64_t hi, const std::uint64_t lo) noexcept; template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const SignedInteger v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const SignedInteger v) noexcept; template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const UnsignedInteger v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const UnsignedInteger v) noexcept; #ifdef BOOST_INT128_HAS_INT128 // Typically a typedef from __int128 - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const detail::builtin_i128 v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const detail::builtin_i128 v) noexcept; // Typically a typedef unsigned __int128 - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const detail::builtin_u128 v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const detail::builtin_u128 v) noexcept; #endif // BOOST_INT128_HAS_INT128 // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(Float f) noexcept; }; } // namespace int128 @@ -126,7 +126,7 @@ struct uint128_t ---- None of the constructors are marked `explicit` in order to match the implicit conversion behavior of the built-in integer types. -Integer constructors are subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +Integer constructors are subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. The floating-point constructor truncates toward zero, matching `static_cast(f)`. Edge cases mirror libgcc's `__fixunsXfti`: NaN and negative values yield zero, and values `>= 2^128` (including positive infinity) saturate to `UINT128_MAX`. @@ -139,7 +139,7 @@ Edge cases mirror libgcc's `__fixunsXfti`: NaN and negative values yield zero, a namespace boost { namespace int128 { -struct uint128_t +struct uint128 { ... @@ -171,9 +171,9 @@ struct uint128_t ---- All conversion operators except `operator bool()` are implicit to match the behavior of built-in integer types. -`operator bool()` is explicit so that a `uint128_t` cannot accidentally bind to a `bool` parameter; contextual conversions (`if (x)`, `!x`, etc.) still work. -Conversions to signed integers are subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. -Conversions to floating-point types may not be lossless depending on the value of the `uint128_t` at time of conversion, +`operator bool()` is explicit so that a `uint128` cannot accidentally bind to a `bool` parameter; contextual conversions (`if (x)`, `!x`, etc.) still work. +Conversions to signed integers are subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. +Conversions to floating-point types may not be lossless depending on the value of the `uint128` at time of conversion, as the number of digits it represents can exceed the precision of the significand in floating point types. [#u128_comparison_operators] @@ -184,108 +184,108 @@ as the number of digits it represents can exceed the precision of the significan [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is less than the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Less Than or Equal To [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is less than or equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Greater Than [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is greater than the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Greater Than or Equal To [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is greater than or equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Equality [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Inequality [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns if the `lhs` value is not equal to the `rhs` value without exception. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Spaceship Operator (Requires pass:[C++20]) [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const uint128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Integer lhs, const uint128 rhs) noexcept; ---- Returns one of the following without exception: @@ -301,7 +301,7 @@ Returns one of the following without exception: [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator~(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator~(const uint128 rhs) noexcept ---- Returns the bitwise negation of `rhs` without exception. @@ -311,70 +311,70 @@ Returns the bitwise negation of `rhs` without exception. [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns the bitwise or of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === And [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns the bitwise and of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Xor [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns the bitwise xor of `lhs` and `rhs` without exception. -This operation is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Left Shift [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const Integer rhs) noexcept; template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128 rhs) noexcept; template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128 rhs) noexcept; // When the compiler provides native 128-bit integers, a built-in 128-bit lhs -// shifted by a uint128_t returns that built-in type. +// shifted by a uint128 returns that built-in type. #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128 rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128 rhs) noexcept; #endif -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns the bitwise left shift of `lhs` without exception. @@ -386,30 +386,30 @@ When the count is in the range `[0, 128)` the low bits vacated by the shift are Shifting by a count that is negative or greater than or equal to `128` (the operand width in bits) is *undefined behavior*, exactly as for the built-in shift operators and the native `__int128` and `unsigned __int128` types (`[expr.shift]` in the C++ standard). No result is guaranteed, not even zero, and inside a constant expression the program is ill-formed. Delegating straight to the native shift this way keeps the in-range operation branchless and bit-for-bit compatible with the built-in types. ==== -When a built-in integer is the `lhs` and a `uint128_t` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. -This operation is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +When a built-in integer is the `lhs` and a `uint128` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. +This operation is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Right Shift [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const Integer rhs) noexcept; template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128 rhs) noexcept; template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator>>(const UnsignedInteger lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator>>(const UnsignedInteger lhs, const uint128 rhs) noexcept; // When the compiler provides native 128-bit integers, a built-in 128-bit lhs -// shifted by a uint128_t returns that built-in type. +// shifted by a uint128 returns that built-in type. #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128 rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128 rhs) noexcept; #endif -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const uint128 rhs) noexcept; ---- Returns the bitwise right shift of `lhs` without exception. @@ -421,8 +421,8 @@ When the count is in the range `[0, 128)` the shift is logical: the high bits va Shifting by a count that is negative or greater than or equal to `128` (the operand width in bits) is *undefined behavior*, exactly as for the built-in shift operators and the native `__int128` and `unsigned __int128` types (`[expr.shift]` in the C++ standard). No result is guaranteed, not even zero, and inside a constant expression the program is ill-formed. Delegating straight to the native shift this way keeps the in-range operation branchless and bit-for-bit compatible with the built-in types. ==== -When a built-in integer is the `lhs` and a `uint128_t` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. -This operation is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +When a built-in integer is the `lhs` and a `uint128` is the shift amount, the return type matches the promotion behavior of the built-in shift: integer types of 16 bits or fewer promote to `int` or `unsigned int`, and, where the compiler provides them, the native 128-bit types return their own type. +This operation is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. [#u128_math_operators] @@ -432,8 +432,8 @@ This operation is subject to mixed sign limitations discussed xref:uint128_t.ado [source, c++] ---- -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t value) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 value) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 value) noexcept; ---- Unary `operator+` returns `value` unchanged. @@ -444,92 +444,92 @@ Unary `operator-` returns the two's-complement negation of `value` (equivalent t [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const uint128 rhs) noexcept; ---- -Returns as a `uint128_t` the sum of `lhs` and `rhs`. -If the sum is greater than is representable by a `uint128_t`, the operation silently performs unsigned rollover in the direction of 0. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +Returns as a `uint128` the sum of `lhs` and `rhs`. +If the sum is greater than is representable by a `uint128`, the operation silently performs unsigned rollover in the direction of 0. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Subtraction [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const uint128 rhs) noexcept; ---- -Returns as a `uint128_t` the difference of `lhs` and `rhs`. -If the difference is less than is representable by a `uint128_t`, the operation silently performs unsigned rollover in the direction of `BOOST_INT128_UINT128_MAX`. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +Returns as a `uint128` the difference of `lhs` and `rhs`. +If the difference is less than is representable by a `uint128`, the operation silently performs unsigned rollover in the direction of `BOOST_INT128_UINT128_MAX`. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Multiplication [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const uint128 rhs) noexcept; ---- -Returns as a `uint128_t` the product of `lhs` and `rhs`. -If the product is greater than is representable by a `uint128_t`, the operation silently performs unsigned rollover in the direction of 0. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +Returns as a `uint128` the product of `lhs` and `rhs`. +If the product is greater than is representable by a `uint128`, the operation silently performs unsigned rollover in the direction of 0. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Division [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const uint128 rhs) noexcept; ---- -Returns as a `uint128_t` the quotient of `lhs` and `rhs` without exception. +Returns as a `uint128` the quotient of `lhs` and `rhs` without exception. For any non-zero `rhs` the result is identical to the built-in `unsigned __int128` division. Division by zero is undefined behavior, exactly as for `unsigned __int128`: the library adds no zero-divisor check (so the generated code matches the built-in and traps where the hardware faults on integer division by zero), and a zero divisor seen during constant evaluation is a hard compile-time error. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. === Modulo [source, c++] ---- template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const Integer rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const Integer rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const Integer lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const Integer lhs, const uint128 rhs) noexcept; -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const uint128 rhs) noexcept; ---- -Returns as a `uint128_t` the remainder of `lhs` and `rhs` without exception. +Returns as a `uint128` the remainder of `lhs` and `rhs` without exception. For any non-zero `rhs` the result is identical to the built-in `unsigned __int128` remainder. Remainder by zero is undefined behavior, exactly as for `unsigned __int128`: the library adds no zero-divisor check (so the generated code matches the built-in and traps where the hardware faults on integer division by zero), and a zero divisor seen during constant evaluation is a hard compile-time error. -This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128_t.adoc#u128_operator_behavior[above]. +This operation is only defined for integers and is subject to mixed sign limitations discussed xref:uint128.adoc#u128_operator_behavior[above]. [#u128_limits] == `` Support and Values -A full specialization of `std::numeric_limits` is provided. +A full specialization of `std::numeric_limits` is provided. It is defined in xref:api_reference.adoc#api_structs[``] and is also included by the umbrella header ``. The member values match those of a built-in unsigned 128-bit integer. @@ -540,14 +540,14 @@ The member values match those of a built-in unsigned 128-bit integer. namespace std { template <> -class numeric_limits; +class numeric_limits; } // namespace std ---- === Member Functions -Each function is `static constexpr` and returns a `uint128_t`. +Each function is `static constexpr` and returns a `uint128`. [cols="1,2", options="header"] |=== @@ -581,7 +581,7 @@ Each function is `static constexpr` and returns a `uint128_t`. | `0` |=== -NOTE: Wrap `min` and `max` in parentheses at the call site, as `(std::numeric_limits::min)()`, so the call is not intercepted by the `min`/`max` function-like macros that some platform headers define. +NOTE: Wrap `min` and `max` in parentheses at the call site, as `(std::numeric_limits::min)()`, so the call is not intercepted by the `min`/`max` function-like macros that some platform headers define. === Member Constants diff --git a/doc/modules/ROOT/pages/utilities.adoc b/doc/modules/ROOT/pages/utilities.adoc index 4250f169..fea899ed 100644 --- a/doc/modules/ROOT/pages/utilities.adoc +++ b/doc/modules/ROOT/pages/utilities.adoc @@ -9,7 +9,7 @@ https://www.boost.org/LICENSE_1_0.txt :idprefix: utilities_ The `` header collects helpers that operate on the library types directly and would not fit naturally into the analogous STL-style headers. -The functions are tuned specifically for `uint128_t` and `int128_t` rather than being template generalizations, which allows the library to dispatch to a fast path based on the shape of the modulus. +The functions are tuned specifically for `uint128` and `int128` rather than being template generalizations, which allows the library to dispatch to a fast path based on the shape of the modulus. [source, c++] ---- @@ -31,16 +31,16 @@ The naive expression `pow(base, exp) % m` is unusable for 128-bit inputs because namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t base, uint128_t exp, uint128_t m) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 powm(uint128 base, uint128 exp, uint128 m) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t powm(int128_t base, int128_t exp, int128_t m) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 powm(int128 base, int128 exp, int128 m) noexcept; } // namespace int128 } // namespace boost ---- The signed overload returns the non-negative residue in the range `[0, m)`, matching the convention used by `pow(a, b, m)` in Python and most arbitrary-precision libraries. -Negative bases are reduced before exponentiation; `(std::numeric_limits::min)()` is handled correctly even though its magnitude is not representable in `int128_t`. +Negative bases are reduced before exponentiation; `(std::numeric_limits::min)()` is handled correctly even though its magnitude is not representable in `int128`. === Special Cases @@ -76,9 +76,9 @@ Unlike `powm` there is no modulus: the result is the true power reduced modulo ` namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t ipow(uint128_t base, std::uint64_t exp) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 ipow(uint128 base, std::uint64_t exp) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t ipow(int128_t base, std::uint64_t exp) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 ipow(int128 base, std::uint64_t exp) noexcept; } // namespace int128 } // namespace boost @@ -114,9 +114,9 @@ The computation runs entirely in integer arithmetic using Newton's method, so it namespace boost { namespace int128 { -BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(uint128_t n) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 isqrt(uint128 n) noexcept; -BOOST_INT128_HOST_DEVICE constexpr int128_t isqrt(int128_t n) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 isqrt(int128 n) noexcept; } // namespace int128 } // namespace boost @@ -167,7 +167,7 @@ The three type parameters are independent: the result type and the two operand t The operation always uses the exact mathematical value of each operand, so a negative signed value added to an unsigned value, or a product that needs up to 256 bits internally, is evaluated correctly. Following the C23 rules, `T1`, `T2`, and `T3` may be any integer type other than `bool`, plain `char`, an enumerated type, or a bit-precise (`_BitInt`) type. -In addition to the standard and extended integer types, the library's `uint128_t` and `int128_t` are accepted. +In addition to the standard and extended integer types, the library's `uint128` and `int128` are accepted. The following example exercises all three operations, including the wrap-around, the `INT128_MIN * -1` case, and the mixed-type behavior described above. @@ -195,7 +195,7 @@ ckd_mul(INT128_MAX, 2): overflow=true, wrapped=-2 ckd_mul(INT128_MIN, -1): overflow=true, wrapped=-170141183460469231731687303715884105728 === Mixed Types === -ckd_add(uint128_t{5}, int128_t{-3}): overflow=false, result=2 +ckd_add(uint128{5}, int128{-3}): overflow=false, result=2 ckd_mul(20, 20): overflow=true, wrapped=144 ---- ==== @@ -207,10 +207,10 @@ ckd_mul(20, 20): overflow=true, wrapped=144 They are available in C++14 and later. Unlike the built-in relational operators, which follow the usual arithmetic conversions, these functions compare the true mathematical values of their operands regardless of signedness. -When a `uint128_t` is compared with an `int128_t`, the operators convert the signed operand to unsigned, so `int128_t{-1} < uint128_t{0}` is reported as `false` and `(std::numeric_limits::max)() == int128_t{-1}` as `true`. +When a `uint128` is compared with an `int128`, the operators convert the signed operand to unsigned, so `int128{-1} < uint128{0}` is reported as `false` and `(std::numeric_limits::max)() == int128{-1}` as `true`. The `cmp_*` functions report the mathematically correct answer in both cases. -Throughout this section a *128-bit type* is `int128_t`, `uint128_t`, or a builtin 128-bit type where the platform provides one (`+__int128+` and its unsigned counterpart, or `std::_Signed128` and `std::_Unsigned128` on MSVC). +Throughout this section a *128-bit type* is `int128`, `uint128`, or a builtin 128-bit type where the platform provides one (`+__int128+` and its unsigned counterpart, or `std::_Signed128` and `std::_Unsigned128` on MSVC). [source, c++] ---- @@ -242,7 +242,7 @@ BOOST_INT128_HOST_DEVICE constexpr bool cmp_greater_equal(T a, U b) noexcept; `cmp_equal(a, b)` returns `true` when `a` and `b` are mathematically equal, and `cmp_less(a, b)` returns `true` when `a` is mathematically less than `b`. The remaining four functions are defined in terms of these two exactly as in the standard: `cmp_not_equal` is `!cmp_equal(a, b)`, `cmp_greater(a, b)` is `cmp_less(b, a)`, `cmp_less_equal(a, b)` is `!cmp_less(b, a)`, and `cmp_greater_equal(a, b)` is `!cmp_less(a, b)`. -Every operand pair in which at least one operand is a 128-bit type is supported, including a `uint128_t` (or an unsigned builtin 128-bit value) against a signed `int128_t` (or a signed builtin one). +Every operand pair in which at least one operand is a 128-bit type is supported, including a `uint128` (or an unsigned builtin 128-bit value) against a signed `int128` (or a signed builtin one). Following the standard, a `bool`, a character type (`char`, `wchar_t`, `char8_t`, `char16_t`, `char32_t`), or `std::byte` is not a permitted operand, and such a call is ill-formed. [#in_range] @@ -264,7 +264,7 @@ BOOST_INT128_HOST_DEVICE constexpr bool in_range(Integer t) noexcept; ---- The target type `R` and the type of `t` may each be a builtin integer or a 128-bit type; at least one of them is a 128-bit type (use `std::in_range` when neither is). -For example, `in_range(int128_t{-1})` is `false` because a negative value is not representable in an unsigned type, and `in_range((std::numeric_limits::max)())` is `false` because the value is too large. +For example, `in_range(int128{-1})` is `false` because a negative value is not representable in an unsigned type, and `in_range((std::numeric_limits::max)())` is `false` because the value is too large. .This https://github.com/cppalliance/int128/blob/develop/examples/integer_comparison.cpp[example] demonstrates signedness-safe comparison and range checking with the library 128-bit types ==== @@ -277,19 +277,19 @@ include::example$integer_comparison.cpp[] [listing] ---- === Signedness-safe comparison === -UINT128_MAX == int128_t{-1} (operator): true -cmp_equal(UINT128_MAX, int128_t{-1}): false -int128_t{-1} < uint128_t{0} (operator): false -cmp_less(int128_t{-1}, uint128_t{0}): true +UINT128_MAX == int128{-1} (operator): true +cmp_equal(UINT128_MAX, int128{-1}): false +int128{-1} < uint128{0} (operator): false +cmp_less(int128{-1}, uint128{0}): true === Mixed with builtin integers === -cmp_less(int128_t{-5}, 0u): true -cmp_equal(uint128_t{42}, 42): true +cmp_less(int128{-5}, 0u): true +cmp_equal(uint128{42}, 42): true === in_range === -in_range(int128_t{200}): false -in_range(int128_t{-1}): false +in_range(int128{200}): false +in_range(int128{-1}): false in_range(UINT128_MAX): false -in_range(UINT128_MAX): false +in_range(UINT128_MAX): false ---- ==== diff --git a/doc/render_benchmarks.py b/doc/render_benchmarks.py index 4d9f8ce8..3766651c 100644 --- a/doc/render_benchmarks.py +++ b/doc/render_benchmarks.py @@ -84,8 +84,8 @@ # Fallback when a data set names a baseline that it did not measure; first match wins. BASELINE_PRIORITY = { - 'u128': ['unsigned __int128', 'std::_Unsigned128', 'boost::mp::uint128_t'], - 'i128': ['__int128', 'std::_Signed128', 'boost::mp::int128_t'], + 'u128': ['unsigned __int128', 'std::_Unsigned128', 'boost::mp::uint128'], + 'i128': ['__int128', 'std::_Signed128', 'boost::mp::int128'], } diff --git a/examples/basic_arithmetic.cpp b/examples/basic_arithmetic.cpp index 76888dca..704781de 100644 --- a/examples/basic_arithmetic.cpp +++ b/examples/basic_arithmetic.cpp @@ -12,12 +12,12 @@ int main() // They can be between values of the same type, or the same signedness by default. // See `mixed_type_arithmetic.cpp` for operations with different signedness. - using boost::int128::int128_t; - using boost::int128::uint128_t; + using boost::int128::int128; + using boost::int128::uint128; // Basic arithmetic with signed 128-bit integers - int128_t x {1000000000000LL}; // 1 trillion - int128_t y {999999999999LL}; // Just under 1 trillion + int128 x {1000000000000LL}; // 1 trillion + int128 y {999999999999LL}; // Just under 1 trillion std::cout << "=== Signed 128-bit Arithmetic ===" << std::endl; std::cout << "x = " << x << std::endl; @@ -44,14 +44,14 @@ int main() std::cout << "x != y: " << (x != y) << std::endl; // Negative values and absolute value - int128_t negative {-42}; + int128 negative {-42}; std::cout << "\nNegative values:" << std::endl; std::cout << "negative = " << negative << std::endl; std::cout << "abs(negative) = " << boost::int128::abs(negative) << std::endl; // Compound assignment operators std::cout << "\nCompound assignment operators:" << std::endl; - int128_t z {100}; + int128 z {100}; std::cout << "z = " << z << std::endl; z += 50; @@ -71,14 +71,14 @@ int main() // Unsigned 128-bit arithmetic - useful for very large positive values std::cout << "\n=== Unsigned 128-bit Arithmetic ===" << std::endl; - uint128_t large {UINT64_C(0x1), UINT64_C(0x0)}; // 2^64 + uint128 large {UINT64_C(0x1), UINT64_C(0x0)}; // 2^64 std::cout << "large (2^64) = " << large << std::endl; std::cout << "large * 2 = " << (large * 2U) << std::endl; std::cout << "large + large = " << (large + large) << std::endl; // Increment and decrement std::cout << "\nIncrement and Decrement:" << std::endl; - int128_t counter {10}; + int128 counter {10}; std::cout << "counter = " << counter << std::endl; std::cout << "++counter = " << ++counter << std::endl; std::cout << "counter++ = " << counter++ << std::endl; diff --git a/examples/bit.cpp b/examples/bit.cpp index b025ca23..34d3cc88 100644 --- a/examples/bit.cpp +++ b/examples/bit.cpp @@ -36,9 +36,9 @@ int main() // end::exclude[] int main() { - // The functions from bit are only available for uint128_t + // The functions from bit are only available for uint128 - constexpr boost::int128::uint128_t x {1U}; + constexpr boost::int128::uint128 x {1U}; // All the functions are constexpr @@ -66,13 +66,13 @@ int main() // Swap the bytes // Create a value with distinct byte pattern - constexpr boost::int128::uint128_t original{ + constexpr boost::int128::uint128 original{ 0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL }; // Expected result after byteswap - constexpr boost::int128::uint128_t expected{ + constexpr boost::int128::uint128 expected{ 0x1032547698BADCFEULL, 0xEFCDAB8967452301ULL }; diff --git a/examples/charconv.cpp b/examples/charconv.cpp index 0af5f1f1..e499e768 100644 --- a/examples/charconv.cpp +++ b/examples/charconv.cpp @@ -12,8 +12,8 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; char buffer[64]; @@ -21,42 +21,42 @@ int main() std::cout << "=== to_chars ===" << std::endl; // Unsigned 128-bit to decimal string - constexpr uint128_t max_u128 {std::numeric_limits::max()}; + constexpr uint128 max_u128 {std::numeric_limits::max()}; auto result {boost::charconv::to_chars(buffer, buffer + sizeof(buffer), max_u128)}; *result.ptr = '\0'; - std::cout << "uint128_t max (decimal): " << buffer << std::endl; + std::cout << "uint128 max (decimal): " << buffer << std::endl; // Signed 128-bit to decimal string - constexpr int128_t min_i128 {std::numeric_limits::min()}; + constexpr int128 min_i128 {std::numeric_limits::min()}; result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), min_i128); *result.ptr = '\0'; - std::cout << "int128_t min (decimal): " << buffer << std::endl; + std::cout << "int128 min (decimal): " << buffer << std::endl; // Hexadecimal output (base 16) - uint128_t hex_value {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; + uint128 hex_value {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), hex_value, 16); *result.ptr = '\0'; - std::cout << "uint128_t (hex): 0x" << buffer << std::endl; + std::cout << "uint128 (hex): 0x" << buffer << std::endl; // Octal output (base 8) - result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), int128_t{511}, 8); + result = boost::charconv::to_chars(buffer, buffer + sizeof(buffer), int128{511}, 8); *result.ptr = '\0'; - std::cout << "int128_t 511 (octal): 0" << buffer << std::endl; + std::cout << "int128 511 (octal): 0" << buffer << std::endl; // === from_chars: Parse character strings to integers === std::cout << "\n=== from_chars ===" << std::endl; - // Parse decimal string to uint128_t + // Parse decimal string to uint128 const char* decimal_str {"340282366920938463463374607431768211455"}; - uint128_t parsed_unsigned; + uint128 parsed_unsigned; boost::charconv::from_chars(decimal_str, decimal_str + std::strlen(decimal_str), parsed_unsigned); std::cout << "Parsed \"" << decimal_str << "\"" << std::endl; std::cout << " Result: " << parsed_unsigned << std::endl; std::cout << " Equals max? " << std::boolalpha << (parsed_unsigned == max_u128) << std::endl; - // Parse negative decimal string to int128_t + // Parse negative decimal string to int128 const char* negative_str {"-170141183460469231731687303715884105728"}; - int128_t parsed_signed; + int128 parsed_signed; boost::charconv::from_chars(negative_str, negative_str + std::strlen(negative_str), parsed_signed); std::cout << "Parsed \"" << negative_str << "\"" << std::endl; std::cout << " Result: " << parsed_signed << std::endl; @@ -64,7 +64,7 @@ int main() // Parse hexadecimal string (base 16) const char* hex_str {"DEADBEEFCAFEBABE12345678"}; - uint128_t parsed_hex; + uint128 parsed_hex; boost::charconv::from_chars(hex_str, hex_str + std::strlen(hex_str), parsed_hex, 16); std::cout << "Parsed hex \"" << hex_str << "\"" << std::endl; std::cout << " Result: " << parsed_hex << std::endl; diff --git a/examples/checked_arithmetic.cpp b/examples/checked_arithmetic.cpp index 55db9834..c2c98d62 100644 --- a/examples/checked_arithmetic.cpp +++ b/examples/checked_arithmetic.cpp @@ -17,8 +17,8 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; using boost::int128::ckd_add; using boost::int128::ckd_sub; using boost::int128::ckd_mul; @@ -29,41 +29,41 @@ int main() // operation is evaluated as if both operands had infinite range, the result // is written to *result wrapped to that type's width, and the function // returns true when the exact result did not fit. - constexpr auto u_max {std::numeric_limits::max()}; - constexpr auto i_max {std::numeric_limits::max()}; - constexpr auto i_min {std::numeric_limits::min()}; + constexpr auto u_max {std::numeric_limits::max()}; + constexpr auto i_max {std::numeric_limits::max()}; + constexpr auto i_min {std::numeric_limits::min()}; // A result that fits returns false and holds the exact value. std::cout << "=== Results That Fit ===" << std::endl; - int128_t r {}; - bool overflow {ckd_add(&r, int128_t{20}, int128_t{22})}; + int128 r {}; + bool overflow {ckd_add(&r, int128{20}, int128{22})}; std::cout << "ckd_add(20, 22): overflow=" << overflow << ", result=" << r << std::endl; // Addition that exceeds the type wraps modulo 2^128 and reports overflow. std::cout << "\n=== Addition Overflow ===" << std::endl; - uint128_t u {}; - overflow = ckd_add(&u, u_max, uint128_t{1}); + uint128 u {}; + overflow = ckd_add(&u, u_max, uint128{1}); std::cout << "ckd_add(UINT128_MAX, 1): overflow=" << overflow << ", wrapped=" << u << std::endl; // Subtracting below zero in an unsigned type wraps to the top of the range. std::cout << "\n=== Subtraction Underflow ===" << std::endl; - overflow = ckd_sub(&u, uint128_t{0}, uint128_t{1}); + overflow = ckd_sub(&u, uint128{0}, uint128{1}); std::cout << "ckd_sub(0, 1): overflow=" << overflow << ", wrapped=" << u << std::endl; // Multiplication detects overflow that operator* would silently roll over, // including INT128_MIN * -1, whose true result is not representable. std::cout << "\n=== Multiplication Overflow ===" << std::endl; - overflow = ckd_mul(&r, i_max, int128_t{2}); + overflow = ckd_mul(&r, i_max, int128{2}); std::cout << "ckd_mul(INT128_MAX, 2): overflow=" << overflow << ", wrapped=" << r << std::endl; - overflow = ckd_mul(&r, i_min, int128_t{-1}); + overflow = ckd_mul(&r, i_min, int128{-1}); std::cout << "ckd_mul(INT128_MIN, -1): overflow=" << overflow << ", wrapped=" << r << std::endl; // The result type and the two operand types are independent: they may differ // in width and signedness, and the exact mathematical value is always used. std::cout << "\n=== Mixed Types ===" << std::endl; std::int64_t narrow {}; - overflow = ckd_add(&narrow, uint128_t{5}, int128_t{-3}); - std::cout << "ckd_add(uint128_t{5}, int128_t{-3}): overflow=" << overflow + overflow = ckd_add(&narrow, uint128{5}, int128{-3}); + std::cout << "ckd_add(uint128{5}, int128{-3}): overflow=" << overflow << ", result=" << narrow << std::endl; // Narrow targets make the wrap-around easy to see (400 modulo 256 is 144). diff --git a/examples/construction.cpp b/examples/construction.cpp index fc92ec1b..97b5a62b 100644 --- a/examples/construction.cpp +++ b/examples/construction.cpp @@ -11,23 +11,23 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; - std::cout << "=== uint128_t Construction ===" << std::endl; + std::cout << "=== uint128 Construction ===" << std::endl; // 1) From a builtin integer type - constexpr uint128_t from_builtin {42U}; + constexpr uint128 from_builtin {42U}; std::cout << "From builtin (42U): " << from_builtin << std::endl; // 2) From high and low 64-bit values (high, low) - constexpr uint128_t from_parts {UINT64_C(0x1), UINT64_C(0x0)}; // 2^64 + constexpr uint128 from_parts {UINT64_C(0x1), UINT64_C(0x0)}; // 2^64 std::cout << "From parts (1, 0) = 2^64: " << from_parts << std::endl; - constexpr uint128_t max_value {UINT64_C(0xFFFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF)}; + constexpr uint128 max_value {UINT64_C(0xFFFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF)}; std::cout << "From parts (max, max): " << max_value << std::endl; std::cout << " Equals numeric_limits max? " << std::boolalpha - << (max_value == std::numeric_limits::max()) << std::endl; + << (max_value == std::numeric_limits::max()) << std::endl; // 3) From user-defined literals. // The library provides only string-form UDLs @@ -44,22 +44,22 @@ int main() // 5) From input stream std::stringstream ss; ss.str("12345678901234567890123456789"); - uint128_t from_stream; + uint128 from_stream; ss >> from_stream; std::cout << "From stringstream: " << from_stream << std::endl; - std::cout << "\n=== int128_t Construction ===" << std::endl; + std::cout << "\n=== int128 Construction ===" << std::endl; // Signed from builtin - constexpr int128_t signed_builtin {-42}; + constexpr int128 signed_builtin {-42}; std::cout << "From builtin (-42): " << signed_builtin << std::endl; // Signed from parts. Both words are stored unsigned, but the constructor takes // the high word signed; read it back with signed_high(). - constexpr int128_t min_value {INT64_MIN, 0}; + constexpr int128 min_value {INT64_MIN, 0}; std::cout << "From parts (INT64_MIN, 0): " << min_value << std::endl; std::cout << " Equals numeric_limits min? " - << (min_value == std::numeric_limits::min()) << std::endl; + << (min_value == std::numeric_limits::min()) << std::endl; // Signed literals. Values that fit in unsigned long long can be written // directly; the leading minus is parsed as a unary operator on the @@ -84,52 +84,52 @@ int main() std::cout << "\n=== Default and Copy Construction ===" << std::endl; // Default construction (zero-initialized) - constexpr uint128_t default_constructed {}; + constexpr uint128 default_constructed {}; std::cout << "Default constructed: " << default_constructed << std::endl; // Copy construction - const uint128_t copied {from_macro}; + const uint128 copied {from_macro}; std::cout << "Copy constructed: " << copied << std::endl; std::cout << "\n=== Floating-Point Construction ===" << std::endl; // Floating-point construction truncates toward zero, matching the behavior of // a static_cast from a floating-point type to a built-in integer. - constexpr uint128_t from_double {12345.9}; - std::cout << "uint128_t from 12345.9 (truncated): " << from_double << std::endl; + constexpr uint128 from_double {12345.9}; + std::cout << "uint128 from 12345.9 (truncated): " << from_double << std::endl; - constexpr int128_t from_negative_double {-12345.9}; - std::cout << "int128_t from -12345.9 (truncated toward zero): " << from_negative_double << std::endl; + constexpr int128 from_negative_double {-12345.9}; + std::cout << "int128 from -12345.9 (truncated toward zero): " << from_negative_double << std::endl; // Values that exceed the 64-bit range are routed through the full 128-bit decomposition. const double two_to_the_100 {1.2676506002282294e30}; // 2^100 - const uint128_t large_from_double {two_to_the_100}; - std::cout << "uint128_t from 2^100: " << large_from_double << std::endl; + const uint128 large_from_double {two_to_the_100}; + std::cout << "uint128 from 2^100: " << large_from_double << std::endl; std::cout << "\n=== Floating-Point Edge Cases ===" << std::endl; // NaN yields zero for both signed and unsigned (mirrors libgcc's __fix(uns)Xfti). const double nan_value {std::numeric_limits::quiet_NaN()}; - const uint128_t unsigned_from_nan {nan_value}; - const int128_t signed_from_nan {nan_value}; - std::cout << "uint128_t from NaN: " << unsigned_from_nan << std::endl; - std::cout << "int128_t from NaN: " << signed_from_nan << std::endl; + const uint128 unsigned_from_nan {nan_value}; + const int128 signed_from_nan {nan_value}; + std::cout << "uint128 from NaN: " << unsigned_from_nan << std::endl; + std::cout << "int128 from NaN: " << signed_from_nan << std::endl; - // Negative values are clamped to zero when constructing uint128_t. - const uint128_t unsigned_from_negative {-1.0}; - std::cout << "uint128_t from -1.0 (clamped to zero): " << unsigned_from_negative << std::endl; + // Negative values are clamped to zero when constructing uint128. + const uint128 unsigned_from_negative {-1.0}; + std::cout << "uint128 from -1.0 (clamped to zero): " << unsigned_from_negative << std::endl; // Positive overflow saturates: anything >= 2^128 (including +infinity) becomes UINT128_MAX. const double infinity {std::numeric_limits::infinity()}; - const uint128_t saturated_unsigned {infinity}; - std::cout << "uint128_t from +infinity (saturates to UINT128_MAX): " << saturated_unsigned << std::endl; + const uint128 saturated_unsigned {infinity}; + std::cout << "uint128 from +infinity (saturates to UINT128_MAX): " << saturated_unsigned << std::endl; - // For int128_t, values >= 2^127 saturate to INT128_MAX and values <= -2^127 saturate to INT128_MIN. + // For int128, values >= 2^127 saturate to INT128_MAX and values <= -2^127 saturate to INT128_MIN. const double huge {1e40}; // Well beyond 2^127 (~ 1.7e38) - const int128_t saturated_positive {huge}; - const int128_t saturated_negative {-huge}; - std::cout << "int128_t from 1e40 (saturates to INT128_MAX): " << saturated_positive << std::endl; - std::cout << "int128_t from -1e40 (saturates to INT128_MIN): " << saturated_negative << std::endl; + const int128 saturated_positive {huge}; + const int128 saturated_negative {-huge}; + std::cout << "int128 from 1e40 (saturates to INT128_MAX): " << saturated_positive << std::endl; + std::cout << "int128 from -1e40 (saturates to INT128_MIN): " << saturated_negative << std::endl; return 0; } \ No newline at end of file diff --git a/examples/container_hash.cpp b/examples/container_hash.cpp index e299bef5..1abea565 100644 --- a/examples/container_hash.cpp +++ b/examples/container_hash.cpp @@ -34,16 +34,16 @@ #include #include -using boost::int128::uint128_t; -using boost::int128::int128_t; +using boost::int128::uint128; +using boost::int128::int128; // A user-defined composite key that holds 128-bit fields. Providing a hash_value // overload in the type's own namespace lets Boost.ContainerHash find it via ADL, // and boost::hash_combine reuses the int128 hashes supplied by hash.hpp. struct point { - int128_t x; - int128_t y; + int128 x; + int128 y; }; bool operator==(const point& lhs, const point& rhs) @@ -65,30 +65,30 @@ int main() // boost::hash dispatches to the hash_value overloads from hash.hpp, which // delegate to std::hash, so the two functors always agree. - const uint128_t big {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; - const int128_t neg {-123456789012345678LL}; + const uint128 big {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; + const int128 neg {-123456789012345678LL}; - std::cout << "boost::hash matches std::hash (uint128_t): " - << std::boolalpha << (boost::hash{}(big) == std::hash{}(big)) << std::endl; - std::cout << "boost::hash matches std::hash (int128_t): " - << (boost::hash{}(neg) == std::hash{}(neg)) << std::endl; + std::cout << "boost::hash matches std::hash (uint128): " + << std::boolalpha << (boost::hash{}(big) == std::hash{}(big)) << std::endl; + std::cout << "boost::hash matches std::hash (int128): " + << (boost::hash{}(neg) == std::hash{}(neg)) << std::endl; - std::cout << "\n=== boost::unordered_map ===" << std::endl; + std::cout << "\n=== boost::unordered_map ===" << std::endl; - // boost::unordered_map defaults to boost::hash, so uint128_t keys need + // boost::unordered_map defaults to boost::hash, so uint128 keys need // no explicit hasher. - boost::unordered_map labels {}; - labels[uint128_t{1, 0}] = "two to the sixty-fourth"; // 2^64 - labels[uint128_t{UINT64_C(0x8000000000000000), 0}] = "two to the one hundred twenty-seventh"; // 2^127 - labels[uint128_t{42}] = "forty-two"; + boost::unordered_map labels {}; + labels[uint128{1, 0}] = "two to the sixty-fourth"; // 2^64 + labels[uint128{UINT64_C(0x8000000000000000), 0}] = "two to the one hundred twenty-seventh"; // 2^127 + labels[uint128{42}] = "forty-two"; std::cout << "Entries: " << labels.size() << std::endl; - std::cout << "Label at 2^64: " << labels[uint128_t{1, 0}] << std::endl; - std::cout << "Contains 42: " << (labels.find(uint128_t{42}) != labels.end()) << std::endl; + std::cout << "Label at 2^64: " << labels[uint128{1, 0}] << std::endl; + std::cout << "Contains 42: " << (labels.find(uint128{42}) != labels.end()) << std::endl; std::cout << "\n=== hash_combine for a composite key ===" << std::endl; - // The point hasher combines two int128_t fields; boost::hash finds it + // The point hasher combines two int128 fields; boost::hash finds it // via ADL, letting point be used as a key directly. boost::unordered_map populations {}; populations[point{10, 20}] = 5000000; @@ -99,16 +99,16 @@ int main() std::cout << "Same coordinate hashes equal: " << (boost::hash{}(point{10, 20}) == boost::hash{}(point{10, 20})) << std::endl; - std::cout << "\n=== boost::unordered_flat_map ===" << std::endl; + std::cout << "\n=== boost::unordered_flat_map ===" << std::endl; // The modern flat container also defaults to boost::hash. - boost::unordered_flat_map counts {}; - counts[int128_t{-1}] = 1; - counts[int128_t{0}] = 2; - counts[int128_t{1}] = 3; + boost::unordered_flat_map counts {}; + counts[int128{-1}] = 1; + counts[int128{0}] = 2; + counts[int128{1}] = 3; std::cout << "Flat map size: " << counts.size() << std::endl; - std::cout << "counts[-1] = " << counts[int128_t{-1}] << std::endl; + std::cout << "counts[-1] = " << counts[int128{-1}] << std::endl; return 0; } diff --git a/examples/cstdlib.cpp b/examples/cstdlib.cpp index 601a20c9..4f33551a 100644 --- a/examples/cstdlib.cpp +++ b/examples/cstdlib.cpp @@ -9,8 +9,8 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; std::cout << "=== div() Function ===" << std::endl; std::cout << "Returns both quotient and remainder in a single operation" << std::endl; @@ -18,8 +18,8 @@ int main() // Unsigned division std::cout << "\n--- Unsigned Division ---" << std::endl; - constexpr uint128_t dividend {1000000000000000000ULL}; - constexpr uint128_t divisor {7}; + constexpr uint128 dividend {1000000000000000000ULL}; + constexpr uint128 divisor {7}; auto uresult {boost::int128::div(dividend, divisor)}; std::cout << dividend << " / " << divisor << " = " << uresult.quot @@ -32,8 +32,8 @@ int main() // Large value division std::cout << "\n--- Large Value Division ---" << std::endl; - constexpr uint128_t large_dividend {uint128_t{1} << 100}; // 2^100 - constexpr uint128_t large_divisor {uint128_t{1} << 50}; // 2^50 + constexpr uint128 large_dividend {uint128{1} << 100}; // 2^100 + constexpr uint128 large_divisor {uint128{1} << 50}; // 2^50 auto large_result {boost::int128::div(large_dividend, large_divisor)}; std::cout << "2^100 / 2^50 = " << large_result.quot @@ -42,8 +42,8 @@ int main() // Signed division std::cout << "\n--- Signed Division ---" << std::endl; - constexpr int128_t signed_dividend {-100}; - constexpr int128_t signed_divisor {7}; + constexpr int128 signed_dividend {-100}; + constexpr int128 signed_divisor {7}; auto sresult {boost::int128::div(signed_dividend, signed_divisor)}; std::cout << signed_dividend << " / " << signed_divisor << " = " << sresult.quot @@ -52,10 +52,10 @@ int main() // Different sign combinations std::cout << "\n--- Sign Combinations ---" << std::endl; - constexpr int128_t pos {17}; - constexpr int128_t neg {-17}; - constexpr int128_t div_pos {5}; - constexpr int128_t div_neg {-5}; + constexpr int128 pos {17}; + constexpr int128 neg {-17}; + constexpr int128 div_pos {5}; + constexpr int128 div_neg {-5}; auto pp {boost::int128::div(pos, div_pos)}; auto pn {boost::int128::div(pos, div_neg)}; @@ -70,7 +70,7 @@ int main() // Edge case: dividend smaller than divisor std::cout << "\n--- Edge Cases ---" << std::endl; - auto small_div {boost::int128::div(uint128_t{3}, uint128_t{10})}; + auto small_div {boost::int128::div(uint128{3}, uint128{10})}; std::cout << "3 / 10 = " << small_div.quot << " remainder " << small_div.rem << std::endl; return 0; diff --git a/examples/cuda.cu b/examples/cuda.cu index b8eeb61c..80271e54 100644 --- a/examples/cuda.cu +++ b/examples/cuda.cu @@ -14,7 +14,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; // Calculates the GCD of 2 values on device __global__ void cuda_gcd(const test_type* in1, const test_type* in2, test_type* out, int numElements) diff --git a/examples/cuda_primality.cu b/examples/cuda_primality.cu index 5a6cdb71..4e261af9 100644 --- a/examples/cuda_primality.cu +++ b/examples/cuda_primality.cu @@ -7,7 +7,7 @@ // // Every step of the test reduces a product of two residues modulo n. For a // 64-bit n both operands can approach 2^64, so the product needs a full 128 -// bits before it can be reduced. uint128_t supplies that intermediate in +// bits before it can be reduced. uint128 supplies that intermediate in // device code, where unsigned __int128 is not portably available. #include @@ -19,7 +19,7 @@ #include -using boost::int128::uint128_t; +using boost::int128::uint128; // Number of bases that make Miller-Rabin deterministic for every 64-bit n constexpr int num_bases {12}; @@ -28,7 +28,7 @@ constexpr int num_bases {12}; // first so that no high-order bits are discarded before the reduction. __host__ __device__ std::uint64_t mulmod(const std::uint64_t a, const std::uint64_t b, const std::uint64_t n) noexcept { - return static_cast((uint128_t{a} * uint128_t{b}) % uint128_t{n}); + return static_cast((uint128{a} * uint128{b}) % uint128{n}); } // Deterministic Miller-Rabin. Exact for the whole 64-bit range. @@ -65,8 +65,8 @@ __host__ __device__ bool is_prime(const std::uint64_t n) noexcept for (int i {0}; i < num_bases; ++i) { - // powm keeps every intermediate in a uint128_t, so a^d mod n is exact - auto x {static_cast(boost::int128::powm(uint128_t{bases[i]}, uint128_t{d}, uint128_t{n}))}; + // powm keeps every intermediate in a uint128, so a^d mod n is exact + auto x {static_cast(boost::int128::powm(uint128{bases[i]}, uint128{d}, uint128{n}))}; if (x == 1U || x == n - 1U) { @@ -136,9 +136,9 @@ int main() const std::uint64_t b {14029467366897019727ULL}; const std::uint64_t n {18446744073709551557ULL}; - std::cout << "Full 128-bit product a * b: " << uint128_t{a} * uint128_t{b} << std::endl; + std::cout << "Full 128-bit product a * b: " << uint128{a} * uint128{b} << std::endl; std::cout << " (a * b) % n, 64-bit math: " << (a * b) % n << " <- the product wrapped" << std::endl; - std::cout << " (a * b) % n via uint128_t: " << mulmod(a, b, n) << std::endl; + std::cout << " (a * b) % n via uint128: " << mulmod(a, b, n) << std::endl; std::cout << std::endl; // Test the largest odd values that fit in 64 bits diff --git a/examples/fmt_format.cpp b/examples/fmt_format.cpp index d953f803..d020e8c4 100644 --- a/examples/fmt_format.cpp +++ b/examples/fmt_format.cpp @@ -23,13 +23,13 @@ int main() { - using boost::int128::int128_t; - using boost::int128::uint128_t; + using boost::int128::int128; + using boost::int128::uint128; std::cout << "=== Basic Formatting ===" << std::endl; - constexpr uint128_t unsigned_value {0xDEADBEEF, 0xCAFEBABE12345678}; - constexpr int128_t signed_value {-123456789012345678}; + constexpr uint128 unsigned_value {0xDEADBEEF, 0xCAFEBABE12345678}; + constexpr int128 signed_value {-123456789012345678}; // Default decimal formatting std::cout << fmt::format("Default (decimal): {}", unsigned_value) << std::endl; @@ -38,7 +38,7 @@ int main() std::cout << "\n=== Base Specifiers ===" << std::endl; // Different bases: binary, octal, decimal, hex - constexpr uint128_t value {255}; + constexpr uint128 value {255}; std::cout << fmt::format("Binary: {:b}", value) << std::endl; std::cout << fmt::format("Octal: {:o}", value) << std::endl; std::cout << fmt::format("Decimal: {:d}", value) << std::endl; @@ -55,8 +55,8 @@ int main() std::cout << "\n=== Sign Options ===" << std::endl; - constexpr int128_t positive {42}; - constexpr int128_t negative {-42}; + constexpr int128 positive {42}; + constexpr int128 negative {-42}; // Sign specifiers: + (always show), - (default), space (space for positive) std::cout << fmt::format("Plus sign: {:+} and {:+}", positive, negative) << std::endl; @@ -101,12 +101,12 @@ int main() std::cout << "\n=== Large Values ===" << std::endl; // Demonstrate with values beyond 64-bit range - constexpr auto uint_max {std::numeric_limits::max()}; - constexpr auto int_min {std::numeric_limits::min()}; + constexpr auto uint_max {std::numeric_limits::max()}; + constexpr auto int_min {std::numeric_limits::min()}; - std::cout << fmt::format("uint128_t max: {}", uint_max) << std::endl; - std::cout << fmt::format("uint128_t max (hex): {:#x}", uint_max) << std::endl; - std::cout << fmt::format("int128_t min: {}", int_min) << std::endl; + std::cout << fmt::format("uint128 max: {}", uint_max) << std::endl; + std::cout << fmt::format("uint128 max (hex): {:#x}", uint_max) << std::endl; + std::cout << fmt::format("int128 min: {}", int_min) << std::endl; std::cout << "\n=== Combined Format Specifiers ===" << std::endl; diff --git a/examples/hello_world.cpp b/examples/hello_world.cpp index 94122d48..95940650 100644 --- a/examples/hello_world.cpp +++ b/examples/hello_world.cpp @@ -9,8 +9,8 @@ int main() { // 2^64 is one past the largest value a 64-bit integer can hold - const boost::int128::uint128_t x {boost::int128::uint128_t{1} << 64U}; - const boost::int128::uint128_t y {42}; + const boost::int128::uint128 x {boost::int128::uint128{1} << 64U}; + const boost::int128::uint128 y {42}; std::cout << x << " + " << y << " = " << x + y << std::endl; diff --git a/examples/integer_comparison.cpp b/examples/integer_comparison.cpp index 0c390f98..ce21bb3f 100644 --- a/examples/integer_comparison.cpp +++ b/examples/integer_comparison.cpp @@ -17,38 +17,38 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; using boost::int128::cmp_equal; using boost::int128::cmp_less; using boost::int128::in_range; std::cout << std::boolalpha; - constexpr auto u_max {(std::numeric_limits::max)()}; + constexpr auto u_max {(std::numeric_limits::max)()}; // The built-in relational operators follow the usual arithmetic conversions, - // so comparing a uint128_t with a negative int128_t converts the negative + // so comparing a uint128 with a negative int128 converts the negative // value to a huge unsigned one and gives the wrong answer. The cmp_* family // compares the true mathematical values instead. std::cout << "=== Signedness-safe comparison ===" << std::endl; - std::cout << "UINT128_MAX == int128_t{-1} (operator): " << (u_max == int128_t{-1}) << std::endl; - std::cout << "cmp_equal(UINT128_MAX, int128_t{-1}): " << cmp_equal(u_max, int128_t{-1}) << std::endl; - std::cout << "int128_t{-1} < uint128_t{0} (operator): " << (int128_t{-1} < uint128_t{0}) << std::endl; - std::cout << "cmp_less(int128_t{-1}, uint128_t{0}): " << cmp_less(int128_t{-1}, uint128_t{0}) << std::endl; + std::cout << "UINT128_MAX == int128{-1} (operator): " << (u_max == int128{-1}) << std::endl; + std::cout << "cmp_equal(UINT128_MAX, int128{-1}): " << cmp_equal(u_max, int128{-1}) << std::endl; + std::cout << "int128{-1} < uint128{0} (operator): " << (int128{-1} < uint128{0}) << std::endl; + std::cout << "cmp_less(int128{-1}, uint128{0}): " << cmp_less(int128{-1}, uint128{0}) << std::endl; // Either operand may be a builtin integer of any width and signedness. std::cout << "\n=== Mixed with builtin integers ===" << std::endl; - std::cout << "cmp_less(int128_t{-5}, 0u): " << cmp_less(int128_t{-5}, 0U) << std::endl; - std::cout << "cmp_equal(uint128_t{42}, 42): " << cmp_equal(uint128_t{42}, 42) << std::endl; + std::cout << "cmp_less(int128{-5}, 0u): " << cmp_less(int128{-5}, 0U) << std::endl; + std::cout << "cmp_equal(uint128{42}, 42): " << cmp_equal(uint128{42}, 42) << std::endl; // in_range(v) reports whether v is representable in the target type R. // R and the type of v may each be a builtin integer or a 128-bit type. std::cout << "\n=== in_range ===" << std::endl; - std::cout << "in_range(int128_t{200}): " << in_range(int128_t{200}) << std::endl; - std::cout << "in_range(int128_t{-1}): " << in_range(int128_t{-1}) << std::endl; + std::cout << "in_range(int128{200}): " << in_range(int128{200}) << std::endl; + std::cout << "in_range(int128{-1}): " << in_range(int128{-1}) << std::endl; std::cout << "in_range(UINT128_MAX): " << in_range(u_max) << std::endl; - std::cout << "in_range(UINT128_MAX): " << in_range(u_max) << std::endl; + std::cout << "in_range(UINT128_MAX): " << in_range(u_max) << std::endl; return 0; } diff --git a/examples/integer_division.cpp b/examples/integer_division.cpp index 137d7d40..88c139a9 100644 --- a/examples/integer_division.cpp +++ b/examples/integer_division.cpp @@ -19,14 +19,14 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; std::cout << "=== Every rounding mode on -12 / 5 ===" << std::endl; // The exact quotient is -2.4, so the nearest integer is -2 and no mode ties - constexpr int128_t x {-12}; - constexpr int128_t y {5}; + constexpr int128 x {-12}; + constexpr int128 y {5}; std::cout << "div_to_zero = " << boost::int128::div_to_zero(x, y) << std::endl; std::cout << "div_away_zero = " << boost::int128::div_away_zero(x, y) << std::endl; @@ -38,8 +38,8 @@ int main() std::cout << "\n=== Tie breaking on -7 / 2 ===" << std::endl; // The exact quotient is -3.5, so every tie-breaking rule picks a different side - constexpr int128_t tie_x {-7}; - constexpr int128_t tie_y {2}; + constexpr int128 tie_x {-7}; + constexpr int128 tie_y {2}; std::cout << "div_ties_to_zero = " << boost::int128::div_ties_to_zero(tie_x, tie_y) << std::endl; std::cout << "div_ties_away_zero = " << boost::int128::div_ties_away_zero(tie_x, tie_y) << std::endl; @@ -66,8 +66,8 @@ int main() // operator% takes its sign from the dividend, which makes it a poor fit for // wrapping an offset into a range. rem_euclid always lands in [0, abs(y)). - constexpr int128_t modulus {7}; - for (int128_t offset {-9}; offset <= -6; ++offset) + constexpr int128 modulus {7}; + for (int128 offset {-9}; offset <= -6; ++offset) { std::cout << offset << " % 7 = " << (offset % modulus) << ", rem_euclid(" << offset << ", 7) = " << boost::int128::rem_euclid(offset, modulus) << std::endl; @@ -78,8 +78,8 @@ int main() // Counting fixed size blocks needed to cover a length is the classic use for // rounding towards positive infinity. The usual (length + block - 1) / block // overflows here, while div_to_pos_inf does not. - constexpr auto length {(std::numeric_limits::max)()}; - constexpr uint128_t block {1000}; + constexpr auto length {(std::numeric_limits::max)()}; + constexpr uint128 block {1000}; std::cout << "length = " << length << std::endl; std::cout << "div_to_pos_inf(length, 1000) = " << boost::int128::div_to_pos_inf(length, block) << std::endl; @@ -90,8 +90,8 @@ int main() // Rounding half to even keeps a long running sum from drifting upwards, which is // what operator/ plus a manual half-adjustment would do - constexpr int128_t scale {1000}; - const int128_t samples[] {int128_t{1500}, int128_t{2500}, int128_t{3500}, int128_t{-1500}}; + constexpr int128 scale {1000}; + const int128 samples[] {int128{1500}, int128{2500}, int128{3500}, int128{-1500}}; for (const auto sample : samples) { diff --git a/examples/math_and_random.cpp b/examples/math_and_random.cpp index 7fd2b069..4d0f4b4a 100644 --- a/examples/math_and_random.cpp +++ b/examples/math_and_random.cpp @@ -27,14 +27,14 @@ int main() { - std::cout << "=== uint128_t ===" << '\n'; + std::cout << "=== uint128 ===" << '\n'; // Setup our rng and distribution std::mt19937_64 rng {42}; - boost::random::uniform_int_distribution dist {0, (std::numeric_limits::max)()}; + boost::random::uniform_int_distribution dist {0, (std::numeric_limits::max)()}; - // Create a dataset for ourselves of random uint128_ts using our dist and rng from above - std::array data_set; + // Create a dataset for ourselves of random uint128s using our dist and rng from above + std::array data_set; for (auto& value : data_set) { value = dist(rng); @@ -45,12 +45,12 @@ int main() std::cout << "Variance: " << boost::math::statistics::variance(data_set) << '\n'; std::cout << " Median: " << boost::math::statistics::median(data_set) << '\n'; - std::cout << "=== int128_t ===" << '\n'; + std::cout << "=== int128 ===" << '\n'; - // We can also generate random signed integers using int128_t - boost::random::uniform_int_distribution signed_dist {std::numeric_limits::min(), std::numeric_limits::max()}; + // We can also generate random signed integers using int128 + boost::random::uniform_int_distribution signed_dist {std::numeric_limits::min(), std::numeric_limits::max()}; - std::cout << "Random int128_t: " << signed_dist(rng) << std::endl; + std::cout << "Random int128: " << signed_dist(rng) << std::endl; return 0; } diff --git a/examples/mixed_type_arithmetic.cpp b/examples/mixed_type_arithmetic.cpp index c06429aa..a6e34ff2 100644 --- a/examples/mixed_type_arithmetic.cpp +++ b/examples/mixed_type_arithmetic.cpp @@ -7,14 +7,14 @@ int main() { - // Mixed-sign comparisons and arithmetic between int128_t, uint128_t, and + // Mixed-sign comparisons and arithmetic between int128, uint128, and // built-in integer types of opposite signedness follow the C++ usual // arithmetic conversions, identical to the built-in __int128 / // unsigned __int128 types. - std::cout << "=== Mixed Type Arithmetic with uint128_t ===" << std::endl; + std::cout << "=== Mixed Type Arithmetic with uint128 ===" << std::endl; - constexpr boost::int128::uint128_t unsigned_value {3}; + constexpr boost::int128::uint128 unsigned_value {3}; std::cout << "unsigned_value = " << unsigned_value << std::endl; constexpr auto greater_unsigned_value {unsigned_value + 5}; @@ -27,9 +27,9 @@ int main() std::cout << "unsigned_value + 5 = " << (unsigned_value + 5) << " (same as greater_unsigned_value: " << greater_unsigned_value << ")" << std::endl; - std::cout << "\n=== Mixed Type Arithmetic with int128_t ===" << std::endl; + std::cout << "\n=== Mixed Type Arithmetic with int128 ===" << std::endl; - constexpr boost::int128::int128_t signed_value {-3}; + constexpr boost::int128::int128 signed_value {-3}; std::cout << "signed_value = " << signed_value << std::endl; std::cout << "signed_value + 1U = " << (signed_value + 1U) << std::endl; diff --git a/examples/numeric_algorithms.cpp b/examples/numeric_algorithms.cpp index e1e7dfd5..0e6922fd 100644 --- a/examples/numeric_algorithms.cpp +++ b/examples/numeric_algorithms.cpp @@ -9,43 +9,43 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; std::cout << "=== Greatest Common Divisor (gcd) ===" << std::endl; // Basic gcd - constexpr uint128_t a {48}; - constexpr uint128_t b {18}; + constexpr uint128 a {48}; + constexpr uint128 b {18}; std::cout << "gcd(" << a << ", " << b << ") = " << boost::int128::gcd(a, b) << std::endl; // gcd with larger values - constexpr uint128_t large_a {123456789012345678ULL}; - constexpr uint128_t large_b {987654321098765432ULL}; + constexpr uint128 large_a {123456789012345678ULL}; + constexpr uint128 large_b {987654321098765432ULL}; std::cout << "gcd(" << large_a << ", " << large_b << ") = " << boost::int128::gcd(large_a, large_b) << std::endl; // gcd with 128-bit values - constexpr uint128_t huge_a {uint128_t{1} << 100}; - constexpr uint128_t huge_b {uint128_t{1} << 80}; + constexpr uint128 huge_a {uint128{1} << 100}; + constexpr uint128 huge_b {uint128{1} << 80}; std::cout << "gcd(2^100, 2^80) = " << boost::int128::gcd(huge_a, huge_b) << " (= 2^80)" << std::endl; // Signed gcd (always returns positive) - constexpr int128_t neg_a {-48}; - constexpr int128_t neg_b {18}; + constexpr int128 neg_a {-48}; + constexpr int128 neg_b {18}; std::cout << "gcd(" << neg_a << ", " << neg_b << ") = " << boost::int128::gcd(neg_a, neg_b) << " (always positive)" << std::endl; std::cout << "\n=== Least Common Multiple (lcm) ===" << std::endl; // Basic lcm - constexpr uint128_t x {12}; - constexpr uint128_t y {18}; + constexpr uint128 x {12}; + constexpr uint128 y {18}; std::cout << "lcm(" << x << ", " << y << ") = " << boost::int128::lcm(x, y) << std::endl; // lcm with coprime numbers - constexpr uint128_t p {7}; - constexpr uint128_t q {11}; + constexpr uint128 p {7}; + constexpr uint128 q {11}; std::cout << "lcm(" << p << ", " << q << ") = " << boost::int128::lcm(p, q) << " (coprime: lcm = p * q)" << std::endl; @@ -60,14 +60,14 @@ int main() std::cout << "\n=== Midpoint ===" << std::endl; // Unsigned midpoint - constexpr uint128_t low {10}; - constexpr uint128_t high {20}; + constexpr uint128 low {10}; + constexpr uint128 high {20}; std::cout << "midpoint(" << low << ", " << high << ") = " << boost::int128::midpoint(low, high) << std::endl; // Midpoint with odd sum (rounds toward first argument) - constexpr uint128_t odd_low {10}; - constexpr uint128_t odd_high {21}; + constexpr uint128 odd_low {10}; + constexpr uint128 odd_high {21}; std::cout << "midpoint(" << odd_low << ", " << odd_high << ") = " << boost::int128::midpoint(odd_low, odd_high) << " (rounds toward first arg)" << std::endl; std::cout << "midpoint(" << odd_high << ", " << odd_low << ") = " @@ -75,7 +75,7 @@ int main() // Midpoint avoids overflow (unlike (a+b)/2) std::cout << "\n--- Overflow-safe midpoint ---" << std::endl; - constexpr auto uint_max {std::numeric_limits::max()}; + constexpr auto uint_max {std::numeric_limits::max()}; constexpr auto uint_max_minus_10 {uint_max - 10U}; std::cout << "midpoint(uint128_max, uint128_max - 10) = " << boost::int128::midpoint(uint_max, uint_max_minus_10) << std::endl; @@ -83,13 +83,13 @@ int main() // Signed midpoint std::cout << "\n--- Signed midpoint ---" << std::endl; - constexpr int128_t neg {-100}; - constexpr int128_t pos {100}; + constexpr int128 neg {-100}; + constexpr int128 pos {100}; std::cout << "midpoint(" << neg << ", " << pos << ") = " << boost::int128::midpoint(neg, pos) << std::endl; - constexpr int128_t neg2 {-100}; - constexpr int128_t neg3 {-50}; + constexpr int128 neg2 {-100}; + constexpr int128 neg3 {-50}; std::cout << "midpoint(" << neg2 << ", " << neg3 << ") = " << boost::int128::midpoint(neg2, neg3) << std::endl; diff --git a/examples/rollover.cpp b/examples/rollover.cpp index 115f39bb..a0324228 100644 --- a/examples/rollover.cpp +++ b/examples/rollover.cpp @@ -11,28 +11,28 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; - constexpr uint128_t max_unsigned_value {std::numeric_limits::max()}; - constexpr uint128_t min_unsigned_value {std::numeric_limits::min()}; + constexpr uint128 max_unsigned_value {std::numeric_limits::max()}; + constexpr uint128 min_unsigned_value {std::numeric_limits::min()}; - std::cout << "=== uint128_t behavior ===" << std::endl; + std::cout << "=== uint128 behavior ===" << std::endl; - std::cout << "Max of uint128_t: " << max_unsigned_value << '\n' + std::cout << "Max of uint128: " << max_unsigned_value << '\n' << "Max + 1U: " << max_unsigned_value + 1U << "\n\n"; - std::cout << "Min of uint128_t: " << min_unsigned_value << '\n' + std::cout << "Min of uint128: " << min_unsigned_value << '\n' << "Min - 1U: " << min_unsigned_value - 1U << "\n\n"; - constexpr int128_t max_signed_value {std::numeric_limits::max()}; - constexpr int128_t min_signed_value {std::numeric_limits::min()}; + constexpr int128 max_signed_value {std::numeric_limits::max()}; + constexpr int128 min_signed_value {std::numeric_limits::min()}; - std::cout << "=== int128_t behavior ===" << std::endl; + std::cout << "=== int128 behavior ===" << std::endl; - std::cout << "Max of int128_t: " << max_signed_value << '\n' + std::cout << "Max of int128: " << max_signed_value << '\n' << "Max + 1: " << max_signed_value + 1 << "\n"; - std::cout << "\nMin of int128_t: " << min_signed_value << '\n' + std::cout << "\nMin of int128: " << min_signed_value << '\n' << "Min - 1: " << min_signed_value - 1 << '\n' << std::endl; } diff --git a/examples/saturating_arithmetic.cpp b/examples/saturating_arithmetic.cpp index cb1960fc..ef886bf4 100644 --- a/examples/saturating_arithmetic.cpp +++ b/examples/saturating_arithmetic.cpp @@ -18,26 +18,26 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; // std::numeric_limits is overloaded for both types - constexpr auto uint_max {std::numeric_limits::max()}; - static_assert(std::is_same::value, "Types should match"); + constexpr auto uint_max {std::numeric_limits::max()}; + static_assert(std::is_same::value, "Types should match"); - constexpr auto int_max {std::numeric_limits::max()}; - constexpr auto int_min {std::numeric_limits::min()}; + constexpr auto int_max {std::numeric_limits::max()}; + constexpr auto int_min {std::numeric_limits::min()}; std::cout << "=== Saturating Arithmetic ===" << std::endl; - std::cout << "uint128_t max = " << uint_max << std::endl; - std::cout << "int128_t max = " << int_max << std::endl; - std::cout << "int128_t min = " << int_min << std::endl; + std::cout << "uint128 max = " << uint_max << std::endl; + std::cout << "int128 max = " << int_max << std::endl; + std::cout << "int128 min = " << int_min << std::endl; // Saturating arithmetic returns max on overflow, or min on underflow rather than rolling over std::cout << "\n=== Saturating Addition and Subtraction ===" << std::endl; std::cout << "saturating_add(uint_max, uint_max) = " << boost::int128::saturating_add(uint_max, uint_max) << " (saturates to uint_max)" << std::endl; - std::cout << "saturating_sub(0, uint_max) = " << boost::int128::saturating_sub(uint128_t{0}, uint_max) + std::cout << "saturating_sub(0, uint_max) = " << boost::int128::saturating_sub(uint128{0}, uint_max) << " (saturates to 0, not underflow)" << std::endl; // This is especially useful for signed types since rollover is undefined @@ -54,7 +54,7 @@ int main() // saturating_cast allows types to be safely converted without rollover behavior std::cout << "\n=== Saturating Casts ===" << std::endl; - std::cout << "saturating_cast(uint_max) = " << boost::int128::saturating_cast(uint_max) + std::cout << "saturating_cast(uint_max) = " << boost::int128::saturating_cast(uint_max) << " (saturates to int_max)" << std::endl; // You can also cast to builtin types diff --git a/examples/stream.cpp b/examples/stream.cpp index 12e2961e..354b8696 100644 --- a/examples/stream.cpp +++ b/examples/stream.cpp @@ -9,17 +9,17 @@ int main() { - using boost::int128::int128_t; - using boost::int128::uint128_t; + using boost::int128::int128; + using boost::int128::uint128; std::cout << "=== Basic Streaming ===" << std::endl; // Both types allow streaming as one would expect from a regular builtin-type - constexpr int128_t signed_value {-42}; + constexpr int128 signed_value {-42}; std::cout << "Signed value: " << signed_value << std::endl; // We can also use to change the output format - constexpr uint128_t unsigned_value {0x1, UINT64_MAX}; + constexpr uint128 unsigned_value {0x1, UINT64_MAX}; std::cout << "Unsigned value (dec): " << unsigned_value << '\n' << "Unsigned value (hex): " << std::hex << unsigned_value << '\n' << "Unsigned value (oct): " << std::oct << unsigned_value << std::endl; @@ -34,47 +34,47 @@ int main() std::cout << "\n=== Large Values (Beyond 64-bit) ===" << std::endl; // 2^64 = 18446744073709551616 (first value that doesn't fit in uint64_t) - constexpr uint128_t two_to_64 {1, 0}; + constexpr uint128 two_to_64 {1, 0}; std::cout << "2^64 = " << two_to_64 << std::endl; // 2^100 = a very large number - constexpr uint128_t two_to_100 {uint128_t{1} << 100}; + constexpr uint128 two_to_100 {uint128{1} << 100}; std::cout << "2^100 = " << two_to_100 << std::endl; - // Maximum uint128_t value - constexpr auto uint_max {std::numeric_limits::max()}; - std::cout << "uint128_t max = " << uint_max << std::endl; + // Maximum uint128 value + constexpr auto uint_max {std::numeric_limits::max()}; + std::cout << "uint128 max = " << uint_max << std::endl; - // Minimum and maximum int128_t values - constexpr auto int_min {std::numeric_limits::min()}; - constexpr auto int_max {std::numeric_limits::max()}; - std::cout << "int128_t min = " << int_min << std::endl; - std::cout << "int128_t max = " << int_max << std::endl; + // Minimum and maximum int128 values + constexpr auto int_min {std::numeric_limits::min()}; + constexpr auto int_max {std::numeric_limits::max()}; + std::cout << "int128 min = " << int_min << std::endl; + std::cout << "int128 max = " << int_max << std::endl; // String conversion using stringstream std::cout << "\n=== String Conversion with std::stringstream ===" << std::endl; - // Convert uint128_t to string + // Convert uint128 to string std::ostringstream oss; oss << two_to_100; auto str {oss.str()}; - std::cout << "uint128_t to string: \"" << str << "\"" << std::endl; + std::cout << "uint128 to string: \"" << str << "\"" << std::endl; - // Convert string to uint128_t + // Convert string to uint128 std::istringstream iss {"123456789012345678901234567890"}; - uint128_t parsed_value {}; + uint128 parsed_value {}; iss >> parsed_value; - std::cout << "String to uint128_t: " << parsed_value << std::endl; + std::cout << "String to uint128: " << parsed_value << std::endl; // Round-trip: value -> string -> value std::cout << "\n=== Round-trip Conversion ===" << std::endl; - constexpr uint128_t original {0xDEADBEEF, 0xCAFEBABE12345678}; + constexpr uint128 original {0xDEADBEEF, 0xCAFEBABE12345678}; std::ostringstream oss2; oss2 << original; auto original_str {oss2.str()}; std::istringstream iss2 {original_str}; - uint128_t round_tripped {}; + uint128 round_tripped {}; iss2 >> round_tripped; std::cout << "Original: " << original << std::endl; diff --git a/examples/sycl.cpp b/examples/sycl.cpp index 5b6f5a58..b15ad5cc 100644 --- a/examples/sycl.cpp +++ b/examples/sycl.cpp @@ -12,7 +12,7 @@ #include #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; // Calculates the GCD of two values on the SYCL device and verifies against the host int main() diff --git a/examples/sycl_accumulate.cpp b/examples/sycl_accumulate.cpp index b8714560..5488f62c 100644 --- a/examples/sycl_accumulate.cpp +++ b/examples/sycl_accumulate.cpp @@ -10,7 +10,7 @@ // worse on a GPU than on a CPU: a parallel reduction visits the elements in // whatever order the hardware schedules, and floating-point addition is not // associative, so the answer changes from run to run and from device to -// device. A uint128_t accumulator is wide enough to be exact here, and +// device. A uint128 accumulator is wide enough to be exact here, and // integer addition is associative, so the device result is bit-for-bit equal // to the host result no matter how the work is partitioned. @@ -22,7 +22,7 @@ #include #include -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { @@ -37,7 +37,7 @@ int main() // Shared (USM) allocations are readable from both the host and the device std::uint64_t* lhs {sycl::malloc_shared(numElements, q)}; std::uint64_t* rhs {sycl::malloc_shared(numElements, q)}; - uint128_t* partials {sycl::malloc_shared(numPartials, q)}; + uint128* partials {sycl::malloc_shared(numPartials, q)}; std::mt19937_64 rng {42}; for (int i {0}; i < numElements; ++i) @@ -53,33 +53,33 @@ int main() { const int p {static_cast(idx[0])}; - uint128_t acc {0}; + uint128 acc {0}; for (int i {p}; i < numElements; i += numPartials) { - acc += uint128_t{lhs[i]} * uint128_t{rhs[i]}; + acc += uint128{lhs[i]} * uint128{rhs[i]}; } partials[p] = acc; }); }).wait(); - uint128_t device_total {0}; + uint128 device_total {0}; for (int i {0}; i < numPartials; ++i) { device_total += partials[i]; } // The same sum on the host, walking the data in both directions - uint128_t host_ascending {0}; + uint128 host_ascending {0}; for (int i {0}; i < numElements; ++i) { - host_ascending += uint128_t{lhs[i]} * uint128_t{rhs[i]}; + host_ascending += uint128{lhs[i]} * uint128{rhs[i]}; } - uint128_t host_descending {0}; + uint128 host_descending {0}; for (int i {numElements - 1}; i >= 0; --i) { - host_descending += uint128_t{lhs[i]} * uint128_t{rhs[i]}; + host_descending += uint128{lhs[i]} * uint128{rhs[i]}; } // What the same reduction produces with a 64-bit accumulator @@ -90,7 +90,7 @@ int main() } std::cout << std::endl; - std::cout << "uint128_t accumulator, exact and " << boost::int128::bit_width(host_ascending) << " bits wide" << std::endl; + std::cout << "uint128 accumulator, exact and " << boost::int128::bit_width(host_ascending) << " bits wide" << std::endl; std::cout << " device, " << numPartials << " strided partials : " << device_total << std::endl; std::cout << " host, ascending order : " << host_ascending << std::endl; std::cout << " host, descending order : " << host_descending << std::endl; @@ -103,16 +103,16 @@ int main() // Widening to double is not a fix either: a single product already needs // more significand bits than double has. - const uint128_t exact_product {uint128_t{lhs[0]} * uint128_t{rhs[0]}}; + const uint128 exact_product {uint128{lhs[0]} * uint128{rhs[0]}}; const double rounded_product {static_cast(lhs[0]) * static_cast(rhs[0])}; - const uint128_t rounded_as_integer {rounded_product}; - const uint128_t rounding_error {rounded_as_integer > exact_product ? + const uint128 rounded_as_integer {rounded_product}; + const uint128 rounding_error {rounded_as_integer > exact_product ? rounded_as_integer - exact_product : exact_product - rounded_as_integer}; std::cout << std::endl; std::cout << "double, too few significand bits for even one product" << std::endl; - std::cout << " lhs[0] * rhs[0] as uint128_t : " << exact_product + std::cout << " lhs[0] * rhs[0] as uint128 : " << exact_product << " (" << boost::int128::bit_width(exact_product) << " bits)" << std::endl; std::cout << " lhs[0] * rhs[0] as double : " << std::setprecision(17) << rounded_product << std::endl; std::cout << " rounding error : " << rounding_error << std::endl; diff --git a/examples/to_string.cpp b/examples/to_string.cpp index 68bb4637..525d2750 100644 --- a/examples/to_string.cpp +++ b/examples/to_string.cpp @@ -11,46 +11,46 @@ int main() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; using boost::int128::to_string; using namespace boost::int128::literals; - std::cout << "=== to_string with uint128_t ===" << std::endl; + std::cout << "=== to_string with uint128 ===" << std::endl; // Compare against std::to_string for values that fit in 64 bits - constexpr uint128_t u_small {UINT64_C(1234567890)}; + constexpr uint128 u_small {UINT64_C(1234567890)}; const auto u_small_str {to_string(u_small)}; const auto u_small_std {std::to_string(std::uint64_t{1234567890})}; - std::cout << "uint128_t to_string(1234567890): " << u_small_str << std::endl; + std::cout << "uint128 to_string(1234567890): " << u_small_str << std::endl; std::cout << "std::to_string(uint64_t 1234567890): " << u_small_std << std::endl; std::cout << "Match: " << std::boolalpha << (u_small_str == u_small_std) << std::endl; - constexpr uint128_t u_max64 {UINT64_MAX}; + constexpr uint128 u_max64 {UINT64_MAX}; const auto u_max64_str {to_string(u_max64)}; const auto u_max64_std {std::to_string(UINT64_MAX)}; - std::cout << "\nuint128_t to_string(UINT64_MAX): " << u_max64_str << std::endl; + std::cout << "\nuint128 to_string(UINT64_MAX): " << u_max64_str << std::endl; std::cout << "std::to_string(UINT64_MAX): " << u_max64_std << std::endl; std::cout << "Match: " << (u_max64_str == u_max64_std) << std::endl; // Values beyond 64-bit range const auto large_unsigned {340282366920938463463374607431768211455_U128}; - std::cout << "\nuint128_t max: " << to_string(large_unsigned) << std::endl; + std::cout << "\nuint128 max: " << to_string(large_unsigned) << std::endl; - std::cout << "\n=== to_string with int128_t ===" << std::endl; + std::cout << "\n=== to_string with int128 ===" << std::endl; // Compare against std::to_string for values that fit in 64 bits - constexpr int128_t s_negative {-42}; + constexpr int128 s_negative {-42}; const auto s_neg_str {to_string(s_negative)}; const auto s_neg_std {std::to_string(std::int64_t{-42})}; - std::cout << "int128_t to_string(-42): " << s_neg_str << std::endl; + std::cout << "int128 to_string(-42): " << s_neg_str << std::endl; std::cout << "std::to_string(int64_t -42): " << s_neg_std << std::endl; std::cout << "Match: " << (s_neg_str == s_neg_std) << std::endl; - constexpr int128_t s_large {INT64_MAX}; + constexpr int128 s_large {INT64_MAX}; const auto s_large_str {to_string(s_large)}; const auto s_large_std {std::to_string(INT64_MAX)}; - std::cout << "\nint128_t to_string(INT64_MAX): " << s_large_str << std::endl; + std::cout << "\nint128 to_string(INT64_MAX): " << s_large_str << std::endl; std::cout << "std::to_string(INT64_MAX): " << s_large_std << std::endl; std::cout << "Match: " << (s_large_str == s_large_std) << std::endl; @@ -59,13 +59,13 @@ int main() // literal, so the positive magnitude 2^127 is read first and rejected as out of // range. A string literal keeps the sign with the digits, so it parses cleanly. const auto large_negative {"-170141183460469231731687303715884105728"_i128}; - std::cout << "\nint128_t min with string literal: " << to_string(large_negative) << std::endl; + std::cout << "\nint128 min with string literal: " << to_string(large_negative) << std::endl; const auto large_negative_c {BOOST_INT128_INT128_C(-170141183460469231731687303715884105728)}; - std::cout << "\nint128_t min with INT128_C macro: " << to_string(large_negative_c) << std::endl; + std::cout << "\nint128 min with INT128_C macro: " << to_string(large_negative_c) << std::endl; - const auto large_positive {std::numeric_limits::max()}; - std::cout << "int128_t max: " << to_string(large_positive) << std::endl; + const auto large_positive {std::numeric_limits::max()}; + std::cout << "int128 max: " << to_string(large_positive) << std::endl; return 0; } diff --git a/extra/int128.natvis b/extra/int128.natvis index 9d3ecbae..af480930 100644 --- a/extra/int128.natvis +++ b/extra/int128.natvis @@ -4,7 +4,7 @@ Distributed under the Boost Software License, Version 1.0. https://www.boost.org/LICENSE_1_0.txt - NATVIS visualizer for boost::int128::uint128_t and boost::int128::int128_t. + NATVIS visualizer for boost::int128::uint128 and boost::int128::int128. Place this file alongside your project or in: %USERPROFILE%\Documents\Visual Studio \Visualizers\ @@ -15,8 +15,8 @@ --> - - + + {low,d} 0x{high,nvohb}{low,nvohb} @@ -25,10 +25,10 @@ - - + {low,u} -{~low + 1,u} 0x{high,nvohb}{low,nvohb} diff --git a/extra/int128_printer_gdb.py b/extra/int128_printer_gdb.py index 49b5e923..1c07183d 100644 --- a/extra/int128_printer_gdb.py +++ b/extra/int128_printer_gdb.py @@ -3,10 +3,10 @@ # https://www.boost.org/LICENSE_1_0.txt # # Struct definitions: -# struct uint128_t { std::uint64_t low; std::uint64_t high; }; -# struct int128_t { std::uint64_t low; std::uint64_t high; }; +# struct uint128 { std::uint64_t low; std::uint64_t high; }; +# struct int128 { std::uint64_t low; std::uint64_t high; }; # -# Both words of both types are unsigned; int128_t reads the pair as two's +# Both words of both types are unsigned; int128 reads the pair as two's # complement. On big endian machines the word order is reversed. # # Usage: source int128_printer.py @@ -16,7 +16,7 @@ import re class Uint128Printer: - """Pretty printer for uint128_t type""" + """Pretty printer for uint128 type""" def __init__(self, val): self.val = val @@ -29,7 +29,7 @@ def to_string(self): value = (high << 64) | low return f"{value:,}" except Exception as e: - return f"" + return f"" def children(self): yield "low", self.val["low"] @@ -40,7 +40,7 @@ def display_hint(self): class Int128Printer: - """Pretty printer for int128_t type""" + """Pretty printer for int128 type""" def __init__(self, val): self.val = val @@ -58,7 +58,7 @@ def to_string(self): value = (high << 64) + low return f"{value:,}" except Exception as e: - return f"" + return f"" def children(self): yield "low", self.val["low"] @@ -68,7 +68,7 @@ def display_hint(self): return None -def lookup_int128_type(val): +def lookup_int128ype(val): """ Lookup function to detect if a type should use our pretty printers. Returns the appropriate printer or None. @@ -87,12 +87,12 @@ def lookup_int128_type(val): type_name = str(type_obj) - # Patterns to match uint128_t and int128_t types + # Patterns to match uint128 and int128 types uint128_pattern = re.compile( - r"^(boost::int128::uint128_t|(\w+::)*uint128_t|uint128_t)$" + r"^(boost::int128::uint128|(\w+::)*uint128|uint128)$" ) int128_pattern = re.compile( - r"^(boost::int128::int128_t|(\w+::)*int128_t|int128_t)$" + r"^(boost::int128::int128|(\w+::)*int128|int128)$" ) if uint128_pattern.match(type_name): @@ -108,9 +108,9 @@ def register_int128_printers(objfile=None): if objfile is None: objfile = gdb - objfile.pretty_printers.append(lookup_int128_type) + objfile.pretty_printers.append(lookup_int128ype) # Auto-register when the script is sourced register_int128_printers() -print("int128_t and uint128_t pretty printers loaded successfully") +print("int128 and uint128 pretty printers loaded successfully") diff --git a/extra/int128_printer_lldb.py b/extra/int128_printer_lldb.py index a3f9a824..86fd1241 100644 --- a/extra/int128_printer_lldb.py +++ b/extra/int128_printer_lldb.py @@ -3,17 +3,17 @@ # https://www.boost.org/LICENSE_1_0.txt # # Struct definitions: -# struct uint128_t { std::uint64_t low; std::uint64_t high; }; -# struct int128_t { std::uint64_t low; std::uint64_t high; }; +# struct uint128 { std::uint64_t low; std::uint64_t high; }; +# struct int128 { std::uint64_t low; std::uint64_t high; }; # -# Both words of both types are unsigned; int128_t reads the pair as two's +# Both words of both types are unsigned; int128 reads the pair as two's # complement. On big endian machines the word order is reversed. import lldb def uint128_summary(valobj, internal_dict): """ - Custom summary for uint128_t type (unsigned). + Custom summary for uint128 type (unsigned). Displays as decimal (base 10). """ try: @@ -24,11 +24,11 @@ def uint128_summary(valobj, internal_dict): value = (high << 64) | low return f"{value:,}" except Exception as e: - return f"" + return f"" def int128_summary(valobj, internal_dict): """ - Custom summary for int128_t type (signed). + Custom summary for int128 type (signed). Displays as decimal (base 10). """ try: @@ -44,11 +44,11 @@ def int128_summary(valobj, internal_dict): return f"{value:,}" except Exception as e: - return f"" + return f"" def __lldb_init_module(debugger, internal_dict): - uint128_pattern = r"^(const )?(boost::int128::uint128_t|(\w+::)*uint128_t)( &| \*)?$" - int128_pattern = r"^(const )?(boost::int128::int128_t|(\w+::)*int128_t)( &| \*)?$" + uint128_pattern = r"^(const )?(boost::int128::uint128|(\w+::)*uint128)( &| \*)?$" + int128_pattern = r"^(const )?(boost::int128::int128|(\w+::)*int128)( &| \*)?$" debugger.HandleCommand( f'type summary add -x "{uint128_pattern}" -e -F int128_printer_lldb.uint128_summary' @@ -64,7 +64,7 @@ def __lldb_init_module(debugger, internal_dict): f'type synthetic add -x "{int128_pattern}" -l int128_printer_lldb.Int128SyntheticProvider' ) - print("int128_t and uint128_t pretty printers loaded successfully") + print("int128 and uint128 pretty printers loaded successfully") class Uint128SyntheticProvider: def __init__(self, valobj, internal_dict): diff --git a/extra/int128_printer_msvc.cpp b/extra/int128_printer_msvc.cpp index daf0c316..e482c9c6 100644 --- a/extra/int128_printer_msvc.cpp +++ b/extra/int128_printer_msvc.cpp @@ -171,22 +171,22 @@ extern "C" __declspec(dllexport) HRESULT __stdcall formatter_s128_hex(DWORD cons __declspec(dllexport) HRESULT __stdcall formatter_u128_dec(DWORD const address, DEBUGHELPER_t* const helper, int const base, BOOL const unicode, char* const result, size_t const maximum, DWORD const reserved) { - return formatter_128(address, helper, base, unicode, result, maximum, reserved); + return formatter_128(address, helper, base, unicode, result, maximum, reserved); } __declspec(dllexport) HRESULT __stdcall formatter_u128_hex(DWORD const address, DEBUGHELPER_t* const helper, int const base, BOOL const unicode, char* const result, size_t const maximum, DWORD const reserved) { - return formatter_128(address, helper, base, unicode, result, maximum, reserved); + return formatter_128(address, helper, base, unicode, result, maximum, reserved); } __declspec(dllexport) HRESULT __stdcall formatter_s128_dec(DWORD const address, DEBUGHELPER_t* const helper, int const base, BOOL const unicode, char* const result, size_t const maximum, DWORD const reserved) { - return formatter_128(address, helper, base, unicode, result, maximum, reserved); + return formatter_128(address, helper, base, unicode, result, maximum, reserved); } __declspec(dllexport) HRESULT __stdcall formatter_s128_hex(DWORD const address, DEBUGHELPER_t* const helper, int const base, BOOL const unicode, char* const result, size_t const maximum, DWORD const reserved) { - return formatter_128(address, helper, base, unicode, result, maximum, reserved); + return formatter_128(address, helper, base, unicode, result, maximum, reserved); } BOOL APIENTRY DllMain(HMODULE const hmodule, DWORD const reason, LPVOID const reserved) diff --git a/extra/int128_printer_msvc.natvis b/extra/int128_printer_msvc.natvis index 2fe32f4a..a0286842 100644 --- a/extra/int128_printer_msvc.natvis +++ b/extra/int128_printer_msvc.natvis @@ -1,11 +1,11 @@ - + - + diff --git a/extra/single_include/boost/int128.hpp b/extra/single_include/boost/int128.hpp index d966e8e3..fe7c1915 100644 --- a/extra/single_include/boost/int128.hpp +++ b/extra/single_include/boost/int128.hpp @@ -40,13 +40,13 @@ #define BOOST_INT128_DETAIL_CONFIG_HPP // A handful of detail-namespace entities are exercised directly by the module -// test suite. BOOST_INT128_TEST_EXPORT exports them only when the module is built +// test suite. BOOST_int128EST_EXPORT exports them only when the module is built // for testing (BOOST_INT128_EXPORT_TESTING), so the normal module API stays limited // to the public interface. It expands to nothing in ordinary (header) builds. #if defined(BOOST_INT128_BUILD_MODULE) && defined(BOOST_INT128_EXPORT_TESTING) -# define BOOST_INT128_TEST_EXPORT export +# define BOOST_int128EST_EXPORT export #else -# define BOOST_INT128_TEST_EXPORT +# define BOOST_int128EST_EXPORT #endif // The SYCL device target (spir64) has no native 128-bit integer, so force the portable @@ -77,13 +77,13 @@ namespace detail { // Avoids pedantic warnings #ifdef __GNUC__ -BOOST_INT128_TEST_EXPORT __extension__ using builtin_i128 = __int128 ; -BOOST_INT128_TEST_EXPORT __extension__ using builtin_u128 = unsigned __int128 ; +BOOST_int128EST_EXPORT __extension__ using builtin_i128 = __int128 ; +BOOST_int128EST_EXPORT __extension__ using builtin_u128 = unsigned __int128 ; #else -BOOST_INT128_TEST_EXPORT using builtin_i128 = __int128 ; -BOOST_INT128_TEST_EXPORT using builtin_u128 = unsigned __int128; +BOOST_int128EST_EXPORT using builtin_i128 = __int128 ; +BOOST_int128EST_EXPORT using builtin_u128 = unsigned __int128; #endif @@ -114,8 +114,8 @@ namespace detail { // See the note above: skip the re-declaration in a module consumer. #if !defined(BOOST_INT128_BUILD_MODULE) || defined(BOOST_INT128_INTERFACE_UNIT) -BOOST_INT128_TEST_EXPORT using builtin_i128 = std::_Signed128; -BOOST_INT128_TEST_EXPORT using builtin_u128 = std::_Unsigned128; +BOOST_int128EST_EXPORT using builtin_i128 = std::_Signed128; +BOOST_int128EST_EXPORT using builtin_u128 = std::_Unsigned128; #endif @@ -327,22 +327,22 @@ BOOST_INT128_TEST_EXPORT using builtin_u128 = std::_Unsigned128; #ifdef BOOST_INT128_DISABLE_EXCEPTIONS -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) #else # ifdef _MSC_VER # ifdef _CPPUNWIND -# define BOOST_INT128_THROW_EXCEPTION(expr) throw expr; +# define BOOST_int128HROW_EXCEPTION(expr) throw expr; # else -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) # define BOOST_INT128_DISABLE_EXCEPTIONS # endif # else # ifdef __EXCEPTIONS -# define BOOST_INT128_THROW_EXCEPTION(expr) throw expr; +# define BOOST_int128HROW_EXCEPTION(expr) throw expr; # else -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) # define BOOST_INT128_DISABLE_EXCEPTIONS # endif #endif @@ -384,8 +384,8 @@ BOOST_INT128_TEST_EXPORT using builtin_u128 = std::_Unsigned128; namespace boost { namespace int128 { -BOOST_INT128_EXPORT struct uint128_t; -BOOST_INT128_EXPORT struct int128_t; +BOOST_INT128_EXPORT struct uint128; +BOOST_INT128_EXPORT struct int128; } // namespace int128 } // namespace boost @@ -551,7 +551,7 @@ namespace detail { // The whole impl namespace is exported when building the module for testing so // the low-level bit helpers can be exercised directly; it is an ordinary // namespace in every other build. -BOOST_INT128_TEST_EXPORT namespace impl { +BOOST_int128EST_EXPORT namespace impl { #if !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) @@ -785,7 +785,7 @@ struct ctor_high_word }; template <> -struct ctor_high_word +struct ctor_high_word { using type = std::int64_t; }; @@ -1557,7 +1557,7 @@ struct #if (defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128)) && !defined(_M_IX86) alignas(alignof(detail::builtin_i128)) #endif -int128_t +int128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -1579,47 +1579,47 @@ int128_t #endif // Defaulted basic construction - constexpr int128_t() noexcept = default; - constexpr int128_t(const int128_t&) noexcept = default; - constexpr int128_t(int128_t&&) noexcept = default; - constexpr int128_t& operator=(const int128_t&) noexcept = default; - constexpr int128_t& operator=(int128_t&&) noexcept = default; + constexpr int128() noexcept = default; + constexpr int128(const int128&) noexcept = default; + constexpr int128(int128&&) noexcept = default; + constexpr int128& operator=(const int128&) noexcept = default; + constexpr int128& operator=(int128&&) noexcept = default; // Requires a conversion file to be implemented - BOOST_INT128_HOST_DEVICE constexpr int128_t(const uint128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const uint128& v) noexcept; // Construct from integral types #if BOOST_INT128_ENDIAN_LITTLE_BYTE - BOOST_INT128_HOST_DEVICE constexpr int128_t(const std::int64_t hi, const std::uint64_t lo) noexcept : low{lo}, high{static_cast(hi)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const std::int64_t hi, const std::uint64_t lo) noexcept : low{lo}, high{static_cast(hi)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? ~UINT64_C(0) : UINT64_C(0)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? ~UINT64_C(0) : UINT64_C(0)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_i128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_u128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_i128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_u128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} #endif // BOOST_INT128_HAS_INT128 #else // Big endian - BOOST_INT128_HOST_DEVICE constexpr int128_t(const std::int64_t hi, const std::uint64_t lo) noexcept : high{static_cast(hi)}, low{lo} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const std::int64_t hi, const std::uint64_t lo) noexcept : high{static_cast(hi)}, low{lo} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const SignedInteger v) noexcept : high{v < 0 ? ~UINT64_C(0) : UINT64_C(0)}, low{static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const SignedInteger v) noexcept : high{v < 0 ? ~UINT64_C(0) : UINT64_C(0)}, low{static_cast(v)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_i128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_i128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} #endif // BOOST_INT128_HAS_INT128 @@ -1627,7 +1627,7 @@ int128_t // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr int128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(Float f) noexcept; // The high word read as a signed value. // Every operation whose meaning depends on the sign of the value goes through @@ -1665,150 +1665,150 @@ int128_t // Compound Or template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator|=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator|=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator|=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator|=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound And template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator&=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator&=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator&=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator&=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound XOR template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator^=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator^=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator^=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator^=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Left Shift template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator<<=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator<<=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator<<=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator<<=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Right Shift template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator>>=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator>>=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator>>=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator>>=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Prefix and postfix increment - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator++() noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t operator++(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator++() noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128 operator++(int) noexcept; // Prefix and postfix decrment - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator--() noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t operator--(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator--() noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128 operator--(int) noexcept; // Compound Addition template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator+=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator+=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator+=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator+=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Subtraction template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator-=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator-=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator-=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator-=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Multiplication template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator*=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator*=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator*=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator*=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Division template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator/=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator/=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator/=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator/=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Modulo template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator%=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator%=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator%=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator%=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 }; namespace detail { -// Builds an int128_t from the raw two's complement words +// Builds an int128 from the raw two's complement words // Enables vectorization -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t from_bits(const std::uint64_t hi, const std::uint64_t lo) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 from_bits(const std::uint64_t hi, const std::uint64_t lo) noexcept { - int128_t result {}; + int128 result {}; result.high = hi; result.low = lo; return result; @@ -1820,7 +1820,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t from_bits( // Absolute Value function //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t abs(int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 abs(int128 value) noexcept { if (value.signed_high() < 0) { @@ -1840,7 +1840,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t abs(int128_t val // converts the unsigned magnitude and applies the sign; see detail/float_conversion.hpp // for why the raw words can not be composed directly for negative values -BOOST_INT128_HOST_DEVICE constexpr int128_t::operator float() const noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::operator float() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -1853,7 +1853,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::operator float() const noexcept #endif } -BOOST_INT128_HOST_DEVICE constexpr int128_t::operator double() const noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::operator double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -1868,7 +1868,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::operator double() const noexcept #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -constexpr int128_t::operator long double() const noexcept +constexpr int128::operator long double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) @@ -1892,7 +1892,7 @@ constexpr int128_t::operator long double() const noexcept // f >= 2^127 -> INT128_MAX; // f < -2^127 -> INT128_MIN. template -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(Float f) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::int128(Float f) noexcept { constexpr Float two_32 {static_cast(UINT64_C(1) << 32)}; constexpr Float two_64 {two_32 * two_32}; @@ -1943,29 +1943,29 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(Float f) noexcept // Unary Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 value) noexcept { return value; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 value) noexcept { // Spelled with the constructor rather than from_bits: clang folds the low word // of the low == 0 arm away here, and loses that if the members are written. - return (value.low == 0) ? int128_t{static_cast(UINT64_C(0) - value.high), 0} : - int128_t{static_cast(~value.high), ~value.low + 1}; + return (value.low == 0) ? int128{static_cast(UINT64_C(0) - value.high), 0} : + int128{static_cast(~value.high), ~value.low + 1}; } //===================================== // Equality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const bool rhs) noexcept { return lhs.high == 0 && lhs.low == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const int128 rhs) noexcept { return rhs.high == 0 && rhs.low == static_cast(lhs); } @@ -1980,7 +1980,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const boo # pragma GCC diagnostic ignored "-Wsign-compare" #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const int128 rhs) noexcept { // x64 and ARM64 like the values in opposite directions @@ -1996,39 +1996,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const SignedInteger rhs) noexcept { return lhs.high == (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const int128 rhs) noexcept { return rhs.high == (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) && rhs.low == static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == 0 && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.high == 0 && rhs.low == static_cast(lhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2037,7 +2037,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Inequality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const int128 rhs) noexcept { // x64 and ARM64 like the values in opposite directions @@ -2069,50 +2069,50 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const bool rhs) noexcept { return lhs.high != 0 || lhs.low != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const int128 rhs) noexcept { return rhs.high != 0 || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const SignedInteger rhs) noexcept { return lhs.high != (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const int128 rhs) noexcept { return rhs.high != (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high != 0 || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.high != 0 || rhs.low != static_cast(lhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2121,7 +2121,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Less than Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -2153,23 +2153,23 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int1 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() < 0 || (lhs.high == 0 && lhs.low < static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() > 0 || (rhs.high == 0 && static_cast(lhs) < rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const SignedInteger rhs) noexcept { if (lhs.signed_high() < 0) { - return rhs >= 0 ? true : lhs < static_cast(rhs); + return rhs >= 0 ? true : lhs < static_cast(rhs); } if (lhs.signed_high() > 0 || rhs < 0) @@ -2181,11 +2181,11 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const Sign } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const int128 rhs) noexcept { if (rhs.signed_high() < 0) { - return lhs >= 0 ? false : static_cast(lhs) < rhs; + return lhs >= 0 ? false : static_cast(lhs) < rhs; } // rhs is positive @@ -2199,14 +2199,14 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2215,7 +2215,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Greater than Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -2247,39 +2247,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int1 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs < rhs) && !(lhs == rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs < rhs) && !(lhs == rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() > 0 || (lhs.high == 0 && lhs.low > static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() < 0 || (rhs.high == 0 && static_cast(lhs) > rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2288,7 +2288,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Less Equal Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -2320,39 +2320,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs > rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs > rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() < 0 || (lhs.high == 0 && lhs.low <= static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() > 0 || (rhs.high == 0 && static_cast(lhs) <= rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2361,7 +2361,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Greater Equal Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -2393,39 +2393,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs < rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs < rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() > 0 || (lhs.high == 0 && lhs.low >= static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() < 0 || (rhs.high == 0 && static_cast(lhs) >= rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -2436,7 +2436,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool #ifdef BOOST_INT128_HAS_SPACESHIP_OPERATOR -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -2453,7 +2453,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering oper } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const SignedInteger rhs) noexcept { if (lhs < rhs) { @@ -2470,7 +2470,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -2487,7 +2487,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Signed } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const UnsignedInteger rhs) noexcept { if (lhs < rhs) { @@ -2504,7 +2504,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -2526,7 +2526,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Unsign // Not Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator~(const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator~(const int128 rhs) noexcept { return detail::from_bits(~rhs.high, ~rhs.low); } @@ -2535,45 +2535,45 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator~(const // Or Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high | rhs.high, lhs.low | rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high | (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low | static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high | (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) | rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::from_bits(lhs.high, lhs.low | static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high, static_cast(lhs) | rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator|(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator|(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator|(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator|(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } @@ -2584,13 +2584,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator|=(const Integer rhs) noexcept { - *this = static_cast(*this | rhs); + *this = static_cast(*this | rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator|=(const int128 rhs) noexcept { *this = *this | rhs; return *this; @@ -2599,9 +2599,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator|=(const Integer rhs) noexcept { - *this = static_cast(*this | rhs); + *this = static_cast(*this | rhs); return *this; } @@ -2611,45 +2611,45 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator|=(const Integer rhs // And Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high & rhs.high, lhs.low & rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high & (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low & static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high & (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) & rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const UnsignedInteger rhs) noexcept { return {0, lhs.low & static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const UnsignedInteger lhs, const int128 rhs) noexcept { return {0, static_cast(lhs) & rhs.low}; } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator&(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator&(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator&(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator&(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } @@ -2658,9 +2658,9 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator&=(const Integer rhs) noexcept { - *this = static_cast(*this & rhs); + *this = static_cast(*this & rhs); return *this; } @@ -2671,13 +2671,13 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator&=(const Integer rhs //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator&=(const Integer rhs) noexcept { - *this = static_cast(*this & rhs); + *this = static_cast(*this & rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator&=(const int128 rhs) noexcept { *this = *this & rhs; return *this; @@ -2687,45 +2687,45 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const int128_t // XOR Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high ^ rhs.high, lhs.low ^ rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high ^ (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low ^ static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high ^ (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) ^ rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::from_bits(lhs.high, lhs.low ^ static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high, static_cast(lhs) ^ rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator^(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator^(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator^(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator^(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } @@ -2736,13 +2736,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator^=(Integer rhs) noexcept { - *this = static_cast(*this ^ rhs); + *this = static_cast(*this ^ rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator^=(int128 rhs) noexcept { *this = *this ^ rhs; return *this; @@ -2751,9 +2751,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(int128_t rhs) #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator^=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator^=(const Integer rhs) noexcept { - *this = static_cast(*this ^ rhs); + *this = static_cast(*this ^ rhs); return *this; } @@ -2766,7 +2766,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator^=(const Integer rhs namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr int128_t default_ls_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 default_ls_impl(const int128 lhs, const Integer rhs) noexcept { static_assert(std::is_integral::value, "Only builtin types allowed"); @@ -2796,7 +2796,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t default_ls_impl(const int128_t lhs, } template -BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE int128 intrinsic_ls_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -2815,8 +2815,8 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value << rhs}; - int128_t return_value; - std::memcpy(&return_value, &res, sizeof(int128_t)); + int128 return_value; + std::memcpy(&return_value, &res, sizeof(int128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -2825,7 +2825,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In # else - return int128_t{static_cast(lhs) << rhs}; + return int128{static_cast(lhs) << rhs}; # endif @@ -2837,7 +2837,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In } else { - int128_t res; + int128 res; res.high = __shiftleft128(lhs.low, lhs.high, static_cast(rhs)); res.low = lhs.low << rhs; @@ -2872,7 +2872,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -2892,7 +2892,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const #endif } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const int128 rhs) noexcept { // Out-of-range counts (negative, >= 128, or with the high word set) are // undefined, matching the built-in operators; forward to the scalar overload. @@ -2901,13 +2901,13 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); @@ -2916,14 +2916,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; @@ -2935,13 +2935,13 @@ BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs #endif // _MSC_VER template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator<<=(const Integer rhs) noexcept { - *this = static_cast(*this << rhs); + *this = static_cast(*this << rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator<<=(const int128 rhs) noexcept { *this = *this << rhs; return *this; @@ -2950,9 +2950,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const int128_ #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator<<=(const Integer rhs) noexcept { - *this = static_cast(*this << rhs); + *this = static_cast(*this << rhs); return *this; } @@ -2969,7 +2969,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator<<=(const Integer rh namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr int128_t default_rs_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 default_rs_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators. In a @@ -2994,7 +2994,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t default_rs_impl(const int128_t lhs, } template -BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE int128 intrinsic_rs_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -3012,8 +3012,8 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In std::memcpy(&value, &lhs, sizeof(builtin_i128)); const auto res {value >> rhs}; - int128_t return_value; - std::memcpy(&return_value, &res, sizeof(int128_t)); + int128 return_value; + std::memcpy(&return_value, &res, sizeof(int128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -3035,7 +3035,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In } else { - int128_t res; + int128 res; res.low = __shiftright128(lhs.low, lhs.high, static_cast(rhs)); res.high = static_cast(lhs.signed_high() >> rhs); @@ -3068,7 +3068,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -3088,7 +3088,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const int128 rhs) noexcept { // Out-of-range counts (negative, >= 128, or with the high word set) are // undefined, matching the built-in operators; forward to the scalar overload. @@ -3097,13 +3097,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); @@ -3112,14 +3112,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; @@ -3131,13 +3131,13 @@ BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs #endif // _MSC_VER template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator>>=(const Integer rhs) noexcept { - *this = static_cast(*this >> rhs); + *this = static_cast(*this >> rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator>>=(const int128 rhs) noexcept { *this = *this >> rhs; return *this; @@ -3146,9 +3146,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const int128_ #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator>>=(const Integer rhs) noexcept { - *this = static_cast(*this >> rhs); + *this = static_cast(*this >> rhs); return *this; } @@ -3162,7 +3162,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator>>=(const Integer rh // Increment Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator++() noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator++() noexcept { if (++low == UINT64_C(0)) { @@ -3172,7 +3172,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator++() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator++(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 int128::operator++(int) noexcept { const auto temp {*this}; ++(*this); @@ -3183,7 +3183,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator++(int) noexcept // Decrement Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator--() noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator--() noexcept { if (low-- == UINT64_C(0)) { @@ -3193,7 +3193,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator--() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator--(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 int128::operator--(int) noexcept { const auto temp {*this}; --(*this); @@ -3206,7 +3206,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator--(int) noexcept namespace detail { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_add(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 library_add(const int128 lhs, const int128 rhs) noexcept { const auto new_low {lhs.low + rhs.low}; const auto new_high {lhs.high + @@ -3216,12 +3216,12 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_ad return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_add(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_add(const int128 lhs, const int128 rhs) noexcept { #if (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_WIN32) && defined(BOOST_INT128_HAS_INT128) // Compute in the unsigned domain so that overflow wraps modulo 2^128 - return int128_t{static_cast(lhs) + static_cast(rhs)}; + return int128{static_cast(lhs) + static_cast(rhs)}; #elif defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) @@ -3240,7 +3240,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad } else { - int128_t result {}; + int128 result {}; const auto carry {BOOST_INT128_ADD_CARRY(0, lhs.low, rhs.low, &result.low)}; BOOST_INT128_ADD_CARRY(carry, lhs.high, rhs.high, &result.high); @@ -3255,7 +3255,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad } template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_add(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_add(const int128 lhs, const Integer rhs) noexcept { const auto new_low {lhs.low + rhs}; const auto new_high {lhs.high + static_cast(new_low < lhs.low)}; @@ -3263,7 +3263,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_sub(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 library_sub(const int128 lhs, const int128 rhs) noexcept { const auto new_low {lhs.low - rhs.low}; const auto new_high {lhs.high - rhs.high - static_cast(lhs.low < rhs.low)}; @@ -3271,7 +3271,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_su return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_sub(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_sub(const int128 lhs, const int128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (!defined(__aarch64__) || defined(__APPLE__) || !defined(BOOST_INT128_HAS_INT128)) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) @@ -3284,7 +3284,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su #elif defined(__aarch64__) && !defined(__APPLE__) // Unsigned wrap for consistent two's-complement semantics - return int128_t{static_cast(lhs) - static_cast(rhs)}; + return int128{static_cast(lhs) - static_cast(rhs)}; #elif defined(_M_AMD64) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -3294,7 +3294,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su } else { - int128_t result {}; + int128 result {}; const auto borrow {BOOST_INT128_SUB_BORROW(0, lhs.low, rhs.low, &result.low)}; BOOST_INT128_SUB_BORROW(borrow, lhs.high, rhs.high, &result.high); @@ -3309,7 +3309,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su } template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_sub(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_sub(const int128 lhs, const Integer rhs) noexcept { const auto new_low {lhs.low - rhs}; const auto new_high {lhs.high - static_cast(new_low > lhs.low)}; @@ -3322,14 +3322,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su // doing addition via subtraction is >10% faster in the benchmarks #if defined(__s390__) || defined(__s390x__) -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const int128 rhs) noexcept { return detail::default_sub(lhs, -rhs); } #else -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const int128 rhs) noexcept { return detail::default_add(lhs, rhs); } @@ -3337,13 +3337,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_add(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::default_add(rhs, lhs); } @@ -3354,7 +3354,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const SignedInteger rhs) noexcept { // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) return rhs < 0 ? detail::default_sub(lhs, -static_cast(rhs)) : @@ -3362,7 +3362,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const SignedInteger lhs, const int128 rhs) noexcept { return lhs < 0 ? detail::default_sub(rhs, -static_cast(lhs)) : detail::default_add(rhs, static_cast(lhs)); @@ -3375,26 +3375,26 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator+(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator+(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return detail::default_add(lhs, static_cast(rhs)); + return detail::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator+(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator+(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return detail::default_add(rhs, static_cast(lhs)); + return detail::default_add(rhs, static_cast(lhs)); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator+=(const Integer rhs) noexcept { - *this = static_cast(*this + rhs); + *this = static_cast(*this + rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator+=(const int128 rhs) noexcept { *this = *this + rhs; return *this; @@ -3403,9 +3403,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator+=(const Integer rhs) noexcept { - *this = static_cast(*this + rhs); + *this = static_cast(*this + rhs); return *this; } @@ -3415,58 +3415,58 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator+=(const Integer rhs // Subtraction Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const int128 rhs) noexcept { return detail::default_sub(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_sub(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::default_add(-rhs, lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const SignedInteger rhs) noexcept { - return detail::default_sub(lhs, static_cast(rhs)); + return detail::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const SignedInteger lhs, const int128 rhs) noexcept { - return detail::default_sub(static_cast(lhs), rhs); + return detail::default_sub(static_cast(lhs), rhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator-(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator-(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator-(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator-(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } #endif template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator-=(const Integer rhs) noexcept { - *this = static_cast(*this - rhs); + *this = static_cast(*this - rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator-=(const int128 rhs) noexcept { *this = *this - rhs; return *this; @@ -3475,9 +3475,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator-=(const Integer rhs) noexcept { - *this = static_cast(*this - rhs); + *this = static_cast(*this - rhs); return *this; } @@ -3489,29 +3489,29 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator-=(const Integer rhs namespace detail { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const std::uint32_t rhs) noexcept { return default_mul(lhs, static_cast(rhs)); } #if defined(_M_AMD64) && !defined(__GNUC__) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128_t msvc_amd64_mul(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128 msvc_amd64_mul(const int128 lhs, const int128 rhs) noexcept { - int128_t result {}; + int128 result {}; result.low = _umul128(lhs.low, rhs.low, &result.high); result.high += lhs.low * rhs.high; result.high += lhs.high * rhs.low; @@ -3521,7 +3521,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128_t msvc_amd64_mul(const #endif -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const int128 rhs) noexcept { #if ((defined(__aarch64__) && defined(__APPLE__)) || defined(__x86_64__) || defined(__PPC__) || defined(__powerpc__)) && defined(__GNUC__) && !defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -3529,7 +3529,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu if (BOOST_INT128_IS_CONSTANT_EVALUATED(lhs)) { - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); } else { @@ -3543,7 +3543,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu std::memcpy(&new_rhs, &rhs, sizeof(detail::builtin_u128)); const auto res {new_lhs * new_rhs}; - int128_t library_res {}; + int128 library_res {}; std::memcpy(&library_res, &res, sizeof(detail::builtin_u128)); @@ -3555,23 +3555,23 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu # elif defined(BOOST_INT128_HAS_INT128) // Unsigned wrap for consistent two's-complement semantics - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; # else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); # endif #elif defined(__aarch64__) && defined(BOOST_INT128_HAS_INT128) - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #elif defined(_M_AMD64) && !defined(__GNUC__) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) if (BOOST_INT128_IS_CONSTANT_EVALUATED(rhs)) { - return low_word_mul(lhs, rhs); // LCOV_EXCL_LINE + return low_word_mul(lhs, rhs); // LCOV_EXCL_LINE } else { @@ -3581,31 +3581,31 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu #elif defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) // Multiply in the unsigned domain to avoid signed-overflow UB, then reinterpret the bits. - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #endif } } // namespace detail -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const int128 rhs) noexcept { return detail::default_mul(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const UnsignedInteger rhs) noexcept { using local_eval_type = detail::evaluation_type_t; return detail::default_mul(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const UnsignedInteger lhs, const int128 rhs) noexcept { using local_eval_type = detail::evaluation_type_t; return detail::default_mul(rhs, static_cast(lhs)); @@ -3617,14 +3617,14 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? -detail::default_mul(lhs, -static_cast(rhs)) : detail::default_mul(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const SignedInteger lhs, const int128 rhs) noexcept { return lhs < 0 ? -detail::default_mul(rhs, -static_cast(lhs)) : detail::default_mul(rhs, static_cast(lhs)); @@ -3636,26 +3636,26 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator*(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator*(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return detail::default_mul(lhs, static_cast(rhs)); + return detail::default_mul(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator*(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator*(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return detail::default_mul(rhs, static_cast(lhs)); + return detail::default_mul(rhs, static_cast(lhs)); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator*=(const Integer rhs) noexcept { - *this = static_cast(*this * rhs); + *this = static_cast(*this * rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator*=(const int128 rhs) noexcept { *this = *this * rhs; return *this; @@ -3664,9 +3664,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator*=(const Integer rhs) noexcept { - *this = static_cast(*this * rhs); + *this = static_cast(*this * rhs); return *this; } @@ -3681,7 +3681,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator*=(const Integer rhs # pragma clang diagnostic ignored "-Wassume" #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -3689,7 +3689,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const BOOST_INT128_UNREACHABLE; } - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto abs_lhs {abs(lhs)}; const auto abs_rhs {abs(rhs)}; @@ -3705,7 +3705,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const // computed above and beats native signed division (the out-of-line __divti3) for this case. if (abs_rhs.high == 0) { - int128_t quotient {}; + int128 quotient {}; if (abs_lhs.high == 0) { @@ -3721,7 +3721,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const #if defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) / static_cast(rhs)); + return static_cast(static_cast(lhs) / static_cast(rhs)); #else @@ -3732,7 +3732,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -3744,13 +3744,13 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const const auto abs_lhs {abs(lhs)}; - int128_t quotient {}; + int128 quotient {}; detail::one_word_div(abs_lhs, static_cast(rhs), quotient); return lhs < 0 ? -quotient : quotient; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const UnsignedInteger lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -3771,7 +3771,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, return {0, 0}; } const auto res {static_cast(lhs) / abs_rhs.low}; - const int128_t result {0, res}; + const int128 result {0, res}; return rhs < 0 ? -result : result; } } @@ -3782,7 +3782,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -3792,9 +3792,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - int128_t quotient {}; + int128 quotient {}; - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto negative_res {static_cast((lhs.signed_high() < 0) ^ (rhs < 0))}; // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) const auto abs_rhs {rhs < 0 ? -static_cast(rhs) : static_cast(rhs)}; @@ -3811,7 +3811,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const SignedInteger lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -3834,7 +3834,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, c } // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) const auto abs_lhs {lhs < 0 ? -static_cast(lhs) : static_cast(lhs)}; - const int128_t res {0, abs_lhs / abs_rhs.low}; + const int128 res {0, abs_lhs / abs_rhs.low}; return negative_res ? -res : res; } @@ -3847,39 +3847,39 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator/(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator/(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return static_cast(static_cast(lhs) / rhs); + return static_cast(static_cast(lhs) / rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator/(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator/(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs / static_cast(rhs)); + return static_cast(lhs / static_cast(rhs)); } #elif defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator/(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator/(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator/(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator/(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator/=(const Integer rhs) noexcept { - *this = static_cast(*this / rhs); + *this = static_cast(*this / rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator/=(const int128 rhs) noexcept { *this = *this / rhs; return *this; @@ -3888,9 +3888,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator/=(const Integer rhs) noexcept { - *this = static_cast(*this / rhs); + *this = static_cast(*this / rhs); return *this; } @@ -3907,21 +3907,21 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator/=(const Integer rhs //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(UnsignedInteger lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(UnsignedInteger lhs, int128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(SignedInteger lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(SignedInteger lhs, int128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, int128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -3931,8 +3931,8 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - int128_t quotient {}; - int128_t remainder {}; + int128 quotient {}; + int128 remainder {}; const auto abs_lhs {abs(lhs)}; @@ -3942,7 +3942,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const UnsignedInteger lhs, const int128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -3959,24 +3959,24 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const UnsignedInteger lhs, return lhs; } - const int128_t remainder {0, static_cast(lhs) % abs_rhs.low}; + const int128 remainder {0, static_cast(lhs) % abs_rhs.low}; return remainder; } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const SignedInteger rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const SignedInteger lhs, const int128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const int128 rhs) noexcept { if (rhs == 0) { @@ -3984,7 +3984,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto abs_lhs {abs(lhs)}; const auto abs_rhs {abs(rhs)}; @@ -3999,15 +3999,15 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const // magnitudes with the hardware-accelerated one_word_div and reapply the dividend's sign. if (abs_rhs.high == 0) { - int128_t remainder {}; + int128 remainder {}; if (abs_lhs.high == 0) { - remainder = int128_t{0, abs_lhs.low % abs_rhs.low}; + remainder = int128{0, abs_lhs.low % abs_rhs.low}; } else { - int128_t quotient {}; + int128 quotient {}; detail::one_word_div(abs_lhs, abs_rhs.low, quotient, remainder); } @@ -4016,11 +4016,11 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) % static_cast(rhs)); + return static_cast(static_cast(lhs) % static_cast(rhs)); #else - int128_t remainder {}; + int128 remainder {}; detail::knuth_div(abs_lhs, abs_rhs, remainder); return is_neg ? -remainder : remainder; @@ -4029,12 +4029,12 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator%(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator%(const int128 lhs, const detail::builtin_i128 rhs) noexcept { return static_cast(lhs) % rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator%(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator%(const detail::builtin_i128 lhs, const int128 rhs) noexcept { return lhs % static_cast(rhs); } @@ -4042,27 +4042,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 #elif defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator%(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator%(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator%(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator%(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator%=(const Integer rhs) noexcept { - *this = static_cast(*this % rhs); + *this = static_cast(*this % rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator%=(const int128 rhs) noexcept { *this = *this % rhs; return *this; @@ -4071,9 +4071,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator%=(const Integer rhs) noexcept { - *this = static_cast(*this % rhs); + *this = static_cast(*this % rhs); return *this; } @@ -4129,15 +4129,15 @@ class numeric_limits_impl_i128 static constexpr bool tinyness_before = false; // Member functions - BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::int128_t { return {INT64_MIN, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::int128_t { return {INT64_MIN, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::int128_t { return {INT64_MAX, UINT64_MAX}; } - BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::int128_t { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::int128 { return {INT64_MIN, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::int128 { return {INT64_MIN, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::int128 { return {INT64_MAX, UINT64_MAX}; } + BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::int128 { return {0, 0}; } }; #if !defined(__cpp_inline_variables) || __cpp_inline_variables < 201606L @@ -4199,7 +4199,7 @@ namespace std { #endif template <> -class numeric_limits : +class numeric_limits : public boost::int128::detail::numeric_limits_impl_i128 {}; #ifdef __clang__ @@ -4242,7 +4242,7 @@ BOOST_INT128_EXPORT struct #if (defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128)) && !defined(_M_IX86) alignas(alignof(detail::builtin_u128)) #endif -uint128_t +uint128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -4264,33 +4264,33 @@ uint128_t #endif // BOOST_INT128_ENDIAN_LITTLE_BYTE // Defaulted basic construction - constexpr uint128_t() noexcept = default; - constexpr uint128_t(const uint128_t&) noexcept = default; - constexpr uint128_t(uint128_t&&) noexcept = default; - constexpr uint128_t& operator=(const uint128_t&) noexcept = default; - constexpr uint128_t& operator=(uint128_t&&) noexcept = default; + constexpr uint128() noexcept = default; + constexpr uint128(const uint128&) noexcept = default; + constexpr uint128(uint128&&) noexcept = default; + constexpr uint128& operator=(const uint128&) noexcept = default; + constexpr uint128& operator=(uint128&&) noexcept = default; // Requires a conversion file to be implemented - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const int128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const int128& v) noexcept; // Construct from integral types #if BOOST_INT128_ENDIAN_LITTLE_BYTE - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const std::uint64_t hi, const std::uint64_t lo) noexcept : low {lo}, high {hi} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const std::uint64_t hi, const std::uint64_t lo) noexcept : low {lo}, high {hi} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? UINT64_MAX : UINT64_C(0)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? UINT64_MAX : UINT64_C(0)} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_i128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_i128 v) noexcept : low {static_cast(v)}, high {static_cast(static_cast(v) >> static_cast(64U))} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_u128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_u128 v) noexcept : low {static_cast(v)}, high {static_cast(v >> static_cast(64U))} {} @@ -4298,21 +4298,21 @@ uint128_t #else // Big endian - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const std::uint64_t hi, const std::uint64_t lo) noexcept : high {hi}, low {lo} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const std::uint64_t hi, const std::uint64_t lo) noexcept : high {hi}, low {lo} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const SignedInteger v) noexcept : high {v < 0 ? UINT64_MAX : UINT64_C(0)}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const SignedInteger v) noexcept : high {v < 0 ? UINT64_MAX : UINT64_C(0)}, low {static_cast(v)} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_i128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_i128 v) noexcept : high {static_cast(static_cast(v) >> 64U)}, low {static_cast(v)} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_u128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v)} {} @@ -4322,7 +4322,7 @@ uint128_t // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(Float f) noexcept; // Integer conversion operators BOOST_INT128_HOST_DEVICE explicit constexpr operator bool() const noexcept {return low || high; } @@ -4355,136 +4355,136 @@ uint128_t // Compound OR template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator|=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator|=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator|=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator|=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound AND template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator&=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator&=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator&=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator&=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound XOR template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator^=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator^=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator^=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator^=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Left Shift template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator<<=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator<<=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator<<=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator<<=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Right Shift template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator>>=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator>>=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator>>=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator>>=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator++() noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t operator++(int) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator--() noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t operator--(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator++() noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128 operator++(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator--() noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128 operator--(int) noexcept; // Compound Addition template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator+=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator+=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator+=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator+=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Subtraction template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator-=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator-=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator-=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator-=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Multiplication template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator*=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator*=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator*=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator*=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Division template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator/=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator/=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator/=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator/=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound modulo template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator%=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator%=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator%=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator%=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 }; @@ -4493,7 +4493,7 @@ uint128_t // Absolute Value function //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t abs(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 abs(const uint128 value) noexcept { return value; } @@ -4506,7 +4506,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t abs(const uint1 // runtime (__floatuntisf and friends) is correctly rounded. The portable fallback // composes the words as high * 2^64 + low; see detail/float_conversion.hpp -BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator float() const noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::operator float() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -4519,7 +4519,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator float() const noexcept #endif } -BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator double() const noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::operator double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -4534,7 +4534,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator double() const noexcept #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -constexpr uint128_t::operator long double() const noexcept +constexpr uint128::operator long double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) @@ -4557,7 +4557,7 @@ constexpr uint128_t::operator long double() const noexcept // NaN/negative -> 0 // overflow -> UINT128_MAX. template -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(Float f) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(Float f) noexcept { constexpr Float two_32 {static_cast(UINT64_C(1) << 32)}; constexpr Float two_64 {two_32 * two_32}; @@ -4588,12 +4588,12 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(Float f) noexcept // Unary Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 value) noexcept { return value; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 value) noexcept { return {~value.high + static_cast(value.low == UINT64_C(0)), ~value.low + UINT64_C(1)}; } @@ -4602,12 +4602,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const // Equality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const bool rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && rhs.low == static_cast(lhs); } @@ -4621,32 +4621,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const boo #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high && lhs.low == rhs_u.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high && lhs_u.low == rhs.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && rhs.low == static_cast(lhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_AMD64) @@ -4680,24 +4680,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -4706,43 +4706,43 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Inequality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const bool rhs) noexcept { return lhs.high != UINT64_C(0) || lhs.low != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const uint128 rhs) noexcept { return rhs.high != UINT64_C(0) || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high != rhs_u.high || lhs.low != rhs_u.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high != rhs.high || lhs_u.low != rhs.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high != UINT64_C(0) || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high != UINT64_C(0) || rhs.low != static_cast(lhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_AMD64) @@ -4777,25 +4777,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_BUILTIN_CONSTEXPR) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -4805,32 +4805,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low < rhs_u.low : lhs.high < rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low < rhs.low : lhs_u.high < rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low < static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high > UINT64_C(0) || static_cast(lhs) < rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const uint128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to unsigned __int128 uniformly better (and seemingly cost free) #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -4895,25 +4895,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -4923,32 +4923,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low <= rhs_u.low : lhs.high < rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low <= rhs.low : lhs_u.high < rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low <= static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high > UINT64_C(0) || static_cast(lhs) <= rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -5012,24 +5012,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } @@ -5040,32 +5040,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low > rhs_u.low : lhs.high > rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low > rhs.low : lhs_u.high > rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high > UINT64_C(0) || lhs.low > static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && static_cast(lhs) > rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -5129,24 +5129,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } @@ -5157,32 +5157,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low >= rhs_u.low : lhs.high > rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low >= rhs.low : lhs_u.high > rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high > UINT64_C(0) || lhs.low >= static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && static_cast(lhs) >= rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -5245,25 +5245,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } @@ -5275,7 +5275,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool #ifdef BOOST_INT128_HAS_SPACESHIP_OPERATOR -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -5292,7 +5292,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering oper } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const UnsignedInteger rhs) noexcept { if (lhs < rhs) { @@ -5309,7 +5309,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint12 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -5326,7 +5326,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Unsign } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -5343,7 +5343,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Signed } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const SignedInteger rhs) noexcept { if (lhs < rhs) { @@ -5365,7 +5365,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint12 // Not Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator~(const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator~(const uint128 rhs) noexcept { return {~rhs.high, ~rhs.low}; } @@ -5375,30 +5375,30 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator~(const //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high | (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low | static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high | (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low | static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {lhs.high, lhs.low | static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high, rhs.low | static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high | rhs.high, lhs.low | rhs.low}; } @@ -5406,36 +5406,36 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator|=(const Integer rhs) noexcept { *this = *this | rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator|=(const uint128 rhs) noexcept { *this = *this | rhs; return *this; @@ -5444,7 +5444,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator|=(const Integer rhs) noexcept { *this = *this | rhs; return *this; @@ -5457,30 +5457,30 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator|=(const Integer r //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high & (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low & static_cast(rhs)}; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high & (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low & static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {UINT64_C(0), lhs.low & static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {UINT64_C(0), rhs.low & static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high & rhs.high, lhs.low & rhs.low}; } @@ -5488,37 +5488,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator&=(const Integer rhs) noexcept { *this = *this & rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator&=(const uint128 rhs) noexcept { *this = *this & rhs; return *this; @@ -5527,7 +5527,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator&=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator&=(Integer rhs) noexcept { *this = *this & rhs; return *this; @@ -5541,30 +5541,30 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator&=(Integer rhs) no //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high ^ (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low ^ static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high ^ (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low ^ static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {lhs.high, lhs.low ^ static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high, rhs.low ^ static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high ^ rhs.high, lhs.low ^ rhs.low}; } @@ -5572,37 +5572,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator^=(const Integer rhs) noexcept { *this = *this ^ rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator^=(const uint128 rhs) noexcept { *this = *this ^ rhs; return *this; @@ -5611,7 +5611,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator^=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator^=(Integer rhs) noexcept { *this = *this ^ rhs; return *this; @@ -5626,7 +5626,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator^=(Integer rhs) no namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr uint128_t default_ls_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 default_ls_impl(const uint128 lhs, const Integer rhs) noexcept { static_assert(std::is_integral::value, "Needs to be a builtin type"); @@ -5655,7 +5655,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t default_ls_impl(const uint128_t lhs } template -BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const T rhs) noexcept +BOOST_INT128_HOST_DEVICE uint128 intrinsic_ls_impl(const uint128 lhs, const T rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -5673,8 +5673,8 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value << rhs}; - uint128_t return_value; - std::memcpy(&return_value, &res, sizeof(uint128_t)); + uint128 return_value; + std::memcpy(&return_value, &res, sizeof(uint128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -5715,7 +5715,7 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -5737,7 +5737,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, con // A number of different overloads to ensure that we return the same type as the builtins would -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const uint128 rhs) noexcept { // Out-of-range counts (>= 128 or with the high word set) are undefined, // matching the built-in operators; forward the count to the scalar overload. @@ -5746,13 +5746,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); @@ -5761,27 +5761,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator<<=(const Integer rhs) noexcept { *this = *this << rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator<<=(const uint128 rhs) noexcept { *this = *this << rhs; return *this; @@ -5790,7 +5790,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const uint1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator<<=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator<<=(Integer rhs) noexcept { *this = *this << rhs; return *this; @@ -5805,7 +5805,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator<<=(Integer rhs) n namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr uint128_t default_rs_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 default_rs_impl(const uint128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators. In a @@ -5832,7 +5832,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t default_rs_impl(const uint128_t lhs } template -BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE uint128 intrinsic_rs_impl(const uint128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -5850,8 +5850,8 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value >> rhs}; - uint128_t return_value; - std::memcpy(&return_value, &res, sizeof(uint128_t)); + uint128 return_value; + std::memcpy(&return_value, &res, sizeof(uint128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -5889,7 +5889,7 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const } // namespace detail BOOST_INT128_EXPORT template ::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -5909,7 +5909,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, con #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const uint128 rhs) noexcept { // Out-of-range counts (>= 128 or with the high word set) are undefined, // matching the built-in operators; forward the count to the scalar overload. @@ -5918,13 +5918,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); @@ -5933,27 +5933,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(UnsignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator>>=(const Integer rhs) noexcept { *this = *this >> rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator>>=(const uint128 rhs) noexcept { *this = *this >> rhs; return *this; @@ -5962,7 +5962,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const uint1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator>>=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator>>=(Integer rhs) noexcept { *this = *this >> rhs; return *this; @@ -5974,7 +5974,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator>>=(Integer rhs) n // Increment Operator //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator++() noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator++() noexcept { if (++low == UINT64_C(0)) { @@ -5984,7 +5984,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator++() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator++(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 uint128::operator++(int) noexcept { const auto temp {*this}; ++(*this); @@ -5995,7 +5995,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator++(int) noexcept // Decrement Operator //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator--() noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator--() noexcept { if (--low == UINT64_MAX) { @@ -6005,7 +6005,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator--() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator--(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 uint128::operator--(int) noexcept { const auto temp {*this}; --(*this); @@ -6018,22 +6018,22 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator--(int) noexcept namespace impl { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_add(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_add(const uint128 lhs, const uint128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high + rhs.high + __builtin_add_overflow(lhs.low, rhs.low, &res.low); return res; #elif (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_MSC_VER) && defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) + static_cast(rhs)); + return static_cast(static_cast(lhs) + static_cast(rhs)); #else - uint128_t temp {lhs.high + rhs.high, lhs.low + rhs.low}; + uint128 temp {lhs.high + rhs.high, lhs.low + rhs.low}; if (temp.low < lhs.low) { @@ -6045,18 +6045,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_a #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_add(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_add(const uint128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high + __builtin_add_overflow(lhs.low, rhs, &res.low); return res; #else - uint128_t temp {lhs.high, lhs.low + rhs}; + uint128 temp {lhs.high, lhs.low + rhs}; if (temp.low < lhs.low) { @@ -6068,22 +6068,22 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_a #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_sub(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_sub(const uint128 lhs, const uint128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (defined(__i386__) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high - rhs.high - __builtin_sub_overflow(lhs.low, rhs.low, &res.low); return res; #elif (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_MSC_VER) && defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) - static_cast(rhs)); + return static_cast(static_cast(lhs) - static_cast(rhs)); #else - uint128_t temp {lhs.high - rhs.high, lhs.low - rhs.low}; + uint128 temp {lhs.high - rhs.high, lhs.low - rhs.low}; // Check for carry if (lhs.low < rhs.low) @@ -6096,18 +6096,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_s #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_sub(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_sub(const uint128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high - __builtin_sub_overflow(lhs.low, rhs, &res.low); return res; #else - uint128_t temp {lhs.high, lhs.low - rhs}; + uint128 temp {lhs.high, lhs.low - rhs}; // Check for carry if (lhs.low < rhs) @@ -6128,14 +6128,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_s #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? impl::default_sub(lhs, -static_cast(rhs)) : impl::default_add(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const SignedInteger lhs, const uint128 rhs) noexcept { return lhs < 0 ? impl::default_sub(rhs, -static_cast(lhs)) : impl::default_add(rhs, static_cast(lhs)); @@ -6146,18 +6146,18 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const SignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const UnsignedInteger rhs) noexcept { return impl::default_add(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const UnsignedInteger lhs, const uint128 rhs) noexcept { return impl::default_add(rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const uint128 rhs) noexcept { return impl::default_add(lhs, rhs); } @@ -6165,37 +6165,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return impl::default_add(lhs, static_cast(rhs)); + return impl::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return impl::default_add(static_cast(lhs), rhs); + return impl::default_add(static_cast(lhs), rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return impl::default_add(lhs, static_cast(rhs)); + return impl::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return impl::default_add(static_cast(lhs), rhs); + return impl::default_add(static_cast(lhs), rhs); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator+=(const Integer rhs) noexcept { *this = *this + rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator+=(const uint128 rhs) noexcept { *this = *this + rhs; return *this; @@ -6204,7 +6204,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator+=(const Integer rhs) noexcept { *this = *this + rhs; return *this; @@ -6223,14 +6223,14 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator+=(const Integer r #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? impl::default_add(lhs, -static_cast(rhs)) : impl::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const SignedInteger lhs, const uint128 rhs) noexcept { return lhs < 0 ? impl::default_sub(-rhs, -static_cast(lhs)) : impl::default_add(-rhs, static_cast(lhs)); @@ -6241,18 +6241,18 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const SignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const UnsignedInteger rhs) noexcept { return impl::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const UnsignedInteger lhs, const uint128 rhs) noexcept { return impl::default_add(-rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const uint128 rhs) noexcept { return impl::default_sub(lhs, rhs); } @@ -6260,37 +6260,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator-=(const Integer rhs) noexcept { *this = *this - rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator-=(const uint128 rhs) noexcept { *this = *this - rhs; return *this; @@ -6299,7 +6299,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator-=(const Integer rhs) noexcept { *this = *this - rhs; return *this; @@ -6320,9 +6320,9 @@ namespace detail { #if defined(_M_AMD64) && !defined(__GNUC__) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const uint128 rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, rhs.low, &result.high); result.high += lhs.low * rhs.high; result.high += lhs.high * rhs.low; @@ -6330,18 +6330,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return result; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint64_t rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, rhs, &result.high); result.high += lhs.high * rhs; return result; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint32_t rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, static_cast(rhs), &result.high); result.high += lhs.high * static_cast(rhs); @@ -6350,7 +6350,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint #elif defined(_M_ARM64) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const uint128 rhs) noexcept { const auto low_low{lhs.low * rhs.low}; const auto high_low_low{__umulh(lhs.low, rhs.low)}; @@ -6363,7 +6363,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return {high, low_low}; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint64_t rhs) noexcept { const auto low{lhs.low * rhs}; const auto high{__umulh(lhs.low, rhs) + (lhs.high * rhs)}; @@ -6371,7 +6371,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return {high, low}; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint32_t rhs) noexcept { const auto low{lhs.low * rhs}; const auto high{__umulh(lhs.low, static_cast(rhs)) + (lhs.high * rhs)}; @@ -6382,7 +6382,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint #endif // MSVC implementations template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_mul(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_mul(const uint128 lhs, const UnsignedInteger rhs) noexcept { #if (defined(__aarch64__) || defined(__x86_64__) || defined(__PPC__) || defined(__powerpc__)) && defined(__GNUC__) && defined(BOOST_INT128_HAS_INT128) @@ -6393,14 +6393,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m detail::builtin_u128 new_lhs {}; detail::builtin_u128 new_rhs {}; - std::memcpy(&new_lhs, &lhs, sizeof(uint128_t)); + std::memcpy(&new_lhs, &lhs, sizeof(uint128)); std::memcpy(&new_rhs, &rhs, sizeof(UnsignedInteger)); const auto res {new_lhs * new_rhs}; - uint128_t library_res {}; + uint128 library_res {}; - std::memcpy(&library_res, &res, sizeof(uint128_t)); + std::memcpy(&library_res, &res, sizeof(uint128)); return library_res; } @@ -6408,7 +6408,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m # elif defined(BOOST_INT128_HAS_INT128) # define BOOST_INT128_HIDE_MUL - return static_cast(static_cast(lhs) * static_cast(rhs)); + return static_cast(static_cast(lhs) * static_cast(rhs)); # endif @@ -6425,14 +6425,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m #elif defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) # define BOOST_INT128_HIDE_MUL - return static_cast(static_cast(lhs) * static_cast(rhs)); + return static_cast(static_cast(lhs) * static_cast(rhs)); #endif // We need to hide this if we use a non-const eval method above to avoid a litany of cross-platform warnings #ifndef BOOST_INT128_HIDE_MUL - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #else #undef BOOST_INT128_HIDE_MUL @@ -6451,7 +6451,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6462,7 +6462,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, cons } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6473,7 +6473,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const SignedInteger lhs, } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_mul(lhs, static_cast(rhs)); } @@ -6483,12 +6483,12 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, cons #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const UnsignedInteger lhs, const uint128 rhs) noexcept { return detail::default_mul(rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const uint128 rhs) noexcept { return detail::default_mul(lhs, rhs); } @@ -6496,49 +6496,49 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { const detail::builtin_u128 rhs_bits {static_cast(rhs)}; const bool rhs_negative {static_cast(static_cast(rhs_bits >> static_cast(64U))) < 0}; - const uint128_t rhs_u {rhs_bits}; - const uint128_t abs_rhs {rhs_negative ? -rhs_u : rhs_u}; - const uint128_t res {lhs * abs_rhs}; + const uint128 rhs_u {rhs_bits}; + const uint128 abs_rhs {rhs_negative ? -rhs_u : rhs_u}; + const uint128 res {lhs * abs_rhs}; return rhs_negative ? -res : res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { const detail::builtin_u128 lhs_bits {static_cast(lhs)}; const bool lhs_negative {static_cast(static_cast(lhs_bits >> static_cast(64U))) < 0}; - const uint128_t lhs_u {lhs_bits}; - const uint128_t abs_lhs {lhs_negative ? -lhs_u : lhs_u}; - const uint128_t res {abs_lhs * rhs}; + const uint128 lhs_u {lhs_bits}; + const uint128 abs_lhs {lhs_negative ? -lhs_u : lhs_u}; + const uint128 res {abs_lhs * rhs}; return lhs_negative ? -res : res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs * static_cast(rhs); + return lhs * static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) * rhs; + return static_cast(lhs) * rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator*=(const Integer rhs) noexcept { *this = *this * rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator*=(const uint128 rhs) noexcept { *this = *this * rhs; return *this; @@ -6547,7 +6547,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator*=(const Integer rhs) noexcept { *this = *this * rhs; return *this; @@ -6561,35 +6561,35 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator*=(const Integer r // For div we need forward declarations since we mix and match the arguments BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(SignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(SignedInteger lhs, uint128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(UnsignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(UnsignedInteger lhs, uint128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, uint128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; - return rhs < 0 ? lhs / static_cast(rhs) : lhs / static_cast(rhs); + return rhs < 0 ? lhs / static_cast(rhs) : lhs / static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; - return lhs < 0 ? static_cast(lhs) / rhs : static_cast(lhs) / rhs; + return lhs < 0 ? static_cast(lhs) / rhs : static_cast(lhs) / rhs; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6604,7 +6604,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons return {0, 0}; } - uint128_t quotient {}; + uint128 quotient {}; detail::one_word_div(lhs, static_cast(rhs), quotient); @@ -6612,7 +6612,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const UnsignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6630,7 +6630,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const UnsignedInteger lhs return {0, static_cast(lhs) / rhs.low}; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const uint128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0U)) { @@ -6653,14 +6653,14 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons return {0, lhs.low / rhs.low}; } - uint128_t quotient {}; + uint128 quotient {}; detail::one_word_div(lhs, rhs.low, quotient); return quotient; } #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return static_cast(static_cast(lhs) / static_cast(rhs)); + return static_cast(static_cast(lhs) / static_cast(rhs)); #else @@ -6671,38 +6671,38 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator/=(const Integer rhs) noexcept { *this = *this / rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator/=(const uint128 rhs) noexcept { *this = *this / rhs; return *this; @@ -6711,7 +6711,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator/=(const Integer rhs) noexcept { *this = *this / rhs; return *this; @@ -6725,35 +6725,35 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator/=(const Integer r // For div we need forward declarations since we mix and match the arguments BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(SignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(SignedInteger lhs, uint128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(UnsignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(UnsignedInteger lhs, uint128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, uint128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; - return rhs < 0 ? lhs % static_cast(rhs) : lhs % static_cast(rhs); + return rhs < 0 ? lhs % static_cast(rhs) : lhs % static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; - return lhs < 0 ? static_cast(lhs) % rhs : static_cast(lhs) % rhs; + return lhs < 0 ? static_cast(lhs) % rhs : static_cast(lhs) % rhs; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6765,8 +6765,8 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons if (lhs.high != 0) { - uint128_t quotient {}; - uint128_t remainder {}; + uint128 quotient {}; + uint128 remainder {}; detail::one_word_div(lhs, static_cast(rhs), quotient, remainder); @@ -6779,7 +6779,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const UnsignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -6796,7 +6796,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const UnsignedInteger lhs return {0, static_cast(lhs) % rhs.low}; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const uint128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0U)) { @@ -6817,19 +6817,19 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons return {0, lhs.low % rhs.low}; } - uint128_t quotient {}; - uint128_t remainder {}; + uint128 quotient {}; + uint128 remainder {}; detail::one_word_div(lhs, rhs.low, quotient, remainder); return remainder; } #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return static_cast(static_cast(lhs) % static_cast(rhs)); + return static_cast(static_cast(lhs) % static_cast(rhs)); #else - uint128_t remainder {}; + uint128 remainder {}; detail::knuth_div(lhs, rhs, remainder); return remainder; @@ -6838,38 +6838,38 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator%=(const Integer rhs) noexcept { *this = *this % rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator%=(const uint128 rhs) noexcept { *this = *this % rhs; return *this; @@ -6878,7 +6878,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator%=(const Integer rhs) noexcept { * this = *this % rhs; return *this; @@ -6936,15 +6936,15 @@ class numeric_limits_impl_u128 static constexpr bool tinyness_before = false; // Member functions - BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::uint128_t { return {UINT64_MAX, UINT64_MAX}; } - BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::uint128_t { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::uint128 { return {UINT64_MAX, UINT64_MAX}; } + BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::uint128 { return {0, 0}; } }; #if !defined(__cpp_inline_variables) || __cpp_inline_variables < 201606L @@ -7007,7 +7007,7 @@ namespace std { #endif template <> -class numeric_limits : +class numeric_limits : public boost::int128::detail::numeric_limits_impl_u128 {}; #ifdef __clang__ @@ -7037,7 +7037,7 @@ namespace detail { template struct valid_overload { - static constexpr bool value = std::is_same::value || std::is_same::value; + static constexpr bool value = std::is_same::value || std::is_same::value; }; template @@ -7047,15 +7047,15 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_valid_overload_v = valid_overload::valu #if BOOST_INT128_ENDIAN_LITTLE_BYTE -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(const uint128_t& v) noexcept : low {v.low}, high {v.high} {} +BOOST_INT128_HOST_DEVICE constexpr int128::int128(const uint128& v) noexcept : low {v.low}, high {v.high} {} -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexcept : low {v.low}, high {v.high} {} +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(const int128& v) noexcept : low {v.low}, high {v.high} {} #else -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(const uint128_t& v) noexcept : high {v.high}, low {v.low} {} +BOOST_INT128_HOST_DEVICE constexpr int128::int128(const uint128& v) noexcept : high {v.high}, low {v.low} {} -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexcept : high {v.high}, low {v.low} {} +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(const int128& v) noexcept : high {v.high}, low {v.low} {} #endif // BOOST_INT128_ENDIAN_LITTLE_BYTE @@ -7071,37 +7071,37 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexc template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator==(const T lhs, const U rhs) noexcept { - return static_cast(lhs) == static_cast(rhs); + return static_cast(lhs) == static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) != static_cast(rhs); + return static_cast(lhs) != static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator<(const T lhs, const U rhs) noexcept { - return static_cast(lhs) < static_cast(rhs); + return static_cast(lhs) < static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) <= static_cast(rhs); + return static_cast(lhs) <= static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator>(const T lhs, const U rhs) noexcept { - return static_cast(lhs) > static_cast(rhs); + return static_cast(lhs) > static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) >= static_cast(rhs); + return static_cast(lhs) >= static_cast(rhs); } //===================================== @@ -7109,33 +7109,33 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const T lhs, const U rhs) noe //===================================== template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const T lhs, const U rhs) noexcept { - return static_cast(lhs) + static_cast(rhs); + return static_cast(lhs) + static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const T lhs, const U rhs) noexcept { - return static_cast(lhs) - static_cast(rhs); + return static_cast(lhs) - static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const T lhs, const U rhs) noexcept { - return static_cast(lhs) * static_cast(rhs); + return static_cast(lhs) * static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const T lhs, const U rhs) noexcept { - return static_cast(lhs) / static_cast(rhs); + return static_cast(lhs) / static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const T lhs, const U rhs) noexcept { - return static_cast(lhs) % static_cast(rhs); + return static_cast(lhs) % static_cast(rhs); } //===================================== @@ -7143,49 +7143,49 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const T lhs, const U rhs) //===================================== template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const T lhs, const U rhs) noexcept { - return static_cast(lhs) | static_cast(rhs); + return static_cast(lhs) | static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const T lhs, const U rhs) noexcept { - return static_cast(lhs) & static_cast(rhs); + return static_cast(lhs) & static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const T lhs, const U rhs) noexcept { - return static_cast(lhs) ^ static_cast(rhs); + return static_cast(lhs) ^ static_cast(rhs); } //===================================== // Cross-type Shift Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const uint128 rhs) noexcept { - return lhs << static_cast(rhs); + return lhs << static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const int128 rhs) noexcept { - return lhs << static_cast(rhs); + return lhs << static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const uint128 rhs) noexcept { - return lhs >> static_cast(rhs); + return lhs >> static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const int128 rhs) noexcept { - return lhs >> static_cast(rhs); + return lhs >> static_cast(rhs); } //===================================== -// int128_t with builtin unsigned __int128 comparison operators +// int128 with builtin unsigned __int128 comparison operators // // These live here (not in int128_imp.hpp) // to avoid C++20 rewritten-candidate ambiguity on MSVC @@ -7193,152 +7193,152 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, con #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } #endif // BOOST_INT128_HAS_INT128 //===================================== -// int128_t with builtin unsigned __int128 binary operators +// int128 with builtin unsigned __int128 binary operators //===================================== #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) + rhs; + return static_cast(lhs) + rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs + static_cast(rhs); + return lhs + static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) * rhs; + return static_cast(lhs) * rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs * static_cast(rhs); + return lhs * static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } #endif // BOOST_INT128_HAS_INT128 @@ -7534,14 +7534,14 @@ namespace int128 { namespace impl { -BOOST_INT128_HOST_DEVICE constexpr int countl_zero_impl(const uint128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr int countl_zero_impl(const uint128 x) noexcept { return x.high == 0 ? 64 + detail::countl_zero(x.low) : detail::countl_zero(x.high); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_clzg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -7560,38 +7560,38 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uin #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_one(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_one(const uint128 x) noexcept { return countl_zero(~x); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int bit_width(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int bit_width(const uint128 x) noexcept { return x ? 128 - countl_zero(x) : 0; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_ceil(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 bit_ceil(const uint128 x) noexcept { // __builtin_stdc_bit_ceil not available, but this is equivalent - return x <= 1U ? static_cast(1) : static_cast(2) << (127 - countl_zero(x - 1)); + return x <= 1U ? static_cast(1) : static_cast(2) << (127 - countl_zero(x - 1)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_floor(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 bit_floor(const uint128 x) noexcept { // __builtin_stdc_bit_floor not available, but this is equivalent - return x == 0U ? static_cast(0) : static_cast(1) << (127 - countl_zero(x)); + return x == 0U ? static_cast(0) : static_cast(1) << (127 - countl_zero(x)); } namespace impl { -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero_impl(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero_impl(const uint128 x) noexcept { return x.low == 0 ? 64 + detail::countr_zero(x.high) : detail::countr_zero(x.low); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_ctzg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -7610,19 +7610,19 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uin #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_one(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_one(const uint128 x) noexcept { return countr_zero(~x); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotl(const uint128_t x, const int s) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rotl(const uint128 x, const int s) noexcept { // __builtin_stdc_rotate_left not available constexpr auto mask {127U}; return x << (static_cast(s) & mask) | x >> (static_cast(-s) & mask); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotr(const uint128_t x, const int s) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rotr(const uint128 x, const int s) noexcept { // __builtin_stdc_rotate_right not available constexpr auto mask {127U}; @@ -7631,7 +7631,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotr(const uint namespace impl { -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(std::uint64_t x) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(std::uint64_t x) noexcept { x = x - ((x >> 1U) & UINT64_C(0x5555555555555555)); x = (x & UINT64_C(0x3333333333333333)) + ((x >> 2U) & UINT64_C(0x3333333333333333)); @@ -7641,14 +7641,14 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(st } // The exact-match overload above is selected for the 64-bit halves -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(const uint128_t x) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(const uint128 x) noexcept { return popcount_impl(x.high) + popcount_impl(x.low); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_popcountg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -7725,14 +7725,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t byteswap_im return (step16 & UINT64_C(0x00FF00FF00FF00FF)) << 8U | (step16 & UINT64_C(0xFF00FF00FF00FF00)) >> 8U; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap_impl(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 byteswap_impl(const uint128 x) noexcept { return {byteswap_impl(x.low), byteswap_impl(x.high)}; } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 byteswap(const uint128 x) noexcept { // The whole-width builtins are deliberately ranked below the paired 64-bit form. // Measured today (7/29/2026) they are a regression: the 128-bit value blocks the loop vectorization @@ -7751,7 +7751,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const return impl::byteswap_impl(x); } - return static_cast(__builtin_bswapg(static_cast(x))); + return static_cast(__builtin_bswapg(static_cast(x))); #elif defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_bswap128) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -7760,7 +7760,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const return impl::byteswap_impl(x); } - return static_cast(__builtin_bswap128(static_cast(x))); + return static_cast(__builtin_bswap128(static_cast(x))); #elif defined(_MSC_VER) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -7780,7 +7780,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(const uint128 x) noexcept { return popcount(x) == 1; } @@ -8049,26 +8049,26 @@ BOOST_INT128_HOST_DEVICE constexpr int from_chars_integer_impl(const char* first } } // namespace impl -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, uint128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, uint128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, int128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, int128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } // Parsing entry points for the user-defined literals. Unlike from_chars these skip the // C++ digit separator ' so that literals such as 1'234'567_u128 are accepted. -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, uint128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, uint128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, int128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, int128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } // Rejects an out of range literal @@ -8077,7 +8077,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_liter #if defined(BOOST_INT128_HAS_GPU_SUPPORT) || defined(BOOST_INT128_DISABLE_EXCEPTIONS) BOOST_INT128_UNREACHABLE; #else - BOOST_INT128_THROW_EXCEPTION(std::out_of_range("Literal is out of range of the target type")); + BOOST_int128HROW_EXCEPTION(std::out_of_range("Literal is out of range of the target type")); #endif } @@ -8087,7 +8087,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_liter #if defined(BOOST_INT128_HAS_GPU_SUPPORT) || defined(BOOST_INT128_DISABLE_EXCEPTIONS) BOOST_INT128_UNREACHABLE; #else - BOOST_INT128_THROW_EXCEPTION(std::invalid_argument("Literal is not a valid integer")); + BOOST_int128HROW_EXCEPTION(std::invalid_argument("Literal is not a valid integer")); #endif } @@ -8229,7 +8229,7 @@ static_assert(sizeof(upper_case_digit_table) == sizeof(char) * 16, "10 numbers, #endif // !__NVCC__ -BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], uint128_t v, const int base, const bool uppercase) noexcept +BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], uint128 v, const int base, const bool uppercase) noexcept { #if defined(BOOST_INT128_HAS_GPU_SUPPORT) constexpr char lower_case_digit_table[] = { @@ -8296,28 +8296,28 @@ BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_ch return last; } -BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], const int128_t v, const int base, const bool uppercase) noexcept +BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], const int128 v, const int base, const bool uppercase) noexcept { char* p {nullptr}; if (v < 0) { // We cant negate the min value inside the signed type, but we know what the result will be - if (v == (std::numeric_limits::min)()) + if (v == (std::numeric_limits::min)()) { - p = mini_to_chars(buffer, uint128_t{UINT64_C(0x8000000000000000), 0}, base, uppercase); + p = mini_to_chars(buffer, uint128{UINT64_C(0x8000000000000000), 0}, base, uppercase); } else { const auto neg_v {-v}; - p = mini_to_chars(buffer, static_cast(neg_v), base, uppercase); + p = mini_to_chars(buffer, static_cast(neg_v), base, uppercase); } *--p = '-'; } else { - p = mini_to_chars(buffer, static_cast(v), base, uppercase); + p = mini_to_chars(buffer, static_cast(v), base, uppercase); } return p; @@ -8387,7 +8387,7 @@ namespace detail { template struct streamable_overload { - static constexpr bool value = std::is_same::value || std::is_same::value; + static constexpr bool value = std::is_same::value || std::is_same::value; }; template @@ -8539,44 +8539,44 @@ namespace boost { namespace int128 { namespace literals { -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } } // namespace literals @@ -8629,17 +8629,17 @@ namespace int128 { BOOST_INT128_EXPORT struct u128div_t { - uint128_t quot; - uint128_t rem; + uint128 quot; + uint128 rem; }; BOOST_INT128_EXPORT struct i128div_t { - int128_t quot; - int128_t rem; + int128 quot; + int128 rem; }; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint128 x, const uint128 y) noexcept { if (BOOST_INT128_UNLIKELY(x == 0U || y == 0U)) { @@ -8671,15 +8671,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint1 } } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int128 x, const int128 y) noexcept { if (BOOST_INT128_UNLIKELY(x == 0 || y == 0)) { return i128div_t{0, 0}; } - const auto abs_lhs {static_cast(abs(x))}; - const auto abs_rhs {static_cast(abs(y))}; + const auto abs_lhs {static_cast(abs(x))}; + const auto abs_rhs {static_cast(abs(y))}; if (abs_rhs > abs_lhs) { @@ -8695,15 +8695,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int12 { const auto builtin_x {static_cast(x)}; const auto builtin_y {static_cast(y)}; - return i128div_t{static_cast(builtin_x / builtin_y), - static_cast(builtin_x % builtin_y)}; + return i128div_t{static_cast(builtin_x / builtin_y), + static_cast(builtin_x % builtin_y)}; } #endif const auto unsigned_res {div(abs_lhs, abs_rhs)}; - i128div_t res {static_cast(unsigned_res.quot), static_cast(unsigned_res.rem)}; + i128div_t res {static_cast(unsigned_res.quot), static_cast(unsigned_res.rem)}; res.quot = negative_quot ? -res.quot : res.quot; res.rem = negative_rem ? -res.rem : res.rem; @@ -8743,8 +8743,8 @@ struct reduced_integers std::is_same::value || std::is_same::value || std::is_same::value || - std::is_same::value || - std::is_same::value}; + std::is_same::value || + std::is_same::value}; }; #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) @@ -8763,25 +8763,25 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_reduced_integer_v {reduced_integers::max)(); + return (std::numeric_limits::max)(); } return z; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_sub(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_sub(const uint128 x, const uint128 y) noexcept { const auto z {x - y}; if (z > x) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } return z; @@ -8793,7 +8793,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_sub( # pragma warning(disable : 4146) // Unary minus applied to unsigned type #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_add(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_add(const int128 x, const int128 y) noexcept { // Detect overflow BEFORE the addition to avoid signed overflow UB. // When both are non-negative: overflow iff x > max - y (subtraction safe: max - non_negative >= 0) @@ -8802,23 +8802,23 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_add(c if (x.signed_high() >= 0 && y.signed_high() >= 0) { - if (x > (std::numeric_limits::max)() - y) + if (x > (std::numeric_limits::max)() - y) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } else if (x.signed_high() < 0 && y.signed_high() < 0) { - if (x < (std::numeric_limits::min)() - y) + if (x < (std::numeric_limits::min)() - y) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } } return x + y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_sub(const int128 x, const int128 y) noexcept { // Detect overflow BEFORE the subtraction to avoid signed overflow UB. // Positive overflow: x >= 0 and y < 0 and x > max + y (safe: max + negative < max) @@ -8827,16 +8827,16 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(c if (x.signed_high() >= 0 && y.signed_high() < 0) { - if (x > (std::numeric_limits::max)() + y) + if (x > (std::numeric_limits::max)() + y) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } else if (x.signed_high() < 0 && y.signed_high() >= 0) { - if (x < (std::numeric_limits::min)() + y) + if (x < (std::numeric_limits::min)() + y) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } } @@ -8847,51 +8847,51 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(c # pragma warning(pop) #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_mul(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_mul(const uint128 x, const uint128 y) noexcept { const auto x_bits {bit_width(x)}; const auto y_bits {bit_width(y)}; - if ((x_bits + y_bits) > std::numeric_limits::digits) + if ((x_bits + y_bits) > std::numeric_limits::digits) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } return x * y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_mul(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_mul(const int128 x, const int128 y) noexcept { - const auto x_bits {bit_width(static_cast(abs(x)))}; - const auto y_bits {bit_width(static_cast(abs(y)))}; + const auto x_bits {bit_width(static_cast(abs(x)))}; + const auto y_bits {bit_width(static_cast(abs(y)))}; - if ((x_bits + y_bits) > std::numeric_limits::digits) + if ((x_bits + y_bits) > std::numeric_limits::digits) { if ((x < 0) != (y < 0)) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } else { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } - const int128_t res {x * y}; + const int128 res {x * y}; return res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_div(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_div(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_div(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_div(const int128 x, const int128 y) noexcept { - if (BOOST_INT128_UNLIKELY(x == (std::numeric_limits::min)() && y == -1)) + if (BOOST_INT128_UNLIKELY(x == (std::numeric_limits::min)() && y == -1)) { // This is the only possible case of overflow - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } return x / y; @@ -8903,15 +8903,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_div(c #endif BOOST_INT128_EXPORT template , bool> = true> -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128_t value) noexcept +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128 value) noexcept { - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { return static_cast(value); } else { - if (value > static_cast((std::numeric_limits::max)())) + if (value > static_cast((std::numeric_limits::max)())) { return (std::numeric_limits::max)(); } @@ -8925,16 +8925,16 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128_t va #endif BOOST_INT128_EXPORT template , bool> = true> -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t value) noexcept +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128 value) noexcept { - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { return static_cast(value); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - else BOOST_INT128_IF_CONSTEXPR (std::is_same::value || std::is_same::value) + else BOOST_INT128_IF_CONSTEXPR (std::is_same::value || std::is_same::value) #else - else BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + else BOOST_INT128_IF_CONSTEXPR (std::is_same::value) #endif { // We can't possibly have overflow in this case @@ -8942,11 +8942,11 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t val } else { - if (value > static_cast((std::numeric_limits::max)())) + if (value > static_cast((std::numeric_limits::max)())) { return (std::numeric_limits::max)(); } - else if (value < static_cast((std::numeric_limits::min)())) + else if (value < static_cast((std::numeric_limits::min)())) { return (std::numeric_limits::min)(); } @@ -8957,7 +8957,7 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t val namespace detail { -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64(std::uint64_t x, std::uint64_t y) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64(std::uint64_t x, std::uint64_t y) noexcept { if (x == 0) { @@ -8989,7 +8989,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64( } // namespace detail -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a, uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 gcd(uint128 a, uint128 b) noexcept { // Base case if (a == 0U) @@ -9013,7 +9013,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a if (a > b) { - const uint128_t temp {a}; + const uint128 temp {a}; a = b; b = temp; } @@ -9023,12 +9023,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a // Stop doing 128-bit math as soon as we can const auto g {detail::gcd64(a.low, b.low)}; - return uint128_t{0, g} << shift; + return uint128{0, g} << shift; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t gcd(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 gcd(const int128 a, const int128 b) noexcept { - return static_cast(gcd(static_cast(abs(a)), static_cast(abs(b)))); + return static_cast(gcd(static_cast(abs(a)), static_cast(abs(b)))); } // For unknown reasons this implementation fails for MSVC x86 only in release mode @@ -9036,11 +9036,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t gcd(const int128 // but very slow impl that we know works. #if !(defined(_M_IX86) && !defined(_NDEBUG)) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(const uint128_t a, const uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 lcm(const uint128 a, const uint128 b) noexcept { if (a == 0U || b == 0U) { - return static_cast(0); + return static_cast(0); } // Calculate GCD first @@ -9052,11 +9052,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(const uint1 #else -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a, uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 lcm(uint128 a, uint128 b) noexcept { if (a == 0U || b == 0U) { - return uint128_t{0}; + return uint128{0}; } @@ -9074,7 +9074,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a std::swap(a, b); } - uint128_t lcm{a}; + uint128 lcm{a}; while (lcm % b != 0U) { @@ -9086,12 +9086,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t lcm(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 lcm(const int128 a, const int128 b) noexcept { - return static_cast(lcm(static_cast(abs(a)), static_cast(abs(b)))); + return static_cast(lcm(static_cast(abs(a)), static_cast(abs(b)))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t midpoint(const uint128_t a, const uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 midpoint(const uint128 a, const uint128 b) noexcept { // Bit manipulation formula works for unsigned integers auto mid {(a & b) + ((a ^ b) >> 1)}; @@ -9105,7 +9105,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t midpoint(const return mid; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 midpoint(const int128 a, const int128 b) noexcept { // For signed integers, we use a + (b - a) / 2 or a - (a - b) / 2 // The subtraction is done in unsigned arithmetic to handle overflow correctly @@ -9113,10 +9113,10 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const i // // Use direct field access for both the uint128 construction and the // comparison to avoid NVCC host compiler issues with operator<= and - // static_cast on int128_t for large-magnitude values + // static_cast on int128 for large-magnitude values - const uint128_t ua {a.high, a.low}; - const uint128_t ub {b.high, b.low}; + const uint128 ua {a.high, a.low}; + const uint128 ub {b.high, b.low}; const bool a_le_b {a.high == b.high ? a.low <= b.low : a.signed_high() < b.signed_high()}; @@ -9124,13 +9124,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const i { // diff = b - a (computed in unsigned, handles wrap-around correctly) const auto diff {ub - ua}; - return a + static_cast(diff / 2U); + return a + static_cast(diff / 2U); } else { // diff = a - b (computed in unsigned, handles wrap-around correctly) const auto diff {ua - ub}; - return a - static_cast(diff / 2U); + return a - static_cast(diff / 2U); } } @@ -9169,7 +9169,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const div_re namespace detail { // -1 when the exact quotient of x / y is negative, and 1 otherwise -BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128_t x, const int128_t y) noexcept +BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128 x, const int128 y) noexcept { return (x < 0) != (y < 0) ? -1 : 1; } @@ -9177,12 +9177,12 @@ BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128_t x, const int // Applies the quotient offset d (-1, 0, or 1) to a truncated division result, and returns the // remainder matching the adjusted quotient. The remainder is evaluated in unsigned arithmetic // so that the d * y term cannot overflow when y is INT128_MIN. -BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i128div_t truncated, const int128_t y, const int d) noexcept +BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i128div_t truncated, const int128 y, const int d) noexcept { - const uint128_t unsigned_rem {truncated.rem.high, truncated.rem.low}; - const uint128_t unsigned_y {y.high, y.low}; + const uint128 unsigned_rem {truncated.rem.high, truncated.rem.low}; + const uint128 unsigned_y {y.high, y.low}; - uint128_t rem {unsigned_rem}; + uint128 rem {unsigned_rem}; if (d > 0) { @@ -9193,14 +9193,14 @@ BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i1 rem = unsigned_rem + unsigned_y; } - return div_result{truncated.quot + d, static_cast(rem)}; + return div_result{truncated.quot + d, static_cast(rem)}; } // An unsigned quotient is never rounded down, so the only offsets are 0 and 1. The remainder // of an incremented quotient is negative, and is returned reduced modulo 2^128. -BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u128div_t truncated, const uint128_t y, const bool increment) noexcept +BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u128div_t truncated, const uint128 y, const bool increment) noexcept { - return div_result{increment ? truncated.quot + 1U : truncated.quot, + return div_result{increment ? truncated.quot + 1U : truncated.quot, increment ? truncated.rem - y : truncated.rem}; } @@ -9208,31 +9208,31 @@ BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u // magnitude when the remainder is more than half the divisor. truncate_ties selects the strict // form, which both breaks an exact tie towards zero and recovers the bit that abs(y) / 2 drops // when y is odd. -BOOST_INT128_HOST_DEVICE constexpr bool nearest_increment(const uint128_t abs_rem, const uint128_t abs_half_y, const bool truncate_ties) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool nearest_increment(const uint128 abs_rem, const uint128 abs_half_y, const bool truncate_ties) noexcept { return truncate_ties ? abs_rem > abs_half_y : abs_rem >= abs_half_y; } // Magnitude of the remainder of a truncated signed division. The magnitude is always less // than abs(y), so it is representable for every valid divisor. -BOOST_INT128_HOST_DEVICE constexpr uint128_t abs_remainder(const i128div_t truncated) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 abs_remainder(const i128div_t truncated) noexcept { - return static_cast(abs(truncated.rem)); + return static_cast(abs(truncated.rem)); } // floor(abs(y) / 2), exact for every y including INT128_MIN -BOOST_INT128_HOST_DEVICE constexpr uint128_t abs_half_divisor(const int128_t y) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 abs_half_divisor(const int128 y) noexcept { - return static_cast(abs(y)) >> 1U; + return static_cast(abs(y)) >> 1U; } // An odd divisor cannot produce an exact tie, so every ties function truncates on it -BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const int128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const int128 x) noexcept { return (x.low & 1U) != 0U; } -BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128 x) noexcept { return (x.low & 1U) != 0U; } @@ -9240,180 +9240,180 @@ BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128_t x) noexcept } // namespace detail // Rounds towards zero, which is what operator/ already does -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_zero(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_zero(const int128 x, const int128 y) noexcept { return x / y; } // Rounds away from zero, so the quotient grows in magnitude unless the division is exact -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0U); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0 ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_away_zero(const uint128 x, const uint128 y) noexcept { return div_rem_away_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_away_zero(const int128 x, const int128 y) noexcept { return div_rem_away_zero(x, y).quotient; } // Rounds towards positive infinity, which for an unsigned quotient is away from zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0U); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto adjust {truncated.rem != 0 && detail::quotient_sign(x, y) > 0}; return detail::offset_quotient(truncated, y, adjust ? 1 : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_pos_inf(const uint128 x, const uint128 y) noexcept { return div_rem_to_pos_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_pos_inf(const int128 x, const int128 y) noexcept { return div_rem_to_pos_inf(x, y).quotient; } // Rounds towards negative infinity, which for an unsigned quotient is truncation -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto adjust {truncated.rem != 0 && detail::quotient_sign(x, y) < 0}; return detail::offset_quotient(truncated, y, adjust ? -1 : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_neg_inf(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_neg_inf(const int128 x, const int128 y) noexcept { return div_rem_to_neg_inf(x, y).quotient; } // Euclidean division, whose remainder is always in [0, abs(y)). Only a negative remainder // needs fixing, and growing the quotient magnitude by one makes the remainder positive. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem < 0 ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_euclid(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_euclid(const int128 x, const int128 y) noexcept { return div_rem_euclid(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, true)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(detail::abs_remainder(truncated), detail::abs_half_divisor(y), true)}; return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_zero(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_zero(const int128 x, const int128 y) noexcept { return div_rem_ties_to_zero(x, y).quotient; } // Rounds to nearest, breaking an exact tie away from zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(detail::abs_remainder(truncated), detail::abs_half_divisor(y), detail::is_odd(y))}; return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_away_zero(const uint128 x, const uint128 y) noexcept { return div_rem_ties_away_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_away_zero(const int128 x, const int128 y) noexcept { return div_rem_ties_away_zero(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards positive infinity. A tie only grows the // magnitude when the quotient is positive. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto sign {detail::quotient_sign(x, y)}; @@ -9421,25 +9421,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? sign : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_pos_inf(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_pos_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_pos_inf(const int128 x, const int128 y) noexcept { return div_rem_ties_to_pos_inf(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards negative infinity. A tie only grows the // magnitude when the quotient is negative, so an unsigned tie always truncates. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, true)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto sign {detail::quotient_sign(x, y)}; @@ -9447,26 +9447,26 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? sign : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_neg_inf(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_neg_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_neg_inf(const int128 x, const int128 y) noexcept { return div_rem_ties_to_neg_inf(x, y).quotient; } // Rounds to nearest, breaking an exact tie to the odd quotient, so a tie only grows the // magnitude when truncation would have produced an even quotient -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y) || detail::is_odd(truncated.quot))}; return detail::offset_quotient(truncated, y, increment); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto truncate_ties {detail::is_odd(y) || detail::is_odd(truncated.quot)}; @@ -9474,26 +9474,26 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_odd(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_odd(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_odd(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_odd(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_odd(const int128 x, const int128 y) noexcept { return div_rem_ties_to_odd(x, y).quotient; } // Rounds to nearest, breaking an exact tie to the even quotient, so a tie only grows the // magnitude when truncation would have produced an odd quotient -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y) || !detail::is_odd(truncated.quot))}; return detail::offset_quotient(truncated, y, increment); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto truncate_ties {detail::is_odd(y) || !detail::is_odd(truncated.quot)}; @@ -9501,31 +9501,31 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_even(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_even(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_even(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_even(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_even(const int128 x, const int128 y) noexcept { return div_rem_ties_to_even(x, y).quotient; } // The Euclidean remainder, which is always in [0, abs(y)). Only a negative remainder needs // fixing, and abs(y) is added in unsigned arithmetic so that INT128_MIN is handled. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rem_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rem_euclid(const uint128 x, const uint128 y) noexcept { return x % y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t rem_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 rem_euclid(const int128 x, const int128 y) noexcept { const auto rem {x % y}; if (rem < 0) { - const uint128_t unsigned_rem {rem.high, rem.low}; - return static_cast(unsigned_rem + static_cast(abs(y))); + const uint128 unsigned_rem {rem.high, rem.low}; + return static_cast(unsigned_rem + static_cast(abs(y))); } return rem; @@ -9714,14 +9714,14 @@ constexpr auto parse_impl(ParseContext& ctx) is_upper = true; break; default: // LCOV_EXCL_LINE - BOOST_INT128_THROW_EXCEPTION(std::format_error("Unsupported format specifier")); // LCOV_EXCL_LINE + BOOST_int128HROW_EXCEPTION(std::format_error("Unsupported format specifier")); // LCOV_EXCL_LINE } } // Verify we're at the closing brace if (it != ctx.end() && *it != '}') { - BOOST_INT128_THROW_EXCEPTION(std::format_error("Expected '}' in format string")); // LCOV_EXCL_LINE + BOOST_int128HROW_EXCEPTION(std::format_error("Expected '}' in format string")); // LCOV_EXCL_LINE } return std::make_tuple(base, padding_digits, sign, is_upper, prefix, zero_pad, fill_char, align, it); @@ -9730,7 +9730,7 @@ constexpr auto parse_impl(ParseContext& ctx) template struct is_library_type_impl { - static constexpr bool value {std::is_same_v || std::is_same_v}; + static constexpr bool value {std::is_same_v || std::is_same_v}; }; template @@ -9786,31 +9786,31 @@ struct formatter { char buffer[boost::int128::detail::mini_to_chars_buffer_size]; bool isneg {false}; - boost::int128::uint128_t abs_v {}; + boost::int128::uint128 abs_v {}; - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (v < 0) { isneg = true; - // Can't negate int128_t::min(), handle specially + // Can't negate int128::min(), handle specially if (v == (std::numeric_limits::min)()) { - abs_v = boost::int128::uint128_t{UINT64_C(0x8000000000000000), 0}; + abs_v = boost::int128::uint128{UINT64_C(0x8000000000000000), 0}; } else { - abs_v = static_cast(-v); + abs_v = static_cast(-v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } const auto end = boost::int128::detail::mini_to_chars(buffer, abs_v, base, is_upper); @@ -9914,7 +9914,7 @@ struct formatter { s.insert(s.begin(), ' '); } - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (isneg) { @@ -9923,7 +9923,7 @@ struct formatter } break; case boost::int128::detail::sign_option::negative: - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (isneg) { @@ -10008,10 +10008,10 @@ struct formatter // [amalgamate] skipped duplicate include of boost/int128/detail/uint128_imp.hpp #include -#define BOOST_INT128_UINT128_MAX boost::int128::uint128_t{UINT64_MAX, UINT64_MAX} +#define BOOST_INT128_UINT128_MAX boost::int128::uint128{UINT64_MAX, UINT64_MAX} -#define BOOST_INT128_INT128_MIN boost::int128::int128_t{INT64_MIN, 0} -#define BOOST_INT128_INT128_MAX boost::int128::int128_t{INT64_MAX, UINT64_MAX} +#define BOOST_INT128_INT128_MIN boost::int128::int128{INT64_MIN, 0} +#define BOOST_INT128_INT128_MAX boost::int128::int128{INT64_MAX, UINT64_MAX} #endif // BOOST_INT128_CLIMITS_HPP // ===== END boost/int128/climits.hpp ===== @@ -10037,7 +10037,7 @@ namespace boost { namespace int128 { template -auto to_string(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::string> +auto to_string(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::string> { char buffer[detail::mini_to_chars_buffer_size]; const auto last {detail::mini_to_chars(buffer, value, 10, false)}; @@ -10045,7 +10045,7 @@ auto to_string(const T& value) -> std::enable_if_t<(std::is_same::v } template -auto to_wstring(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::wstring> +auto to_wstring(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::wstring> { char buffer[detail::mini_to_chars_buffer_size]; const auto last {detail::mini_to_chars(buffer, value, 10, false)}; @@ -10084,9 +10084,9 @@ namespace int128 { namespace detail { // Modular addition for 128-bit operands assuming 0 <= a, b < m -BOOST_INT128_HOST_DEVICE constexpr uint128_t addmod(const uint128_t a, const uint128_t b, const uint128_t m) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 addmod(const uint128 a, const uint128 b, const uint128 m) noexcept { - const uint128_t s {a + b}; + const uint128 s {a + b}; if (s < a || s >= m) { @@ -10097,9 +10097,9 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t addmod(const uint128_t a, const uin } // Modular multiplication via shift-and-add for the full 128-bit modulus case -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t mulmod_shift(uint128_t a, uint128_t b, const uint128_t m) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 mulmod_shift(uint128 a, uint128 b, const uint128 m) noexcept { - uint128_t result {0}; + uint128 result {0}; while (b != 0U) { @@ -10118,42 +10118,42 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t mulmod_shi // Modular multiplication when the modulus fits in 64 bits BOOST_INT128_HOST_DEVICE constexpr std::uint64_t mulmod_word(const std::uint64_t a, const std::uint64_t b, const std::uint64_t m) noexcept { - return ((uint128_t{a} * uint128_t{b}) % uint128_t{m}).low; + return ((uint128{a} * uint128{b}) % uint128{m}).low; } } // namespace detail // Computes (base ^ exp) mod m using fast modular exponentiation with // optimizations specific to the boost::int128 library types -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t base, uint128_t exp, const uint128_t m) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 powm(uint128 base, uint128 exp, const uint128 m) noexcept { if (BOOST_INT128_UNLIKELY(m == 0U)) { - return uint128_t{0}; + return uint128{0}; } if (m == 1U) { - return uint128_t{0}; + return uint128{0}; } if (exp == 0U) { - return uint128_t{1}; + return uint128{1}; } base %= m; if (base == 0U) { - return uint128_t{0}; + return uint128{0}; } // Power-of-two modulus: reduction is just a bitmask. if (has_single_bit(m)) { - const uint128_t mask {m - 1U}; - uint128_t result {1}; + const uint128 mask {m - 1U}; + uint128 result {1}; while (exp != 0U) { @@ -10187,12 +10187,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t exp >>= 1; } - return uint128_t{result}; + return uint128{result}; } // General 128-bit modulus: shift-and-add for each squaring keeps every // intermediate strictly below m without needing a 256-bit product. - uint128_t result {1}; + uint128 result {1}; while (exp != 0U) { @@ -10209,36 +10209,36 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t } // Signed overload. Returns the non-negative residue in [0, m) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t powm(const int128_t base, const int128_t exp, const int128_t m) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 powm(const int128 base, const int128 exp, const int128 m) noexcept { if (BOOST_INT128_UNLIKELY(m <= 0 || exp < 0)) { - return int128_t{0}; + return int128{0}; } - const uint128_t um {static_cast(m)}; + const uint128 um {static_cast(m)}; - uint128_t ub {}; + uint128 ub {}; if (base.signed_high() < 0) { - const uint128_t magnitude {static_cast(abs(base))}; - const uint128_t r {magnitude % um}; - ub = r == 0U ? uint128_t{0} : static_cast(um - r); + const uint128 magnitude {static_cast(abs(base))}; + const uint128 r {magnitude % um}; + ub = r == 0U ? uint128{0} : static_cast(um - r); } else { - ub = static_cast(base) % um; + ub = static_cast(base) % um; } - return static_cast(powm(ub, static_cast(exp), um)); + return static_cast(powm(ub, static_cast(exp), um)); } // Computes base^exp using exponentiation by squaring. The result is reduced // modulo 2^128, mirroring the wrap-around behavior of operator*. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t ipow(uint128_t base, std::uint64_t exp) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 ipow(uint128 base, std::uint64_t exp) noexcept { - uint128_t result {1}; + uint128 result {1}; while (exp != 0U) { @@ -10259,9 +10259,9 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t ipow(uint128_t } // Signed overload. Wraps modulo 2^128 on overflow, matching operator*. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t ipow(int128_t base, std::uint64_t exp) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 ipow(int128 base, std::uint64_t exp) noexcept { - int128_t result {1}; + int128 result {1}; while (exp != 0U) { @@ -10282,7 +10282,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t ipow(int128_t ba } // Integer square root: returns floor(sqrt(n)). -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uint128_t n) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 isqrt(const uint128 n) noexcept { if (n < 2U) { @@ -10290,11 +10290,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uin } // 2^ceil(bit_width(n)/2) is the smallest power of two whose square exceeds n. - uint128_t x {uint128_t{1} << ((bit_width(n) + 1) / 2)}; + uint128 x {uint128{1} << ((bit_width(n) + 1) / 2)}; while (true) { - const uint128_t y {(x + n / x) >> 1}; + const uint128 y {(x + n / x) >> 1}; if (y >= x) { @@ -10306,14 +10306,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uin } // Signed overload. Negative inputs are documented to return 0. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t isqrt(const int128_t n) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 isqrt(const int128 n) noexcept { if (BOOST_INT128_UNLIKELY(n < 0)) { - return int128_t{0}; + return int128{0}; } - return static_cast(isqrt(static_cast(n))); + return static_cast(isqrt(static_cast(n))); } namespace detail { @@ -10326,22 +10326,22 @@ struct valid_checked_type : std::integral_constant::va !std::is_same::value> {}; template <> -struct valid_checked_type : std::true_type {}; +struct valid_checked_type : std::true_type {}; template <> -struct valid_checked_type : std::true_type {}; +struct valid_checked_type : std::true_type {}; -// Widen an integer operand to its 128-bit two's complement bit pattern, returned as a uint128_t +// Widen an integer operand to its 128-bit two's complement bit pattern, returned as a uint128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t ckd_widen(const T value) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 ckd_widen(const T value) noexcept { BOOST_INT128_IF_CONSTEXPR (std::numeric_limits::is_signed) { - return static_cast(static_cast(value)); + return static_cast(static_cast(value)); } else { - return static_cast(value); + return static_cast(value); } } @@ -10349,35 +10349,35 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t ckd_widen(const T value) noexcept // image. magnitude is the absolute value; negative records the sign. struct ckd_operand { - uint128_t raw; - uint128_t magnitude; + uint128 raw; + uint128 magnitude; bool negative; }; template BOOST_INT128_HOST_DEVICE constexpr ckd_operand ckd_decompose(const T value) noexcept { - const uint128_t raw {ckd_widen(value)}; + const uint128 raw {ckd_widen(value)}; const bool negative {std::numeric_limits::is_signed && ((raw >> 127) != 0U)}; - return ckd_operand{raw, negative ? uint128_t{0} - raw : raw, negative}; + return ckd_operand{raw, negative ? uint128{0} - raw : raw, negative}; } // Exact signed sum of two operands given as (magnitude, sign). carry marks a // 129th bit, which no 128-bit or narrower target can represent. struct ckd_sum_result { - uint128_t magnitude; + uint128 magnitude; bool negative; bool carry; }; -BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128_t a_magnitude, const bool a_negative, - const uint128_t b_magnitude, const bool b_negative) noexcept +BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128 a_magnitude, const bool a_negative, + const uint128 b_magnitude, const bool b_negative) noexcept { if (a_negative == b_negative) { // Equal signs: magnitudes add and may overflow into a 129th bit. - const uint128_t magnitude {a_magnitude + b_magnitude}; + const uint128 magnitude {a_magnitude + b_magnitude}; return ckd_sum_result{magnitude, a_negative, magnitude < a_magnitude}; } @@ -10393,18 +10393,18 @@ BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128_t // Whether a result of the given sign and magnitude fits in T1. exceeds_width // forces overflow when the true magnitude does not even fit in 128 bits. template -BOOST_INT128_HOST_DEVICE constexpr bool ckd_overflows(const uint128_t magnitude, const bool negative, const bool exceeds_width) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool ckd_overflows(const uint128 magnitude, const bool negative, const bool exceeds_width) noexcept { if (exceeds_width) { return true; } - const uint128_t max_magnitude {static_cast((std::numeric_limits::max)())}; + const uint128 max_magnitude {static_cast((std::numeric_limits::max)())}; if (negative) { - const uint128_t min_magnitude {std::numeric_limits::is_signed ? max_magnitude + uint128_t{1} : uint128_t{0}}; + const uint128 min_magnitude {std::numeric_limits::is_signed ? max_magnitude + uint128{1} : uint128{0}}; return magnitude > min_magnitude; } @@ -10485,9 +10485,9 @@ BOOST_INT128_HOST_DEVICE constexpr bool ckd_mul(T1* result, const T2 a, const T3 // UINT128_MAX. Dividing the maximum by one magnitude tests that without // forming a 256-bit product. const bool exceeds_width {op_a.magnitude != 0U && - op_b.magnitude > ((std::numeric_limits::max)() / op_a.magnitude)}; + op_b.magnitude > ((std::numeric_limits::max)() / op_a.magnitude)}; - const uint128_t product_magnitude {op_a.magnitude * op_b.magnitude}; + const uint128 product_magnitude {op_a.magnitude * op_b.magnitude}; const bool product_negative {op_a.negative != op_b.negative}; return detail::ckd_overflows(product_magnitude, product_negative, exceeds_width); @@ -10520,8 +10520,8 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_type_v = valid_comparison // Allow the builtins to be used when available template -BOOST_INT128_INLINE_CONSTEXPR bool is_int128_type_v = std::is_same::value || - std::is_same::value +BOOST_INT128_INLINE_CONSTEXPR bool is_int128ype_v = std::is_same::value || + std::is_same::value #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) || std::is_same::value || std::is_same::value @@ -10530,7 +10530,7 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_int128_type_v = std::is_same: template BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_operand_v = is_valid_comparison_type_v || - is_int128_type_v; + is_int128ype_v; // Maps the builtin 128-bit types onto the library equivalents template @@ -10544,13 +10544,13 @@ struct comparison_canonical template <> struct comparison_canonical { - using type = int128_t; + using type = int128; }; template <> struct comparison_canonical { - using type = uint128_t; + using type = uint128; }; #endif @@ -10594,7 +10594,7 @@ BOOST_INT128_HOST_DEVICE constexpr bool cmp_less_impl(const T lhs, const U rhs) template BOOST_INT128_INLINE_CONSTEXPR bool enable_comparison_v = is_valid_comparison_operand_v && is_valid_comparison_operand_v && - (is_int128_type_v || is_int128_type_v); + (is_int128ype_v || is_int128ype_v); } // namespace detail @@ -10704,9 +10704,9 @@ inline std::size_t hash_finalize_64(std::uint64_t v) noexcept namespace std { template <> -struct hash +struct hash { - auto operator()(const boost::int128::int128_t v) const noexcept -> std::size_t + auto operator()(const boost::int128::int128 v) const noexcept -> std::size_t { const std::size_t low_hash {boost::int128::detail::hash_finalize_64(v.low)}; const std::size_t high_hash {boost::int128::detail::hash_finalize_64(v.high)}; @@ -10717,9 +10717,9 @@ struct hash }; template <> -struct hash +struct hash { - auto operator()(const boost::int128::uint128_t v) const noexcept -> std::size_t + auto operator()(const boost::int128::uint128 v) const noexcept -> std::size_t { const std::size_t low_hash {boost::int128::detail::hash_finalize_64(v.low)}; const std::size_t high_hash {boost::int128::detail::hash_finalize_64(v.high)}; @@ -10734,14 +10734,14 @@ struct hash namespace boost { namespace int128 { -inline std::size_t hash_value(const uint128_t v) noexcept +inline std::size_t hash_value(const uint128 v) noexcept { - return std::hash{}(v); + return std::hash{}(v); } -inline std::size_t hash_value(const int128_t v) noexcept +inline std::size_t hash_value(const int128 v) noexcept { - return std::hash{}(v); + return std::hash{}(v); } } // namespace int128 diff --git a/include/boost/int128/bit.hpp b/include/boost/int128/bit.hpp index 95a8acdf..8c386095 100644 --- a/include/boost/int128/bit.hpp +++ b/include/boost/int128/bit.hpp @@ -15,14 +15,14 @@ namespace int128 { namespace impl { -BOOST_INT128_HOST_DEVICE constexpr int countl_zero_impl(const uint128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr int countl_zero_impl(const uint128 x) noexcept { return x.high == 0 ? 64 + detail::countl_zero(x.low) : detail::countl_zero(x.high); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_clzg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -41,38 +41,38 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_zero(const uin #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_one(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countl_one(const uint128 x) noexcept { return countl_zero(~x); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int bit_width(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int bit_width(const uint128 x) noexcept { return x ? 128 - countl_zero(x) : 0; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_ceil(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 bit_ceil(const uint128 x) noexcept { // __builtin_stdc_bit_ceil not available, but this is equivalent - return x <= 1U ? static_cast(1) : static_cast(2) << (127 - countl_zero(x - 1)); + return x <= 1U ? static_cast(1) : static_cast(2) << (127 - countl_zero(x - 1)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t bit_floor(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 bit_floor(const uint128 x) noexcept { // __builtin_stdc_bit_floor not available, but this is equivalent - return x == 0U ? static_cast(0) : static_cast(1) << (127 - countl_zero(x)); + return x == 0U ? static_cast(0) : static_cast(1) << (127 - countl_zero(x)); } namespace impl { -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero_impl(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero_impl(const uint128 x) noexcept { return x.low == 0 ? 64 + detail::countr_zero(x.high) : detail::countr_zero(x.low); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_ctzg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -91,19 +91,19 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_zero(const uin #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_one(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int countr_one(const uint128 x) noexcept { return countr_zero(~x); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotl(const uint128_t x, const int s) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rotl(const uint128 x, const int s) noexcept { // __builtin_stdc_rotate_left not available constexpr auto mask {127U}; return x << (static_cast(s) & mask) | x >> (static_cast(-s) & mask); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotr(const uint128_t x, const int s) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rotr(const uint128 x, const int s) noexcept { // __builtin_stdc_rotate_right not available constexpr auto mask {127U}; @@ -112,7 +112,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rotr(const uint namespace impl { -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(std::uint64_t x) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(std::uint64_t x) noexcept { x = x - ((x >> 1U) & UINT64_C(0x5555555555555555)); x = (x & UINT64_C(0x3333333333333333)) + ((x >> 2U) & UINT64_C(0x3333333333333333)); @@ -122,14 +122,14 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(st } // The exact-match overload above is selected for the 64-bit halves -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(const uint128_t x) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount_impl(const uint128 x) noexcept { return popcount_impl(x.high) + popcount_impl(x.low); } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int popcount(const uint128 x) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_popcountg) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -206,14 +206,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t byteswap_im return (step16 & UINT64_C(0x00FF00FF00FF00FF)) << 8U | (step16 & UINT64_C(0xFF00FF00FF00FF00)) >> 8U; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap_impl(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 byteswap_impl(const uint128 x) noexcept { return {byteswap_impl(x.low), byteswap_impl(x.high)}; } } // namespace impl -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 byteswap(const uint128 x) noexcept { // The whole-width builtins are deliberately ranked below the paired 64-bit form. // Measured today (7/29/2026) they are a regression: the 128-bit value blocks the loop vectorization @@ -232,7 +232,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const return impl::byteswap_impl(x); } - return static_cast(__builtin_bswapg(static_cast(x))); + return static_cast(__builtin_bswapg(static_cast(x))); #elif defined(BOOST_INT128_HAS_INT128) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) && BOOST_INT128_HAS_BUILTIN(__builtin_bswap128) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -241,7 +241,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const return impl::byteswap_impl(x); } - return static_cast(__builtin_bswap128(static_cast(x))); + return static_cast(__builtin_bswap128(static_cast(x))); #elif defined(_MSC_VER) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -261,7 +261,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t byteswap(const #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(const uint128_t x) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool has_single_bit(const uint128 x) noexcept { return popcount(x) == 1; } diff --git a/include/boost/int128/charconv.hpp b/include/boost/int128/charconv.hpp index 44183129..28faa6ca 100644 --- a/include/boost/int128/charconv.hpp +++ b/include/boost/int128/charconv.hpp @@ -31,131 +31,131 @@ namespace charconv { namespace detail { template <> -struct is_signed { static constexpr bool value = false; }; +struct is_signed { static constexpr bool value = false; }; template <> -struct is_signed { static constexpr bool value = true; }; +struct is_signed { static constexpr bool value = true; }; template <> -struct make_unsigned { using type = int128::uint128_t; }; +struct make_unsigned { using type = int128::uint128; }; template <> -struct make_unsigned { using type = int128::uint128_t; }; +struct make_unsigned { using type = int128::uint128; }; template <> -struct make_signed { using type = int128::int128_t; }; +struct make_signed { using type = int128::int128; }; template <> -struct make_signed { using type = int128::int128_t; }; +struct make_signed { using type = int128::int128; }; #if defined(BOOST_INT128_HAS_GPU_SUPPORT) template <> -BOOST_INT128_HOST_DEVICE constexpr int128::uint128_t get_max_value() +BOOST_INT128_HOST_DEVICE constexpr int128::uint128 get_max_value() { - return std::numeric_limits::max(); + return std::numeric_limits::max(); } template <> -BOOST_INT128_HOST_DEVICE constexpr int128::int128_t get_max_value() +BOOST_INT128_HOST_DEVICE constexpr int128::int128 get_max_value() { - return std::numeric_limits::max(); + return std::numeric_limits::max(); } #endif #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -BOOST_INT128_INLINE_CONSTEXPR int128::uint128_t int128_pow10[39] = +BOOST_INT128_INLINE_CONSTEXPR int128::uint128 int128_pow10[39] = { - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x1)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xa)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x64)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x3e8)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2710)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x186a0)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xf4240)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x989680)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x5f5e100)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x3b9aca00)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2540be400)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x174876e800)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xe8d4a51000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x9184e72a000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x5af3107a4000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x38d7ea4c68000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2386f26fc10000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x16345785d8a0000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xde0b6b3a7640000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x8ac7230489e80000)}, - int128::uint128_t{UINT64_C(0x5), UINT64_C(0x6bc75e2d63100000)}, - int128::uint128_t{UINT64_C(0x36), UINT64_C(0x35c9adc5dea00000)}, - int128::uint128_t{UINT64_C(0x21e), UINT64_C(0x19e0c9bab2400000)}, - int128::uint128_t{UINT64_C(0x152d), UINT64_C(0x2c7e14af6800000)}, - int128::uint128_t{UINT64_C(0xd3c2), UINT64_C(0x1bcecceda1000000)}, - int128::uint128_t{UINT64_C(0x84595), UINT64_C(0x161401484a000000)}, - int128::uint128_t{UINT64_C(0x52b7d2), UINT64_C(0xdcc80cd2e4000000)}, - int128::uint128_t{UINT64_C(0x33b2e3c), UINT64_C(0x9fd0803ce8000000)}, - int128::uint128_t{UINT64_C(0x204fce5e), UINT64_C(0x3e25026110000000)}, - int128::uint128_t{UINT64_C(0x1431e0fae), UINT64_C(0x6d7217caa0000000)}, - int128::uint128_t{UINT64_C(0xc9f2c9cd0), UINT64_C(0x4674edea40000000)}, - int128::uint128_t{UINT64_C(0x7e37be2022), UINT64_C(0xc0914b2680000000)}, - int128::uint128_t{UINT64_C(0x4ee2d6d415b), UINT64_C(0x85acef8100000000)}, - int128::uint128_t{UINT64_C(0x314dc6448d93), UINT64_C(0x38c15b0a00000000)}, - int128::uint128_t{UINT64_C(0x1ed09bead87c0), UINT64_C(0x378d8e6400000000)}, - int128::uint128_t{UINT64_C(0x13426172c74d82), UINT64_C(0x2b878fe800000000)}, - int128::uint128_t{UINT64_C(0xc097ce7bc90715), UINT64_C(0xb34b9f1000000000)}, - int128::uint128_t{UINT64_C(0x785ee10d5da46d9), UINT64_C(0xf436a000000000)}, - int128::uint128_t{UINT64_C(0x4b3b4ca85a86c47a), UINT64_C(0x98a224000000000)} + int128::uint128{UINT64_C(0x0), UINT64_C(0x1)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xa)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x64)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x3e8)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2710)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x186a0)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xf4240)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x989680)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x5f5e100)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x3b9aca00)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2540be400)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x174876e800)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xe8d4a51000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x9184e72a000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x5af3107a4000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x38d7ea4c68000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2386f26fc10000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x16345785d8a0000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xde0b6b3a7640000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x8ac7230489e80000)}, + int128::uint128{UINT64_C(0x5), UINT64_C(0x6bc75e2d63100000)}, + int128::uint128{UINT64_C(0x36), UINT64_C(0x35c9adc5dea00000)}, + int128::uint128{UINT64_C(0x21e), UINT64_C(0x19e0c9bab2400000)}, + int128::uint128{UINT64_C(0x152d), UINT64_C(0x2c7e14af6800000)}, + int128::uint128{UINT64_C(0xd3c2), UINT64_C(0x1bcecceda1000000)}, + int128::uint128{UINT64_C(0x84595), UINT64_C(0x161401484a000000)}, + int128::uint128{UINT64_C(0x52b7d2), UINT64_C(0xdcc80cd2e4000000)}, + int128::uint128{UINT64_C(0x33b2e3c), UINT64_C(0x9fd0803ce8000000)}, + int128::uint128{UINT64_C(0x204fce5e), UINT64_C(0x3e25026110000000)}, + int128::uint128{UINT64_C(0x1431e0fae), UINT64_C(0x6d7217caa0000000)}, + int128::uint128{UINT64_C(0xc9f2c9cd0), UINT64_C(0x4674edea40000000)}, + int128::uint128{UINT64_C(0x7e37be2022), UINT64_C(0xc0914b2680000000)}, + int128::uint128{UINT64_C(0x4ee2d6d415b), UINT64_C(0x85acef8100000000)}, + int128::uint128{UINT64_C(0x314dc6448d93), UINT64_C(0x38c15b0a00000000)}, + int128::uint128{UINT64_C(0x1ed09bead87c0), UINT64_C(0x378d8e6400000000)}, + int128::uint128{UINT64_C(0x13426172c74d82), UINT64_C(0x2b878fe800000000)}, + int128::uint128{UINT64_C(0xc097ce7bc90715), UINT64_C(0xb34b9f1000000000)}, + int128::uint128{UINT64_C(0x785ee10d5da46d9), UINT64_C(0xf436a000000000)}, + int128::uint128{UINT64_C(0x4b3b4ca85a86c47a), UINT64_C(0x98a224000000000)} }; #endif // __NVCC__ -BOOST_INT128_HOST_DEVICE constexpr int num_digits(const int128::uint128_t& x) noexcept +BOOST_INT128_HOST_DEVICE constexpr int num_digits(const int128::uint128& x) noexcept { #if defined(BOOST_INT128_HAS_GPU_SUPPORT) - constexpr int128::uint128_t int128_pow10[39] = + constexpr int128::uint128 int128_pow10[39] = { - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x1)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xa)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x64)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x3e8)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2710)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x186a0)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xf4240)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x989680)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x5f5e100)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x3b9aca00)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2540be400)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x174876e800)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xe8d4a51000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x9184e72a000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x5af3107a4000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x38d7ea4c68000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x2386f26fc10000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x16345785d8a0000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0xde0b6b3a7640000)}, - int128::uint128_t{UINT64_C(0x0), UINT64_C(0x8ac7230489e80000)}, - int128::uint128_t{UINT64_C(0x5), UINT64_C(0x6bc75e2d63100000)}, - int128::uint128_t{UINT64_C(0x36), UINT64_C(0x35c9adc5dea00000)}, - int128::uint128_t{UINT64_C(0x21e), UINT64_C(0x19e0c9bab2400000)}, - int128::uint128_t{UINT64_C(0x152d), UINT64_C(0x2c7e14af6800000)}, - int128::uint128_t{UINT64_C(0xd3c2), UINT64_C(0x1bcecceda1000000)}, - int128::uint128_t{UINT64_C(0x84595), UINT64_C(0x161401484a000000)}, - int128::uint128_t{UINT64_C(0x52b7d2), UINT64_C(0xdcc80cd2e4000000)}, - int128::uint128_t{UINT64_C(0x33b2e3c), UINT64_C(0x9fd0803ce8000000)}, - int128::uint128_t{UINT64_C(0x204fce5e), UINT64_C(0x3e25026110000000)}, - int128::uint128_t{UINT64_C(0x1431e0fae), UINT64_C(0x6d7217caa0000000)}, - int128::uint128_t{UINT64_C(0xc9f2c9cd0), UINT64_C(0x4674edea40000000)}, - int128::uint128_t{UINT64_C(0x7e37be2022), UINT64_C(0xc0914b2680000000)}, - int128::uint128_t{UINT64_C(0x4ee2d6d415b), UINT64_C(0x85acef8100000000)}, - int128::uint128_t{UINT64_C(0x314dc6448d93), UINT64_C(0x38c15b0a00000000)}, - int128::uint128_t{UINT64_C(0x1ed09bead87c0), UINT64_C(0x378d8e6400000000)}, - int128::uint128_t{UINT64_C(0x13426172c74d82), UINT64_C(0x2b878fe800000000)}, - int128::uint128_t{UINT64_C(0xc097ce7bc90715), UINT64_C(0xb34b9f1000000000)}, - int128::uint128_t{UINT64_C(0x785ee10d5da46d9), UINT64_C(0xf436a000000000)}, - int128::uint128_t{UINT64_C(0x4b3b4ca85a86c47a), UINT64_C(0x98a224000000000)} + int128::uint128{UINT64_C(0x0), UINT64_C(0x1)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xa)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x64)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x3e8)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2710)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x186a0)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xf4240)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x989680)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x5f5e100)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x3b9aca00)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2540be400)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x174876e800)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xe8d4a51000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x9184e72a000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x5af3107a4000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x38d7ea4c68000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x2386f26fc10000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x16345785d8a0000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0xde0b6b3a7640000)}, + int128::uint128{UINT64_C(0x0), UINT64_C(0x8ac7230489e80000)}, + int128::uint128{UINT64_C(0x5), UINT64_C(0x6bc75e2d63100000)}, + int128::uint128{UINT64_C(0x36), UINT64_C(0x35c9adc5dea00000)}, + int128::uint128{UINT64_C(0x21e), UINT64_C(0x19e0c9bab2400000)}, + int128::uint128{UINT64_C(0x152d), UINT64_C(0x2c7e14af6800000)}, + int128::uint128{UINT64_C(0xd3c2), UINT64_C(0x1bcecceda1000000)}, + int128::uint128{UINT64_C(0x84595), UINT64_C(0x161401484a000000)}, + int128::uint128{UINT64_C(0x52b7d2), UINT64_C(0xdcc80cd2e4000000)}, + int128::uint128{UINT64_C(0x33b2e3c), UINT64_C(0x9fd0803ce8000000)}, + int128::uint128{UINT64_C(0x204fce5e), UINT64_C(0x3e25026110000000)}, + int128::uint128{UINT64_C(0x1431e0fae), UINT64_C(0x6d7217caa0000000)}, + int128::uint128{UINT64_C(0xc9f2c9cd0), UINT64_C(0x4674edea40000000)}, + int128::uint128{UINT64_C(0x7e37be2022), UINT64_C(0xc0914b2680000000)}, + int128::uint128{UINT64_C(0x4ee2d6d415b), UINT64_C(0x85acef8100000000)}, + int128::uint128{UINT64_C(0x314dc6448d93), UINT64_C(0x38c15b0a00000000)}, + int128::uint128{UINT64_C(0x1ed09bead87c0), UINT64_C(0x378d8e6400000000)}, + int128::uint128{UINT64_C(0x13426172c74d82), UINT64_C(0x2b878fe800000000)}, + int128::uint128{UINT64_C(0xc097ce7bc90715), UINT64_C(0xb34b9f1000000000)}, + int128::uint128{UINT64_C(0x785ee10d5da46d9), UINT64_C(0xf436a000000000)}, + int128::uint128{UINT64_C(0x4b3b4ca85a86c47a), UINT64_C(0x98a224000000000)} }; #endif // __NVCC__ @@ -189,52 +189,52 @@ BOOST_INT128_HOST_DEVICE constexpr int num_digits(const int128::uint128_t& x) no } // namespace detail -BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, const int128::uint128_t value, const int base = 10) noexcept +BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, const int128::uint128 value, const int base = 10) noexcept { #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) if (base == 10) { - return detail::to_chars_128integer_impl(first, last, value); + return detail::to_chars_128integer_impl(first, last, value); } #endif // __NVCC__ - return detail::to_chars_integer_impl(first, last, value, base); + return detail::to_chars_integer_impl(first, last, value, base); } -BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, const int128::int128_t value, const int base = 10) noexcept +BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_CONSTEXPR to_chars_result to_chars(char* first, char* last, const int128::int128 value, const int base = 10) noexcept { #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) if (base == 10) { - return detail::to_chars_128integer_impl(first, last, value); + return detail::to_chars_128integer_impl(first, last, value); } #endif // __NVCC__ - return detail::to_chars_integer_impl(first, last, value, base); + return detail::to_chars_integer_impl(first, last, value, base); } -BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(const char* first, const char* last, int128::uint128_t& value, const int base = 10) noexcept +BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(const char* first, const char* last, int128::uint128& value, const int base = 10) noexcept { - return detail::from_chars_integer_impl(first, last, value, base); + return detail::from_chars_integer_impl(first, last, value, base); } -BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(core::string_view sv, int128::uint128_t& value, const int base = 10) noexcept +BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(core::string_view sv, int128::uint128& value, const int base = 10) noexcept { - return detail::from_chars_integer_impl(sv.data(), sv.data() + sv.size(), value, base); + return detail::from_chars_integer_impl(sv.data(), sv.data() + sv.size(), value, base); } -BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(const char* first, const char* last, int128::int128_t& value, const int base = 10) noexcept +BOOST_INT128_HOST_DEVICE BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(const char* first, const char* last, int128::int128& value, const int base = 10) noexcept { - return detail::from_chars_integer_impl(first, last, value, base); + return detail::from_chars_integer_impl(first, last, value, base); } -BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(core::string_view sv, int128::int128_t& value, int base = 10) noexcept +BOOST_CHARCONV_GCC5_CONSTEXPR from_chars_result from_chars(core::string_view sv, int128::int128& value, int base = 10) noexcept { - return detail::from_chars_integer_impl(sv.data(), sv.data() + sv.size(), value, base); + return detail::from_chars_integer_impl(sv.data(), sv.data() + sv.size(), value, base); } } // namespace charconv diff --git a/include/boost/int128/climits.hpp b/include/boost/int128/climits.hpp index c0c8420e..15a9878b 100644 --- a/include/boost/int128/climits.hpp +++ b/include/boost/int128/climits.hpp @@ -9,9 +9,9 @@ #include #include -#define BOOST_INT128_UINT128_MAX boost::int128::uint128_t{UINT64_MAX, UINT64_MAX} +#define BOOST_INT128_UINT128_MAX boost::int128::uint128{UINT64_MAX, UINT64_MAX} -#define BOOST_INT128_INT128_MIN boost::int128::int128_t{INT64_MIN, 0} -#define BOOST_INT128_INT128_MAX boost::int128::int128_t{INT64_MAX, UINT64_MAX} +#define BOOST_INT128_INT128_MIN boost::int128::int128{INT64_MIN, 0} +#define BOOST_INT128_INT128_MAX boost::int128::int128{INT64_MAX, UINT64_MAX} #endif // BOOST_INT128_CLIMITS_HPP diff --git a/include/boost/int128/cstdlib.hpp b/include/boost/int128/cstdlib.hpp index 658685ba..a9957487 100644 --- a/include/boost/int128/cstdlib.hpp +++ b/include/boost/int128/cstdlib.hpp @@ -12,17 +12,17 @@ namespace int128 { BOOST_INT128_EXPORT struct u128div_t { - uint128_t quot; - uint128_t rem; + uint128 quot; + uint128 rem; }; BOOST_INT128_EXPORT struct i128div_t { - int128_t quot; - int128_t rem; + int128 quot; + int128 rem; }; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint128 x, const uint128 y) noexcept { if (BOOST_INT128_UNLIKELY(x == 0U || y == 0U)) { @@ -54,15 +54,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr u128div_t div(const uint1 } } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int128 x, const int128 y) noexcept { if (BOOST_INT128_UNLIKELY(x == 0 || y == 0)) { return i128div_t{0, 0}; } - const auto abs_lhs {static_cast(abs(x))}; - const auto abs_rhs {static_cast(abs(y))}; + const auto abs_lhs {static_cast(abs(x))}; + const auto abs_rhs {static_cast(abs(y))}; if (abs_rhs > abs_lhs) { @@ -78,15 +78,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr i128div_t div(const int12 { const auto builtin_x {static_cast(x)}; const auto builtin_y {static_cast(y)}; - return i128div_t{static_cast(builtin_x / builtin_y), - static_cast(builtin_x % builtin_y)}; + return i128div_t{static_cast(builtin_x / builtin_y), + static_cast(builtin_x % builtin_y)}; } #endif const auto unsigned_res {div(abs_lhs, abs_rhs)}; - i128div_t res {static_cast(unsigned_res.quot), static_cast(unsigned_res.rem)}; + i128div_t res {static_cast(unsigned_res.quot), static_cast(unsigned_res.rem)}; res.quot = negative_quot ? -res.quot : res.quot; res.rem = negative_rem ? -res.rem : res.rem; diff --git a/include/boost/int128/detail/clz.hpp b/include/boost/int128/detail/clz.hpp index 3fa01b6f..b7ecab8b 100644 --- a/include/boost/int128/detail/clz.hpp +++ b/include/boost/int128/detail/clz.hpp @@ -21,7 +21,7 @@ namespace detail { // The whole impl namespace is exported when building the module for testing so // the low-level bit helpers can be exercised directly; it is an ordinary // namespace in every other build. -BOOST_INT128_TEST_EXPORT namespace impl { +BOOST_int128EST_EXPORT namespace impl { #if !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) diff --git a/include/boost/int128/detail/common_mul.hpp b/include/boost/int128/detail/common_mul.hpp index a4bf0fa6..0b361043 100644 --- a/include/boost/int128/detail/common_mul.hpp +++ b/include/boost/int128/detail/common_mul.hpp @@ -25,7 +25,7 @@ struct ctor_high_word }; template <> -struct ctor_high_word +struct ctor_high_word { using type = std::int64_t; }; diff --git a/include/boost/int128/detail/config.hpp b/include/boost/int128/detail/config.hpp index 2cc4f87d..7770da71 100644 --- a/include/boost/int128/detail/config.hpp +++ b/include/boost/int128/detail/config.hpp @@ -6,13 +6,13 @@ #define BOOST_INT128_DETAIL_CONFIG_HPP // A handful of detail-namespace entities are exercised directly by the module -// test suite. BOOST_INT128_TEST_EXPORT exports them only when the module is built +// test suite. BOOST_int128EST_EXPORT exports them only when the module is built // for testing (BOOST_INT128_EXPORT_TESTING), so the normal module API stays limited // to the public interface. It expands to nothing in ordinary (header) builds. #if defined(BOOST_INT128_BUILD_MODULE) && defined(BOOST_INT128_EXPORT_TESTING) -# define BOOST_INT128_TEST_EXPORT export +# define BOOST_int128EST_EXPORT export #else -# define BOOST_INT128_TEST_EXPORT +# define BOOST_int128EST_EXPORT #endif // The SYCL device target (spir64) has no native 128-bit integer, so force the portable @@ -43,13 +43,13 @@ namespace detail { // Avoids pedantic warnings #ifdef __GNUC__ -BOOST_INT128_TEST_EXPORT __extension__ using builtin_i128 = __int128 ; -BOOST_INT128_TEST_EXPORT __extension__ using builtin_u128 = unsigned __int128 ; +BOOST_int128EST_EXPORT __extension__ using builtin_i128 = __int128 ; +BOOST_int128EST_EXPORT __extension__ using builtin_u128 = unsigned __int128 ; #else -BOOST_INT128_TEST_EXPORT using builtin_i128 = __int128 ; -BOOST_INT128_TEST_EXPORT using builtin_u128 = unsigned __int128; +BOOST_int128EST_EXPORT using builtin_i128 = __int128 ; +BOOST_int128EST_EXPORT using builtin_u128 = unsigned __int128; #endif @@ -80,8 +80,8 @@ namespace detail { // See the note above: skip the re-declaration in a module consumer. #if !defined(BOOST_INT128_BUILD_MODULE) || defined(BOOST_INT128_INTERFACE_UNIT) -BOOST_INT128_TEST_EXPORT using builtin_i128 = std::_Signed128; -BOOST_INT128_TEST_EXPORT using builtin_u128 = std::_Unsigned128; +BOOST_int128EST_EXPORT using builtin_i128 = std::_Signed128; +BOOST_int128EST_EXPORT using builtin_u128 = std::_Unsigned128; #endif @@ -293,22 +293,22 @@ BOOST_INT128_TEST_EXPORT using builtin_u128 = std::_Unsigned128; #ifdef BOOST_INT128_DISABLE_EXCEPTIONS -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) #else # ifdef _MSC_VER # ifdef _CPPUNWIND -# define BOOST_INT128_THROW_EXCEPTION(expr) throw expr; +# define BOOST_int128HROW_EXCEPTION(expr) throw expr; # else -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) # define BOOST_INT128_DISABLE_EXCEPTIONS # endif # else # ifdef __EXCEPTIONS -# define BOOST_INT128_THROW_EXCEPTION(expr) throw expr; +# define BOOST_int128HROW_EXCEPTION(expr) throw expr; # else -# define BOOST_INT128_THROW_EXCEPTION(expr) +# define BOOST_int128HROW_EXCEPTION(expr) # define BOOST_INT128_DISABLE_EXCEPTIONS # endif #endif diff --git a/include/boost/int128/detail/conversions.hpp b/include/boost/int128/detail/conversions.hpp index ed8dba24..5d165724 100644 --- a/include/boost/int128/detail/conversions.hpp +++ b/include/boost/int128/detail/conversions.hpp @@ -16,7 +16,7 @@ namespace detail { template struct valid_overload { - static constexpr bool value = std::is_same::value || std::is_same::value; + static constexpr bool value = std::is_same::value || std::is_same::value; }; template @@ -26,15 +26,15 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_valid_overload_v = valid_overload::valu #if BOOST_INT128_ENDIAN_LITTLE_BYTE -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(const uint128_t& v) noexcept : low {v.low}, high {v.high} {} +BOOST_INT128_HOST_DEVICE constexpr int128::int128(const uint128& v) noexcept : low {v.low}, high {v.high} {} -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexcept : low {v.low}, high {v.high} {} +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(const int128& v) noexcept : low {v.low}, high {v.high} {} #else -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(const uint128_t& v) noexcept : high {v.high}, low {v.low} {} +BOOST_INT128_HOST_DEVICE constexpr int128::int128(const uint128& v) noexcept : high {v.high}, low {v.low} {} -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexcept : high {v.high}, low {v.low} {} +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(const int128& v) noexcept : high {v.high}, low {v.low} {} #endif // BOOST_INT128_ENDIAN_LITTLE_BYTE @@ -50,37 +50,37 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(const int128_t& v) noexc template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator==(const T lhs, const U rhs) noexcept { - return static_cast(lhs) == static_cast(rhs); + return static_cast(lhs) == static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) != static_cast(rhs); + return static_cast(lhs) != static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator<(const T lhs, const U rhs) noexcept { - return static_cast(lhs) < static_cast(rhs); + return static_cast(lhs) < static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) <= static_cast(rhs); + return static_cast(lhs) <= static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator>(const T lhs, const U rhs) noexcept { - return static_cast(lhs) > static_cast(rhs); + return static_cast(lhs) > static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const T lhs, const U rhs) noexcept { - return static_cast(lhs) >= static_cast(rhs); + return static_cast(lhs) >= static_cast(rhs); } //===================================== @@ -88,33 +88,33 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const T lhs, const U rhs) noe //===================================== template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const T lhs, const U rhs) noexcept { - return static_cast(lhs) + static_cast(rhs); + return static_cast(lhs) + static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const T lhs, const U rhs) noexcept { - return static_cast(lhs) - static_cast(rhs); + return static_cast(lhs) - static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const T lhs, const U rhs) noexcept { - return static_cast(lhs) * static_cast(rhs); + return static_cast(lhs) * static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const T lhs, const U rhs) noexcept { - return static_cast(lhs) / static_cast(rhs); + return static_cast(lhs) / static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const T lhs, const U rhs) noexcept { - return static_cast(lhs) % static_cast(rhs); + return static_cast(lhs) % static_cast(rhs); } //===================================== @@ -122,49 +122,49 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const T lhs, const U rhs) //===================================== template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const T lhs, const U rhs) noexcept { - return static_cast(lhs) | static_cast(rhs); + return static_cast(lhs) | static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const T lhs, const U rhs) noexcept { - return static_cast(lhs) & static_cast(rhs); + return static_cast(lhs) & static_cast(rhs); } template && detail::is_valid_overload_v && !std::is_same::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const T lhs, const U rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const T lhs, const U rhs) noexcept { - return static_cast(lhs) ^ static_cast(rhs); + return static_cast(lhs) ^ static_cast(rhs); } //===================================== // Cross-type Shift Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const uint128 rhs) noexcept { - return lhs << static_cast(rhs); + return lhs << static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const int128 rhs) noexcept { - return lhs << static_cast(rhs); + return lhs << static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const uint128 rhs) noexcept { - return lhs >> static_cast(rhs); + return lhs >> static_cast(rhs); } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const int128 rhs) noexcept { - return lhs >> static_cast(rhs); + return lhs >> static_cast(rhs); } //===================================== -// int128_t with builtin unsigned __int128 comparison operators +// int128 with builtin unsigned __int128 comparison operators // // These live here (not in int128_imp.hpp) // to avoid C++20 rewritten-candidate ambiguity on MSVC @@ -172,152 +172,152 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, con #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } #endif // BOOST_INT128_HAS_INT128 //===================================== -// int128_t with builtin unsigned __int128 binary operators +// int128 with builtin unsigned __int128 binary operators //===================================== #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) + rhs; + return static_cast(lhs) + rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs + static_cast(rhs); + return lhs + static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) * rhs; + return static_cast(lhs) * rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs * static_cast(rhs); + return lhs * static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const int128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const int128 lhs, const detail::builtin_u128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_u128 lhs, const int128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } #endif // BOOST_INT128_HAS_INT128 diff --git a/include/boost/int128/detail/fwd.hpp b/include/boost/int128/detail/fwd.hpp index 4ec7dbc0..127c8318 100644 --- a/include/boost/int128/detail/fwd.hpp +++ b/include/boost/int128/detail/fwd.hpp @@ -10,8 +10,8 @@ namespace boost { namespace int128 { -BOOST_INT128_EXPORT struct uint128_t; -BOOST_INT128_EXPORT struct int128_t; +BOOST_INT128_EXPORT struct uint128; +BOOST_INT128_EXPORT struct int128; } // namespace int128 } // namespace boost diff --git a/include/boost/int128/detail/int128_imp.hpp b/include/boost/int128/detail/int128_imp.hpp index 0341f15a..9fc10e39 100644 --- a/include/boost/int128/detail/int128_imp.hpp +++ b/include/boost/int128/detail/int128_imp.hpp @@ -28,7 +28,7 @@ struct #if (defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128)) && !defined(_M_IX86) alignas(alignof(detail::builtin_i128)) #endif -int128_t +int128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -50,47 +50,47 @@ int128_t #endif // Defaulted basic construction - constexpr int128_t() noexcept = default; - constexpr int128_t(const int128_t&) noexcept = default; - constexpr int128_t(int128_t&&) noexcept = default; - constexpr int128_t& operator=(const int128_t&) noexcept = default; - constexpr int128_t& operator=(int128_t&&) noexcept = default; + constexpr int128() noexcept = default; + constexpr int128(const int128&) noexcept = default; + constexpr int128(int128&&) noexcept = default; + constexpr int128& operator=(const int128&) noexcept = default; + constexpr int128& operator=(int128&&) noexcept = default; // Requires a conversion file to be implemented - BOOST_INT128_HOST_DEVICE constexpr int128_t(const uint128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(const uint128& v) noexcept; // Construct from integral types #if BOOST_INT128_ENDIAN_LITTLE_BYTE - BOOST_INT128_HOST_DEVICE constexpr int128_t(const std::int64_t hi, const std::uint64_t lo) noexcept : low{lo}, high{static_cast(hi)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const std::int64_t hi, const std::uint64_t lo) noexcept : low{lo}, high{static_cast(hi)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? ~UINT64_C(0) : UINT64_C(0)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? ~UINT64_C(0) : UINT64_C(0)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_i128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_u128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_i128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_u128 v) noexcept : low {static_cast(v & static_cast(detail::low_word_mask))}, high {static_cast(v >> static_cast(64U))} {} #endif // BOOST_INT128_HAS_INT128 #else // Big endian - BOOST_INT128_HOST_DEVICE constexpr int128_t(const std::int64_t hi, const std::uint64_t lo) noexcept : high{static_cast(hi)}, low{lo} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const std::int64_t hi, const std::uint64_t lo) noexcept : high{static_cast(hi)}, low{lo} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const SignedInteger v) noexcept : high{v < 0 ? ~UINT64_C(0) : UINT64_C(0)}, low{static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const SignedInteger v) noexcept : high{v < 0 ? ~UINT64_C(0) : UINT64_C(0)}, low{static_cast(v)} {} template - BOOST_INT128_HOST_DEVICE constexpr int128_t(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr int128(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_i128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_i128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v & detail::low_word_mask)} {} #endif // BOOST_INT128_HAS_INT128 @@ -98,7 +98,7 @@ int128_t // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr int128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128(Float f) noexcept; // The high word read as a signed value. // Every operation whose meaning depends on the sign of the value goes through @@ -136,150 +136,150 @@ int128_t // Compound Or template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator|=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator|=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator|=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator|=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound And template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator&=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator&=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator&=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator&=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound XOR template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator^=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator^=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator^=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator^=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Left Shift template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator<<=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator<<=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator<<=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator<<=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Right Shift template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator>>=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator>>=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator>>=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator>>=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Prefix and postfix increment - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator++() noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t operator++(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator++() noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128 operator++(int) noexcept; // Prefix and postfix decrment - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator--() noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t operator--(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator--() noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128 operator--(int) noexcept; // Compound Addition template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator+=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator+=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator+=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator+=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Subtraction template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator-=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator-=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator-=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator-=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Multiplication template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator*=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator*=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator*=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator*=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Division template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator/=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator/=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator/=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator/=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Modulo template - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator%=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr int128_t& operator%=(int128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr int128& operator%=(int128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline int128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline int128& operator%=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 }; namespace detail { -// Builds an int128_t from the raw two's complement words +// Builds an int128 from the raw two's complement words // Enables vectorization -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t from_bits(const std::uint64_t hi, const std::uint64_t lo) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 from_bits(const std::uint64_t hi, const std::uint64_t lo) noexcept { - int128_t result {}; + int128 result {}; result.high = hi; result.low = lo; return result; @@ -291,7 +291,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t from_bits( // Absolute Value function //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t abs(int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 abs(int128 value) noexcept { if (value.signed_high() < 0) { @@ -311,7 +311,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t abs(int128_t val // converts the unsigned magnitude and applies the sign; see detail/float_conversion.hpp // for why the raw words can not be composed directly for negative values -BOOST_INT128_HOST_DEVICE constexpr int128_t::operator float() const noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::operator float() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -324,7 +324,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::operator float() const noexcept #endif } -BOOST_INT128_HOST_DEVICE constexpr int128_t::operator double() const noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::operator double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -339,7 +339,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::operator double() const noexcept #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -constexpr int128_t::operator long double() const noexcept +constexpr int128::operator long double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) @@ -363,7 +363,7 @@ constexpr int128_t::operator long double() const noexcept // f >= 2^127 -> INT128_MAX; // f < -2^127 -> INT128_MIN. template -BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(Float f) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128::int128(Float f) noexcept { constexpr Float two_32 {static_cast(UINT64_C(1) << 32)}; constexpr Float two_64 {two_32 * two_32}; @@ -414,29 +414,29 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t::int128_t(Float f) noexcept // Unary Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 value) noexcept { return value; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 value) noexcept { // Spelled with the constructor rather than from_bits: clang folds the low word // of the low == 0 arm away here, and loses that if the members are written. - return (value.low == 0) ? int128_t{static_cast(UINT64_C(0) - value.high), 0} : - int128_t{static_cast(~value.high), ~value.low + 1}; + return (value.low == 0) ? int128{static_cast(UINT64_C(0) - value.high), 0} : + int128{static_cast(~value.high), ~value.low + 1}; } //===================================== // Equality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const bool rhs) noexcept { return lhs.high == 0 && lhs.low == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const int128 rhs) noexcept { return rhs.high == 0 && rhs.low == static_cast(lhs); } @@ -451,7 +451,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const boo # pragma GCC diagnostic ignored "-Wsign-compare" #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const int128 rhs) noexcept { // x64 and ARM64 like the values in opposite directions @@ -467,39 +467,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const SignedInteger rhs) noexcept { return lhs.high == (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const int128 rhs) noexcept { return rhs.high == (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) && rhs.low == static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == 0 && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.high == 0 && rhs.low == static_cast(lhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -508,7 +508,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Inequality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const int128 rhs) noexcept { // x64 and ARM64 like the values in opposite directions @@ -540,50 +540,50 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const bool rhs) noexcept { return lhs.high != 0 || lhs.low != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const int128 rhs) noexcept { return rhs.high != 0 || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const SignedInteger rhs) noexcept { return lhs.high != (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const int128 rhs) noexcept { return rhs.high != (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)) || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high != 0 || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.high != 0 || rhs.low != static_cast(lhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -592,7 +592,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Less than Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -624,23 +624,23 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int1 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() < 0 || (lhs.high == 0 && lhs.low < static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() > 0 || (rhs.high == 0 && static_cast(lhs) < rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128 lhs, const SignedInteger rhs) noexcept { if (lhs.signed_high() < 0) { - return rhs >= 0 ? true : lhs < static_cast(rhs); + return rhs >= 0 ? true : lhs < static_cast(rhs); } if (lhs.signed_high() > 0 || rhs < 0) @@ -652,11 +652,11 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator<(const int128_t lhs, const Sign } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const int128 rhs) noexcept { if (rhs.signed_high() < 0) { - return lhs >= 0 ? false : static_cast(lhs) < rhs; + return lhs >= 0 ? false : static_cast(lhs) < rhs; } // rhs is positive @@ -670,14 +670,14 @@ BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -686,7 +686,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Greater than Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -718,39 +718,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int1 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs < rhs) && !(lhs == rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs < rhs) && !(lhs == rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() > 0 || (lhs.high == 0 && lhs.low > static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() < 0 || (rhs.high == 0 && static_cast(lhs) > rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -759,7 +759,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Less Equal Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -791,39 +791,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs > rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs > rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() < 0 || (lhs.high == 0 && lhs.low <= static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() > 0 || (rhs.high == 0 && static_cast(lhs) <= rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -832,7 +832,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Greater Equal Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const int128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to __int128 uniformly better (and seemingly cost free) #if defined(__aarch64__) && defined(__APPLE__) && defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -864,39 +864,39 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const SignedInteger rhs) noexcept { return !(lhs < rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const int128 rhs) noexcept { return !(lhs < rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const int128 lhs, const UnsignedInteger rhs) noexcept { return lhs.signed_high() > 0 || (lhs.high == 0 && lhs.low >= static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const int128 rhs) noexcept { return rhs.signed_high() < 0 || (rhs.high == 0 && static_cast(lhs) >= rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -907,7 +907,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool #ifdef BOOST_INT128_HAS_SPACESHIP_OPERATOR -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -924,7 +924,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering oper } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const SignedInteger rhs) noexcept { if (lhs < rhs) { @@ -941,7 +941,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -958,7 +958,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Signed } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 lhs, const UnsignedInteger rhs) noexcept { if (lhs < rhs) { @@ -975,7 +975,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const int128 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const int128 rhs) noexcept { if (lhs < rhs) { @@ -997,7 +997,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Unsign // Not Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator~(const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator~(const int128 rhs) noexcept { return detail::from_bits(~rhs.high, ~rhs.low); } @@ -1006,45 +1006,45 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator~(const // Or Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high | rhs.high, lhs.low | rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high | (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low | static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high | (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) | rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::from_bits(lhs.high, lhs.low | static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator|(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator|(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high, static_cast(lhs) | rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator|(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator|(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator|(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator|(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } @@ -1055,13 +1055,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator|=(const Integer rhs) noexcept { - *this = static_cast(*this | rhs); + *this = static_cast(*this | rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator|=(const int128 rhs) noexcept { *this = *this | rhs; return *this; @@ -1070,9 +1070,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator|=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator|=(const Integer rhs) noexcept { - *this = static_cast(*this | rhs); + *this = static_cast(*this | rhs); return *this; } @@ -1082,45 +1082,45 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator|=(const Integer rhs // And Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high & rhs.high, lhs.low & rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high & (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low & static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high & (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) & rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const int128 lhs, const UnsignedInteger rhs) noexcept { return {0, lhs.low & static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator&(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator&(const UnsignedInteger lhs, const int128 rhs) noexcept { return {0, static_cast(lhs) & rhs.low}; } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator&(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator&(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator&(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator&(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } @@ -1129,9 +1129,9 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator&=(const Integer rhs) noexcept { - *this = static_cast(*this & rhs); + *this = static_cast(*this & rhs); return *this; } @@ -1142,13 +1142,13 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator&=(const Integer rhs //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator&=(const Integer rhs) noexcept { - *this = static_cast(*this & rhs); + *this = static_cast(*this & rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator&=(const int128 rhs) noexcept { *this = *this & rhs; return *this; @@ -1158,45 +1158,45 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator&=(const int128_t // XOR Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const int128 rhs) noexcept { return detail::from_bits(lhs.high ^ rhs.high, lhs.low ^ rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const SignedInteger rhs) noexcept { return detail::from_bits(lhs.high ^ (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low ^ static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const SignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high ^ (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), static_cast(lhs) ^ rhs.low); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::from_bits(lhs.high, lhs.low ^ static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator^(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator^(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::from_bits(rhs.high, static_cast(lhs) ^ rhs.low); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator^(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator^(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator^(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator^(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } @@ -1207,13 +1207,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 //===================================== template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator^=(Integer rhs) noexcept { - *this = static_cast(*this ^ rhs); + *this = static_cast(*this ^ rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator^=(int128 rhs) noexcept { *this = *this ^ rhs; return *this; @@ -1222,9 +1222,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator^=(int128_t rhs) #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator^=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator^=(const Integer rhs) noexcept { - *this = static_cast(*this ^ rhs); + *this = static_cast(*this ^ rhs); return *this; } @@ -1237,7 +1237,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator^=(const Integer rhs namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr int128_t default_ls_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 default_ls_impl(const int128 lhs, const Integer rhs) noexcept { static_assert(std::is_integral::value, "Only builtin types allowed"); @@ -1267,7 +1267,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t default_ls_impl(const int128_t lhs, } template -BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE int128 intrinsic_ls_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -1286,8 +1286,8 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value << rhs}; - int128_t return_value; - std::memcpy(&return_value, &res, sizeof(int128_t)); + int128 return_value; + std::memcpy(&return_value, &res, sizeof(int128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -1296,7 +1296,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In # else - return int128_t{static_cast(lhs) << rhs}; + return int128{static_cast(lhs) << rhs}; # endif @@ -1308,7 +1308,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In } else { - int128_t res; + int128 res; res.high = __shiftleft128(lhs.low, lhs.high, static_cast(rhs)); res.low = lhs.low << rhs; @@ -1343,7 +1343,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_ls_impl(const int128_t lhs, const In } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -1363,7 +1363,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const #endif } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator<<(const int128 lhs, const int128 rhs) noexcept { // Out-of-range counts (negative, >= 128, or with the high word set) are // undefined, matching the built-in operators; forward to the scalar overload. @@ -1372,13 +1372,13 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator<<(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); @@ -1387,14 +1387,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; @@ -1406,13 +1406,13 @@ BOOST_INT128_HOST_DEVICE constexpr unsigned operator<<(const UnsignedInteger lhs #endif // _MSC_VER template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator<<=(const Integer rhs) noexcept { - *this = static_cast(*this << rhs); + *this = static_cast(*this << rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator<<=(const int128 rhs) noexcept { *this = *this << rhs; return *this; @@ -1421,9 +1421,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator<<=(const int128_ #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator<<=(const Integer rhs) noexcept { - *this = static_cast(*this << rhs); + *this = static_cast(*this << rhs); return *this; } @@ -1440,7 +1440,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator<<=(const Integer rh namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr int128_t default_rs_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 default_rs_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators. In a @@ -1465,7 +1465,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t default_rs_impl(const int128_t lhs, } template -BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE int128 intrinsic_rs_impl(const int128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -1483,8 +1483,8 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In std::memcpy(&value, &lhs, sizeof(builtin_i128)); const auto res {value >> rhs}; - int128_t return_value; - std::memcpy(&return_value, &res, sizeof(int128_t)); + int128 return_value; + std::memcpy(&return_value, &res, sizeof(int128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -1506,7 +1506,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In } else { - int128_t res; + int128 res; res.low = __shiftright128(lhs.low, lhs.high, static_cast(rhs)); res.high = static_cast(lhs.signed_high() >> rhs); @@ -1539,7 +1539,7 @@ BOOST_INT128_HOST_DEVICE int128_t intrinsic_rs_impl(const int128_t lhs, const In } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -1559,7 +1559,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator>>(const int128 lhs, const int128 rhs) noexcept { // Out-of-range counts (negative, >= 128, or with the high word set) are // undefined, matching the built-in operators; forward to the scalar overload. @@ -1568,13 +1568,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator>>(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); @@ -1583,14 +1583,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs, const int128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; @@ -1602,13 +1602,13 @@ BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(const UnsignedInteger lhs #endif // _MSC_VER template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator>>=(const Integer rhs) noexcept { - *this = static_cast(*this >> rhs); + *this = static_cast(*this >> rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator>>=(const int128 rhs) noexcept { *this = *this >> rhs; return *this; @@ -1617,9 +1617,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator>>=(const int128_ #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator>>=(const Integer rhs) noexcept { - *this = static_cast(*this >> rhs); + *this = static_cast(*this >> rhs); return *this; } @@ -1633,7 +1633,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator>>=(const Integer rh // Increment Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator++() noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator++() noexcept { if (++low == UINT64_C(0)) { @@ -1643,7 +1643,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator++() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator++(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 int128::operator++(int) noexcept { const auto temp {*this}; ++(*this); @@ -1654,7 +1654,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator++(int) noexcept // Decrement Operators //===================================== -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator--() noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator--() noexcept { if (low-- == UINT64_C(0)) { @@ -1664,7 +1664,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator--() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator--(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 int128::operator--(int) noexcept { const auto temp {*this}; --(*this); @@ -1677,7 +1677,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t int128_t::operator--(int) noexcept namespace detail { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_add(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 library_add(const int128 lhs, const int128 rhs) noexcept { const auto new_low {lhs.low + rhs.low}; const auto new_high {lhs.high + @@ -1687,12 +1687,12 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_ad return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_add(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_add(const int128 lhs, const int128 rhs) noexcept { #if (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_WIN32) && defined(BOOST_INT128_HAS_INT128) // Compute in the unsigned domain so that overflow wraps modulo 2^128 - return int128_t{static_cast(lhs) + static_cast(rhs)}; + return int128{static_cast(lhs) + static_cast(rhs)}; #elif defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) @@ -1711,7 +1711,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad } else { - int128_t result {}; + int128 result {}; const auto carry {BOOST_INT128_ADD_CARRY(0, lhs.low, rhs.low, &result.low)}; BOOST_INT128_ADD_CARRY(carry, lhs.high, rhs.high, &result.high); @@ -1726,7 +1726,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad } template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_add(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_add(const int128 lhs, const Integer rhs) noexcept { const auto new_low {lhs.low + rhs}; const auto new_high {lhs.high + static_cast(new_low < lhs.low)}; @@ -1734,7 +1734,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_ad return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_sub(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 library_sub(const int128 lhs, const int128 rhs) noexcept { const auto new_low {lhs.low - rhs.low}; const auto new_high {lhs.high - rhs.high - static_cast(lhs.low < rhs.low)}; @@ -1742,7 +1742,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t library_su return detail::from_bits(new_high, new_low); } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_sub(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_sub(const int128 lhs, const int128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (!defined(__aarch64__) || defined(__APPLE__) || !defined(BOOST_INT128_HAS_INT128)) && !(defined(__CUDACC__) && defined(BOOST_INT128_ENABLE_CUDA)) @@ -1755,7 +1755,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su #elif defined(__aarch64__) && !defined(__APPLE__) // Unsigned wrap for consistent two's-complement semantics - return int128_t{static_cast(lhs) - static_cast(rhs)}; + return int128{static_cast(lhs) - static_cast(rhs)}; #elif defined(_M_AMD64) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) @@ -1765,7 +1765,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su } else { - int128_t result {}; + int128 result {}; const auto borrow {BOOST_INT128_SUB_BORROW(0, lhs.low, rhs.low, &result.low)}; BOOST_INT128_SUB_BORROW(borrow, lhs.high, rhs.high, &result.high); @@ -1780,7 +1780,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su } template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_sub(const int128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_sub(const int128 lhs, const Integer rhs) noexcept { const auto new_low {lhs.low - rhs}; const auto new_high {lhs.high - static_cast(new_low > lhs.low)}; @@ -1793,14 +1793,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_su // doing addition via subtraction is >10% faster in the benchmarks #if defined(__s390__) || defined(__s390x__) -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const int128 rhs) noexcept { return detail::default_sub(lhs, -rhs); } #else -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const int128 rhs) noexcept { return detail::default_add(lhs, rhs); } @@ -1808,13 +1808,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_add(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::default_add(rhs, lhs); } @@ -1825,7 +1825,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const int128 lhs, const SignedInteger rhs) noexcept { // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) return rhs < 0 ? detail::default_sub(lhs, -static_cast(rhs)) : @@ -1833,7 +1833,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const int128_t lhs, const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator+(const SignedInteger lhs, const int128 rhs) noexcept { return lhs < 0 ? detail::default_sub(rhs, -static_cast(lhs)) : detail::default_add(rhs, static_cast(lhs)); @@ -1846,26 +1846,26 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator+(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator+(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator+(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return detail::default_add(lhs, static_cast(rhs)); + return detail::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator+(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator+(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return detail::default_add(rhs, static_cast(lhs)); + return detail::default_add(rhs, static_cast(lhs)); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator+=(const Integer rhs) noexcept { - *this = static_cast(*this + rhs); + *this = static_cast(*this + rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator+=(const int128 rhs) noexcept { *this = *this + rhs; return *this; @@ -1874,9 +1874,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator+=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator+=(const Integer rhs) noexcept { - *this = static_cast(*this + rhs); + *this = static_cast(*this + rhs); return *this; } @@ -1886,58 +1886,58 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator+=(const Integer rhs // Subtraction Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const int128 rhs) noexcept { return detail::default_sub(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_sub(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const UnsignedInteger lhs, const int128 rhs) noexcept { return detail::default_add(-rhs, lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const int128 lhs, const SignedInteger rhs) noexcept { - return detail::default_sub(lhs, static_cast(rhs)); + return detail::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator-(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator-(const SignedInteger lhs, const int128 rhs) noexcept { - return detail::default_sub(static_cast(lhs), rhs); + return detail::default_sub(static_cast(lhs), rhs); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator-(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator-(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator-(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator-(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } #endif template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator-=(const Integer rhs) noexcept { - *this = static_cast(*this - rhs); + *this = static_cast(*this - rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator-=(const int128 rhs) noexcept { *this = *this - rhs; return *this; @@ -1946,9 +1946,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator-=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator-=(const Integer rhs) noexcept { - *this = static_cast(*this - rhs); + *this = static_cast(*this - rhs); return *this; } @@ -1960,29 +1960,29 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator-=(const Integer rhs namespace detail { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const std::uint32_t rhs) noexcept { return default_mul(lhs, static_cast(rhs)); } #if defined(_M_AMD64) && !defined(__GNUC__) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128_t msvc_amd64_mul(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128 msvc_amd64_mul(const int128 lhs, const int128 rhs) noexcept { - int128_t result {}; + int128 result {}; result.low = _umul128(lhs.low, rhs.low, &result.high); result.high += lhs.low * rhs.high; result.high += lhs.high * rhs.low; @@ -1992,7 +1992,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE int128_t msvc_amd64_mul(const #endif -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mul(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128 default_mul(const int128 lhs, const int128 rhs) noexcept { #if ((defined(__aarch64__) && defined(__APPLE__)) || defined(__x86_64__) || defined(__PPC__) || defined(__powerpc__)) && defined(__GNUC__) && !defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -2000,7 +2000,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu if (BOOST_INT128_IS_CONSTANT_EVALUATED(lhs)) { - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); } else { @@ -2014,7 +2014,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu std::memcpy(&new_rhs, &rhs, sizeof(detail::builtin_u128)); const auto res {new_lhs * new_rhs}; - int128_t library_res {}; + int128 library_res {}; std::memcpy(&library_res, &res, sizeof(detail::builtin_u128)); @@ -2026,23 +2026,23 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu # elif defined(BOOST_INT128_HAS_INT128) // Unsigned wrap for consistent two's-complement semantics - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; # else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); # endif #elif defined(__aarch64__) && defined(BOOST_INT128_HAS_INT128) - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #elif defined(_M_AMD64) && !defined(__GNUC__) && !defined(BOOST_INT128_NO_CONSTEVAL_DETECTION) if (BOOST_INT128_IS_CONSTANT_EVALUATED(rhs)) { - return low_word_mul(lhs, rhs); // LCOV_EXCL_LINE + return low_word_mul(lhs, rhs); // LCOV_EXCL_LINE } else { @@ -2052,31 +2052,31 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr int128_t default_mu #elif defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) // Multiply in the unsigned domain to avoid signed-overflow UB, then reinterpret the bits. - return int128_t{static_cast(lhs) * static_cast(rhs)}; + return int128{static_cast(lhs) * static_cast(rhs)}; #else - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #endif } } // namespace detail -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const int128 rhs) noexcept { return detail::default_mul(lhs, rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const UnsignedInteger rhs) noexcept { using local_eval_type = detail::evaluation_type_t; return detail::default_mul(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const UnsignedInteger lhs, const int128 rhs) noexcept { using local_eval_type = detail::evaluation_type_t; return detail::default_mul(rhs, static_cast(lhs)); @@ -2088,14 +2088,14 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const int128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? -detail::default_mul(lhs, -static_cast(rhs)) : detail::default_mul(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator*(const SignedInteger lhs, const int128 rhs) noexcept { return lhs < 0 ? -detail::default_mul(rhs, -static_cast(lhs)) : detail::default_mul(rhs, static_cast(lhs)); @@ -2107,26 +2107,26 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator*(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator*(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator*(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return detail::default_mul(lhs, static_cast(rhs)); + return detail::default_mul(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator*(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator*(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return detail::default_mul(rhs, static_cast(lhs)); + return detail::default_mul(rhs, static_cast(lhs)); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator*=(const Integer rhs) noexcept { - *this = static_cast(*this * rhs); + *this = static_cast(*this * rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator*=(const int128 rhs) noexcept { *this = *this * rhs; return *this; @@ -2135,9 +2135,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator*=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator*=(const Integer rhs) noexcept { - *this = static_cast(*this * rhs); + *this = static_cast(*this * rhs); return *this; } @@ -2152,7 +2152,7 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator*=(const Integer rhs # pragma clang diagnostic ignored "-Wassume" #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -2160,7 +2160,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const BOOST_INT128_UNREACHABLE; } - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto abs_lhs {abs(lhs)}; const auto abs_rhs {abs(rhs)}; @@ -2176,7 +2176,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const // computed above and beats native signed division (the out-of-line __divti3) for this case. if (abs_rhs.high == 0) { - int128_t quotient {}; + int128 quotient {}; if (abs_lhs.high == 0) { @@ -2192,7 +2192,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const #if defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) / static_cast(rhs)); + return static_cast(static_cast(lhs) / static_cast(rhs)); #else @@ -2203,7 +2203,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2215,13 +2215,13 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const const auto abs_lhs {abs(lhs)}; - int128_t quotient {}; + int128 quotient {}; detail::one_word_div(abs_lhs, static_cast(rhs), quotient); return lhs < 0 ? -quotient : quotient; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const UnsignedInteger lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -2242,7 +2242,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, return {0, 0}; } const auto res {static_cast(lhs) / abs_rhs.low}; - const int128_t result {0, res}; + const int128 result {0, res}; return rhs < 0 ? -result : result; } } @@ -2253,7 +2253,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const UnsignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const int128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2263,9 +2263,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - int128_t quotient {}; + int128 quotient {}; - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto negative_res {static_cast((lhs.signed_high() < 0) ^ (rhs < 0))}; // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) const auto abs_rhs {rhs < 0 ? -static_cast(rhs) : static_cast(rhs)}; @@ -2282,7 +2282,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const int128_t lhs, const } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator/(const SignedInteger lhs, const int128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0)) { @@ -2305,7 +2305,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, c } // Negate in the unsigned domain so INT64_MIN does not overflow (UBSAN) const auto abs_lhs {lhs < 0 ? -static_cast(lhs) : static_cast(lhs)}; - const int128_t res {0, abs_lhs / abs_rhs.low}; + const int128 res {0, abs_lhs / abs_rhs.low}; return negative_res ? -res : res; } @@ -2318,39 +2318,39 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator/(const SignedInteger lhs, c #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator/(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator/(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return static_cast(static_cast(lhs) / rhs); + return static_cast(static_cast(lhs) / rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator/(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator/(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs / static_cast(rhs)); + return static_cast(lhs / static_cast(rhs)); } #elif defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator/(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator/(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator/(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator/(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator/=(const Integer rhs) noexcept { - *this = static_cast(*this / rhs); + *this = static_cast(*this / rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator/=(const int128 rhs) noexcept { *this = *this / rhs; return *this; @@ -2359,9 +2359,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator/=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator/=(const Integer rhs) noexcept { - *this = static_cast(*this / rhs); + *this = static_cast(*this / rhs); return *this; } @@ -2378,21 +2378,21 @@ BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator/=(const Integer rhs //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(UnsignedInteger lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(UnsignedInteger lhs, int128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(SignedInteger lhs, int128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(SignedInteger lhs, int128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(int128_t lhs, int128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator%(int128 lhs, int128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2402,8 +2402,8 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - int128_t quotient {}; - int128_t remainder {}; + int128 quotient {}; + int128 remainder {}; const auto abs_lhs {abs(lhs)}; @@ -2413,7 +2413,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const UnsignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const UnsignedInteger lhs, const int128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2430,24 +2430,24 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const UnsignedInteger lhs, return lhs; } - const int128_t remainder {0, static_cast(lhs) % abs_rhs.low}; + const int128 remainder {0, static_cast(lhs) % abs_rhs.low}; return remainder; } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const SignedInteger rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const SignedInteger lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const SignedInteger lhs, const int128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128 operator%(const int128 lhs, const int128 rhs) noexcept { if (rhs == 0) { @@ -2455,7 +2455,7 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const BOOST_INT128_UNREACHABLE; } - constexpr int128_t min_val {INT64_MIN, 0}; + constexpr int128 min_val {INT64_MIN, 0}; const auto abs_lhs {abs(lhs)}; const auto abs_rhs {abs(rhs)}; @@ -2470,15 +2470,15 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const // magnitudes with the hardware-accelerated one_word_div and reapply the dividend's sign. if (abs_rhs.high == 0) { - int128_t remainder {}; + int128 remainder {}; if (abs_lhs.high == 0) { - remainder = int128_t{0, abs_lhs.low % abs_rhs.low}; + remainder = int128{0, abs_lhs.low % abs_rhs.low}; } else { - int128_t quotient {}; + int128 quotient {}; detail::one_word_div(abs_lhs, abs_rhs.low, quotient, remainder); } @@ -2487,11 +2487,11 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) % static_cast(rhs)); + return static_cast(static_cast(lhs) % static_cast(rhs)); #else - int128_t remainder {}; + int128 remainder {}; detail::knuth_div(abs_lhs, abs_rhs, remainder); return is_neg ? -remainder : remainder; @@ -2500,12 +2500,12 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t operator%(const int128_t lhs, const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator%(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator%(const int128 lhs, const detail::builtin_i128 rhs) noexcept { return static_cast(lhs) % rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128_t operator%(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int128 operator%(const detail::builtin_i128 lhs, const int128 rhs) noexcept { return lhs % static_cast(rhs); } @@ -2513,27 +2513,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR int1 #elif defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator%(const int128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator%(const int128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128_t operator%(const detail::builtin_i128 lhs, const int128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE inline int128 operator%(const detail::builtin_i128 lhs, const int128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator%=(const Integer rhs) noexcept { - *this = static_cast(*this % rhs); + *this = static_cast(*this % rhs); return *this; } -BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const int128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int128& int128::operator%=(const int128 rhs) noexcept { *this = *this % rhs; return *this; @@ -2542,9 +2542,9 @@ BOOST_INT128_HOST_DEVICE constexpr int128_t& int128_t::operator%=(const int128_t #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline int128_t& int128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline int128& int128::operator%=(const Integer rhs) noexcept { - *this = static_cast(*this % rhs); + *this = static_cast(*this % rhs); return *this; } @@ -2600,15 +2600,15 @@ class numeric_limits_impl_i128 static constexpr bool tinyness_before = false; // Member functions - BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::int128_t { return {INT64_MIN, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::int128_t { return {INT64_MIN, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::int128_t { return {INT64_MAX, UINT64_MAX}; } - BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::int128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::int128_t { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::int128 { return {INT64_MIN, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::int128 { return {INT64_MIN, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::int128 { return {INT64_MAX, UINT64_MAX}; } + BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::int128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::int128 { return {0, 0}; } }; #if !defined(__cpp_inline_variables) || __cpp_inline_variables < 201606L @@ -2670,7 +2670,7 @@ namespace std { #endif template <> -class numeric_limits : +class numeric_limits : public boost::int128::detail::numeric_limits_impl_i128 {}; #ifdef __clang__ diff --git a/include/boost/int128/detail/mini_from_chars.hpp b/include/boost/int128/detail/mini_from_chars.hpp index 94291e54..def96673 100644 --- a/include/boost/int128/detail/mini_from_chars.hpp +++ b/include/boost/int128/detail/mini_from_chars.hpp @@ -247,26 +247,26 @@ BOOST_INT128_HOST_DEVICE constexpr int from_chars_integer_impl(const char* first } } // namespace impl -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, uint128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, uint128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, int128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars(const char* first, const char* last, int128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } // Parsing entry points for the user-defined literals. Unlike from_chars these skip the // C++ digit separator ' so that literals such as 1'234'567_u128 are accepted. -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, uint128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, uint128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, int128_t& value, int base = 10) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_literal(const char* first, const char* last, int128& value, int base = 10) noexcept { - return impl::from_chars_integer_impl(first, last, value, base); + return impl::from_chars_integer_impl(first, last, value, base); } // Rejects an out of range literal @@ -275,7 +275,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_liter #if defined(BOOST_INT128_HAS_GPU_SUPPORT) || defined(BOOST_INT128_DISABLE_EXCEPTIONS) BOOST_INT128_UNREACHABLE; #else - BOOST_INT128_THROW_EXCEPTION(std::out_of_range("Literal is out of range of the target type")); + BOOST_int128HROW_EXCEPTION(std::out_of_range("Literal is out of range of the target type")); #endif } @@ -285,7 +285,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr int from_chars_liter #if defined(BOOST_INT128_HAS_GPU_SUPPORT) || defined(BOOST_INT128_DISABLE_EXCEPTIONS) BOOST_INT128_UNREACHABLE; #else - BOOST_INT128_THROW_EXCEPTION(std::invalid_argument("Literal is not a valid integer")); + BOOST_int128HROW_EXCEPTION(std::invalid_argument("Literal is not a valid integer")); #endif } diff --git a/include/boost/int128/detail/mini_to_chars.hpp b/include/boost/int128/detail/mini_to_chars.hpp index 5f4d6c7c..6d2f56e4 100644 --- a/include/boost/int128/detail/mini_to_chars.hpp +++ b/include/boost/int128/detail/mini_to_chars.hpp @@ -34,7 +34,7 @@ static_assert(sizeof(upper_case_digit_table) == sizeof(char) * 16, "10 numbers, #endif // !__NVCC__ -BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], uint128_t v, const int base, const bool uppercase) noexcept +BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], uint128 v, const int base, const bool uppercase) noexcept { #if defined(BOOST_INT128_HAS_GPU_SUPPORT) constexpr char lower_case_digit_table[] = { @@ -101,28 +101,28 @@ BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_ch return last; } -BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], const int128_t v, const int base, const bool uppercase) noexcept +BOOST_INT128_HOST_DEVICE constexpr char* mini_to_chars(char (&buffer)[mini_to_chars_buffer_size], const int128 v, const int base, const bool uppercase) noexcept { char* p {nullptr}; if (v < 0) { // We cant negate the min value inside the signed type, but we know what the result will be - if (v == (std::numeric_limits::min)()) + if (v == (std::numeric_limits::min)()) { - p = mini_to_chars(buffer, uint128_t{UINT64_C(0x8000000000000000), 0}, base, uppercase); + p = mini_to_chars(buffer, uint128{UINT64_C(0x8000000000000000), 0}, base, uppercase); } else { const auto neg_v {-v}; - p = mini_to_chars(buffer, static_cast(neg_v), base, uppercase); + p = mini_to_chars(buffer, static_cast(neg_v), base, uppercase); } *--p = '-'; } else { - p = mini_to_chars(buffer, static_cast(v), base, uppercase); + p = mini_to_chars(buffer, static_cast(v), base, uppercase); } return p; diff --git a/include/boost/int128/detail/uint128_imp.hpp b/include/boost/int128/detail/uint128_imp.hpp index 0e378aaf..701c64f5 100644 --- a/include/boost/int128/detail/uint128_imp.hpp +++ b/include/boost/int128/detail/uint128_imp.hpp @@ -29,7 +29,7 @@ BOOST_INT128_EXPORT struct #if (defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128)) && !defined(_M_IX86) alignas(alignof(detail::builtin_u128)) #endif -uint128_t +uint128 { #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::uint64_t low {}; @@ -51,33 +51,33 @@ uint128_t #endif // BOOST_INT128_ENDIAN_LITTLE_BYTE // Defaulted basic construction - constexpr uint128_t() noexcept = default; - constexpr uint128_t(const uint128_t&) noexcept = default; - constexpr uint128_t(uint128_t&&) noexcept = default; - constexpr uint128_t& operator=(const uint128_t&) noexcept = default; - constexpr uint128_t& operator=(uint128_t&&) noexcept = default; + constexpr uint128() noexcept = default; + constexpr uint128(const uint128&) noexcept = default; + constexpr uint128(uint128&&) noexcept = default; + constexpr uint128& operator=(const uint128&) noexcept = default; + constexpr uint128& operator=(uint128&&) noexcept = default; // Requires a conversion file to be implemented - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const int128_t& v) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(const int128& v) noexcept; // Construct from integral types #if BOOST_INT128_ENDIAN_LITTLE_BYTE - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const std::uint64_t hi, const std::uint64_t lo) noexcept : low {lo}, high {hi} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const std::uint64_t hi, const std::uint64_t lo) noexcept : low {lo}, high {hi} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? UINT64_MAX : UINT64_C(0)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const SignedInteger v) noexcept : low {static_cast(v)}, high {v < 0 ? UINT64_MAX : UINT64_C(0)} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const UnsignedInteger v) noexcept : low {static_cast(v)}, high {} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_i128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_i128 v) noexcept : low {static_cast(v)}, high {static_cast(static_cast(v) >> static_cast(64U))} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_u128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_u128 v) noexcept : low {static_cast(v)}, high {static_cast(v >> static_cast(64U))} {} @@ -85,21 +85,21 @@ uint128_t #else // Big endian - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const std::uint64_t hi, const std::uint64_t lo) noexcept : high {hi}, low {lo} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const std::uint64_t hi, const std::uint64_t lo) noexcept : high {hi}, low {lo} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const SignedInteger v) noexcept : high {v < 0 ? UINT64_MAX : UINT64_C(0)}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const SignedInteger v) noexcept : high {v < 0 ? UINT64_MAX : UINT64_C(0)}, low {static_cast(v)} {} template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} + BOOST_INT128_HOST_DEVICE constexpr uint128(const UnsignedInteger v) noexcept : high {}, low {static_cast(v)} {} #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_i128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_i128 v) noexcept : high {static_cast(static_cast(v) >> 64U)}, low {static_cast(v)} {} - BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t(const detail::builtin_u128 v) noexcept : + BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128(const detail::builtin_u128 v) noexcept : high {static_cast(v >> 64U)}, low {static_cast(v)} {} @@ -109,7 +109,7 @@ uint128_t // Construct from floating-point types template - BOOST_INT128_HOST_DEVICE constexpr uint128_t(Float f) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128(Float f) noexcept; // Integer conversion operators BOOST_INT128_HOST_DEVICE explicit constexpr operator bool() const noexcept {return low || high; } @@ -142,136 +142,136 @@ uint128_t // Compound OR template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator|=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator|=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator|=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator|=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator|=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound AND template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator&=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator&=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator&=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator&=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator&=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound XOR template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator^=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator^=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator^=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator^=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator^=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Left Shift template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator<<=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator<<=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator<<=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator<<=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator<<=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Right Shift template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator>>=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator>>=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator>>=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator>>=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator>>=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator++() noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t operator++(int) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator--() noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t operator--(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator++() noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128 operator++(int) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator--() noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128 operator--(int) noexcept; // Compound Addition template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator+=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator+=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator+=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator+=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator+=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Subtraction template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator-=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator-=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator-=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator-=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator-=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Multiplication template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator*=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator*=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator*=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator*=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator*=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound Division template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator/=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator/=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator/=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator/=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator/=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 // Compound modulo template - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator%=(Integer rhs) noexcept; - BOOST_INT128_HOST_DEVICE constexpr uint128_t& operator%=(uint128_t rhs) noexcept; + BOOST_INT128_HOST_DEVICE constexpr uint128& operator%=(uint128 rhs) noexcept; #ifdef BOOST_INT128_HAS_MSVC_INT128 template - BOOST_INT128_HOST_DEVICE inline uint128_t& operator%=(Integer rhs) noexcept; + BOOST_INT128_HOST_DEVICE inline uint128& operator%=(Integer rhs) noexcept; #endif // BOOST_INT128_HAS_MSVC_INT128 }; @@ -280,7 +280,7 @@ uint128_t // Absolute Value function //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t abs(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 abs(const uint128 value) noexcept { return value; } @@ -293,7 +293,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t abs(const uint1 // runtime (__floatuntisf and friends) is correctly rounded. The portable fallback // composes the words as high * 2^64 + low; see detail/float_conversion.hpp -BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator float() const noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::operator float() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -306,7 +306,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator float() const noexcept #endif } -BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator double() const noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::operator double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) && !defined(BOOST_INT128_HAS_GPU_SUPPORT) @@ -321,7 +321,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::operator double() const noexcept #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -constexpr uint128_t::operator long double() const noexcept +constexpr uint128::operator long double() const noexcept { #if defined(BOOST_INT128_HAS_INT128) @@ -344,7 +344,7 @@ constexpr uint128_t::operator long double() const noexcept // NaN/negative -> 0 // overflow -> UINT128_MAX. template -BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(Float f) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128::uint128(Float f) noexcept { constexpr Float two_32 {static_cast(UINT64_C(1) << 32)}; constexpr Float two_64 {two_32 * two_32}; @@ -375,12 +375,12 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t::uint128_t(Float f) noexcept // Unary Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 value) noexcept { return value; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t value) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 value) noexcept { return {~value.high + static_cast(value.low == UINT64_C(0)), ~value.low + UINT64_C(1)}; } @@ -389,12 +389,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const // Equality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const bool rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const bool lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && rhs.low == static_cast(lhs); } @@ -408,32 +408,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const boo #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high && lhs.low == rhs_u.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high && lhs_u.low == rhs.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low == static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator==(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && rhs.low == static_cast(lhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_AMD64) @@ -467,24 +467,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator==(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs == static_cast(rhs); + return lhs == static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator==(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) == rhs; + return static_cast(lhs) == rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -493,43 +493,43 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool // Inequality Operators //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const bool rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const bool rhs) noexcept { return lhs.high != UINT64_C(0) || lhs.low != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const bool lhs, const uint128 rhs) noexcept { return rhs.high != UINT64_C(0) || rhs.low != static_cast(lhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high != rhs_u.high || lhs.low != rhs_u.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high != rhs.high || lhs_u.low != rhs.low; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high != UINT64_C(0) || lhs.low != static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high != UINT64_C(0) || rhs.low != static_cast(lhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_AMD64) @@ -564,25 +564,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator!=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_BUILTIN_CONSTEXPR) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs != static_cast(rhs); + return lhs != static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator!=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) != rhs; + return static_cast(lhs) != rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -592,32 +592,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low < rhs_u.low : lhs.high < rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low < rhs.low : lhs_u.high < rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low < static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high > UINT64_C(0) || static_cast(lhs) < rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint128 lhs, const uint128 rhs) noexcept { // On ARM macs only with the clang compiler is casting to unsigned __int128 uniformly better (and seemingly cost free) #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -682,25 +682,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<(const uint #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs < static_cast(rhs); + return lhs < static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) < rhs; + return static_cast(lhs) < rhs; } #endif // BOOST_INT128_HAS_INT128 @@ -710,32 +710,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low <= rhs_u.low : lhs.high < rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low <= rhs.low : lhs_u.high < rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high == UINT64_C(0) && lhs.low <= static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high > UINT64_C(0) || static_cast(lhs) <= rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -799,24 +799,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator<=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs <= static_cast(rhs); + return lhs <= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator<=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) <= rhs; + return static_cast(lhs) <= rhs; } @@ -827,32 +827,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low > rhs_u.low : lhs.high > rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low > rhs.low : lhs_u.high > rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high > UINT64_C(0) || lhs.low > static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && static_cast(lhs) > rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -916,24 +916,24 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>(const uint #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs > static_cast(rhs); + return lhs > static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) > rhs; + return static_cast(lhs) > rhs; } @@ -944,32 +944,32 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const SignedInteger rhs) noexcept { - const uint128_t rhs_u {rhs}; + const uint128 rhs_u {rhs}; return lhs.high == rhs_u.high ? lhs.low >= rhs_u.low : lhs.high > rhs_u.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const SignedInteger lhs, const uint128 rhs) noexcept { - const uint128_t lhs_u {lhs}; + const uint128 lhs_u {lhs}; return lhs_u.high == rhs.high ? lhs_u.low >= rhs.low : lhs_u.high > rhs.high; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const UnsignedInteger rhs) noexcept { return lhs.high > UINT64_C(0) || lhs.low >= static_cast(rhs); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const UnsignedInteger lhs, const uint128 rhs) noexcept { return rhs.high == UINT64_C(0) && static_cast(lhs) >= rhs.low; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uint128 lhs, const uint128 rhs) noexcept { #if defined(__clang__) && defined(BOOST_INT128_HAS_INT128) @@ -1032,25 +1032,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr bool operator>=(const uin #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs >= static_cast(rhs); + return lhs >= static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool operator>=(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) >= rhs; + return static_cast(lhs) >= rhs; } @@ -1062,7 +1062,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR bool #ifdef BOOST_INT128_HAS_SPACESHIP_OPERATOR -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -1079,7 +1079,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering oper } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const UnsignedInteger rhs) noexcept { if (lhs < rhs) { @@ -1096,7 +1096,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint12 } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const UnsignedInteger lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -1113,7 +1113,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Unsign } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const SignedInteger lhs, const uint128 rhs) noexcept { if (lhs < rhs) { @@ -1130,7 +1130,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const Signed } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint128 lhs, const SignedInteger rhs) noexcept { if (lhs < rhs) { @@ -1152,7 +1152,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const uint12 // Not Operator //===================================== -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator~(const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator~(const uint128 rhs) noexcept { return {~rhs.high, ~rhs.low}; } @@ -1162,30 +1162,30 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator~(const //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high | (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low | static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high | (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low | static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {lhs.high, lhs.low | static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high, rhs.low | static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator|(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high | rhs.high, lhs.low | rhs.low}; } @@ -1193,36 +1193,36 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator|(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs | static_cast(rhs); + return lhs | static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator|(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator|(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) | rhs; + return static_cast(lhs) | rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator|=(const Integer rhs) noexcept { *this = *this | rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator|=(const uint128 rhs) noexcept { *this = *this | rhs; return *this; @@ -1231,7 +1231,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator|=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator|=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator|=(const Integer rhs) noexcept { *this = *this | rhs; return *this; @@ -1244,30 +1244,30 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator|=(const Integer r //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high & (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low & static_cast(rhs)}; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high & (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low & static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {UINT64_C(0), lhs.low & static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {UINT64_C(0), rhs.low & static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator&(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high & rhs.high, lhs.low & rhs.low}; } @@ -1275,37 +1275,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator&(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs & static_cast(rhs); + return lhs & static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator&(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator&(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) & rhs; + return static_cast(lhs) & rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator&=(const Integer rhs) noexcept { *this = *this & rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator&=(const uint128 rhs) noexcept { *this = *this & rhs; return *this; @@ -1314,7 +1314,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator&=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator&=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator&=(Integer rhs) noexcept { *this = *this & rhs; return *this; @@ -1328,30 +1328,30 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator&=(Integer rhs) no //===================================== BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const SignedInteger rhs) noexcept { return {lhs.high ^ (rhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), lhs.low ^ static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const SignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high ^ (lhs < 0 ? ~UINT64_C(0) : UINT64_C(0)), rhs.low ^ static_cast(lhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const UnsignedInteger rhs) noexcept { return {lhs.high, lhs.low ^ static_cast(rhs)}; } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const UnsignedInteger lhs, const uint128 rhs) noexcept { return {rhs.high, rhs.low ^ static_cast(lhs)}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator^(const uint128 lhs, const uint128 rhs) noexcept { return {lhs.high ^ rhs.high, lhs.low ^ rhs.low}; } @@ -1359,37 +1359,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator^(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs ^ static_cast(rhs); + return lhs ^ static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator^(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator^(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) ^ rhs; + return static_cast(lhs) ^ rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator^=(const Integer rhs) noexcept { *this = *this ^ rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator^=(const uint128 rhs) noexcept { *this = *this ^ rhs; return *this; @@ -1398,7 +1398,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator^=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator^=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator^=(Integer rhs) noexcept { *this = *this ^ rhs; return *this; @@ -1413,7 +1413,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator^=(Integer rhs) no namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr uint128_t default_ls_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 default_ls_impl(const uint128 lhs, const Integer rhs) noexcept { static_assert(std::is_integral::value, "Needs to be a builtin type"); @@ -1442,7 +1442,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t default_ls_impl(const uint128_t lhs } template -BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const T rhs) noexcept +BOOST_INT128_HOST_DEVICE uint128 intrinsic_ls_impl(const uint128 lhs, const T rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -1460,8 +1460,8 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value << rhs}; - uint128_t return_value; - std::memcpy(&return_value, &res, sizeof(uint128_t)); + uint128 return_value; + std::memcpy(&return_value, &res, sizeof(uint128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -1502,7 +1502,7 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_ls_impl(const uint128_t lhs, const } // namespace detail BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -1524,7 +1524,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, con // A number of different overloads to ensure that we return the same type as the builtins would -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator<<(const uint128 lhs, const uint128 rhs) noexcept { // Out-of-range counts (>= 128 or with the high word set) are undefined, // matching the built-in operators; forward the count to the scalar overload. @@ -1533,13 +1533,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator<<(cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator<<(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator<<(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs << static_cast(rhs.low); @@ -1548,27 +1548,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator<<(const SignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned int operator<<(const UnsignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) << rhs.low; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator<<=(const Integer rhs) noexcept { *this = *this << rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator<<=(const uint128 rhs) noexcept { *this = *this << rhs; return *this; @@ -1577,7 +1577,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator<<=(const uint1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator<<=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator<<=(Integer rhs) noexcept { *this = *this << rhs; return *this; @@ -1592,7 +1592,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator<<=(Integer rhs) n namespace detail { template -BOOST_INT128_HOST_DEVICE constexpr uint128_t default_rs_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 default_rs_impl(const uint128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators. In a @@ -1619,7 +1619,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t default_rs_impl(const uint128_t lhs } template -BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE uint128 intrinsic_rs_impl(const uint128 lhs, const Integer rhs) noexcept { // A shift by a negative amount or by an amount >= 128 (the operand width) is // undefined behavior, exactly as for the built-in shift operators; delegate @@ -1637,8 +1637,8 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const std::memcpy(&value, &lhs, sizeof(builtin_u128)); const auto res {value >> rhs}; - uint128_t return_value; - std::memcpy(&return_value, &res, sizeof(uint128_t)); + uint128 return_value; + std::memcpy(&return_value, &res, sizeof(uint128)); return return_value; #if defined(__GNUC__) && __GNUC__ >= 8 @@ -1676,7 +1676,7 @@ BOOST_INT128_HOST_DEVICE uint128_t intrinsic_rs_impl(const uint128_t lhs, const } // namespace detail BOOST_INT128_EXPORT template ::value, bool> = true> -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const Integer rhs) noexcept { #ifndef BOOST_INT128_NO_CONSTEVAL_DETECTION @@ -1696,7 +1696,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, con #endif } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator>>(const uint128 lhs, const uint128 rhs) noexcept { // Out-of-range counts (>= 128 or with the high word set) are undefined, // matching the built-in operators; forward the count to the scalar overload. @@ -1705,13 +1705,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator>>(cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_u128 operator>>(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR detail::builtin_i128 operator>>(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return lhs >> static_cast(rhs.low); @@ -1720,27 +1720,27 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR deta #endif BOOST_INT128_EXPORT template && (sizeof(SignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr int operator>>(const SignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } BOOST_INT128_EXPORT template && (sizeof(UnsignedInteger) * 8 <= 16), bool> = true> -BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr unsigned operator>>(UnsignedInteger lhs, const uint128 rhs) noexcept { // Out-of-range counts are undefined, matching the built-in operators. return static_cast(lhs) >> rhs.low; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator>>=(const Integer rhs) noexcept { *this = *this >> rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator>>=(const uint128 rhs) noexcept { *this = *this >> rhs; return *this; @@ -1749,7 +1749,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator>>=(const uint1 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator>>=(Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator>>=(Integer rhs) noexcept { *this = *this >> rhs; return *this; @@ -1761,7 +1761,7 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator>>=(Integer rhs) n // Increment Operator //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator++() noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator++() noexcept { if (++low == UINT64_C(0)) { @@ -1771,7 +1771,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator++() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator++(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 uint128::operator++(int) noexcept { const auto temp {*this}; ++(*this); @@ -1782,7 +1782,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator++(int) noexcept // Decrement Operator //===================================== -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator--() noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator--() noexcept { if (--low == UINT64_MAX) { @@ -1792,7 +1792,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator--() noexcept return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator--(int) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 uint128::operator--(int) noexcept { const auto temp {*this}; --(*this); @@ -1805,22 +1805,22 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t uint128_t::operator--(int) noexcept namespace impl { -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_add(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_add(const uint128 lhs, const uint128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high + rhs.high + __builtin_add_overflow(lhs.low, rhs.low, &res.low); return res; #elif (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_MSC_VER) && defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) + static_cast(rhs)); + return static_cast(static_cast(lhs) + static_cast(rhs)); #else - uint128_t temp {lhs.high + rhs.high, lhs.low + rhs.low}; + uint128 temp {lhs.high + rhs.high, lhs.low + rhs.low}; if (temp.low < lhs.low) { @@ -1832,18 +1832,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_a #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_add(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_add(const uint128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_ADD_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high + __builtin_add_overflow(lhs.low, rhs, &res.low); return res; #else - uint128_t temp {lhs.high, lhs.low + rhs}; + uint128 temp {lhs.high, lhs.low + rhs}; if (temp.low < lhs.low) { @@ -1855,22 +1855,22 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_a #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_sub(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_sub(const uint128 lhs, const uint128 rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (defined(__i386__) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high - rhs.high - __builtin_sub_overflow(lhs.low, rhs.low, &res.low); return res; #elif (defined(__x86_64__) || (defined(__aarch64__) && !defined(__APPLE__))) && !defined(_MSC_VER) && defined(BOOST_INT128_HAS_INT128) - return static_cast(static_cast(lhs) - static_cast(rhs)); + return static_cast(static_cast(lhs) - static_cast(rhs)); #else - uint128_t temp {lhs.high - rhs.high, lhs.low - rhs.low}; + uint128 temp {lhs.high - rhs.high, lhs.low - rhs.low}; // Check for carry if (lhs.low < rhs.low) @@ -1883,18 +1883,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_s #endif } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_sub(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_sub(const uint128 lhs, const std::uint64_t rhs) noexcept { #if defined(BOOST_INT128_HAS_BUILTIN_SUB_OVERFLOW) && (defined(__i386__) || (defined(__aarch64__) && !defined(__APPLE__)) || defined(__arm__) || (defined(__s390__) || defined(__s390x__))) - uint128_t res {}; + uint128 res {}; res.high = lhs.high - __builtin_sub_overflow(lhs.low, rhs, &res.low); return res; #else - uint128_t temp {lhs.high, lhs.low - rhs}; + uint128 temp {lhs.high, lhs.low - rhs}; // Check for carry if (lhs.low < rhs) @@ -1915,14 +1915,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_s #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? impl::default_sub(lhs, -static_cast(rhs)) : impl::default_add(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const SignedInteger lhs, const uint128 rhs) noexcept { return lhs < 0 ? impl::default_sub(rhs, -static_cast(lhs)) : impl::default_add(rhs, static_cast(lhs)); @@ -1933,18 +1933,18 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const SignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const UnsignedInteger rhs) noexcept { return impl::default_add(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const UnsignedInteger lhs, const uint128 rhs) noexcept { return impl::default_add(rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator+(const uint128 lhs, const uint128 rhs) noexcept { return impl::default_add(lhs, rhs); } @@ -1952,37 +1952,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator+(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return impl::default_add(lhs, static_cast(rhs)); + return impl::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return impl::default_add(static_cast(lhs), rhs); + return impl::default_add(static_cast(lhs), rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return impl::default_add(lhs, static_cast(rhs)); + return impl::default_add(lhs, static_cast(rhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator+(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator+(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return impl::default_add(static_cast(lhs), rhs); + return impl::default_add(static_cast(lhs), rhs); } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator+=(const Integer rhs) noexcept { *this = *this + rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator+=(const uint128 rhs) noexcept { *this = *this + rhs; return *this; @@ -1991,7 +1991,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator+=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator+=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator+=(const Integer rhs) noexcept { *this = *this + rhs; return *this; @@ -2010,14 +2010,14 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator+=(const Integer r #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const SignedInteger rhs) noexcept { return rhs < 0 ? impl::default_add(lhs, -static_cast(rhs)) : impl::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const SignedInteger lhs, const uint128 rhs) noexcept { return lhs < 0 ? impl::default_sub(-rhs, -static_cast(lhs)) : impl::default_add(-rhs, static_cast(lhs)); @@ -2028,18 +2028,18 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const SignedInteger lhs, #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const UnsignedInteger rhs) noexcept { return impl::default_sub(lhs, static_cast(rhs)); } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const UnsignedInteger lhs, const uint128 rhs) noexcept { return impl::default_add(-rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator-(const uint128 lhs, const uint128 rhs) noexcept { return impl::default_sub(lhs, rhs); } @@ -2047,37 +2047,37 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator-(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs - static_cast(rhs); + return lhs - static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator-(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator-(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) - rhs; + return static_cast(lhs) - rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator-=(const Integer rhs) noexcept { *this = *this - rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator-=(const uint128 rhs) noexcept { *this = *this - rhs; return *this; @@ -2086,7 +2086,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator-=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator-=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator-=(const Integer rhs) noexcept { *this = *this - rhs; return *this; @@ -2107,9 +2107,9 @@ namespace detail { #if defined(_M_AMD64) && !defined(__GNUC__) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const uint128 rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, rhs.low, &result.high); result.high += lhs.low * rhs.high; result.high += lhs.high * rhs.low; @@ -2117,18 +2117,18 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return result; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint64_t rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, rhs, &result.high); result.high += lhs.high * rhs; return result; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint32_t rhs) noexcept { - uint128_t result {}; + uint128 result {}; result.low = _umul128(lhs.low, static_cast(rhs), &result.high); result.high += lhs.high * static_cast(rhs); @@ -2137,7 +2137,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint #elif defined(_M_ARM64) -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const uint128 rhs) noexcept { const auto low_low{lhs.low * rhs.low}; const auto high_low_low{__umulh(lhs.low, rhs.low)}; @@ -2150,7 +2150,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return {high, low_low}; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint64_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint64_t rhs) noexcept { const auto low{lhs.low * rhs}; const auto high{__umulh(lhs.low, rhs) + (lhs.high * rhs)}; @@ -2158,7 +2158,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint return {high, low}; } -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint128_t lhs, const std::uint32_t rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128 msvc_mul(const uint128 lhs, const std::uint32_t rhs) noexcept { const auto low{lhs.low * rhs}; const auto high{__umulh(lhs.low, static_cast(rhs)) + (lhs.high * rhs)}; @@ -2169,7 +2169,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE uint128_t msvc_mul(const uint #endif // MSVC implementations template -BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_mul(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128 default_mul(const uint128 lhs, const UnsignedInteger rhs) noexcept { #if (defined(__aarch64__) || defined(__x86_64__) || defined(__PPC__) || defined(__powerpc__)) && defined(__GNUC__) && defined(BOOST_INT128_HAS_INT128) @@ -2180,14 +2180,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m detail::builtin_u128 new_lhs {}; detail::builtin_u128 new_rhs {}; - std::memcpy(&new_lhs, &lhs, sizeof(uint128_t)); + std::memcpy(&new_lhs, &lhs, sizeof(uint128)); std::memcpy(&new_rhs, &rhs, sizeof(UnsignedInteger)); const auto res {new_lhs * new_rhs}; - uint128_t library_res {}; + uint128 library_res {}; - std::memcpy(&library_res, &res, sizeof(uint128_t)); + std::memcpy(&library_res, &res, sizeof(uint128)); return library_res; } @@ -2195,7 +2195,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m # elif defined(BOOST_INT128_HAS_INT128) # define BOOST_INT128_HIDE_MUL - return static_cast(static_cast(lhs) * static_cast(rhs)); + return static_cast(static_cast(lhs) * static_cast(rhs)); # endif @@ -2212,14 +2212,14 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m #elif defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) # define BOOST_INT128_HIDE_MUL - return static_cast(static_cast(lhs) * static_cast(rhs)); + return static_cast(static_cast(lhs) * static_cast(rhs)); #endif // We need to hide this if we use a non-const eval method above to avoid a litany of cross-platform warnings #ifndef BOOST_INT128_HIDE_MUL - return low_word_mul(lhs, rhs); + return low_word_mul(lhs, rhs); #else #undef BOOST_INT128_HIDE_MUL @@ -2238,7 +2238,7 @@ BOOST_INT128_HOST_DEVICE BOOST_INT128_FORCE_INLINE constexpr uint128_t default_m #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2249,7 +2249,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, cons } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2260,7 +2260,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const SignedInteger lhs, } BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const UnsignedInteger rhs) noexcept { return detail::default_mul(lhs, static_cast(rhs)); } @@ -2270,12 +2270,12 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, cons #endif BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const UnsignedInteger lhs, const uint128 rhs) noexcept { return detail::default_mul(rhs, static_cast(lhs)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator*(const uint128 lhs, const uint128 rhs) noexcept { return detail::default_mul(lhs, rhs); } @@ -2283,49 +2283,49 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator*(const #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { const detail::builtin_u128 rhs_bits {static_cast(rhs)}; const bool rhs_negative {static_cast(static_cast(rhs_bits >> static_cast(64U))) < 0}; - const uint128_t rhs_u {rhs_bits}; - const uint128_t abs_rhs {rhs_negative ? -rhs_u : rhs_u}; - const uint128_t res {lhs * abs_rhs}; + const uint128 rhs_u {rhs_bits}; + const uint128 abs_rhs {rhs_negative ? -rhs_u : rhs_u}; + const uint128 res {lhs * abs_rhs}; return rhs_negative ? -res : res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { const detail::builtin_u128 lhs_bits {static_cast(lhs)}; const bool lhs_negative {static_cast(static_cast(lhs_bits >> static_cast(64U))) < 0}; - const uint128_t lhs_u {lhs_bits}; - const uint128_t abs_lhs {lhs_negative ? -lhs_u : lhs_u}; - const uint128_t res {abs_lhs * rhs}; + const uint128 lhs_u {lhs_bits}; + const uint128 abs_lhs {lhs_negative ? -lhs_u : lhs_u}; + const uint128 res {abs_lhs * rhs}; return lhs_negative ? -res : res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs * static_cast(rhs); + return lhs * static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator*(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator*(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) * rhs; + return static_cast(lhs) * rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator*=(const Integer rhs) noexcept { *this = *this * rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator*=(const uint128 rhs) noexcept { *this = *this * rhs; return *this; @@ -2334,7 +2334,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator*=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator*=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator*=(const Integer rhs) noexcept { *this = *this * rhs; return *this; @@ -2348,35 +2348,35 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator*=(const Integer r // For div we need forward declarations since we mix and match the arguments BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(SignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(SignedInteger lhs, uint128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(UnsignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(UnsignedInteger lhs, uint128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(uint128 lhs, uint128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; - return rhs < 0 ? lhs / static_cast(rhs) : lhs / static_cast(rhs); + return rhs < 0 ? lhs / static_cast(rhs) : lhs / static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; - return lhs < 0 ? static_cast(lhs) / rhs : static_cast(lhs) / rhs; + return lhs < 0 ? static_cast(lhs) / rhs : static_cast(lhs) / rhs; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2391,7 +2391,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons return {0, 0}; } - uint128_t quotient {}; + uint128 quotient {}; detail::one_word_div(lhs, static_cast(rhs), quotient); @@ -2399,7 +2399,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const UnsignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2417,7 +2417,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const UnsignedInteger lhs return {0, static_cast(lhs) / rhs.low}; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator/(const uint128 lhs, const uint128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0U)) { @@ -2440,14 +2440,14 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons return {0, lhs.low / rhs.low}; } - uint128_t quotient {}; + uint128 quotient {}; detail::one_word_div(lhs, rhs.low, quotient); return quotient; } #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return static_cast(static_cast(lhs) / static_cast(rhs)); + return static_cast(static_cast(lhs) / static_cast(rhs)); #else @@ -2458,38 +2458,38 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator/(const uint128_t lhs, cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs / static_cast(rhs); + return lhs / static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator/(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator/(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) / rhs; + return static_cast(lhs) / rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator/=(const Integer rhs) noexcept { *this = *this / rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator/=(const uint128 rhs) noexcept { *this = *this / rhs; return *this; @@ -2498,7 +2498,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator/=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator/=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator/=(const Integer rhs) noexcept { *this = *this / rhs; return *this; @@ -2512,35 +2512,35 @@ BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator/=(const Integer r // For div we need forward declarations since we mix and match the arguments BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, SignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, SignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(SignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(SignedInteger lhs, uint128 rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, UnsignedInteger rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, UnsignedInteger rhs) noexcept; BOOST_INT128_EXPORT template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(UnsignedInteger lhs, uint128_t rhs) noexcept; +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(UnsignedInteger lhs, uint128 rhs) noexcept; -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(uint128_t lhs, uint128_t rhs) noexcept; +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(uint128 lhs, uint128 rhs) noexcept; template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const SignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const SignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; - return rhs < 0 ? lhs % static_cast(rhs) : lhs % static_cast(rhs); + return rhs < 0 ? lhs % static_cast(rhs) : lhs % static_cast(rhs); } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const SignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const SignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; - return lhs < 0 ? static_cast(lhs) % rhs : static_cast(lhs) % rhs; + return lhs < 0 ? static_cast(lhs) % rhs : static_cast(lhs) % rhs; } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const UnsignedInteger rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const UnsignedInteger rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2552,8 +2552,8 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons if (lhs.high != 0) { - uint128_t quotient {}; - uint128_t remainder {}; + uint128 quotient {}; + uint128 remainder {}; detail::one_word_div(lhs, static_cast(rhs), quotient, remainder); @@ -2566,7 +2566,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons } template -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const UnsignedInteger lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const UnsignedInteger lhs, const uint128 rhs) noexcept { using eval_type = detail::evaluation_type_t; @@ -2583,7 +2583,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const UnsignedInteger lhs return {0, static_cast(lhs) % rhs.low}; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 operator%(const uint128 lhs, const uint128 rhs) noexcept { if (BOOST_INT128_UNLIKELY(rhs == 0U)) { @@ -2604,19 +2604,19 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons return {0, lhs.low % rhs.low}; } - uint128_t quotient {}; - uint128_t remainder {}; + uint128 quotient {}; + uint128 remainder {}; detail::one_word_div(lhs, rhs.low, quotient, remainder); return remainder; } #if defined(BOOST_INT128_HAS_INT128) && !defined(__s390__) && !defined(__s390x__) - return static_cast(static_cast(lhs) % static_cast(rhs)); + return static_cast(static_cast(lhs) % static_cast(rhs)); #else - uint128_t remainder {}; + uint128 remainder {}; detail::knuth_div(lhs, rhs, remainder); return remainder; @@ -2625,38 +2625,38 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t operator%(const uint128_t lhs, cons #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const uint128_t lhs, const detail::builtin_u128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const uint128 lhs, const detail::builtin_u128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_u128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_u128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const uint128_t lhs, const detail::builtin_i128 rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const uint128 lhs, const detail::builtin_i128 rhs) noexcept { - return lhs % static_cast(rhs); + return lhs % static_cast(rhs); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128_t operator%(const detail::builtin_i128 lhs, const uint128_t rhs) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE BOOST_INT128_BUILTIN_CONSTEXPR uint128 operator%(const detail::builtin_i128 lhs, const uint128 rhs) noexcept { - return static_cast(lhs) % rhs; + return static_cast(lhs) % rhs; } #endif // BOOST_INT128_HAS_INT128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator%=(const Integer rhs) noexcept { *this = *this % rhs; return *this; } -BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const uint128_t rhs) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128& uint128::operator%=(const uint128 rhs) noexcept { *this = *this % rhs; return *this; @@ -2665,7 +2665,7 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t& uint128_t::operator%=(const uint12 #ifdef BOOST_INT128_HAS_MSVC_INT128 template -BOOST_INT128_HOST_DEVICE inline uint128_t& uint128_t::operator%=(const Integer rhs) noexcept +BOOST_INT128_HOST_DEVICE inline uint128& uint128::operator%=(const Integer rhs) noexcept { * this = *this % rhs; return *this; @@ -2723,15 +2723,15 @@ class numeric_limits_impl_u128 static constexpr bool tinyness_before = false; // Member functions - BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::uint128_t { return {UINT64_MAX, UINT64_MAX}; } - BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::uint128_t { return {0, 0}; } - BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::uint128_t { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (min) () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto lowest () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto (max) () -> boost::int128::uint128 { return {UINT64_MAX, UINT64_MAX}; } + BOOST_INT128_HOST_DEVICE static constexpr auto epsilon () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto round_error () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto infinity () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto quiet_NaN () -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto signaling_NaN() -> boost::int128::uint128 { return {0, 0}; } + BOOST_INT128_HOST_DEVICE static constexpr auto denorm_min () -> boost::int128::uint128 { return {0, 0}; } }; #if !defined(__cpp_inline_variables) || __cpp_inline_variables < 201606L @@ -2794,7 +2794,7 @@ namespace std { #endif template <> -class numeric_limits : +class numeric_limits : public boost::int128::detail::numeric_limits_impl_u128 {}; #ifdef __clang__ diff --git a/include/boost/int128/fmt_format.hpp b/include/boost/int128/fmt_format.hpp index 2199f8b5..030eed3d 100644 --- a/include/boost/int128/fmt_format.hpp +++ b/include/boost/int128/fmt_format.hpp @@ -182,7 +182,7 @@ constexpr auto parse_impl(ParseContext& ctx) break; // LCOV_EXCL_START default: - BOOST_INT128_THROW_EXCEPTION(std::logic_error("Unsupported format specifier")); + BOOST_int128HROW_EXCEPTION(std::logic_error("Unsupported format specifier")); // LCOV_EXCL_STOP } } @@ -190,7 +190,7 @@ constexpr auto parse_impl(ParseContext& ctx) // Verify we're at the closing brace if (it != ctx.end() && *it != '}') { - BOOST_INT128_THROW_EXCEPTION(std::logic_error("Expected '}' in format string")); // LCOV_EXCL_LINE + BOOST_int128HROW_EXCEPTION(std::logic_error("Expected '}' in format string")); // LCOV_EXCL_LINE } return std::make_tuple(base, padding_digits, sign, is_upper, prefix, zero_pad, fill_char, align, it); @@ -199,7 +199,7 @@ constexpr auto parse_impl(ParseContext& ctx) template struct is_library_type_impl { - static constexpr bool value {std::is_same::value || std::is_same::value}; + static constexpr bool value {std::is_same::value || std::is_same::value}; }; template @@ -248,31 +248,31 @@ struct formatter { char buffer[detail::mini_to_chars_buffer_size]; bool isneg {false}; - boost::int128::uint128_t abs_v {}; + boost::int128::uint128 abs_v {}; - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { if (v < T{0}) { isneg = true; - // Can't negate int128_t::min(), handle specially + // Can't negate int128::min(), handle specially if (v == (std::numeric_limits::min)()) { - abs_v = boost::int128::uint128_t{UINT64_C(0x8000000000000000), 0}; + abs_v = boost::int128::uint128{UINT64_C(0x8000000000000000), 0}; } else { - abs_v = static_cast(-v); + abs_v = static_cast(-v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } const auto end = detail::mini_to_chars(buffer, abs_v, base, is_upper); @@ -376,7 +376,7 @@ struct formatter { s.insert(s.begin(), ' '); } - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { if (isneg) { @@ -385,7 +385,7 @@ struct formatter } break; case sign_option::negative: - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { if (isneg) { @@ -444,10 +444,10 @@ struct formatter namespace fmt { template <> -struct formatter : public boost::int128::fmt_detail::formatter {}; +struct formatter : public boost::int128::fmt_detail::formatter {}; template <> -struct formatter : public boost::int128::fmt_detail::formatter {}; +struct formatter : public boost::int128::fmt_detail::formatter {}; } // namespace fmt diff --git a/include/boost/int128/format.hpp b/include/boost/int128/format.hpp index 851e5510..d5589f1e 100644 --- a/include/boost/int128/format.hpp +++ b/include/boost/int128/format.hpp @@ -175,14 +175,14 @@ constexpr auto parse_impl(ParseContext& ctx) is_upper = true; break; default: // LCOV_EXCL_LINE - BOOST_INT128_THROW_EXCEPTION(std::format_error("Unsupported format specifier")); // LCOV_EXCL_LINE + BOOST_int128HROW_EXCEPTION(std::format_error("Unsupported format specifier")); // LCOV_EXCL_LINE } } // Verify we're at the closing brace if (it != ctx.end() && *it != '}') { - BOOST_INT128_THROW_EXCEPTION(std::format_error("Expected '}' in format string")); // LCOV_EXCL_LINE + BOOST_int128HROW_EXCEPTION(std::format_error("Expected '}' in format string")); // LCOV_EXCL_LINE } return std::make_tuple(base, padding_digits, sign, is_upper, prefix, zero_pad, fill_char, align, it); @@ -191,7 +191,7 @@ constexpr auto parse_impl(ParseContext& ctx) template struct is_library_type_impl { - static constexpr bool value {std::is_same_v || std::is_same_v}; + static constexpr bool value {std::is_same_v || std::is_same_v}; }; template @@ -247,31 +247,31 @@ struct formatter { char buffer[boost::int128::detail::mini_to_chars_buffer_size]; bool isneg {false}; - boost::int128::uint128_t abs_v {}; + boost::int128::uint128 abs_v {}; - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (v < 0) { isneg = true; - // Can't negate int128_t::min(), handle specially + // Can't negate int128::min(), handle specially if (v == (std::numeric_limits::min)()) { - abs_v = boost::int128::uint128_t{UINT64_C(0x8000000000000000), 0}; + abs_v = boost::int128::uint128{UINT64_C(0x8000000000000000), 0}; } else { - abs_v = static_cast(-v); + abs_v = static_cast(-v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } } else { - abs_v = static_cast(v); + abs_v = static_cast(v); } const auto end = boost::int128::detail::mini_to_chars(buffer, abs_v, base, is_upper); @@ -375,7 +375,7 @@ struct formatter { s.insert(s.begin(), ' '); } - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (isneg) { @@ -384,7 +384,7 @@ struct formatter } break; case boost::int128::detail::sign_option::negative: - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { if (isneg) { diff --git a/include/boost/int128/hash.hpp b/include/boost/int128/hash.hpp index 83ec5dbb..d1255fa4 100644 --- a/include/boost/int128/hash.hpp +++ b/include/boost/int128/hash.hpp @@ -49,9 +49,9 @@ inline std::size_t hash_finalize_64(std::uint64_t v) noexcept namespace std { template <> -struct hash +struct hash { - auto operator()(const boost::int128::int128_t v) const noexcept -> std::size_t + auto operator()(const boost::int128::int128 v) const noexcept -> std::size_t { const std::size_t low_hash {boost::int128::detail::hash_finalize_64(v.low)}; const std::size_t high_hash {boost::int128::detail::hash_finalize_64(v.high)}; @@ -62,9 +62,9 @@ struct hash }; template <> -struct hash +struct hash { - auto operator()(const boost::int128::uint128_t v) const noexcept -> std::size_t + auto operator()(const boost::int128::uint128 v) const noexcept -> std::size_t { const std::size_t low_hash {boost::int128::detail::hash_finalize_64(v.low)}; const std::size_t high_hash {boost::int128::detail::hash_finalize_64(v.high)}; @@ -79,14 +79,14 @@ struct hash namespace boost { namespace int128 { -inline std::size_t hash_value(const uint128_t v) noexcept +inline std::size_t hash_value(const uint128 v) noexcept { - return std::hash{}(v); + return std::hash{}(v); } -inline std::size_t hash_value(const int128_t v) noexcept +inline std::size_t hash_value(const int128 v) noexcept { - return std::hash{}(v); + return std::hash{}(v); } } // namespace int128 diff --git a/include/boost/int128/iostream.hpp b/include/boost/int128/iostream.hpp index 878e4610..679ebca2 100644 --- a/include/boost/int128/iostream.hpp +++ b/include/boost/int128/iostream.hpp @@ -28,7 +28,7 @@ namespace detail { template struct streamable_overload { - static constexpr bool value = std::is_same::value || std::is_same::value; + static constexpr bool value = std::is_same::value || std::is_same::value; }; template diff --git a/include/boost/int128/literals.hpp b/include/boost/int128/literals.hpp index 47b18d8a..d11cf277 100644 --- a/include/boost/int128/literals.hpp +++ b/include/boost/int128/literals.hpp @@ -15,44 +15,44 @@ namespace boost { namespace int128 { namespace literals { -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_u128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_u128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t operator ""_U128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 operator ""_U128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str) noexcept { - return detail::parse_literal(str, str + detail::strlen(str)); + return detail::parse_literal(str, str + detail::strlen(str)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_i128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_i128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t operator ""_I128(const char* str, std::size_t len) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 operator ""_I128(const char* str, std::size_t len) noexcept { - return detail::parse_literal(str, str + len); + return detail::parse_literal(str, str + len); } } // namespace literals diff --git a/include/boost/int128/numeric.hpp b/include/boost/int128/numeric.hpp index ba104d6d..5a184bcb 100644 --- a/include/boost/int128/numeric.hpp +++ b/include/boost/int128/numeric.hpp @@ -34,8 +34,8 @@ struct reduced_integers std::is_same::value || std::is_same::value || std::is_same::value || - std::is_same::value || - std::is_same::value}; + std::is_same::value || + std::is_same::value}; }; #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) @@ -54,25 +54,25 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_reduced_integer_v {reduced_integers::max)(); + return (std::numeric_limits::max)(); } return z; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_sub(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_sub(const uint128 x, const uint128 y) noexcept { const auto z {x - y}; if (z > x) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } return z; @@ -84,7 +84,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_sub( # pragma warning(disable : 4146) // Unary minus applied to unsigned type #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_add(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_add(const int128 x, const int128 y) noexcept { // Detect overflow BEFORE the addition to avoid signed overflow UB. // When both are non-negative: overflow iff x > max - y (subtraction safe: max - non_negative >= 0) @@ -93,23 +93,23 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_add(c if (x.signed_high() >= 0 && y.signed_high() >= 0) { - if (x > (std::numeric_limits::max)() - y) + if (x > (std::numeric_limits::max)() - y) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } else if (x.signed_high() < 0 && y.signed_high() < 0) { - if (x < (std::numeric_limits::min)() - y) + if (x < (std::numeric_limits::min)() - y) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } } return x + y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_sub(const int128 x, const int128 y) noexcept { // Detect overflow BEFORE the subtraction to avoid signed overflow UB. // Positive overflow: x >= 0 and y < 0 and x > max + y (safe: max + negative < max) @@ -118,16 +118,16 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(c if (x.signed_high() >= 0 && y.signed_high() < 0) { - if (x > (std::numeric_limits::max)() + y) + if (x > (std::numeric_limits::max)() + y) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } else if (x.signed_high() < 0 && y.signed_high() >= 0) { - if (x < (std::numeric_limits::min)() + y) + if (x < (std::numeric_limits::min)() + y) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } } @@ -138,51 +138,51 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_sub(c # pragma warning(pop) #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_mul(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_mul(const uint128 x, const uint128 y) noexcept { const auto x_bits {bit_width(x)}; const auto y_bits {bit_width(y)}; - if ((x_bits + y_bits) > std::numeric_limits::digits) + if ((x_bits + y_bits) > std::numeric_limits::digits) { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } return x * y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_mul(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_mul(const int128 x, const int128 y) noexcept { - const auto x_bits {bit_width(static_cast(abs(x)))}; - const auto y_bits {bit_width(static_cast(abs(y)))}; + const auto x_bits {bit_width(static_cast(abs(x)))}; + const auto y_bits {bit_width(static_cast(abs(y)))}; - if ((x_bits + y_bits) > std::numeric_limits::digits) + if ((x_bits + y_bits) > std::numeric_limits::digits) { if ((x < 0) != (y < 0)) { - return (std::numeric_limits::min)(); + return (std::numeric_limits::min)(); } else { - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } } - const int128_t res {x * y}; + const int128 res {x * y}; return res; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t saturating_div(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 saturating_div(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_div(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 saturating_div(const int128 x, const int128 y) noexcept { - if (BOOST_INT128_UNLIKELY(x == (std::numeric_limits::min)() && y == -1)) + if (BOOST_INT128_UNLIKELY(x == (std::numeric_limits::min)() && y == -1)) { // This is the only possible case of overflow - return (std::numeric_limits::max)(); + return (std::numeric_limits::max)(); } return x / y; @@ -194,15 +194,15 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t saturating_div(c #endif BOOST_INT128_EXPORT template , bool> = true> -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128_t value) noexcept +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128 value) noexcept { - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { return static_cast(value); } else { - if (value > static_cast((std::numeric_limits::max)())) + if (value > static_cast((std::numeric_limits::max)())) { return (std::numeric_limits::max)(); } @@ -216,16 +216,16 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const uint128_t va #endif BOOST_INT128_EXPORT template , bool> = true> -BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t value) noexcept +BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128 value) noexcept { - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { return static_cast(value); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) - else BOOST_INT128_IF_CONSTEXPR (std::is_same::value || std::is_same::value) + else BOOST_INT128_IF_CONSTEXPR (std::is_same::value || std::is_same::value) #else - else BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + else BOOST_INT128_IF_CONSTEXPR (std::is_same::value) #endif { // We can't possibly have overflow in this case @@ -233,11 +233,11 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t val } else { - if (value > static_cast((std::numeric_limits::max)())) + if (value > static_cast((std::numeric_limits::max)())) { return (std::numeric_limits::max)(); } - else if (value < static_cast((std::numeric_limits::min)())) + else if (value < static_cast((std::numeric_limits::min)())) { return (std::numeric_limits::min)(); } @@ -248,7 +248,7 @@ BOOST_INT128_HOST_DEVICE constexpr TargetType saturating_cast(const int128_t val namespace detail { -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64(std::uint64_t x, std::uint64_t y) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64(std::uint64_t x, std::uint64_t y) noexcept { if (x == 0) { @@ -280,7 +280,7 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr std::uint64_t gcd64( } // namespace detail -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a, uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 gcd(uint128 a, uint128 b) noexcept { // Base case if (a == 0U) @@ -304,7 +304,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a if (a > b) { - const uint128_t temp {a}; + const uint128 temp {a}; a = b; b = temp; } @@ -314,12 +314,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t gcd(uint128_t a // Stop doing 128-bit math as soon as we can const auto g {detail::gcd64(a.low, b.low)}; - return uint128_t{0, g} << shift; + return uint128{0, g} << shift; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t gcd(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 gcd(const int128 a, const int128 b) noexcept { - return static_cast(gcd(static_cast(abs(a)), static_cast(abs(b)))); + return static_cast(gcd(static_cast(abs(a)), static_cast(abs(b)))); } // For unknown reasons this implementation fails for MSVC x86 only in release mode @@ -327,11 +327,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t gcd(const int128 // but very slow impl that we know works. #if !(defined(_M_IX86) && !defined(_NDEBUG)) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(const uint128_t a, const uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 lcm(const uint128 a, const uint128 b) noexcept { if (a == 0U || b == 0U) { - return static_cast(0); + return static_cast(0); } // Calculate GCD first @@ -343,11 +343,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(const uint1 #else -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a, uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 lcm(uint128 a, uint128 b) noexcept { if (a == 0U || b == 0U) { - return uint128_t{0}; + return uint128{0}; } @@ -365,7 +365,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a std::swap(a, b); } - uint128_t lcm{a}; + uint128 lcm{a}; while (lcm % b != 0U) { @@ -377,12 +377,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t lcm(uint128_t a #endif -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t lcm(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 lcm(const int128 a, const int128 b) noexcept { - return static_cast(lcm(static_cast(abs(a)), static_cast(abs(b)))); + return static_cast(lcm(static_cast(abs(a)), static_cast(abs(b)))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t midpoint(const uint128_t a, const uint128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 midpoint(const uint128 a, const uint128 b) noexcept { // Bit manipulation formula works for unsigned integers auto mid {(a & b) + ((a ^ b) >> 1)}; @@ -396,7 +396,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t midpoint(const return mid; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const int128_t a, const int128_t b) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 midpoint(const int128 a, const int128 b) noexcept { // For signed integers, we use a + (b - a) / 2 or a - (a - b) / 2 // The subtraction is done in unsigned arithmetic to handle overflow correctly @@ -404,10 +404,10 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const i // // Use direct field access for both the uint128 construction and the // comparison to avoid NVCC host compiler issues with operator<= and - // static_cast on int128_t for large-magnitude values + // static_cast on int128 for large-magnitude values - const uint128_t ua {a.high, a.low}; - const uint128_t ub {b.high, b.low}; + const uint128 ua {a.high, a.low}; + const uint128 ub {b.high, b.low}; const bool a_le_b {a.high == b.high ? a.low <= b.low : a.signed_high() < b.signed_high()}; @@ -415,13 +415,13 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t midpoint(const i { // diff = b - a (computed in unsigned, handles wrap-around correctly) const auto diff {ub - ua}; - return a + static_cast(diff / 2U); + return a + static_cast(diff / 2U); } else { // diff = a - b (computed in unsigned, handles wrap-around correctly) const auto diff {ua - ub}; - return a - static_cast(diff / 2U); + return a - static_cast(diff / 2U); } } @@ -460,7 +460,7 @@ BOOST_INT128_HOST_DEVICE constexpr std::strong_ordering operator<=>(const div_re namespace detail { // -1 when the exact quotient of x / y is negative, and 1 otherwise -BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128_t x, const int128_t y) noexcept +BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128 x, const int128 y) noexcept { return (x < 0) != (y < 0) ? -1 : 1; } @@ -468,12 +468,12 @@ BOOST_INT128_HOST_DEVICE constexpr int quotient_sign(const int128_t x, const int // Applies the quotient offset d (-1, 0, or 1) to a truncated division result, and returns the // remainder matching the adjusted quotient. The remainder is evaluated in unsigned arithmetic // so that the d * y term cannot overflow when y is INT128_MIN. -BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i128div_t truncated, const int128_t y, const int d) noexcept +BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i128div_t truncated, const int128 y, const int d) noexcept { - const uint128_t unsigned_rem {truncated.rem.high, truncated.rem.low}; - const uint128_t unsigned_y {y.high, y.low}; + const uint128 unsigned_rem {truncated.rem.high, truncated.rem.low}; + const uint128 unsigned_y {y.high, y.low}; - uint128_t rem {unsigned_rem}; + uint128 rem {unsigned_rem}; if (d > 0) { @@ -484,14 +484,14 @@ BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const i1 rem = unsigned_rem + unsigned_y; } - return div_result{truncated.quot + d, static_cast(rem)}; + return div_result{truncated.quot + d, static_cast(rem)}; } // An unsigned quotient is never rounded down, so the only offsets are 0 and 1. The remainder // of an incremented quotient is negative, and is returned reduced modulo 2^128. -BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u128div_t truncated, const uint128_t y, const bool increment) noexcept +BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u128div_t truncated, const uint128 y, const bool increment) noexcept { - return div_result{increment ? truncated.quot + 1U : truncated.quot, + return div_result{increment ? truncated.quot + 1U : truncated.quot, increment ? truncated.rem - y : truncated.rem}; } @@ -499,31 +499,31 @@ BOOST_INT128_HOST_DEVICE constexpr div_result offset_quotient(const u // magnitude when the remainder is more than half the divisor. truncate_ties selects the strict // form, which both breaks an exact tie towards zero and recovers the bit that abs(y) / 2 drops // when y is odd. -BOOST_INT128_HOST_DEVICE constexpr bool nearest_increment(const uint128_t abs_rem, const uint128_t abs_half_y, const bool truncate_ties) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool nearest_increment(const uint128 abs_rem, const uint128 abs_half_y, const bool truncate_ties) noexcept { return truncate_ties ? abs_rem > abs_half_y : abs_rem >= abs_half_y; } // Magnitude of the remainder of a truncated signed division. The magnitude is always less // than abs(y), so it is representable for every valid divisor. -BOOST_INT128_HOST_DEVICE constexpr uint128_t abs_remainder(const i128div_t truncated) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 abs_remainder(const i128div_t truncated) noexcept { - return static_cast(abs(truncated.rem)); + return static_cast(abs(truncated.rem)); } // floor(abs(y) / 2), exact for every y including INT128_MIN -BOOST_INT128_HOST_DEVICE constexpr uint128_t abs_half_divisor(const int128_t y) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 abs_half_divisor(const int128 y) noexcept { - return static_cast(abs(y)) >> 1U; + return static_cast(abs(y)) >> 1U; } // An odd divisor cannot produce an exact tie, so every ties function truncates on it -BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const int128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const int128 x) noexcept { return (x.low & 1U) != 0U; } -BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128_t x) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128 x) noexcept { return (x.low & 1U) != 0U; } @@ -531,180 +531,180 @@ BOOST_INT128_HOST_DEVICE constexpr bool is_odd(const uint128_t x) noexcept } // namespace detail // Rounds towards zero, which is what operator/ already does -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_zero(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_zero(const int128 x, const int128 y) noexcept { return x / y; } // Rounds away from zero, so the quotient grows in magnitude unless the division is exact -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0U); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_away_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0 ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_away_zero(const uint128 x, const uint128 y) noexcept { return div_rem_away_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_away_zero(const int128 x, const int128 y) noexcept { return div_rem_away_zero(x, y).quotient; } // Rounds towards positive infinity, which for an unsigned quotient is away from zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem != 0U); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_pos_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto adjust {truncated.rem != 0 && detail::quotient_sign(x, y) > 0}; return detail::offset_quotient(truncated, y, adjust ? 1 : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_pos_inf(const uint128 x, const uint128 y) noexcept { return div_rem_to_pos_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_pos_inf(const int128 x, const int128 y) noexcept { return div_rem_to_pos_inf(x, y).quotient; } // Rounds towards negative infinity, which for an unsigned quotient is truncation -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_to_neg_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto adjust {truncated.rem != 0 && detail::quotient_sign(x, y) < 0}; return detail::offset_quotient(truncated, y, adjust ? -1 : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_to_neg_inf(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_to_neg_inf(const int128 x, const int128 y) noexcept { return div_rem_to_neg_inf(x, y).quotient; } // Euclidean division, whose remainder is always in [0, abs(y)). Only a negative remainder // needs fixing, and growing the quotient magnitude by one makes the remainder positive. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; - return div_result{truncated.quot, truncated.rem}; + return div_result{truncated.quot, truncated.rem}; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_euclid(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, truncated.rem < 0 ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_euclid(const uint128 x, const uint128 y) noexcept { return x / y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_euclid(const int128 x, const int128 y) noexcept { return div_rem_euclid(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, true)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(detail::abs_remainder(truncated), detail::abs_half_divisor(y), true)}; return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_zero(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_zero(const int128 x, const int128 y) noexcept { return div_rem_ties_to_zero(x, y).quotient; } // Rounds to nearest, breaking an exact tie away from zero -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_away_zero(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(detail::abs_remainder(truncated), detail::abs_half_divisor(y), detail::is_odd(y))}; return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_away_zero(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_away_zero(const uint128 x, const uint128 y) noexcept { return div_rem_ties_away_zero(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_away_zero(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_away_zero(const int128 x, const int128 y) noexcept { return div_rem_ties_away_zero(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards positive infinity. A tie only grows the // magnitude when the quotient is positive. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y))); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_pos_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto sign {detail::quotient_sign(x, y)}; @@ -712,25 +712,25 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? sign : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_pos_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_pos_inf(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_pos_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_pos_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_pos_inf(const int128 x, const int128 y) noexcept { return div_rem_ties_to_pos_inf(x, y).quotient; } // Rounds to nearest, breaking an exact tie towards negative infinity. A tie only grows the // magnitude when the quotient is negative, so an unsigned tie always truncates. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; return detail::offset_quotient(truncated, y, detail::nearest_increment(truncated.rem, y >> 1U, true)); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_neg_inf(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto sign {detail::quotient_sign(x, y)}; @@ -738,26 +738,26 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? sign : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_neg_inf(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_neg_inf(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_neg_inf(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_neg_inf(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_neg_inf(const int128 x, const int128 y) noexcept { return div_rem_ties_to_neg_inf(x, y).quotient; } // Rounds to nearest, breaking an exact tie to the odd quotient, so a tie only grows the // magnitude when truncation would have produced an even quotient -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y) || detail::is_odd(truncated.quot))}; return detail::offset_quotient(truncated, y, increment); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_odd(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto truncate_ties {detail::is_odd(y) || detail::is_odd(truncated.quot)}; @@ -765,26 +765,26 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_odd(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_odd(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_odd(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_odd(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_odd(const int128 x, const int128 y) noexcept { return div_rem_ties_to_odd(x, y).quotient; } // Rounds to nearest, breaking an exact tie to the even quotient, so a tie only grows the // magnitude when truncation would have produced an odd quotient -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const uint128 x, const uint128 y) noexcept { const auto truncated {div(x, y)}; const auto increment {detail::nearest_increment(truncated.rem, y >> 1U, detail::is_odd(y) || !detail::is_odd(truncated.quot))}; return detail::offset_quotient(truncated, y, increment); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_rem_ties_to_even(const int128 x, const int128 y) noexcept { const auto truncated {div(x, y)}; const auto truncate_ties {detail::is_odd(y) || !detail::is_odd(truncated.quot)}; @@ -792,31 +792,31 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr div_result div_ return detail::offset_quotient(truncated, y, increment ? detail::quotient_sign(x, y) : 0); } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t div_ties_to_even(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 div_ties_to_even(const uint128 x, const uint128 y) noexcept { return div_rem_ties_to_even(x, y).quotient; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t div_ties_to_even(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 div_ties_to_even(const int128 x, const int128 y) noexcept { return div_rem_ties_to_even(x, y).quotient; } // The Euclidean remainder, which is always in [0, abs(y)). Only a negative remainder needs // fixing, and abs(y) is added in unsigned arithmetic so that INT128_MIN is handled. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t rem_euclid(const uint128_t x, const uint128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 rem_euclid(const uint128 x, const uint128 y) noexcept { return x % y; } -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t rem_euclid(const int128_t x, const int128_t y) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 rem_euclid(const int128 x, const int128 y) noexcept { const auto rem {x % y}; if (rem < 0) { - const uint128_t unsigned_rem {rem.high, rem.low}; - return static_cast(unsigned_rem + static_cast(abs(y))); + const uint128 unsigned_rem {rem.high, rem.low}; + return static_cast(unsigned_rem + static_cast(abs(y))); } return rem; diff --git a/include/boost/int128/random.hpp b/include/boost/int128/random.hpp index 82e2975b..adc58bdb 100644 --- a/include/boost/int128/random.hpp +++ b/include/boost/int128/random.hpp @@ -15,79 +15,79 @@ template struct make_unsigned_imp; template <> -struct make_unsigned_imp +struct make_unsigned_imp { - using type = int128::uint128_t; + using type = int128::uint128; }; template <> -struct make_unsigned_imp +struct make_unsigned_imp { - using type = int128::uint128_t; + using type = int128::uint128; }; template struct make_unsigned; template <> -struct make_unsigned +struct make_unsigned { - using type = int128::uint128_t; + using type = int128::uint128; }; template <> -struct make_unsigned +struct make_unsigned { - using type = int128::int128_t; + using type = int128::int128; }; template struct make_unsigned_or_unbounded_imp; template <> -struct make_unsigned_or_unbounded_imp +struct make_unsigned_or_unbounded_imp { - using type = int128::uint128_t; + using type = int128::uint128; }; template <> -struct make_unsigned_or_unbounded_imp +struct make_unsigned_or_unbounded_imp { - using type = int128::uint128_t; + using type = int128::uint128; }; template struct make_unsigned_or_unbounded; template <> -struct make_unsigned_or_unbounded +struct make_unsigned_or_unbounded { - using type = int128::uint128_t; + using type = int128::uint128; }; template <> -struct make_unsigned_or_unbounded +struct make_unsigned_or_unbounded { - using type = int128::uint128_t; + using type = int128::uint128; }; template struct is_integral; template <> -struct is_integral : std::true_type {}; +struct is_integral : std::true_type {}; template <> -struct is_integral : std::true_type {}; +struct is_integral : std::true_type {}; template struct is_signed; template <> -struct is_signed : std::false_type {}; +struct is_signed : std::false_type {}; template <> -struct is_signed : std::true_type {}; +struct is_signed : std::true_type {}; } // namespace traits } // namespace random diff --git a/include/boost/int128/string.hpp b/include/boost/int128/string.hpp index 4d1d94e6..0eec29a2 100644 --- a/include/boost/int128/string.hpp +++ b/include/boost/int128/string.hpp @@ -18,7 +18,7 @@ namespace boost { namespace int128 { template -auto to_string(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::string> +auto to_string(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::string> { char buffer[detail::mini_to_chars_buffer_size]; const auto last {detail::mini_to_chars(buffer, value, 10, false)}; @@ -26,7 +26,7 @@ auto to_string(const T& value) -> std::enable_if_t<(std::is_same::v } template -auto to_wstring(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::wstring> +auto to_wstring(const T& value) -> std::enable_if_t<(std::is_same::value || std::is_same::value), std::wstring> { char buffer[detail::mini_to_chars_buffer_size]; const auto last {detail::mini_to_chars(buffer, value, 10, false)}; diff --git a/include/boost/int128/utilities.hpp b/include/boost/int128/utilities.hpp index 2ccf907e..01fed4c0 100644 --- a/include/boost/int128/utilities.hpp +++ b/include/boost/int128/utilities.hpp @@ -24,9 +24,9 @@ namespace int128 { namespace detail { // Modular addition for 128-bit operands assuming 0 <= a, b < m -BOOST_INT128_HOST_DEVICE constexpr uint128_t addmod(const uint128_t a, const uint128_t b, const uint128_t m) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 addmod(const uint128 a, const uint128 b, const uint128 m) noexcept { - const uint128_t s {a + b}; + const uint128 s {a + b}; if (s < a || s >= m) { @@ -37,9 +37,9 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t addmod(const uint128_t a, const uin } // Modular multiplication via shift-and-add for the full 128-bit modulus case -BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t mulmod_shift(uint128_t a, uint128_t b, const uint128_t m) noexcept +BOOST_int128EST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 mulmod_shift(uint128 a, uint128 b, const uint128 m) noexcept { - uint128_t result {0}; + uint128 result {0}; while (b != 0U) { @@ -58,42 +58,42 @@ BOOST_INT128_TEST_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t mulmod_shi // Modular multiplication when the modulus fits in 64 bits BOOST_INT128_HOST_DEVICE constexpr std::uint64_t mulmod_word(const std::uint64_t a, const std::uint64_t b, const std::uint64_t m) noexcept { - return ((uint128_t{a} * uint128_t{b}) % uint128_t{m}).low; + return ((uint128{a} * uint128{b}) % uint128{m}).low; } } // namespace detail // Computes (base ^ exp) mod m using fast modular exponentiation with // optimizations specific to the boost::int128 library types -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t base, uint128_t exp, const uint128_t m) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 powm(uint128 base, uint128 exp, const uint128 m) noexcept { if (BOOST_INT128_UNLIKELY(m == 0U)) { - return uint128_t{0}; + return uint128{0}; } if (m == 1U) { - return uint128_t{0}; + return uint128{0}; } if (exp == 0U) { - return uint128_t{1}; + return uint128{1}; } base %= m; if (base == 0U) { - return uint128_t{0}; + return uint128{0}; } // Power-of-two modulus: reduction is just a bitmask. if (has_single_bit(m)) { - const uint128_t mask {m - 1U}; - uint128_t result {1}; + const uint128 mask {m - 1U}; + uint128 result {1}; while (exp != 0U) { @@ -127,12 +127,12 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t exp >>= 1; } - return uint128_t{result}; + return uint128{result}; } // General 128-bit modulus: shift-and-add for each squaring keeps every // intermediate strictly below m without needing a 256-bit product. - uint128_t result {1}; + uint128 result {1}; while (exp != 0U) { @@ -149,36 +149,36 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t powm(uint128_t } // Signed overload. Returns the non-negative residue in [0, m) -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t powm(const int128_t base, const int128_t exp, const int128_t m) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 powm(const int128 base, const int128 exp, const int128 m) noexcept { if (BOOST_INT128_UNLIKELY(m <= 0 || exp < 0)) { - return int128_t{0}; + return int128{0}; } - const uint128_t um {static_cast(m)}; + const uint128 um {static_cast(m)}; - uint128_t ub {}; + uint128 ub {}; if (base.signed_high() < 0) { - const uint128_t magnitude {static_cast(abs(base))}; - const uint128_t r {magnitude % um}; - ub = r == 0U ? uint128_t{0} : static_cast(um - r); + const uint128 magnitude {static_cast(abs(base))}; + const uint128 r {magnitude % um}; + ub = r == 0U ? uint128{0} : static_cast(um - r); } else { - ub = static_cast(base) % um; + ub = static_cast(base) % um; } - return static_cast(powm(ub, static_cast(exp), um)); + return static_cast(powm(ub, static_cast(exp), um)); } // Computes base^exp using exponentiation by squaring. The result is reduced // modulo 2^128, mirroring the wrap-around behavior of operator*. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t ipow(uint128_t base, std::uint64_t exp) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 ipow(uint128 base, std::uint64_t exp) noexcept { - uint128_t result {1}; + uint128 result {1}; while (exp != 0U) { @@ -199,9 +199,9 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t ipow(uint128_t } // Signed overload. Wraps modulo 2^128 on overflow, matching operator*. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t ipow(int128_t base, std::uint64_t exp) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 ipow(int128 base, std::uint64_t exp) noexcept { - int128_t result {1}; + int128 result {1}; while (exp != 0U) { @@ -222,7 +222,7 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t ipow(int128_t ba } // Integer square root: returns floor(sqrt(n)). -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uint128_t n) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128 isqrt(const uint128 n) noexcept { if (n < 2U) { @@ -230,11 +230,11 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uin } // 2^ceil(bit_width(n)/2) is the smallest power of two whose square exceeds n. - uint128_t x {uint128_t{1} << ((bit_width(n) + 1) / 2)}; + uint128 x {uint128{1} << ((bit_width(n) + 1) / 2)}; while (true) { - const uint128_t y {(x + n / x) >> 1}; + const uint128 y {(x + n / x) >> 1}; if (y >= x) { @@ -246,14 +246,14 @@ BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr uint128_t isqrt(const uin } // Signed overload. Negative inputs are documented to return 0. -BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128_t isqrt(const int128_t n) noexcept +BOOST_INT128_EXPORT BOOST_INT128_HOST_DEVICE constexpr int128 isqrt(const int128 n) noexcept { if (BOOST_INT128_UNLIKELY(n < 0)) { - return int128_t{0}; + return int128{0}; } - return static_cast(isqrt(static_cast(n))); + return static_cast(isqrt(static_cast(n))); } namespace detail { @@ -266,22 +266,22 @@ struct valid_checked_type : std::integral_constant::va !std::is_same::value> {}; template <> -struct valid_checked_type : std::true_type {}; +struct valid_checked_type : std::true_type {}; template <> -struct valid_checked_type : std::true_type {}; +struct valid_checked_type : std::true_type {}; -// Widen an integer operand to its 128-bit two's complement bit pattern, returned as a uint128_t +// Widen an integer operand to its 128-bit two's complement bit pattern, returned as a uint128 template -BOOST_INT128_HOST_DEVICE constexpr uint128_t ckd_widen(const T value) noexcept +BOOST_INT128_HOST_DEVICE constexpr uint128 ckd_widen(const T value) noexcept { BOOST_INT128_IF_CONSTEXPR (std::numeric_limits::is_signed) { - return static_cast(static_cast(value)); + return static_cast(static_cast(value)); } else { - return static_cast(value); + return static_cast(value); } } @@ -289,35 +289,35 @@ BOOST_INT128_HOST_DEVICE constexpr uint128_t ckd_widen(const T value) noexcept // image. magnitude is the absolute value; negative records the sign. struct ckd_operand { - uint128_t raw; - uint128_t magnitude; + uint128 raw; + uint128 magnitude; bool negative; }; template BOOST_INT128_HOST_DEVICE constexpr ckd_operand ckd_decompose(const T value) noexcept { - const uint128_t raw {ckd_widen(value)}; + const uint128 raw {ckd_widen(value)}; const bool negative {std::numeric_limits::is_signed && ((raw >> 127) != 0U)}; - return ckd_operand{raw, negative ? uint128_t{0} - raw : raw, negative}; + return ckd_operand{raw, negative ? uint128{0} - raw : raw, negative}; } // Exact signed sum of two operands given as (magnitude, sign). carry marks a // 129th bit, which no 128-bit or narrower target can represent. struct ckd_sum_result { - uint128_t magnitude; + uint128 magnitude; bool negative; bool carry; }; -BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128_t a_magnitude, const bool a_negative, - const uint128_t b_magnitude, const bool b_negative) noexcept +BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128 a_magnitude, const bool a_negative, + const uint128 b_magnitude, const bool b_negative) noexcept { if (a_negative == b_negative) { // Equal signs: magnitudes add and may overflow into a 129th bit. - const uint128_t magnitude {a_magnitude + b_magnitude}; + const uint128 magnitude {a_magnitude + b_magnitude}; return ckd_sum_result{magnitude, a_negative, magnitude < a_magnitude}; } @@ -333,18 +333,18 @@ BOOST_INT128_HOST_DEVICE constexpr ckd_sum_result ckd_signed_sum(const uint128_t // Whether a result of the given sign and magnitude fits in T1. exceeds_width // forces overflow when the true magnitude does not even fit in 128 bits. template -BOOST_INT128_HOST_DEVICE constexpr bool ckd_overflows(const uint128_t magnitude, const bool negative, const bool exceeds_width) noexcept +BOOST_INT128_HOST_DEVICE constexpr bool ckd_overflows(const uint128 magnitude, const bool negative, const bool exceeds_width) noexcept { if (exceeds_width) { return true; } - const uint128_t max_magnitude {static_cast((std::numeric_limits::max)())}; + const uint128 max_magnitude {static_cast((std::numeric_limits::max)())}; if (negative) { - const uint128_t min_magnitude {std::numeric_limits::is_signed ? max_magnitude + uint128_t{1} : uint128_t{0}}; + const uint128 min_magnitude {std::numeric_limits::is_signed ? max_magnitude + uint128{1} : uint128{0}}; return magnitude > min_magnitude; } @@ -425,9 +425,9 @@ BOOST_INT128_HOST_DEVICE constexpr bool ckd_mul(T1* result, const T2 a, const T3 // UINT128_MAX. Dividing the maximum by one magnitude tests that without // forming a 256-bit product. const bool exceeds_width {op_a.magnitude != 0U && - op_b.magnitude > ((std::numeric_limits::max)() / op_a.magnitude)}; + op_b.magnitude > ((std::numeric_limits::max)() / op_a.magnitude)}; - const uint128_t product_magnitude {op_a.magnitude * op_b.magnitude}; + const uint128 product_magnitude {op_a.magnitude * op_b.magnitude}; const bool product_negative {op_a.negative != op_b.negative}; return detail::ckd_overflows(product_magnitude, product_negative, exceeds_width); @@ -460,8 +460,8 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_type_v = valid_comparison // Allow the builtins to be used when available template -BOOST_INT128_INLINE_CONSTEXPR bool is_int128_type_v = std::is_same::value || - std::is_same::value +BOOST_INT128_INLINE_CONSTEXPR bool is_int128ype_v = std::is_same::value || + std::is_same::value #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) || std::is_same::value || std::is_same::value @@ -470,7 +470,7 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_int128_type_v = std::is_same: template BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_operand_v = is_valid_comparison_type_v || - is_int128_type_v; + is_int128ype_v; // Maps the builtin 128-bit types onto the library equivalents template @@ -484,13 +484,13 @@ struct comparison_canonical template <> struct comparison_canonical { - using type = int128_t; + using type = int128; }; template <> struct comparison_canonical { - using type = uint128_t; + using type = uint128; }; #endif @@ -534,7 +534,7 @@ BOOST_INT128_HOST_DEVICE constexpr bool cmp_less_impl(const T lhs, const U rhs) template BOOST_INT128_INLINE_CONSTEXPR bool enable_comparison_v = is_valid_comparison_operand_v && is_valid_comparison_operand_v && - (is_int128_type_v || is_int128_type_v); + (is_int128ype_v || is_int128ype_v); } // namespace detail diff --git a/module/int128.cppm b/module/int128.cppm index 6218cac9..de6b35c9 100644 --- a/module/int128.cppm +++ b/module/int128.cppm @@ -71,18 +71,18 @@ extern "C++" { export namespace boost::int128 { -struct int128_t; -struct uint128_t; +struct int128; +struct uint128; } // namespace boost::int128 export namespace std { template <> -class numeric_limits; +class numeric_limits; template <> -class numeric_limits; +class numeric_limits; } // namespace std diff --git a/module/quick_test.cpp b/module/quick_test.cpp index 8f44ad82..ff7f4cbd 100644 --- a/module/quick_test.cpp +++ b/module/quick_test.cpp @@ -15,7 +15,7 @@ int main() { using namespace boost::int128; - uint128_t a {2, 0}; + uint128 a {2, 0}; a += 2u; std::cout << a << std::endl; diff --git a/test/benchmark_i128.cpp b/test/benchmark_i128.cpp index 963b7483..e68149f6 100644 --- a/test/benchmark_i128.cpp +++ b/test/benchmark_i128.cpp @@ -85,7 +85,7 @@ using namespace std::chrono_literals; #include #include -using mp_i128 = boost::multiprecision::int128_t; +using mp_i128 = boost::multiprecision::int128; // Names of the implementations under test. The generated documentation tables and // the plot legends use these labels verbatim, so each one spells the type the way @@ -94,15 +94,15 @@ template const char* impl_label() noexcept; template <> -const char* impl_label() noexcept +const char* impl_label() noexcept { - return "int128_t"; + return "int128"; } template <> const char* impl_label() noexcept { - return "boost::mp::int128_t"; + return "boost::mp::int128"; } #if defined(BOOST_INT128_HAS_INT128) @@ -149,13 +149,13 @@ const char* impl_label() noexcept // 4 = Random width template -T from_int128(const boost::int128::int128_t value) +T from_int128(const boost::int128::int128 value) { return static_cast(value); } template <> -mp_i128 from_int128(const boost::int128::int128_t value) +mp_i128 from_int128(const boost::int128::int128 value) { return static_cast(static_cast(value.high)) << 64 | value.low; } @@ -163,7 +163,7 @@ mp_i128 from_int128(const boost::int128::int128_t value) #ifdef BOOST_INT128_HAS_MSVC_INTERNAL_I128 template <> -std::_Signed128 from_int128(const boost::int128::int128_t value) +std::_Signed128 from_int128(const boost::int128::int128 value) { return static_cast(static_cast(value.high)) << static_cast(64) | static_cast(value.low); } @@ -173,7 +173,7 @@ std::_Signed128 from_int128(const boost::int128::int128_t value) #ifdef BOOST_INT128_BENCHMARK_ABSL template <> -absl::int128 from_int128(const boost::int128::int128_t value) +absl::int128 from_int128(const boost::int128::int128 value) { return static_cast(static_cast(value.high)) << 64 | static_cast(value.low); } @@ -183,7 +183,7 @@ absl::int128 from_int128(const boost::int128::int128_t value) template std::vector generate_random_vector(std::size_t size = N, unsigned seed = 42U) { - using boost::int128::int128_t; + using boost::int128::int128; if (seed == 0) { @@ -202,43 +202,43 @@ std::vector generate_random_vector(std::size_t size = N, unsigned seed = 42U) switch (words) { case 0: - result[i] = from_int128(int128_t{ dist_high(gen), dist_low(gen) }); + result[i] = from_int128(int128{ dist_high(gen), dist_low(gen) }); break; case 1: - result[i] = from_int128(int128_t{dist_low(gen)}); + result[i] = from_int128(int128{dist_low(gen)}); break; case 2: if (i % 2 == 0) { - result[i] = from_int128(int128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_int128(int128{dist_high(gen), dist_low(gen)}); } else { - result[i] = from_int128(int128_t{dist_low(gen)}); + result[i] = from_int128(int128{dist_low(gen)}); } break; case 3: if (i % 2 == 1) { - result[i] = from_int128(int128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_int128(int128{dist_high(gen), dist_low(gen)}); } else { - result[i] = from_int128(int128_t{dist_low(gen)}); + result[i] = from_int128(int128{dist_low(gen)}); } break; case 4: if (size_dist(gen) == 1) { - result[i] = from_int128(int128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_int128(int128{dist_high(gen), dist_low(gen)}); } else { - result[i] = from_int128(int128_t{dist_low(gen)}); + result[i] = from_int128(int128{dist_low(gen)}); } break; } @@ -510,7 +510,7 @@ int main(int argc, char* argv[]) std::cerr << "Two Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<0, boost::int128::int128_t>(); + const auto library_vector = generate_random_vector<0, boost::int128::int128>(); const auto mp_vector = generate_random_vector<0, mp_i128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -634,7 +634,7 @@ int main(int argc, char* argv[]) std::cerr << "One Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<1, boost::int128::int128_t>(); + const auto library_vector = generate_random_vector<1, boost::int128::int128>(); const auto mp_vector = generate_random_vector<1, mp_i128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -733,7 +733,7 @@ int main(int argc, char* argv[]) std::cerr << "Two-One Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<2, boost::int128::int128_t>(); + const auto library_vector = generate_random_vector<2, boost::int128::int128>(); const auto mp_vector = generate_random_vector<2, mp_i128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -832,7 +832,7 @@ int main(int argc, char* argv[]) std::cerr << "One-Two Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<3, boost::int128::int128_t>(); + const auto library_vector = generate_random_vector<3, boost::int128::int128>(); const auto mp_vector = generate_random_vector<3, mp_i128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -931,7 +931,7 @@ int main(int argc, char* argv[]) std::cerr << "Random Width Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<4, boost::int128::int128_t>(); + const auto library_vector = generate_random_vector<4, boost::int128::int128>(); const auto mp_vector = generate_random_vector<4, mp_i128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -1048,7 +1048,7 @@ int main(int argc, char* argv[]) std::cerr << std::endl; } - bench::write_json(bench::metadata{"int128_t", "i128", impl_label()}); + bench::write_json(bench::metadata{"int128", "i128", impl_label()}); // The Jamfile declares this target with run-fail, so a successful run reports 1. return 1; diff --git a/test/benchmark_results.hpp b/test/benchmark_results.hpp index 6fa5bc18..4edddcc8 100644 --- a/test/benchmark_results.hpp +++ b/test/benchmark_results.hpp @@ -2,8 +2,8 @@ // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt -#ifndef BOOST_INT128_TEST_BENCHMARK_RESULTS_HPP -#define BOOST_INT128_TEST_BENCHMARK_RESULTS_HPP +#ifndef BOOST_int128EST_BENCHMARK_RESULTS_HPP +#define BOOST_int128EST_BENCHMARK_RESULTS_HPP // Command line handling and result collection shared by benchmark_u128.cpp and // benchmark_i128.cpp. Every timing is still printed to stderr as it is measured @@ -343,4 +343,4 @@ inline void parse_options(const int argc, char* argv[]) } // namespace bench -#endif // BOOST_INT128_TEST_BENCHMARK_RESULTS_HPP +#endif // BOOST_int128EST_BENCHMARK_RESULTS_HPP diff --git a/test/benchmark_u128.cpp b/test/benchmark_u128.cpp index e1ee9c8a..675e466d 100644 --- a/test/benchmark_u128.cpp +++ b/test/benchmark_u128.cpp @@ -92,7 +92,7 @@ using namespace std::chrono_literals; #include #include -using mp_u128 = boost::multiprecision::uint128_t; +using mp_u128 = boost::multiprecision::uint128; // Names of the implementations under test. The generated documentation tables and // the plot legends use these labels verbatim, so each one spells the type the way @@ -101,15 +101,15 @@ template const char* impl_label() noexcept; template <> -const char* impl_label() noexcept +const char* impl_label() noexcept { - return "uint128_t"; + return "uint128"; } template <> const char* impl_label() noexcept { - return "boost::mp::uint128_t"; + return "boost::mp::uint128"; } #if defined(BOOST_INT128_HAS_INT128) @@ -156,13 +156,13 @@ const char* impl_label() noexcept // 4 = Random width template -T from_uint128(const boost::int128::uint128_t value) +T from_uint128(const boost::int128::uint128 value) { return static_cast(value); } template <> -mp_u128 from_uint128(const boost::int128::uint128_t value) +mp_u128 from_uint128(const boost::int128::uint128 value) { return static_cast(value.high) << 64 | value.low; } @@ -170,7 +170,7 @@ mp_u128 from_uint128(const boost::int128::uint128_t value) #ifdef BOOST_INT128_HAS_MSVC_INTERNAL_I128 template <> -std::_Unsigned128 from_uint128(const boost::int128::uint128_t value) +std::_Unsigned128 from_uint128(const boost::int128::uint128 value) { return static_cast(value.high) << static_cast(64) | static_cast(value.low); } @@ -180,7 +180,7 @@ std::_Unsigned128 from_uint128(const boost::int128::uint128_t value) #ifdef BOOST_INT128_BENCHMARK_ABSL template <> -absl::uint128 from_uint128(const boost::int128::uint128_t value) +absl::uint128 from_uint128(const boost::int128::uint128 value) { return static_cast(value.high) << 64U | static_cast(value.low); } @@ -190,7 +190,7 @@ absl::uint128 from_uint128(const boost::int128::uint128_t value) template std::vector generate_random_vector(std::size_t size = N, unsigned seed = 42U) { - using boost::int128::uint128_t; + using boost::int128::uint128; if (seed == 0) { @@ -210,32 +210,32 @@ std::vector generate_random_vector(std::size_t size = N, unsigned seed = 42U) switch (words) { case 0: - result[i] = from_uint128(uint128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_uint128(uint128{dist_high(gen), dist_low(gen)}); break; case 1: - result[i] = from_uint128(uint128_t{ dist_low(gen) }); + result[i] = from_uint128(uint128{ dist_low(gen) }); break; case 2: if (i % 2 == 0) { - result[i] = from_uint128(uint128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_uint128(uint128{dist_high(gen), dist_low(gen)}); } else { - result[i] = from_uint128(uint128_t{dist_low(gen)}); + result[i] = from_uint128(uint128{dist_low(gen)}); } break; case 3: if (i % 2 == 1) { - result[i] = from_uint128(uint128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_uint128(uint128{dist_high(gen), dist_low(gen)}); } else { - result[i] = from_uint128(uint128_t{dist_low(gen)}); + result[i] = from_uint128(uint128{dist_low(gen)}); } break; @@ -244,16 +244,16 @@ std::vector generate_random_vector(std::size_t size = N, unsigned seed = 42U) switch (size_dist(gen)) { case 0: - result[i] = from_uint128(uint128_t{dist_low(gen)}); + result[i] = from_uint128(uint128{dist_low(gen)}); break; case 1: - result[i] = from_uint128(uint128_t{dist_high(gen), dist_low(gen)}); + result[i] = from_uint128(uint128{dist_high(gen), dist_low(gen)}); break; case 2: - result[i] = from_uint128(uint128_t{dist_small(gen), dist_low(gen)}); + result[i] = from_uint128(uint128{dist_small(gen), dist_low(gen)}); break; case 3: - result[i] = from_uint128(uint128_t{dist_small(gen)}); + result[i] = from_uint128(uint128{dist_small(gen)}); break; default: BOOST_INT128_UNREACHABLE; @@ -638,7 +638,7 @@ int main(int argc, char* argv[]) std::cerr << "Two Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<0, boost::int128::uint128_t>(); + const auto library_vector = generate_random_vector<0, boost::int128::uint128>(); const auto mp_vector = generate_random_vector<0, mp_u128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -773,7 +773,7 @@ int main(int argc, char* argv[]) std::cerr << "One Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<1, boost::int128::uint128_t>(); + const auto library_vector = generate_random_vector<1, boost::int128::uint128>(); const auto mp_vector = generate_random_vector<1, mp_u128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -874,7 +874,7 @@ int main(int argc, char* argv[]) std::cerr << "Two-One Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<2, boost::int128::uint128_t>(); + const auto library_vector = generate_random_vector<2, boost::int128::uint128>(); const auto mp_vector = generate_random_vector<2, mp_u128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -973,7 +973,7 @@ int main(int argc, char* argv[]) std::cerr << "One-Two Word Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<3, boost::int128::uint128_t>(); + const auto library_vector = generate_random_vector<3, boost::int128::uint128>(); const auto mp_vector = generate_random_vector<3, mp_u128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -1071,7 +1071,7 @@ int main(int argc, char* argv[]) std::cerr << "Random Width Operations\n"; std::cerr << "---------------------------\n\n"; - const auto library_vector = generate_random_vector<4, boost::int128::uint128_t>(); + const auto library_vector = generate_random_vector<4, boost::int128::uint128>(); const auto mp_vector = generate_random_vector<4, mp_u128>(); #if defined(BOOST_INT128_HAS_INT128) @@ -1230,7 +1230,7 @@ int main(int argc, char* argv[]) } - bench::write_json(bench::metadata{"uint128_t", "u128", impl_label()}); + bench::write_json(bench::metadata{"uint128", "u128", impl_label()}); // The Jamfile declares this target with run-fail, so a successful run reports 1. return 1; diff --git a/test/compile_tests/literals_base_prefix_fail.cpp b/test/compile_tests/literals_base_prefix_fail.cpp index f7e10b0c..32eac374 100644 --- a/test/compile_tests/literals_base_prefix_fail.cpp +++ b/test/compile_tests/literals_base_prefix_fail.cpp @@ -4,7 +4,7 @@ // // A prefixed user-defined literal whose value does not fit the target type must be // rejected at compile time. 0x1 followed by 32 zeros is 2^128, one past the -// uint128_t maximum, so the base-16 parse overflows and this must not compile. +// uint128 maximum, so the base-16 parse overflows and this must not compile. #include diff --git a/test/compile_tests/utilities_comparison_fail.cpp b/test/compile_tests/utilities_comparison_fail.cpp index 5053bbf6..e6bce46a 100644 --- a/test/compile_tests/utilities_comparison_fail.cpp +++ b/test/compile_tests/utilities_comparison_fail.cpp @@ -9,5 +9,5 @@ int main() { - return boost::int128::cmp_equal(boost::int128::uint128_t{1}, 'a') ? 1 : 0; + return boost::int128::cmp_equal(boost::int128::uint128{1}, 'a') ? 1 : 0; } diff --git a/test/decimal_github_issue_1260.cpp b/test/decimal_github_issue_1260.cpp index 43825836..80cd10fb 100644 --- a/test/decimal_github_issue_1260.cpp +++ b/test/decimal_github_issue_1260.cpp @@ -12,11 +12,11 @@ using namespace boost::int128; int main() { - uint128_t lhs_sig {UINT64_C(54210108624275), UINT64_C(4089650035136921600)}; - uint128_t rhs_sig {UINT64_C(276471553983803), UINT64_C(11633843142343524352)}; + uint128 lhs_sig {UINT64_C(54210108624275), UINT64_C(4089650035136921600)}; + uint128 rhs_sig {UINT64_C(276471553983803), UINT64_C(11633843142343524352)}; lhs_sig *= 1000U; - BOOST_TEST_EQ(lhs_sig, uint128_t(UINT64_C(54210108624275221), UINT64_C(12919594847110692864))); + BOOST_TEST_EQ(lhs_sig, uint128(UINT64_C(54210108624275221), UINT64_C(12919594847110692864))); // 10^31 rhs_sig /= BOOST_INT128_UINT128_C(10000000000000000000000000000000); @@ -25,20 +25,20 @@ int main() rhs_sig /= 10U; BOOST_TEST_EQ(rhs_sig, 51U); - auto signed_lhs {static_cast(lhs_sig)}; - auto signed_rhs {static_cast(rhs_sig)}; + auto signed_lhs {static_cast(lhs_sig)}; + auto signed_rhs {static_cast(rhs_sig)}; signed_rhs = -signed_rhs; - BOOST_TEST_EQ(signed_rhs, int128_t(INT64_C(-1), UINT64_C(18446744073709551565))); + BOOST_TEST_EQ(signed_rhs, int128(INT64_C(-1), UINT64_C(18446744073709551565))); - auto res_sig {static_cast(signed_lhs + signed_rhs)}; - BOOST_TEST_EQ(res_sig, uint128_t(UINT64_C(54210108624275221), UINT64_C(12919594847110692813))); + auto res_sig {static_cast(signed_lhs + signed_rhs)}; + BOOST_TEST_EQ(res_sig, uint128(UINT64_C(54210108624275221), UINT64_C(12919594847110692813))); res_sig /= UINT64_C(10); - BOOST_TEST_EQ(res_sig, uint128_t(UINT64_C(5421010862427522), UINT64_C(3136633892082024442))); + BOOST_TEST_EQ(res_sig, uint128(UINT64_C(5421010862427522), UINT64_C(3136633892082024442))); res_sig /= UINT64_C(10); - BOOST_TEST_EQ(res_sig, uint128_t(UINT64_C(542101086242752), UINT64_C(4003012203950112767))); + BOOST_TEST_EQ(res_sig, uint128(UINT64_C(542101086242752), UINT64_C(4003012203950112767))); return boost::report_errors(); } diff --git a/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp index 216ec8e6..9b12bd88 100644 --- a/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp @@ -104,12 +104,12 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) const std::uint64_t b_hi64 { *reinterpret_cast(tmp_data.data() + std::size_t { UINT8_C(24) }) }; // Import data into the uint values. - using local_uint_type = ::boost::int128::uint128_t; + using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; #else - using cntrl_uint_type = ::math::wide_integer::uint128_t; + using cntrl_uint_type = ::math::wide_integer::uint128; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp index 64145026..35104985 100644 --- a/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp @@ -104,12 +104,12 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) const std::uint64_t b_hi64 { *reinterpret_cast(tmp_data.data() + std::size_t { UINT8_C(24) }) }; // Import data into the uint values. - using local_uint_type = ::boost::int128::uint128_t; + using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; #else - using cntrl_uint_type = ::math::wide_integer::uint128_t; + using cntrl_uint_type = ::math::wide_integer::uint128; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp index 2d7da2dc..619937a4 100644 --- a/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp @@ -104,12 +104,12 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) const std::uint64_t b_hi64 { *reinterpret_cast(tmp_data.data() + std::size_t { UINT8_C(24) }) }; // Import data into the uint values. - using local_uint_type = ::boost::int128::uint128_t; + using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; #else - using cntrl_uint_type = ::math::wide_integer::uint128_t; + using cntrl_uint_type = ::math::wide_integer::uint128; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp index e5bff887..3af53c78 100644 --- a/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp @@ -104,12 +104,12 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) const std::uint64_t b_hi64 { *reinterpret_cast(tmp_data.data() + std::size_t { UINT8_C(24) }) }; // Import data into the uint values. - using local_uint_type = ::boost::int128::uint128_t; + using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; #else - using cntrl_uint_type = ::math::wide_integer::uint128_t; + using cntrl_uint_type = ::math::wide_integer::uint128; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/github_issue_207.cpp b/test/github_issue_207.cpp index c7c6cb2f..36d1917d 100644 --- a/test/github_issue_207.cpp +++ b/test/github_issue_207.cpp @@ -10,18 +10,18 @@ void test_u128_literals() { - const boost::int128::uint128_t max_val {std::numeric_limits::max()}; + const boost::int128::uint128 max_val {std::numeric_limits::max()}; const auto macro_val {BOOST_INT128_UINT128_C(340282366920938463463374607431768211455)}; BOOST_TEST(max_val == macro_val); } void test_i128_literals() { - const boost::int128::int128_t max_val {std::numeric_limits::max()}; + const boost::int128::int128 max_val {std::numeric_limits::max()}; const auto macro_val {BOOST_INT128_INT128_C(170141183460469231731687303715884105727)}; BOOST_TEST(max_val == macro_val); - const boost::int128::int128_t min_val {std::numeric_limits::min()}; + const boost::int128::int128 min_val {std::numeric_limits::min()}; const auto min_macro_val {BOOST_INT128_INT128_C(-170141183460469231731687303715884105728)}; BOOST_TEST(min_val == min_macro_val); } diff --git a/test/github_issue_210.cpp b/test/github_issue_210.cpp index 43e6ff4f..e80578ef 100644 --- a/test/github_issue_210.cpp +++ b/test/github_issue_210.cpp @@ -17,7 +17,7 @@ constexpr bool test_spot_div(IntType lhs, IntType rhs, IntType known_res) int main() { - static_assert(test_spot_div(boost::int128::uint128_t{50012077812411ULL, 6429278683030093824ULL}, boost::int128::uint128_t{542101086ULL, 4477988020393345024ULL}, 92256), "Spot failure"); + static_assert(test_spot_div(boost::int128::uint128{50012077812411ULL, 6429278683030093824ULL}, boost::int128::uint128{542101086ULL, 4477988020393345024ULL}, 92256), "Spot failure"); return 0; } diff --git a/test/github_issue_221.cpp b/test/github_issue_221.cpp index f05f2bd0..9a68b5ed 100644 --- a/test/github_issue_221.cpp +++ b/test/github_issue_221.cpp @@ -29,8 +29,8 @@ void test() int main() { - test(); - test(); + test(); + test(); return boost::report_errors(); } diff --git a/test/github_issue_272.cpp b/test/github_issue_272.cpp index c26f940c..c5342043 100644 --- a/test/github_issue_272.cpp +++ b/test/github_issue_272.cpp @@ -36,8 +36,8 @@ void check_endpos() int main() { - check_endpos(); - check_endpos(); + check_endpos(); + check_endpos(); return boost::report_errors(); } diff --git a/test/github_issue_377.cpp b/test/github_issue_377.cpp index 11ba3eb4..9b779cae 100644 --- a/test/github_issue_377.cpp +++ b/test/github_issue_377.cpp @@ -14,14 +14,14 @@ using namespace boost::int128; template void test_div_by_one() { - constexpr auto min_val {std::numeric_limits::min()}; + constexpr auto min_val {std::numeric_limits::min()}; BOOST_TEST_EQ(min_val, min_val / T{1}); } template void test_other_vals() { - constexpr auto min_val {std::numeric_limits::min()}; + constexpr auto min_val {std::numeric_limits::min()}; const auto min_div_2 {BOOST_INT128_INT128_C(-85070591730234615865843651857942052864)}; const auto min_div_4 {BOOST_INT128_INT128_C(-42535295865117307932921825928971026432)}; const auto min_div_16 {BOOST_INT128_INT128_C(-10633823966279326983230456482242756608)}; @@ -31,44 +31,44 @@ void test_other_vals() BOOST_TEST_EQ(min_div_16, min_val / T{16}); } -// Bug 1: operator>>(int128_t, int128_t) was calling << instead of >> +// Bug 1: operator>>(int128, int128) was calling << instead of >> void test_right_shift_int128_amount() { - const auto val {int128_t(0, 0xFF00)}; - const auto shift_4 {int128_t(0, 4)}; + const auto val {int128(0, 0xFF00)}; + const auto shift_4 {int128(0, 4)}; - // Right-shift with int128_t shift amount must match integer shift + // Right-shift with int128 shift amount must match integer shift BOOST_TEST_EQ(val >> shift_4, val >> 4); - const auto expected_ff0 {int128_t(0, 0xFF0)}; + const auto expected_ff0 {int128(0, 0xFF0)}; BOOST_TEST_EQ(val >> shift_4, expected_ff0); - // Test >>= with int128_t rhs + // Test >>= with int128 rhs auto val2 {val}; val2 >>= shift_4; BOOST_TEST_EQ(val2, expected_ff0); // Cross-word shift - const auto big_val {int128_t(0x1234, 0)}; - const auto shift_64 {int128_t(0, 64)}; - const auto expected_1234 {int128_t(0, 0x1234)}; + const auto big_val {int128(0x1234, 0)}; + const auto shift_64 {int128(0, 64)}; + const auto expected_1234 {int128(0, 0x1234)}; BOOST_TEST_EQ(big_val >> shift_64, expected_1234); // Arithmetic right shift preserves sign for negative values - constexpr auto min_val {std::numeric_limits::min()}; - const auto shift_1 {int128_t(0, 1)}; + constexpr auto min_val {std::numeric_limits::min()}; + const auto shift_1 {int128(0, 1)}; BOOST_TEST_EQ(min_val >> shift_1, min_val >> 1); BOOST_TEST((min_val >> shift_1) < 0); } -// Bug 2: UnsignedInteger / int128_t returned {rhs.high, res} instead of proper sign handling +// Bug 2: UnsignedInteger / int128 returned {rhs.high, res} instead of proper sign handling void test_unsigned_div_negative_int128() { const std::uint64_t lhs {10}; - const auto neg3 {-int128_t(0, 3)}; - const auto pos3 {int128_t(0, 3)}; - const auto expected_neg3 {-int128_t(0, 3)}; - const auto expected_pos3 {int128_t(0, 3)}; + const auto neg3 {-int128(0, 3)}; + const auto pos3 {int128(0, 3)}; + const auto expected_neg3 {-int128(0, 3)}; + const auto expected_pos3 {int128(0, 3)}; // 10 / -3 = -3 BOOST_TEST_EQ(lhs / neg3, expected_neg3); @@ -78,19 +78,19 @@ void test_unsigned_div_negative_int128() // 7 / -1 = -7 const std::uint64_t seven {7}; - const auto neg1 {-int128_t(0, 1)}; - const auto expected_neg7 {-int128_t(0, 7)}; + const auto neg1 {-int128(0, 1)}; + const auto expected_neg7 {-int128(0, 7)}; BOOST_TEST_EQ(seven / neg1, expected_neg7); } -// Bug 3: UnsignedInteger % int128_t used rhs.low instead of abs_rhs.low +// Bug 3: UnsignedInteger % int128 used rhs.low instead of abs_rhs.low // and applied wrong sign to remainder void test_unsigned_mod_negative_int128() { const std::uint64_t lhs {10}; - const auto neg3 {-int128_t(0, 3)}; - const auto pos3 {int128_t(0, 3)}; - const auto expected_1 {int128_t(0, 1)}; + const auto neg3 {-int128(0, 3)}; + const auto pos3 {int128(0, 3)}; + const auto expected_1 {int128(0, 1)}; // 10 % -3 = 1 (remainder has sign of dividend, which is unsigned/positive) BOOST_TEST_EQ(lhs % neg3, expected_1); @@ -100,29 +100,29 @@ void test_unsigned_mod_negative_int128() // 12 % -5 = 2 const std::uint64_t twelve {12}; - const auto neg5 {-int128_t(0, 5)}; - const auto expected_2 {int128_t(0, 2)}; + const auto neg5 {-int128(0, 5)}; + const auto expected_2 {int128(0, 2)}; BOOST_TEST_EQ(twelve % neg5, expected_2); } -// Bug 4: operator%(int128_t, int128_t) early return was wrong when lhs = INT128_MIN +// Bug 4: operator%(int128, int128) early return was wrong when lhs = INT128_MIN // because abs(INT128_MIN) overflows back to INT128_MIN void test_min_val_modulo() { - constexpr auto min_val {std::numeric_limits::min()}; - const auto zero {int128_t(0, 0)}; + constexpr auto min_val {std::numeric_limits::min()}; + const auto zero {int128(0, 0)}; // INT128_MIN % 1 = 0 - const auto one {int128_t(0, 1)}; + const auto one {int128(0, 1)}; BOOST_TEST_EQ(min_val % one, zero); // INT128_MIN % 2 = 0 (2^127 is even) - const auto two {int128_t(0, 2)}; + const auto two {int128(0, 2)}; BOOST_TEST_EQ(min_val % two, zero); // INT128_MIN % 3 = -2 // -170141183460469231731687303715884105728 = -56713727820156410577229101238628035242 * 3 + (-2) - const auto three {int128_t(0, 3)}; + const auto three {int128(0, 3)}; const auto expected_neg2 {BOOST_INT128_INT128_C(-2)}; BOOST_TEST_EQ(min_val % three, expected_neg2); @@ -134,11 +134,11 @@ int main() { test_div_by_one(); test_div_by_one(); - test_div_by_one(); + test_div_by_one(); test_other_vals(); test_other_vals(); - test_other_vals(); + test_other_vals(); test_right_shift_int128_amount(); test_unsigned_div_negative_int128(); diff --git a/test/github_issue_432.cpp b/test/github_issue_432.cpp index 0dfd6ebb..0e870708 100644 --- a/test/github_issue_432.cpp +++ b/test/github_issue_432.cpp @@ -10,13 +10,13 @@ // double round 2^64 - 1 up to 2^64, which hid the error, but any type with 64 or // more significand bits (x87 80-bit and IEEE quad long double) holds 2^64 - 1 // exactly, so every conversion with a non-zero high word was off by the value of -// the high word. For example uint128_t{1, 0} (2^64) converted to 2^64 - 1. +// the high word. For example uint128{1, 0} (2^64) converted to 2^64 - 1. // -// 2) int128_t fed its raw two's complement words into high * scale + low. That +// 2) int128 fed its raw two's complement words into high * scale + low. That // identity is exact in integer arithmetic but not in floating point: a small // negative value stores low close to 2^64, which rounds to exactly 2^64 whenever // the type has fewer than 64 significand bits, and adding the scaled high word -// then cancels catastrophically. int128_t{-1} converted to 0.0 instead of -1.0. +// then cancels catastrophically. int128{-1} converted to 0.0 instead of -1.0. // // The operators now use the builtin 128-bit conversion where one exists, and the // portable fallback scales by an exact 2^64 and converts negative values through @@ -39,8 +39,8 @@ #include #include -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; // Exactly representable values must convert exactly, so a defect either produces // the exact expected value or it is a bug. No tolerances are used anywhere here. @@ -51,7 +51,7 @@ void test_small_negative_values() { for (int v {-1}; v >= -1024; --v) { - const int128_t value {v}; + const int128 value {v}; BOOST_TEST_EQ(static_cast(value), static_cast(v)); // The portable fallback must also be correct on platforms @@ -66,16 +66,16 @@ void test_signed_powers_of_two() { for (int k {0}; k < 127; ++k) { - const int128_t value {-(int128_t{1} << k)}; + const int128 value {-(int128{1} << k)}; const T expected {-std::ldexp(static_cast(1), k)}; BOOST_TEST_EQ(static_cast(value), expected); BOOST_TEST_EQ(boost::int128::detail::signed_words_to_float(value.signed_high(), value.low), expected); } - // INT128_MIN itself: the magnitude 2^127 does not fit in int128_t, + // INT128_MIN itself: the magnitude 2^127 does not fit in int128, // so this exercises the negation edge case in the fallback - const auto min_value {(std::numeric_limits::min)()}; + const auto min_value {(std::numeric_limits::min)()}; const T expected_min {-std::ldexp(static_cast(1), 127)}; BOOST_TEST_EQ(static_cast(min_value), expected_min); @@ -101,18 +101,18 @@ void test_offset_exactness() for (std::uint64_t k {1}; k <= 64; ++k) { - BOOST_TEST_EQ(static_cast(uint128_t{k, 0}), static_cast(k) * two_64); + BOOST_TEST_EQ(static_cast(uint128{k, 0}), static_cast(k) * two_64); BOOST_TEST_EQ(boost::int128::detail::unsigned_words_to_float(k, 0), static_cast(k) * two_64); - const int128_t negative {-int128_t{static_cast(k), 0}}; + const int128 negative {-int128{static_cast(k), 0}}; BOOST_TEST_EQ(static_cast(negative), -(static_cast(k) * two_64)); } - BOOST_TEST_EQ(static_cast(uint128_t{UINT64_C(1) << 63, 0}), std::ldexp(static_cast(1), 127)); + BOOST_TEST_EQ(static_cast(uint128{UINT64_C(1) << 63, 0}), std::ldexp(static_cast(1), 127)); // -(2^64 - 1): exact wherever the significand holds 64 bits, and the computed // expected value rounds identically to the conversion everywhere else - const int128_t value {-1, 1}; + const int128 value {-1, 1}; BOOST_TEST_EQ(static_cast(value), -(two_64 - static_cast(1))); } @@ -147,10 +147,10 @@ void test_vs_builtin() const auto hi {rng()}; const auto lo {rng()}; - const uint128_t u {hi, lo}; + const uint128 u {hi, lo}; const auto builtin_u {(static_cast(hi) << 64) | static_cast(lo)}; - const int128_t s {static_cast(hi), lo}; + const int128 s {static_cast(hi), lo}; const auto builtin_s {static_cast(builtin_u)}; // The operators use the builtin conversion on this platform, so these are exact @@ -176,23 +176,23 @@ void test_vs_builtin() #endif // BOOST_INT128_HAS_INT128 // Both conversion paths are constexpr, so the regressions are also pinned at compile time -static_assert(static_cast(int128_t{-1}) == -1.0f, "int128_t{-1} must convert to -1.0f"); -static_assert(static_cast(int128_t{-1}) == -1.0, "int128_t{-1} must convert to -1.0"); -static_assert(static_cast(int128_t{-1024}) == -1024.0, "small negatives must not cancel to 0"); -static_assert(static_cast(uint128_t{1, 0}) == 18446744073709551616.0, "uint128_t 2^64 must convert to 2^64"); +static_assert(static_cast(int128{-1}) == -1.0f, "int128{-1} must convert to -1.0f"); +static_assert(static_cast(int128{-1}) == -1.0, "int128{-1} must convert to -1.0"); +static_assert(static_cast(int128{-1024}) == -1024.0, "small negatives must not cancel to 0"); +static_assert(static_cast(uint128{1, 0}) == 18446744073709551616.0, "uint128 2^64 must convert to 2^64"); static_assert(boost::int128::detail::signed_words_to_float(-1, UINT64_MAX) == -1.0, - "fallback conversion of int128_t{-1} must yield -1.0"); + "fallback conversion of int128{-1} must yield -1.0"); static_assert(boost::int128::detail::unsigned_words_to_float(1, 0) == 18446744073709551616.0, "fallback conversion of 2^64 must yield 2^64"); #if !defined(BOOST_INT128_HAS_GPU_SUPPORT) -static_assert(static_cast(int128_t{-1}) == -1.0L, "int128_t{-1} must convert to -1.0L"); -static_assert(static_cast(uint128_t{1, 0}) == 18446744073709551616.0L, - "uint128_t 2^64 must convert to 2^64 exactly, not 2^64 - 1"); -static_assert(static_cast(int128_t{-1, 1}) == -(18446744073709551616.0L - 1.0L), - "int128_t -(2^64 - 1) must match the correctly rounded value"); +static_assert(static_cast(int128{-1}) == -1.0L, "int128{-1} must convert to -1.0L"); +static_assert(static_cast(uint128{1, 0}) == 18446744073709551616.0L, + "uint128 2^64 must convert to 2^64 exactly, not 2^64 - 1"); +static_assert(static_cast(int128{-1, 1}) == -(18446744073709551616.0L - 1.0L), + "int128 -(2^64 - 1) must match the correctly rounded value"); #endif diff --git a/test/limits_link_1.cpp b/test/limits_link_1.cpp index e55da2ed..44e8c3d8 100644 --- a/test/limits_link_1.cpp +++ b/test/limits_link_1.cpp @@ -16,6 +16,6 @@ template void test() void f1() { - test(); - test(); + test(); + test(); } diff --git a/test/limits_link_2.cpp b/test/limits_link_2.cpp index 03cfca27..2b54a6c6 100644 --- a/test/limits_link_2.cpp +++ b/test/limits_link_2.cpp @@ -16,6 +16,6 @@ template void test() // LCOV_EXCL_LINE void f2() { - test(); - test(); + test(); + test(); } diff --git a/test/sycl_test.hpp b/test/sycl_test.hpp index bbf02c78..b2157108 100644 --- a/test/sycl_test.hpp +++ b/test/sycl_test.hpp @@ -6,8 +6,8 @@ // element-wise on the SYCL device over random inputs and verifies that the // device results match a host recomputation of the same operation. -#ifndef BOOST_INT128_TEST_SYCL_TEST_HPP -#define BOOST_INT128_TEST_SYCL_TEST_HPP +#ifndef BOOST_int128EST_SYCL_TEST_HPP +#define BOOST_int128EST_SYCL_TEST_HPP #include #include @@ -319,4 +319,4 @@ int run_from_chars(const int base) } // namespace int128_sycl_test -#endif // BOOST_INT128_TEST_SYCL_TEST_HPP +#endif // BOOST_int128EST_SYCL_TEST_HPP diff --git a/test/test_bit.cpp b/test/test_bit.cpp index 8085c628..0486eb11 100644 --- a/test/test_bit.cpp +++ b/test/test_bit.cpp @@ -18,7 +18,7 @@ import boost.int128; void test_has_single_bit() { - boost::int128::uint128_t x {0}; + boost::int128::uint128 x {0}; BOOST_TEST(!boost::int128::has_single_bit(x)); ++x; @@ -40,7 +40,7 @@ void test_countl_zero() { BOOST_TEST_EQ(boost::int128::countl_zero(0), 128); - boost::int128::uint128_t x {1}; + boost::int128::uint128 x {1}; for (unsigned i {1}; i < 128U; ++i) { @@ -51,9 +51,9 @@ void test_countl_zero() void test_bit_width() { - BOOST_TEST_EQ(boost::int128::bit_width(boost::int128::uint128_t{0}), 0); + BOOST_TEST_EQ(boost::int128::bit_width(boost::int128::uint128{0}), 0); - boost::int128::uint128_t x {1}; + boost::int128::uint128 x {1}; for (unsigned i {1}; i < 128U; ++i) { @@ -75,8 +75,8 @@ void test_bit_ceil() BOOST_TEST_EQ(boost::int128::bit_ceil(1), 1U); BOOST_TEST_EQ(boost::int128::bit_ceil(2), 2U); - boost::int128::uint128_t x {3}; - boost::int128::uint128_t y {4}; + boost::int128::uint128 x {3}; + boost::int128::uint128 y {4}; for (unsigned i {4}; i < 128U; ++i) { BOOST_TEST_EQ(boost::int128::bit_ceil(x), y); @@ -90,8 +90,8 @@ void test_bit_floor() { BOOST_TEST_EQ(boost::int128::bit_floor(0), 0U); - boost::int128::uint128_t x {3}; - boost::int128::uint128_t y {2}; + boost::int128::uint128 x {3}; + boost::int128::uint128 y {2}; for (unsigned i {2}; i < 127U; ++i) { @@ -105,7 +105,7 @@ void test_bit_floor() void test_countl_one() { BOOST_TEST_EQ(boost::int128::countl_one(0), 0); - boost::int128::uint128_t x {UINT64_MAX, UINT64_MAX}; + boost::int128::uint128 x {UINT64_MAX, UINT64_MAX}; for (int i {128}; i >= 0; --i) { @@ -118,7 +118,7 @@ void test_countr_zero() { BOOST_TEST_EQ(boost::int128::countr_zero(0), 128); - boost::int128::uint128_t x {0x8000000000000000ULL, 0}; + boost::int128::uint128 x {0x8000000000000000ULL, 0}; for (int i {127}; i >= 0; --i) { @@ -131,7 +131,7 @@ void test_countr_one() { BOOST_TEST_EQ(boost::int128::countr_one(0), 0); - boost::int128::uint128_t x {UINT64_MAX, UINT64_MAX}; + boost::int128::uint128 x {UINT64_MAX, UINT64_MAX}; for (int i {128}; i >= 0; --i) { @@ -142,8 +142,8 @@ void test_countr_one() void test_rotl() { - constexpr boost::int128::uint128_t x {1}; - boost::int128::uint128_t y {1}; + constexpr boost::int128::uint128 x {1}; + boost::int128::uint128 y {1}; for (int i {0}; i < 128; ++i) { @@ -154,8 +154,8 @@ void test_rotl() void test_rotr() { - constexpr boost::int128::uint128_t x {0x8000000000000000ULL, 0}; - boost::int128::uint128_t y {0x8000000000000000ULL, 0}; + constexpr boost::int128::uint128 x {0x8000000000000000ULL, 0}; + boost::int128::uint128 y {0x8000000000000000ULL, 0}; for (int i {0}; i < 128; ++i) { @@ -167,7 +167,7 @@ void test_rotr() void test_popcount() { BOOST_TEST_EQ(boost::int128::popcount(0), 0); - boost::int128::uint128_t x {0, 2}; + boost::int128::uint128 x {0, 2}; for (int i {1}; i < 128; ++i) { @@ -179,7 +179,7 @@ void test_popcount() x <<= 1; } - constexpr boost::int128::uint128_t y {1}; + constexpr boost::int128::uint128 y {1}; static_assert(boost::int128::popcount(y) == 1, "Wrong popcount"); } @@ -188,13 +188,13 @@ void test_byteswap() // Test 1: Basic test with specific byte values { // Create a value with distinct byte pattern - boost::int128::uint128_t original{ + boost::int128::uint128 original{ 0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL }; // Expected result after byteswap - boost::int128::uint128_t expected{ + boost::int128::uint128 expected{ 0x1032547698BADCFEULL, 0xEFCDAB8967452301ULL }; @@ -205,7 +205,7 @@ void test_byteswap() // Test 2: Verify double byteswap returns original { - boost::int128::uint128_t values[] = { + boost::int128::uint128 values[] = { {0, 0}, // All zeros {~0ULL, ~0ULL}, // All ones {0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL}, // Mixed pattern @@ -222,12 +222,12 @@ void test_byteswap() for (int i = 0; i < 16; ++i) { // Set a single byte to 0xFF - boost::int128::uint128_t input{0, 0}; + boost::int128::uint128 input{0, 0}; auto bytes = reinterpret_cast(&input); bytes[i] = 0xFF; // After byteswap, the 0xFF should be at position (15-i) - boost::int128::uint128_t result = boost::int128::byteswap(input); + boost::int128::uint128 result = boost::int128::byteswap(input); auto result_bytes = reinterpret_cast(&result); for (int j = 0; j < 16; ++j) @@ -246,13 +246,13 @@ void test_byteswap() // Test 4: Check the backup impls { // Create a value with distinct byte pattern - constexpr boost::int128::uint128_t original{ + constexpr boost::int128::uint128 original{ 0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL }; // Expected result after byteswap - constexpr boost::int128::uint128_t expected{ + constexpr boost::int128::uint128 expected{ 0x1032547698BADCFEULL, 0xEFCDAB8967452301ULL }; diff --git a/test/test_bit_ceil.cu b/test/test_bit_ceil.cu index ea0a1d25..c6565d3e 100644 --- a/test/test_bit_ceil.cu +++ b/test/test_bit_ceil.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, test_type *out, int numElements) { diff --git a/test/test_bit_ceil_sycl.cpp b/test/test_bit_ceil_sycl.cpp index 3ce20af6..4d1e1a55 100644 --- a/test/test_bit_ceil_sycl.cpp +++ b/test/test_bit_ceil_sycl.cpp @@ -4,11 +4,11 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { // Shift right by one so bit_ceil never has to round past 2^127. - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::bit_ceil(a >> 1); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::bit_ceil(a >> 1); }); } diff --git a/test/test_bit_floor.cu b/test/test_bit_floor.cu index 1031b471..298bbe9a 100644 --- a/test/test_bit_floor.cu +++ b/test/test_bit_floor.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, test_type *out, int numElements) { diff --git a/test/test_bit_floor_sycl.cpp b/test/test_bit_floor_sycl.cpp index 44cc6046..23747bcf 100644 --- a/test/test_bit_floor_sycl.cpp +++ b/test/test_bit_floor_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::bit_floor(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::bit_floor(a); }); } diff --git a/test/test_bit_width.cu b/test/test_bit_width.cu index 46917d89..96d83f36 100644 --- a/test/test_bit_width.cu +++ b/test/test_bit_width.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_bit_width_sycl.cpp b/test/test_bit_width_sycl.cpp index 51f864fb..b7733acd 100644 --- a/test/test_bit_width_sycl.cpp +++ b/test/test_bit_width_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::bit_width(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::bit_width(a); }); } diff --git a/test/test_boundaries.cpp b/test/test_boundaries.cpp index 490948a9..403b7663 100644 --- a/test/test_boundaries.cpp +++ b/test/test_boundaries.cpp @@ -7,7 +7,7 @@ #include #include -using boost::int128::int128_t; +using boost::int128::int128; namespace { @@ -24,9 +24,9 @@ std::uint64_t opaque(std::uint64_t v) return s; } -int128_t opaque(int128_t v) +int128 opaque(int128 v) { - return int128_t{opaque(v.signed_high()), opaque(v.low)}; + return int128{opaque(v.signed_high()), opaque(v.low)}; } } // namespace @@ -35,26 +35,26 @@ int main() { const auto int_max {opaque(BOOST_INT128_INT128_MAX)}; const auto int_min {opaque(BOOST_INT128_INT128_MIN)}; - const int128_t one {opaque(int128_t{0, 1})}; + const int128 one {opaque(int128{0, 1})}; // Negating a signed scalar of INT64_MIN must not overflow the scalar type. - // The scalar-operand result must equal promoting the scalar to int128_t first. + // The scalar-operand result must equal promoting the scalar to int128 first. const std::int64_t m {opaque((std::numeric_limits::min)())}; - const int128_t m128 {m}; - const int128_t a {opaque(int128_t{42, 1234})}; - const int128_t b {opaque(int128_t{0, 5})}; + const int128 m128 {m}; + const int128 a {opaque(int128{42, 1234})}; + const int128 b {opaque(int128{0, 5})}; - BOOST_TEST_EQ(a + m, a + m128); // operator+(int128_t, Signed) was int128_imp.hpp:1889 - BOOST_TEST_EQ(m + a, m128 + a); // operator+(Signed, int128_t) was int128_imp.hpp:1895 - BOOST_TEST_EQ(a / m, a / m128); // operator/(int128_t, Signed) was int128_imp.hpp:2295 - BOOST_TEST_EQ(m / b, m128 / b); // operator/(Signed, int128_t) was int128_imp.hpp:2324 + BOOST_TEST_EQ(a + m, a + m128); // operator+(int128, Signed) was int128_imp.hpp:1889 + BOOST_TEST_EQ(m + a, m128 + a); // operator+(Signed, int128) was int128_imp.hpp:1895 + BOOST_TEST_EQ(a / m, a / m128); // operator/(int128, Signed) was int128_imp.hpp:2295 + BOOST_TEST_EQ(m / b, m128 / b); // operator/(Signed, int128) was int128_imp.hpp:2324 // A 128-bit divisor of exactly -2^64 has abs().low == 0; the quotient of any // 64-bit numerator by it is 0 and must not divide by zero. - const int128_t neg_two_pow_64 {opaque(int128_t{-1, 0})}; - BOOST_TEST_EQ(opaque(std::int64_t{5}) / neg_two_pow_64, (int128_t{0, 0})); // operator/(Signed, int128_t) - BOOST_TEST_EQ(opaque(std::int64_t{-5}) / neg_two_pow_64, (int128_t{0, 0})); - BOOST_TEST_EQ(opaque(std::uint64_t{5}) / neg_two_pow_64, (int128_t{0, 0})); // operator/(Unsigned, int128_t) + const int128 neg_two_pow_64 {opaque(int128{-1, 0})}; + BOOST_TEST_EQ(opaque(std::int64_t{5}) / neg_two_pow_64, (int128{0, 0})); // operator/(Signed, int128) + BOOST_TEST_EQ(opaque(std::int64_t{-5}) / neg_two_pow_64, (int128{0, 0})); + BOOST_TEST_EQ(opaque(std::uint64_t{5}) / neg_two_pow_64, (int128{0, 0})); // operator/(Unsigned, int128) // Two's-complement rollover at the range boundaries: no UB, wraps like __int128. BOOST_TEST_EQ(int_max + one, int_min); // MAX + 1 -> MIN @@ -63,7 +63,7 @@ int main() BOOST_TEST_EQ(int_min - opaque(std::int64_t{1}), int_max); // MIN - 1 (scalar) -> MAX BOOST_TEST_EQ(-int_min, int_min); // -MIN wraps to itself BOOST_TEST_EQ(int_min * opaque(std::int64_t{-1}), int_min); // MIN * -1 overflows to MIN - BOOST_TEST_EQ(int_max * opaque(std::int64_t{2}), (-int128_t{0, 2})); // MAX * 2 overflows to -2 + BOOST_TEST_EQ(int_max * opaque(std::int64_t{2}), (-int128{0, 2})); // MAX * 2 overflows to -2 return boost::report_errors(); } diff --git a/test/test_builtin_parity.cpp b/test/test_builtin_parity.cpp index 3f3b25df..5133ae33 100644 --- a/test/test_builtin_parity.cpp +++ b/test/test_builtin_parity.cpp @@ -2,7 +2,7 @@ // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // -// Verifies that boost::int128::int128_t and boost::int128::uint128_t produce +// Verifies that boost::int128::int128 and boost::int128::uint128 produce // results identical to the built-in __int128 / unsigned __int128 types under // the C++ usual arithmetic conversions, for every operator x type-pair. @@ -21,8 +21,8 @@ # pragma GCC diagnostic ignored "-Wconversion" #endif -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; using boost::int128::detail::builtin_i128; using boost::int128::detail::builtin_u128; @@ -48,7 +48,7 @@ builtin_i128 random_value() } // ========================================================================= -// uint128_t vs small signed/unsigned built-in integers +// uint128 vs small signed/unsigned built-in integers // ========================================================================= template @@ -58,7 +58,7 @@ void test_uint128_vs_signed_small() { const auto raw_lhs {random_value()}; const auto raw_rhs {random_value()}; - const uint128_t lib_lhs {raw_lhs}; + const uint128 lib_lhs {raw_lhs}; const SignedT s_rhs {raw_rhs}; // Builtin path: usual arithmetic conversion converts SignedT to unsigned __int128 @@ -81,32 +81,32 @@ void test_uint128_vs_signed_small() BOOST_TEST_EQ(s_rhs >= lib_lhs, oracle_rhs >= oracle_lhs); // Arithmetic - BOOST_TEST_EQ(lib_lhs + s_rhs, uint128_t{oracle_lhs + oracle_rhs}); - BOOST_TEST_EQ(lib_lhs - s_rhs, uint128_t{oracle_lhs - oracle_rhs}); - BOOST_TEST_EQ(lib_lhs * s_rhs, uint128_t{oracle_lhs * oracle_rhs}); + BOOST_TEST_EQ(lib_lhs + s_rhs, uint128{oracle_lhs + oracle_rhs}); + BOOST_TEST_EQ(lib_lhs - s_rhs, uint128{oracle_lhs - oracle_rhs}); + BOOST_TEST_EQ(lib_lhs * s_rhs, uint128{oracle_lhs * oracle_rhs}); if (s_rhs != 0) { - BOOST_TEST_EQ(lib_lhs / s_rhs, uint128_t{oracle_lhs / oracle_rhs}); - BOOST_TEST_EQ(lib_lhs % s_rhs, uint128_t{oracle_lhs % oracle_rhs}); + BOOST_TEST_EQ(lib_lhs / s_rhs, uint128{oracle_lhs / oracle_rhs}); + BOOST_TEST_EQ(lib_lhs % s_rhs, uint128{oracle_lhs % oracle_rhs}); } if (raw_lhs != 0) { - BOOST_TEST_EQ(s_rhs + lib_lhs, uint128_t{oracle_rhs + oracle_lhs}); - BOOST_TEST_EQ(s_rhs - lib_lhs, uint128_t{oracle_rhs - oracle_lhs}); - BOOST_TEST_EQ(s_rhs * lib_lhs, uint128_t{oracle_rhs * oracle_lhs}); - BOOST_TEST_EQ(s_rhs / lib_lhs, uint128_t{oracle_rhs / oracle_lhs}); - BOOST_TEST_EQ(s_rhs % lib_lhs, uint128_t{oracle_rhs % oracle_lhs}); + BOOST_TEST_EQ(s_rhs + lib_lhs, uint128{oracle_rhs + oracle_lhs}); + BOOST_TEST_EQ(s_rhs - lib_lhs, uint128{oracle_rhs - oracle_lhs}); + BOOST_TEST_EQ(s_rhs * lib_lhs, uint128{oracle_rhs * oracle_lhs}); + BOOST_TEST_EQ(s_rhs / lib_lhs, uint128{oracle_rhs / oracle_lhs}); + BOOST_TEST_EQ(s_rhs % lib_lhs, uint128{oracle_rhs % oracle_lhs}); } // Bitwise - BOOST_TEST_EQ(lib_lhs | s_rhs, uint128_t{oracle_lhs | oracle_rhs}); - BOOST_TEST_EQ(lib_lhs & s_rhs, uint128_t{oracle_lhs & oracle_rhs}); - BOOST_TEST_EQ(lib_lhs ^ s_rhs, uint128_t{oracle_lhs ^ oracle_rhs}); + BOOST_TEST_EQ(lib_lhs | s_rhs, uint128{oracle_lhs | oracle_rhs}); + BOOST_TEST_EQ(lib_lhs & s_rhs, uint128{oracle_lhs & oracle_rhs}); + BOOST_TEST_EQ(lib_lhs ^ s_rhs, uint128{oracle_lhs ^ oracle_rhs}); } } // ========================================================================= -// int128_t vs small signed/unsigned built-in integers +// int128 vs small signed/unsigned built-in integers // ========================================================================= template @@ -116,10 +116,10 @@ void test_int128_vs_unsigned_small() { const auto raw_lhs {random_value()}; const auto raw_rhs {random_value()}; - const int128_t lib_lhs {raw_lhs}; + const int128 lib_lhs {raw_lhs}; const UnsignedT u_rhs {raw_rhs}; - // Builtin path: int128_t has higher rank and can represent UnsignedT, + // Builtin path: int128 has higher rank and can represent UnsignedT, // so both promote to __int128 (signed) and the result type is signed. // Comparisons use the signed oracle directly. Arithmetic and bitwise // are performed in the unsigned domain (well-defined wrap-around) and @@ -144,31 +144,31 @@ void test_int128_vs_unsigned_small() BOOST_TEST_EQ(u_rhs > lib_lhs, oracle_rhs > oracle_lhs); BOOST_TEST_EQ(u_rhs >= lib_lhs, oracle_rhs >= oracle_lhs); - BOOST_TEST_EQ(lib_lhs + u_rhs, int128_t{static_cast(oracle_lhs_u + oracle_rhs_u)}); - BOOST_TEST_EQ(lib_lhs - u_rhs, int128_t{static_cast(oracle_lhs_u - oracle_rhs_u)}); - BOOST_TEST_EQ(lib_lhs * u_rhs, int128_t{static_cast(oracle_lhs_u * oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs + u_rhs, int128{static_cast(oracle_lhs_u + oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs - u_rhs, int128{static_cast(oracle_lhs_u - oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs * u_rhs, int128{static_cast(oracle_lhs_u * oracle_rhs_u)}); if (u_rhs != 0) { - BOOST_TEST_EQ(lib_lhs / u_rhs, int128_t{oracle_lhs / oracle_rhs}); - BOOST_TEST_EQ(lib_lhs % u_rhs, int128_t{oracle_lhs % oracle_rhs}); + BOOST_TEST_EQ(lib_lhs / u_rhs, int128{oracle_lhs / oracle_rhs}); + BOOST_TEST_EQ(lib_lhs % u_rhs, int128{oracle_lhs % oracle_rhs}); } if (raw_lhs != 0) { - BOOST_TEST_EQ(u_rhs + lib_lhs, int128_t{static_cast(oracle_rhs_u + oracle_lhs_u)}); - BOOST_TEST_EQ(u_rhs - lib_lhs, int128_t{static_cast(oracle_rhs_u - oracle_lhs_u)}); - BOOST_TEST_EQ(u_rhs * lib_lhs, int128_t{static_cast(oracle_rhs_u * oracle_lhs_u)}); - BOOST_TEST_EQ(u_rhs / lib_lhs, int128_t{oracle_rhs / oracle_lhs}); - BOOST_TEST_EQ(u_rhs % lib_lhs, int128_t{oracle_rhs % oracle_lhs}); + BOOST_TEST_EQ(u_rhs + lib_lhs, int128{static_cast(oracle_rhs_u + oracle_lhs_u)}); + BOOST_TEST_EQ(u_rhs - lib_lhs, int128{static_cast(oracle_rhs_u - oracle_lhs_u)}); + BOOST_TEST_EQ(u_rhs * lib_lhs, int128{static_cast(oracle_rhs_u * oracle_lhs_u)}); + BOOST_TEST_EQ(u_rhs / lib_lhs, int128{oracle_rhs / oracle_lhs}); + BOOST_TEST_EQ(u_rhs % lib_lhs, int128{oracle_rhs % oracle_lhs}); } - BOOST_TEST_EQ(lib_lhs | u_rhs, int128_t{static_cast(oracle_lhs_u | oracle_rhs_u)}); - BOOST_TEST_EQ(lib_lhs & u_rhs, int128_t{static_cast(oracle_lhs_u & oracle_rhs_u)}); - BOOST_TEST_EQ(lib_lhs ^ u_rhs, int128_t{static_cast(oracle_lhs_u ^ oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs | u_rhs, int128{static_cast(oracle_lhs_u | oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs & u_rhs, int128{static_cast(oracle_lhs_u & oracle_rhs_u)}); + BOOST_TEST_EQ(lib_lhs ^ u_rhs, int128{static_cast(oracle_lhs_u ^ oracle_rhs_u)}); } } // ========================================================================= -// uint128_t vs int128_t (cross-type) +// uint128 vs int128 (cross-type) // ========================================================================= void test_cross_type() @@ -177,8 +177,8 @@ void test_cross_type() { const auto raw_u {random_value()}; const auto raw_i {random_value()}; - const uint128_t lib_u {raw_u}; - const int128_t lib_i {raw_i}; + const uint128 lib_u {raw_u}; + const int128 lib_i {raw_i}; // Both promote to unsigned __int128 (same rank, signed -> unsigned) const builtin_u128 oracle_u {raw_u}; @@ -198,44 +198,44 @@ void test_cross_type() BOOST_TEST_EQ(lib_i > lib_u, oracle_i > oracle_u); BOOST_TEST_EQ(lib_i >= lib_u, oracle_i >= oracle_u); - BOOST_TEST_EQ(lib_u + lib_i, uint128_t{oracle_u + oracle_i}); - BOOST_TEST_EQ(lib_u - lib_i, uint128_t{oracle_u - oracle_i}); - BOOST_TEST_EQ(lib_u * lib_i, uint128_t{oracle_u * oracle_i}); + BOOST_TEST_EQ(lib_u + lib_i, uint128{oracle_u + oracle_i}); + BOOST_TEST_EQ(lib_u - lib_i, uint128{oracle_u - oracle_i}); + BOOST_TEST_EQ(lib_u * lib_i, uint128{oracle_u * oracle_i}); if (oracle_i != 0) { - BOOST_TEST_EQ(lib_u / lib_i, uint128_t{oracle_u / oracle_i}); - BOOST_TEST_EQ(lib_u % lib_i, uint128_t{oracle_u % oracle_i}); + BOOST_TEST_EQ(lib_u / lib_i, uint128{oracle_u / oracle_i}); + BOOST_TEST_EQ(lib_u % lib_i, uint128{oracle_u % oracle_i}); } if (oracle_u != 0) { - BOOST_TEST_EQ(lib_i / lib_u, uint128_t{oracle_i / oracle_u}); - BOOST_TEST_EQ(lib_i % lib_u, uint128_t{oracle_i % oracle_u}); + BOOST_TEST_EQ(lib_i / lib_u, uint128{oracle_i / oracle_u}); + BOOST_TEST_EQ(lib_i % lib_u, uint128{oracle_i % oracle_u}); } - // Bitwise: same-rank, signed -> unsigned, result uint128_t - BOOST_TEST_EQ(lib_u | lib_i, uint128_t{oracle_u | oracle_i}); - BOOST_TEST_EQ(lib_u & lib_i, uint128_t{oracle_u & oracle_i}); - BOOST_TEST_EQ(lib_u ^ lib_i, uint128_t{oracle_u ^ oracle_i}); - BOOST_TEST_EQ(lib_i | lib_u, uint128_t{oracle_i | oracle_u}); - BOOST_TEST_EQ(lib_i & lib_u, uint128_t{oracle_i & oracle_u}); - BOOST_TEST_EQ(lib_i ^ lib_u, uint128_t{oracle_i ^ oracle_u}); + // Bitwise: same-rank, signed -> unsigned, result uint128 + BOOST_TEST_EQ(lib_u | lib_i, uint128{oracle_u | oracle_i}); + BOOST_TEST_EQ(lib_u & lib_i, uint128{oracle_u & oracle_i}); + BOOST_TEST_EQ(lib_u ^ lib_i, uint128{oracle_u ^ oracle_i}); + BOOST_TEST_EQ(lib_i | lib_u, uint128{oracle_i | oracle_u}); + BOOST_TEST_EQ(lib_i & lib_u, uint128{oracle_i & oracle_u}); + BOOST_TEST_EQ(lib_i ^ lib_u, uint128{oracle_i ^ oracle_u}); // Shifts: result type follows LHS. Compute the int128 left-shift via // the unsigned domain (well-defined wrap-around) and reinterpret as // signed to avoid UB when `raw_i` is negative or the result overflows. const std::uint64_t shift_amount {static_cast(rng()) % 128}; - const uint128_t lib_u_shift {shift_amount}; - const int128_t lib_i_shift {static_cast(shift_amount)}; + const uint128 lib_u_shift {shift_amount}; + const int128 lib_i_shift {static_cast(shift_amount)}; const builtin_u128 raw_i_u = static_cast(raw_i); - BOOST_TEST_EQ(lib_i << lib_u_shift, int128_t{static_cast(raw_i_u << shift_amount)}); - BOOST_TEST_EQ(lib_u << lib_i_shift, uint128_t{raw_u << shift_amount}); - BOOST_TEST_EQ(lib_i >> lib_u_shift, int128_t{raw_i >> shift_amount}); - BOOST_TEST_EQ(lib_u >> lib_i_shift, uint128_t{raw_u >> shift_amount}); + BOOST_TEST_EQ(lib_i << lib_u_shift, int128{static_cast(raw_i_u << shift_amount)}); + BOOST_TEST_EQ(lib_u << lib_i_shift, uint128{raw_u << shift_amount}); + BOOST_TEST_EQ(lib_i >> lib_u_shift, int128{raw_i >> shift_amount}); + BOOST_TEST_EQ(lib_u >> lib_i_shift, uint128{raw_u >> shift_amount}); } } // ========================================================================= -// uint128_t vs builtin_i128 +// uint128 vs builtin_i128 // ========================================================================= void test_uint128_vs_builtin_i128() @@ -244,7 +244,7 @@ void test_uint128_vs_builtin_i128() { const auto raw_u {random_value()}; const auto raw_i {random_value()}; - const uint128_t lib_u {raw_u}; + const uint128 lib_u {raw_u}; const builtin_u128 oracle_u {raw_u}; const builtin_u128 oracle_i = static_cast(raw_i); @@ -256,27 +256,27 @@ void test_uint128_vs_builtin_i128() BOOST_TEST_EQ(lib_u > raw_i, oracle_u > oracle_i); BOOST_TEST_EQ(lib_u >= raw_i, oracle_u >= oracle_i); - BOOST_TEST_EQ(lib_u + raw_i, uint128_t{oracle_u + oracle_i}); - BOOST_TEST_EQ(lib_u - raw_i, uint128_t{oracle_u - oracle_i}); - BOOST_TEST_EQ(lib_u * raw_i, uint128_t{oracle_u * oracle_i}); + BOOST_TEST_EQ(lib_u + raw_i, uint128{oracle_u + oracle_i}); + BOOST_TEST_EQ(lib_u - raw_i, uint128{oracle_u - oracle_i}); + BOOST_TEST_EQ(lib_u * raw_i, uint128{oracle_u * oracle_i}); if (oracle_i != 0) { - BOOST_TEST_EQ(lib_u / raw_i, uint128_t{oracle_u / oracle_i}); - BOOST_TEST_EQ(lib_u % raw_i, uint128_t{oracle_u % oracle_i}); + BOOST_TEST_EQ(lib_u / raw_i, uint128{oracle_u / oracle_i}); + BOOST_TEST_EQ(lib_u % raw_i, uint128{oracle_u % oracle_i}); } - BOOST_TEST_EQ(lib_u | raw_i, uint128_t{oracle_u | oracle_i}); - BOOST_TEST_EQ(lib_u & raw_i, uint128_t{oracle_u & oracle_i}); - BOOST_TEST_EQ(lib_u ^ raw_i, uint128_t{oracle_u ^ oracle_i}); + BOOST_TEST_EQ(lib_u | raw_i, uint128{oracle_u | oracle_i}); + BOOST_TEST_EQ(lib_u & raw_i, uint128{oracle_u & oracle_i}); + BOOST_TEST_EQ(lib_u ^ raw_i, uint128{oracle_u ^ oracle_i}); const unsigned shift_amount {static_cast(rng() % 128)}; - BOOST_TEST_EQ(lib_u << shift_amount, uint128_t{oracle_u << shift_amount}); - BOOST_TEST_EQ(lib_u >> shift_amount, uint128_t{oracle_u >> shift_amount}); + BOOST_TEST_EQ(lib_u << shift_amount, uint128{oracle_u << shift_amount}); + BOOST_TEST_EQ(lib_u >> shift_amount, uint128{oracle_u >> shift_amount}); } } // ========================================================================= -// int128_t vs builtin_u128 +// int128 vs builtin_u128 // ========================================================================= void test_int128_vs_builtin_u128() @@ -285,10 +285,10 @@ void test_int128_vs_builtin_u128() { const auto raw_i {random_value()}; const auto raw_u {random_value()}; - const int128_t lib_i {raw_i}; + const int128 lib_i {raw_i}; // Both promote to unsigned __int128 (same rank, signed -> unsigned). - // Result of arithmetic is unsigned __int128 (uint128_t in library form). + // Result of arithmetic is unsigned __int128 (uint128 in library form). const builtin_u128 oracle_i = static_cast(raw_i); const builtin_u128 oracle_u {raw_u}; @@ -299,28 +299,28 @@ void test_int128_vs_builtin_u128() BOOST_TEST_EQ(lib_i > raw_u, oracle_i > oracle_u); BOOST_TEST_EQ(lib_i >= raw_u, oracle_i >= oracle_u); - BOOST_TEST_EQ(lib_i + raw_u, uint128_t{oracle_i + oracle_u}); - BOOST_TEST_EQ(lib_i - raw_u, uint128_t{oracle_i - oracle_u}); - BOOST_TEST_EQ(lib_i * raw_u, uint128_t{oracle_i * oracle_u}); + BOOST_TEST_EQ(lib_i + raw_u, uint128{oracle_i + oracle_u}); + BOOST_TEST_EQ(lib_i - raw_u, uint128{oracle_i - oracle_u}); + BOOST_TEST_EQ(lib_i * raw_u, uint128{oracle_i * oracle_u}); if (oracle_u != 0) { - BOOST_TEST_EQ(lib_i / raw_u, uint128_t{oracle_i / oracle_u}); - BOOST_TEST_EQ(lib_i % raw_u, uint128_t{oracle_i % oracle_u}); + BOOST_TEST_EQ(lib_i / raw_u, uint128{oracle_i / oracle_u}); + BOOST_TEST_EQ(lib_i % raw_u, uint128{oracle_i % oracle_u}); } - BOOST_TEST_EQ(lib_i | raw_u, uint128_t{oracle_i | oracle_u}); - BOOST_TEST_EQ(lib_i & raw_u, uint128_t{oracle_i & oracle_u}); - BOOST_TEST_EQ(lib_i ^ raw_u, uint128_t{oracle_i ^ oracle_u}); + BOOST_TEST_EQ(lib_i | raw_u, uint128{oracle_i | oracle_u}); + BOOST_TEST_EQ(lib_i & raw_u, uint128{oracle_i & oracle_u}); + BOOST_TEST_EQ(lib_i ^ raw_u, uint128{oracle_i ^ oracle_u}); - // Shifts: result type follows LHS (int128_t for `lib_i << count`). + // Shifts: result type follows LHS (int128 for `lib_i << count`). // Left shift: compute via unsigned (well-defined wrap-around) and // reinterpret as signed, since `signed << count` overflowing or // shifting a negative value is UB pre-C++20 (UBSan flags it). // Right shift: keep signed for arithmetic-shift semantics. const unsigned shift_amount {static_cast(rng() % 128)}; const builtin_u128 raw_i_u = static_cast(raw_i); - BOOST_TEST_EQ(lib_i << shift_amount, int128_t{static_cast(raw_i_u << shift_amount)}); - BOOST_TEST_EQ(lib_i >> shift_amount, int128_t{raw_i >> shift_amount}); + BOOST_TEST_EQ(lib_i << shift_amount, int128{static_cast(raw_i_u << shift_amount)}); + BOOST_TEST_EQ(lib_i >> shift_amount, int128{raw_i >> shift_amount}); } } @@ -372,17 +372,17 @@ void test_signed_boundaries() for (std::size_t i {0}; i < count; ++i) { const auto raw_a {values[i]}; - const int128_t a {raw_a}; + const int128 a {raw_a}; // Unary and conversion. - BOOST_TEST_EQ(-a, int128_t{static_cast(0U - static_cast(raw_a))}); - BOOST_TEST_EQ(~a, int128_t{static_cast(~static_cast(raw_a))}); - BOOST_TEST_EQ(int128_t{static_cast(a)}, int128_t{raw_a}); + BOOST_TEST_EQ(-a, int128{static_cast(0U - static_cast(raw_a))}); + BOOST_TEST_EQ(~a, int128{static_cast(~static_cast(raw_a))}); + BOOST_TEST_EQ(int128{static_cast(a)}, int128{raw_a}); BOOST_TEST_EQ(a.signed_high(), static_cast(static_cast(raw_a) >> 64)); // abs(INT128_MIN) has no representable result; it wraps, like the builtin. BOOST_TEST_EQ(boost::int128::abs(a), - int128_t{static_cast(raw_a < 0 ? 0U - static_cast(raw_a) + int128{static_cast(raw_a < 0 ? 0U - static_cast(raw_a) : static_cast(raw_a))}); // Float conversion is the other place the sign is applied by hand. Compared @@ -394,15 +394,15 @@ void test_signed_boundaries() // Arithmetic right shift fills with the sign bit at every distance. for (unsigned shift {0}; shift < 128U; ++shift) { - BOOST_TEST_EQ(a >> shift, int128_t{raw_a >> shift}); + BOOST_TEST_EQ(a >> shift, int128{raw_a >> shift}); BOOST_TEST_EQ(a << shift, - int128_t{static_cast(static_cast(raw_a) << shift)}); + int128{static_cast(static_cast(raw_a) << shift)}); } for (std::size_t j {0}; j < count; ++j) { const auto raw_b {values[j]}; - const int128_t b {raw_b}; + const int128 b {raw_b}; BOOST_TEST_EQ(a == b, raw_a == raw_b); BOOST_TEST_EQ(a != b, raw_a != raw_b); @@ -414,25 +414,25 @@ void test_signed_boundaries() // Computed through the unsigned domain: signed overflow is UB for the oracle. const builtin_u128 ua {static_cast(raw_a)}; const builtin_u128 ub {static_cast(raw_b)}; - BOOST_TEST_EQ(a + b, int128_t{static_cast(ua + ub)}); - BOOST_TEST_EQ(a - b, int128_t{static_cast(ua - ub)}); - BOOST_TEST_EQ(a * b, int128_t{static_cast(ua * ub)}); + BOOST_TEST_EQ(a + b, int128{static_cast(ua + ub)}); + BOOST_TEST_EQ(a - b, int128{static_cast(ua - ub)}); + BOOST_TEST_EQ(a * b, int128{static_cast(ua * ub)}); // INT128_MIN / -1 overflows; the builtin traps on it, so skip that pair. const bool overflowing_div {raw_b == -1 && raw_a == static_cast(top_bit)}; if (raw_b != 0 && !overflowing_div) { - BOOST_TEST_EQ(a / b, int128_t{raw_a / raw_b}); - BOOST_TEST_EQ(a % b, int128_t{raw_a % raw_b}); + BOOST_TEST_EQ(a / b, int128{raw_a / raw_b}); + BOOST_TEST_EQ(a % b, int128{raw_a % raw_b}); const auto qr {boost::int128::div(a, b)}; - BOOST_TEST_EQ(qr.quot, int128_t{raw_a / raw_b}); - BOOST_TEST_EQ(qr.rem, int128_t{raw_a % raw_b}); + BOOST_TEST_EQ(qr.quot, int128{raw_a / raw_b}); + BOOST_TEST_EQ(qr.rem, int128{raw_a % raw_b}); } - BOOST_TEST_EQ(a | b, int128_t{static_cast(ua | ub)}); - BOOST_TEST_EQ(a & b, int128_t{static_cast(ua & ub)}); - BOOST_TEST_EQ(a ^ b, int128_t{static_cast(ua ^ ub)}); + BOOST_TEST_EQ(a | b, int128{static_cast(ua | ub)}); + BOOST_TEST_EQ(a & b, int128{static_cast(ua & ub)}); + BOOST_TEST_EQ(a ^ b, int128{static_cast(ua ^ ub)}); // Saturating arithmetic clamps instead of wrapping. const builtin_i128 sum {static_cast(ua + ub)}; @@ -440,14 +440,14 @@ void test_signed_boundaries() const builtin_i128 expected_add {add_overflowed ? (raw_a < 0 ? static_cast(top_bit) : static_cast(~top_bit)) : sum}; - BOOST_TEST_EQ(boost::int128::saturating_add(a, b), int128_t{expected_add}); + BOOST_TEST_EQ(boost::int128::saturating_add(a, b), int128{expected_add}); const builtin_i128 diff {static_cast(ua - ub)}; const bool sub_overflowed {(raw_a < 0) != (raw_b < 0) && (diff < 0) != (raw_a < 0)}; const builtin_i128 expected_sub {sub_overflowed ? (raw_a < 0 ? static_cast(top_bit) : static_cast(~top_bit)) : diff}; - BOOST_TEST_EQ(boost::int128::saturating_sub(a, b), int128_t{expected_sub}); + BOOST_TEST_EQ(boost::int128::saturating_sub(a, b), int128{expected_sub}); // midpoint rounds toward the first argument. Neither expression below can // overflow: b - a is representable when the signs agree, and a + b is @@ -462,7 +462,7 @@ void test_signed_boundaries() const builtin_i128 straddling_sum {raw_a + raw_b}; mid = (straddling_sum >> 1) + ((straddling_sum & 1) != 0 && raw_a > raw_b ? 1 : 0); } - BOOST_TEST_EQ(boost::int128::midpoint(a, b), int128_t{mid}); + BOOST_TEST_EQ(boost::int128::midpoint(a, b), int128{mid}); } } } diff --git a/test/test_byteswap.cu b/test/test_byteswap.cu index 5fd7094f..449e0974 100644 --- a/test/test_byteswap.cu +++ b/test/test_byteswap.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, test_type *out, int numElements) { diff --git a/test/test_byteswap_sycl.cpp b/test/test_byteswap_sycl.cpp index 87fb124b..feef1851 100644 --- a/test/test_byteswap_sycl.cpp +++ b/test/test_byteswap_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::byteswap(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::byteswap(a); }); } diff --git a/test/test_ckd.cpp b/test/test_ckd.cpp index e79343cc..f80d33b2 100644 --- a/test/test_ckd.cpp +++ b/test/test_ckd.cpp @@ -11,8 +11,8 @@ using boost::int128::ckd_add; using boost::int128::ckd_sub; using boost::int128::ckd_mul; -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; constexpr std::size_t N {4096}; static std::mt19937_64 rng {42}; @@ -192,14 +192,14 @@ void test_standard_oracle() {} // #if defined(__SIZEOF_INT128__) && (defined(__GNUC__) || defined(__clang__)) -static uint128_t lib_u(const unsigned __int128 v) +static uint128 lib_u(const unsigned __int128 v) { - return uint128_t{static_cast(v >> 64), static_cast(v)}; + return uint128{static_cast(v >> 64), static_cast(v)}; } -static int128_t lib_s(const __int128 v) +static int128 lib_s(const __int128 v) { - return static_cast(lib_u(static_cast(v))); + return static_cast(lib_u(static_cast(v))); } static unsigned __int128 rand_native() @@ -313,41 +313,41 @@ void native_fuzz(Ref ref_overflow, Ckd ckd_overflow) const __int128 sa {static_cast<__int128>(ua)}; const __int128 sb {static_cast<__int128>(ub)}; - // uint128_t target, unsigned operands + // uint128 target, unsigned operands { unsigned __int128 ref {}; const bool ref_of {ref_overflow(ua, ub, &ref)}; - uint128_t got {}; + uint128 got {}; const bool got_of {ckd_overflow(&got, lib_u(ua), lib_u(ub))}; BOOST_TEST_EQ(got_of, ref_of); BOOST_TEST(got == lib_u(ref)); } - // int128_t target, signed operands + // int128 target, signed operands { __int128 ref {}; const bool ref_of {ref_overflow(sa, sb, &ref)}; - int128_t got {}; + int128 got {}; const bool got_of {ckd_overflow(&got, lib_s(sa), lib_s(sb))}; BOOST_TEST_EQ(got_of, ref_of); BOOST_TEST(got == lib_s(ref)); } - // int128_t target, mixed-sign operands (unsigned + signed) + // int128 target, mixed-sign operands (unsigned + signed) { __int128 ref {}; const bool ref_of {ref_overflow(ua, sb, &ref)}; - int128_t got {}; + int128 got {}; const bool got_of {ckd_overflow(&got, lib_u(ua), lib_s(sb))}; BOOST_TEST_EQ(got_of, ref_of); BOOST_TEST(got == lib_s(ref)); } - // uint128_t target, mixed-sign operands (signed + unsigned) + // uint128 target, mixed-sign operands (signed + unsigned) { unsigned __int128 ref {}; const bool ref_of {ref_overflow(sa, ub, &ref)}; - uint128_t got {}; + uint128 got {}; const bool got_of {ckd_overflow(&got, lib_s(sa), lib_u(ub))}; BOOST_TEST_EQ(got_of, ref_of); BOOST_TEST(got == lib_u(ref)); @@ -380,98 +380,98 @@ void test_native_oracle() {} // Hand-verified edge cases that run on every platform, including those without // a native 128-bit type. // -constexpr auto u_max {(std::numeric_limits::max)()}; -constexpr auto i_max {(std::numeric_limits::max)()}; -constexpr auto i_min {(std::numeric_limits::min)()}; +constexpr auto u_max {(std::numeric_limits::max)()}; +constexpr auto i_max {(std::numeric_limits::max)()}; +constexpr auto i_min {(std::numeric_limits::min)()}; void test_add_edges() { - uint128_t u {0}; - BOOST_TEST_EQ(ckd_add(&u, u_max, uint128_t{1}), true); // 2^128 wraps to 0 - BOOST_TEST(u == uint128_t{0}); - BOOST_TEST_EQ(ckd_add(&u, uint128_t{5}, int128_t{-3}), false); - BOOST_TEST(u == uint128_t{2}); - BOOST_TEST_EQ(ckd_add(&u, uint128_t{3}, int128_t{-5}), true); // -2 wraps - BOOST_TEST(u == u_max - uint128_t{1}); + uint128 u {0}; + BOOST_TEST_EQ(ckd_add(&u, u_max, uint128{1}), true); // 2^128 wraps to 0 + BOOST_TEST(u == uint128{0}); + BOOST_TEST_EQ(ckd_add(&u, uint128{5}, int128{-3}), false); + BOOST_TEST(u == uint128{2}); + BOOST_TEST_EQ(ckd_add(&u, uint128{3}, int128{-5}), true); // -2 wraps + BOOST_TEST(u == u_max - uint128{1}); BOOST_TEST_EQ(ckd_add(&u, u_max, u_max), true); // carry past 2^128 - int128_t i {0}; - BOOST_TEST_EQ(ckd_add(&i, i_max, int128_t{1}), true); // INT128_MAX + 1 -> INT128_MIN + int128 i {0}; + BOOST_TEST_EQ(ckd_add(&i, i_max, int128{1}), true); // INT128_MAX + 1 -> INT128_MIN BOOST_TEST(i == i_min); BOOST_TEST_EQ(ckd_add(&i, i_max, i_min), false); - BOOST_TEST(i == int128_t{-1}); - BOOST_TEST_EQ(ckd_add(&i, u_max, uint128_t{0}), true); // 2^128 - 1 unfit in signed - BOOST_TEST(i == int128_t{-1}); + BOOST_TEST(i == int128{-1}); + BOOST_TEST_EQ(ckd_add(&i, u_max, uint128{0}), true); // 2^128 - 1 unfit in signed + BOOST_TEST(i == int128{-1}); } void test_sub_edges() { - uint128_t u {0}; - BOOST_TEST_EQ(ckd_sub(&u, uint128_t{0}, uint128_t{1}), true); // -1 wraps to 2^128 - 1 + uint128 u {0}; + BOOST_TEST_EQ(ckd_sub(&u, uint128{0}, uint128{1}), true); // -1 wraps to 2^128 - 1 BOOST_TEST(u == u_max); - BOOST_TEST_EQ(ckd_sub(&u, uint128_t{5}, uint128_t{3}), false); - BOOST_TEST(u == uint128_t{2}); - BOOST_TEST_EQ(ckd_sub(&u, u_max, int128_t{-1}), true); // 2^128 wraps to 0 - BOOST_TEST(u == uint128_t{0}); + BOOST_TEST_EQ(ckd_sub(&u, uint128{5}, uint128{3}), false); + BOOST_TEST(u == uint128{2}); + BOOST_TEST_EQ(ckd_sub(&u, u_max, int128{-1}), true); // 2^128 wraps to 0 + BOOST_TEST(u == uint128{0}); - int128_t i {0}; - BOOST_TEST_EQ(ckd_sub(&i, i_min, int128_t{1}), true); // INT128_MIN - 1 -> INT128_MAX + int128 i {0}; + BOOST_TEST_EQ(ckd_sub(&i, i_min, int128{1}), true); // INT128_MIN - 1 -> INT128_MAX BOOST_TEST(i == i_max); - BOOST_TEST_EQ(ckd_sub(&i, i_max, int128_t{-1}), true); // -> INT128_MIN + BOOST_TEST_EQ(ckd_sub(&i, i_max, int128{-1}), true); // -> INT128_MIN BOOST_TEST(i == i_min); BOOST_TEST_EQ(ckd_sub(&i, i_max, i_max), false); - BOOST_TEST(i == int128_t{0}); + BOOST_TEST(i == int128{0}); BOOST_TEST_EQ(ckd_sub(&i, i_min, i_min), false); - BOOST_TEST(i == int128_t{0}); + BOOST_TEST(i == int128{0}); // Narrow targets. std::int32_t r32 {0}; - BOOST_TEST_EQ(ckd_sub(&r32, int128_t{1000}, int128_t{2000}), false); + BOOST_TEST_EQ(ckd_sub(&r32, int128{1000}, int128{2000}), false); BOOST_TEST_EQ(r32, -1000); std::uint8_t r8 {0}; - BOOST_TEST_EQ(ckd_sub(&r8, uint128_t{0}, uint128_t{1}), true); + BOOST_TEST_EQ(ckd_sub(&r8, uint128{0}, uint128{1}), true); BOOST_TEST_EQ(static_cast(r8), 255); } void test_mul_edges() { - int128_t i {0}; - BOOST_TEST_EQ(ckd_mul(&i, i_min, int128_t{-1}), true); // 2^127 wraps to INT128_MIN + int128 i {0}; + BOOST_TEST_EQ(ckd_mul(&i, i_min, int128{-1}), true); // 2^127 wraps to INT128_MIN BOOST_TEST(i == i_min); - BOOST_TEST_EQ(ckd_mul(&i, i_max, int128_t{2}), true); // 2^128 - 2 -> -2 - BOOST_TEST(i == int128_t{-2}); - BOOST_TEST_EQ(ckd_mul(&i, i_min, int128_t{1}), false); + BOOST_TEST_EQ(ckd_mul(&i, i_max, int128{2}), true); // 2^128 - 2 -> -2 + BOOST_TEST(i == int128{-2}); + BOOST_TEST_EQ(ckd_mul(&i, i_min, int128{1}), false); BOOST_TEST(i == i_min); - BOOST_TEST_EQ(ckd_mul(&i, int128_t{-3}, int128_t{4}), false); - BOOST_TEST(i == int128_t{-12}); - BOOST_TEST_EQ(ckd_mul(&i, int128_t{0}, int128_t{-7}), false); - BOOST_TEST(i == int128_t{0}); - - uint128_t u {0}; - BOOST_TEST_EQ(ckd_mul(&u, u_max, uint128_t{2}), true); // 2^129 - 2 wraps - BOOST_TEST(u == u_max - uint128_t{1}); - const uint128_t two_64 {1U, 0U}; // 2^64 + BOOST_TEST_EQ(ckd_mul(&i, int128{-3}, int128{4}), false); + BOOST_TEST(i == int128{-12}); + BOOST_TEST_EQ(ckd_mul(&i, int128{0}, int128{-7}), false); + BOOST_TEST(i == int128{0}); + + uint128 u {0}; + BOOST_TEST_EQ(ckd_mul(&u, u_max, uint128{2}), true); // 2^129 - 2 wraps + BOOST_TEST(u == u_max - uint128{1}); + const uint128 two_64 {1U, 0U}; // 2^64 BOOST_TEST_EQ(ckd_mul(&u, two_64, two_64), true); // 2^128 wraps to 0 - BOOST_TEST(u == uint128_t{0}); - BOOST_TEST_EQ(ckd_mul(&u, uint128_t{0}, u_max), false); - BOOST_TEST(u == uint128_t{0}); - BOOST_TEST_EQ(ckd_mul(&u, uint128_t{6}, uint128_t{7}), false); - BOOST_TEST(u == uint128_t{42}); - BOOST_TEST_EQ(ckd_mul(&u, u_max, int128_t{-1}), true); // negative result in unsigned - BOOST_TEST(u == uint128_t{1}); + BOOST_TEST(u == uint128{0}); + BOOST_TEST_EQ(ckd_mul(&u, uint128{0}, u_max), false); + BOOST_TEST(u == uint128{0}); + BOOST_TEST_EQ(ckd_mul(&u, uint128{6}, uint128{7}), false); + BOOST_TEST(u == uint128{42}); + BOOST_TEST_EQ(ckd_mul(&u, u_max, int128{-1}), true); // negative result in unsigned + BOOST_TEST(u == uint128{1}); // Narrow targets. std::int32_t r32 {0}; - BOOST_TEST_EQ(ckd_mul(&r32, int128_t{1000}, int128_t{1000}), false); + BOOST_TEST_EQ(ckd_mul(&r32, int128{1000}, int128{1000}), false); BOOST_TEST_EQ(r32, 1000000); std::uint8_t r8 {0}; - BOOST_TEST_EQ(ckd_mul(&r8, uint128_t{20}, uint128_t{20}), true); // 400 wraps mod 256 + BOOST_TEST_EQ(ckd_mul(&r8, uint128{20}, uint128{20}), true); // 400 wraps mod 256 BOOST_TEST_EQ(static_cast(r8), 144); std::int8_t r8s {0}; - BOOST_TEST_EQ(ckd_mul(&r8s, int128_t{-5}, int128_t{20}), false); + BOOST_TEST_EQ(ckd_mul(&r8s, int128{-5}, int128{20}), false); BOOST_TEST_EQ(static_cast(r8s), -100); } @@ -480,7 +480,7 @@ void test_mul_edges() // #if defined(__GNUC__) && __GNUC__ <= 7 && !defined(__clang__) && !defined(__SIZEOF_INT128__) -# define BOOST_INT128_TEST_CKD_NO_CONSTEXPR_128 +# define BOOST_int128EST_CKD_NO_CONSTEXPR_128 #endif constexpr bool add_overflows_int_max() @@ -517,11 +517,11 @@ constexpr int mul_value() constexpr bool mul_overflows_i128_min() { - int128_t r {0}; - return ckd_mul(&r, (std::numeric_limits::min)(), int128_t{-1}); + int128 r {0}; + return ckd_mul(&r, (std::numeric_limits::min)(), int128{-1}); } -#ifndef BOOST_INT128_TEST_CKD_NO_CONSTEXPR_128 +#ifndef BOOST_int128EST_CKD_NO_CONSTEXPR_128 // MSVC 14.1 warns of integral overflow #ifdef _MSC_VER @@ -536,7 +536,7 @@ void test_constexpr() static_assert(mul_overflows_int_max(), "INT_MAX * 2 overflows int"); static_assert(sub_value() == 2, "5 - 3 == 2"); static_assert(mul_value() == 42, "6 * 7 == 42"); - static_assert(mul_overflows_i128_min(), "INT128_MIN * -1 overflows int128_t"); + static_assert(mul_overflows_i128_min(), "INT128_MIN * -1 overflows int128"); } #ifdef _MSC_VER @@ -553,7 +553,7 @@ int main() test_sub_edges(); test_mul_edges(); - #ifndef BOOST_INT128_TEST_CKD_NO_CONSTEXPR_128 + #ifndef BOOST_int128EST_CKD_NO_CONSTEXPR_128 test_constexpr(); #endif diff --git a/test/test_climits.cpp b/test/test_climits.cpp index 9f030990..e03adc0a 100644 --- a/test/test_climits.cpp +++ b/test/test_climits.cpp @@ -7,9 +7,9 @@ int main() { - static_assert(BOOST_INT128_UINT128_MAX == std::numeric_limits::max(), "Should be equal"); - static_assert(BOOST_INT128_INT128_MAX == std::numeric_limits::max(), "Should be equal"); - static_assert(BOOST_INT128_INT128_MIN == std::numeric_limits::min(), "Should be equal"); + static_assert(BOOST_INT128_UINT128_MAX == std::numeric_limits::max(), "Should be equal"); + static_assert(BOOST_INT128_INT128_MAX == std::numeric_limits::max(), "Should be equal"); + static_assert(BOOST_INT128_INT128_MIN == std::numeric_limits::min(), "Should be equal"); return 0; } diff --git a/test/test_consteval_funcs.cpp b/test/test_consteval_funcs.cpp index 64f1e79d..72aead80 100644 --- a/test/test_consteval_funcs.cpp +++ b/test/test_consteval_funcs.cpp @@ -30,7 +30,7 @@ from ./boost/int128.hpp:8, from libs/decimal/test/test_consteval_funcs.cpp:6: libs/decimal/test/test_consteval_funcs.cpp:39:25: in constexpr expansion of 'boost::int128::operator*(x, 2)' ./boost/int128/detail/uint128_imp.hpp:2276:31: in constexpr expansion of 'boost::int128::detail::default_mul(lhs, ((uint64_t)rhs))' -./boost/int128/detail/uint128_imp.hpp:2211:37: in constexpr expansion of 'boost::int128::detail::knuth_multiply(((const uint32_t (&)[4])(& lhs_words)), ((const uint32_t (&)[2])(& rhs_words)))' +./boost/int128/detail/uint128_imp.hpp:2211:37: in constexpr expansion of 'boost::int128::detail::knuth_multiply(((const uint32_t (&)[4])(& lhs_words)), ((const uint32_t (&)[2])(& rhs_words)))' ./boost/int128/detail/common_mul.hpp:38:9: error: constexpr loop iteration count exceeds limit of 262144 (use -fconstexpr-loop-limit= to increase the limit) for (std::size_t i {}; i < u_size; ++i) ^~~ @@ -102,8 +102,8 @@ BOOST_INT128_CONSTEVAL bool test() int main() { - static_assert(test(), ""); - static_assert(test(), ""); + static_assert(test(), ""); + static_assert(test(), ""); return 0; } diff --git a/test/test_constexpr_boundaries.cpp b/test/test_constexpr_boundaries.cpp index f98295b1..8b88fedb 100644 --- a/test/test_constexpr_boundaries.cpp +++ b/test/test_constexpr_boundaries.cpp @@ -16,33 +16,33 @@ # pragma warning(disable : 4146) // unary minus operator applied to unsigned type, result still unsigned #endif -using boost::int128::int128_t; +using boost::int128::int128; namespace { constexpr auto int_max {BOOST_INT128_INT128_MAX}; constexpr auto int_min {BOOST_INT128_INT128_MIN}; -constexpr int128_t one {0, 1}; +constexpr int128 one {0, 1}; constexpr std::int64_t m {(std::numeric_limits::min)()}; -constexpr int128_t m128 {m}; -constexpr int128_t a {42, 1234}; -constexpr int128_t b {0, 5}; -constexpr int128_t neg_two_pow_64 {-1, 0}; +constexpr int128 m128 {m}; +constexpr int128 a {42, 1234}; +constexpr int128 b {0, 5}; +constexpr int128 neg_two_pow_64 {-1, 0}; // Signed-scalar negation paths (INT64_MIN) must be UB-free and must agree with -// promoting the scalar to int128_t first. -static_assert(a + m == a + m128, "operator+(int128_t, Signed)"); -static_assert(m + a == m128 + a, "operator+(Signed, int128_t)"); -static_assert(a / m == a / m128, "operator/(int128_t, Signed)"); -static_assert(m / b == m128 / b, "operator/(Signed, int128_t)"); +// promoting the scalar to int128 first. +static_assert(a + m == a + m128, "operator+(int128, Signed)"); +static_assert(m + a == m128 + a, "operator+(Signed, int128)"); +static_assert(a / m == a / m128, "operator/(int128, Signed)"); +static_assert(m / b == m128 / b, "operator/(Signed, int128)"); // A 128-bit divisor of exactly -2^64 has abs().low == 0; the quotient is 0 and // must not divide by zero. -static_assert(std::int64_t{5} / neg_two_pow_64 == int128_t{0, 0}, "operator/(Signed, int128_t) -2^64"); -static_assert(std::int64_t{-5} / neg_two_pow_64 == int128_t{0, 0}, "operator/(Signed, int128_t) -2^64 negative"); -static_assert(std::uint64_t{5} / neg_two_pow_64 == int128_t{0, 0}, "operator/(Unsigned, int128_t) -2^64"); +static_assert(std::int64_t{5} / neg_two_pow_64 == int128{0, 0}, "operator/(Signed, int128) -2^64"); +static_assert(std::int64_t{-5} / neg_two_pow_64 == int128{0, 0}, "operator/(Signed, int128) -2^64 negative"); +static_assert(std::uint64_t{5} / neg_two_pow_64 == int128{0, 0}, "operator/(Unsigned, int128) -2^64"); // Two's-complement rollover at the range boundaries: no UB, wraps like __int128. static_assert(int_max + one == int_min, "MAX + 1 -> MIN"); @@ -51,7 +51,7 @@ static_assert(int_max + 1 == int_min, "MAX + 1 (scalar) -> MIN"); static_assert(int_min - 1 == int_max, "MIN - 1 (scalar) -> MAX"); static_assert(-int_min == int_min, "-MIN wraps to itself"); static_assert(int_min * -1 == int_min, "MIN * -1 overflows to MIN"); -static_assert(int_max * 2 == -int128_t{0, 2}, "MAX * 2 overflows to -2"); +static_assert(int_max * 2 == -int128{0, 2}, "MAX * 2 overflows to -2"); } // namespace diff --git a/test/test_container_hash.cpp b/test/test_container_hash.cpp index a648ff91..ebb0a094 100644 --- a/test/test_container_hash.cpp +++ b/test/test_container_hash.cpp @@ -34,26 +34,26 @@ // turn delegates to std::hash. All three entry points must agree. void test_boost_hash_matches_std_and_hash_value() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; - const boost::hash u_hasher {}; - const std::hash u_std {}; + const boost::hash u_hasher {}; + const std::hash u_std {}; std::mt19937_64 rng {42}; for (int i {0}; i < 1024; ++i) { - const uint128_t v {rng(), rng()}; + const uint128 v {rng(), rng()}; BOOST_TEST_EQ(u_hasher(v), boost::int128::hash_value(v)); BOOST_TEST_EQ(u_hasher(v), u_std(v)); } - const boost::hash s_hasher {}; - const std::hash s_std {}; + const boost::hash s_hasher {}; + const std::hash s_std {}; for (int i {0}; i < 1024; ++i) { - const int128_t v {static_cast(rng()), rng()}; + const int128 v {static_cast(rng()), rng()}; BOOST_TEST_EQ(s_hasher(v), boost::int128::hash_value(v)); BOOST_TEST_EQ(s_hasher(v), s_std(v)); } @@ -62,25 +62,25 @@ void test_boost_hash_matches_std_and_hash_value() // Equal values must hash equal through boost::hash. void test_boost_hash_equal_values() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; - const boost::hash u_hasher {}; - const uint128_t ua {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; - const uint128_t ub {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; + const boost::hash u_hasher {}; + const uint128 ua {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; + const uint128 ub {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE12345678)}; BOOST_TEST_EQ(u_hasher(ua), u_hasher(ub)); - const boost::hash s_hasher {}; - const int128_t sa {INT64_C(-1), UINT64_C(0xCAFEBABE)}; - const int128_t sb {INT64_C(-1), UINT64_C(0xCAFEBABE)}; + const boost::hash s_hasher {}; + const int128 sa {INT64_C(-1), UINT64_C(0xCAFEBABE)}; + const int128 sb {INT64_C(-1), UINT64_C(0xCAFEBABE)}; BOOST_TEST_EQ(s_hasher(sa), s_hasher(sb)); // A value and its negation must not collide. - const boost::hash hasher {}; + const boost::hash hasher {}; for (std::int64_t i {1}; i <= 512; ++i) { - const int128_t pos {i}; - const int128_t neg {-i}; + const int128 pos {i}; + const int128 neg {-i}; BOOST_TEST_NE(hasher(pos), hasher(neg)); } } @@ -88,10 +88,10 @@ void test_boost_hash_equal_values() // boost::hash_combine must be deterministic and order sensitive. void test_hash_combine() { - using boost::int128::uint128_t; + using boost::int128::uint128; - const uint128_t a {UINT64_C(1), UINT64_C(2)}; - const uint128_t b {UINT64_C(3), UINT64_C(4)}; + const uint128 a {UINT64_C(1), UINT64_C(2)}; + const uint128 b {UINT64_C(3), UINT64_C(4)}; std::size_t seed1 {0}; boost::hash_combine(seed1, a); @@ -115,11 +115,11 @@ void test_hash_combine() // boost::hash_range over a container of 128-bit values. void test_hash_range() { - using boost::int128::uint128_t; + using boost::int128::uint128; - const std::vector v1 {uint128_t{0, 1}, uint128_t{1, 0}, uint128_t{UINT64_MAX, UINT64_MAX}}; - const std::vector v2 {uint128_t{0, 1}, uint128_t{1, 0}, uint128_t{UINT64_MAX, UINT64_MAX}}; - const std::vector v3 {uint128_t{1, 0}, uint128_t{0, 1}, uint128_t{UINT64_MAX, UINT64_MAX}}; + const std::vector v1 {uint128{0, 1}, uint128{1, 0}, uint128{UINT64_MAX, UINT64_MAX}}; + const std::vector v2 {uint128{0, 1}, uint128{1, 0}, uint128{UINT64_MAX, UINT64_MAX}}; + const std::vector v3 {uint128{1, 0}, uint128{0, 1}, uint128{UINT64_MAX, UINT64_MAX}}; // Equal ranges hash equal. BOOST_TEST_EQ(boost::hash_range(v1.begin(), v1.end()), boost::hash_range(v2.begin(), v2.end())); @@ -132,48 +132,48 @@ void test_hash_range() // with no explicit hasher. void test_unordered_map_default_hash() { - using boost::int128::uint128_t; - using boost::int128::int128_t; - - boost::unordered_map umap {}; - umap[uint128_t{0, 1}] = 1; - umap[uint128_t{0, 2}] = 2; - umap[uint128_t{1, 0}] = 3; - umap[uint128_t{UINT64_MAX, UINT64_MAX}] = 4; - - BOOST_TEST_EQ((umap[uint128_t{0, 1}]), 1); - BOOST_TEST_EQ((umap[uint128_t{0, 2}]), 2); - BOOST_TEST_EQ((umap[uint128_t{1, 0}]), 3); - BOOST_TEST_EQ((umap[uint128_t{UINT64_MAX, UINT64_MAX}]), 4); + using boost::int128::uint128; + using boost::int128::int128; + + boost::unordered_map umap {}; + umap[uint128{0, 1}] = 1; + umap[uint128{0, 2}] = 2; + umap[uint128{1, 0}] = 3; + umap[uint128{UINT64_MAX, UINT64_MAX}] = 4; + + BOOST_TEST_EQ((umap[uint128{0, 1}]), 1); + BOOST_TEST_EQ((umap[uint128{0, 2}]), 2); + BOOST_TEST_EQ((umap[uint128{1, 0}]), 3); + BOOST_TEST_EQ((umap[uint128{UINT64_MAX, UINT64_MAX}]), 4); BOOST_TEST_EQ(umap.size(), (std::size_t {4})); - boost::unordered_map smap {}; - smap[int128_t{0, 1}] = 1; - smap[int128_t{-1, UINT64_MAX}] = 2; - smap[int128_t{1, 0}] = 3; - smap[int128_t{-1, 0}] = 4; + boost::unordered_map smap {}; + smap[int128{0, 1}] = 1; + smap[int128{-1, UINT64_MAX}] = 2; + smap[int128{1, 0}] = 3; + smap[int128{-1, 0}] = 4; - BOOST_TEST_EQ((smap[int128_t{0, 1}]), 1); - BOOST_TEST_EQ((smap[int128_t{-1, UINT64_MAX}]), 2); - BOOST_TEST_EQ((smap[int128_t{1, 0}]), 3); - BOOST_TEST_EQ((smap[int128_t{-1, 0}]), 4); + BOOST_TEST_EQ((smap[int128{0, 1}]), 1); + BOOST_TEST_EQ((smap[int128{-1, UINT64_MAX}]), 2); + BOOST_TEST_EQ((smap[int128{1, 0}]), 3); + BOOST_TEST_EQ((smap[int128{-1, 0}]), 4); BOOST_TEST_EQ(smap.size(), (std::size_t {4})); } // boost::unordered_set likewise deduplicates via boost::hash. void test_unordered_set_default_hash() { - using boost::int128::uint128_t; + using boost::int128::uint128; - boost::unordered_set set {}; - set.insert(uint128_t{0, 1}); - set.insert(uint128_t{0, 1}); // duplicate - set.insert(uint128_t{1, 0}); + boost::unordered_set set {}; + set.insert(uint128{0, 1}); + set.insert(uint128{0, 1}); // duplicate + set.insert(uint128{1, 0}); BOOST_TEST_EQ(set.size(), (std::size_t {2})); - BOOST_TEST(set.find(uint128_t{0, 1}) != set.end()); - BOOST_TEST(set.find(uint128_t{1, 0}) != set.end()); - BOOST_TEST(set.find(uint128_t{9, 9}) == set.end()); + BOOST_TEST(set.find(uint128{0, 1}) != set.end()); + BOOST_TEST(set.find(uint128{1, 0}) != set.end()); + BOOST_TEST(set.find(uint128{9, 9}) == set.end()); } int main() diff --git a/test/test_countl_one.cu b/test/test_countl_one.cu index 9bf23038..b8e3d3a9 100644 --- a/test/test_countl_one.cu +++ b/test/test_countl_one.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_countl_one_sycl.cpp b/test/test_countl_one_sycl.cpp index 4fc726e8..981d994c 100644 --- a/test/test_countl_one_sycl.cpp +++ b/test/test_countl_one_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::countl_one(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::countl_one(a); }); } diff --git a/test/test_countl_zero.cu b/test/test_countl_zero.cu index 6f211909..bc8061d1 100644 --- a/test/test_countl_zero.cu +++ b/test/test_countl_zero.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_countl_zero_sycl.cpp b/test/test_countl_zero_sycl.cpp index 32b8e969..106ceb15 100644 --- a/test/test_countl_zero_sycl.cpp +++ b/test/test_countl_zero_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::countl_zero(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::countl_zero(a); }); } diff --git a/test/test_countr_one.cu b/test/test_countr_one.cu index 8f9c0439..e1665c80 100644 --- a/test/test_countr_one.cu +++ b/test/test_countr_one.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_countr_one_sycl.cpp b/test/test_countr_one_sycl.cpp index cb337e3f..f0ad51cc 100644 --- a/test/test_countr_one_sycl.cpp +++ b/test/test_countr_one_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::countr_one(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::countr_one(a); }); } diff --git a/test/test_countr_zero.cu b/test/test_countr_zero.cu index 4c6e5b34..1c3d87a1 100644 --- a/test/test_countr_zero.cu +++ b/test/test_countr_zero.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_countr_zero_sycl.cpp b/test/test_countr_zero_sycl.cpp index 543d2f88..cf6b97bb 100644 --- a/test/test_countr_zero_sycl.cpp +++ b/test/test_countr_zero_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::countr_zero(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::countr_zero(a); }); } diff --git a/test/test_cross_type_assign.cpp b/test/test_cross_type_assign.cpp index f3274c59..d75b5a11 100644 --- a/test/test_cross_type_assign.cpp +++ b/test/test_cross_type_assign.cpp @@ -13,37 +13,37 @@ using namespace boost::int128; void test_implicit_conversion_traits() { - static_assert(std::is_convertible::value, "int128_t -> uint128_t should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> int128_t should be implicit"); - static_assert(std::is_assignable::value, "uint128_t should be assignable to int128_t"); - static_assert(std::is_assignable::value, "int128_t should be assignable to uint128_t"); + static_assert(std::is_convertible::value, "int128 -> uint128 should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> int128 should be implicit"); + static_assert(std::is_assignable::value, "uint128 should be assignable to int128"); + static_assert(std::is_assignable::value, "int128 should be assignable to uint128"); // Implicit conversions to builtin integer types (matches __int128 behavior) - static_assert(std::is_convertible::value, "int128_t -> int should be implicit"); - static_assert(std::is_convertible::value, "int128_t -> unsigned int should be implicit"); - static_assert(std::is_convertible::value, "int128_t -> int64_t should be implicit"); - static_assert(std::is_convertible::value, "int128_t -> uint64_t should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> int should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> unsigned int should be implicit"); + static_assert(std::is_convertible::value, "int128 -> int should be implicit"); + static_assert(std::is_convertible::value, "int128 -> unsigned int should be implicit"); + static_assert(std::is_convertible::value, "int128 -> int64_t should be implicit"); + static_assert(std::is_convertible::value, "int128 -> uint64_t should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> int should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> unsigned int should be implicit"); // Implicit conversions to floating-point types - static_assert(std::is_convertible::value, "int128_t -> float should be implicit"); - static_assert(std::is_convertible::value, "int128_t -> double should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> float should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> double should be implicit"); + static_assert(std::is_convertible::value, "int128 -> float should be implicit"); + static_assert(std::is_convertible::value, "int128 -> double should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> float should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> double should be implicit"); #if defined(BOOST_INT128_HAS_INT128) // Implicit conversions to builtin __int128 - static_assert(std::is_convertible::value, "int128_t -> __int128 should be implicit"); - static_assert(std::is_convertible::value, "int128_t -> unsigned __int128 should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> __int128 should be implicit"); - static_assert(std::is_convertible::value, "uint128_t -> unsigned __int128 should be implicit"); + static_assert(std::is_convertible::value, "int128 -> __int128 should be implicit"); + static_assert(std::is_convertible::value, "int128 -> unsigned __int128 should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> __int128 should be implicit"); + static_assert(std::is_convertible::value, "uint128 -> unsigned __int128 should be implicit"); #endif } void test_implicit_conversions_runtime() { - const int128_t i {0, 42U}; + const int128 i {0, 42U}; const int as_int = i; BOOST_TEST_EQ(as_int, 42); @@ -54,7 +54,7 @@ void test_implicit_conversions_runtime() const double as_double = i; BOOST_TEST_EQ(static_cast(as_double), 42); - const uint128_t u {0U, 100U}; + const uint128 u {0U, 100U}; const unsigned int as_uint = u; BOOST_TEST_EQ(as_uint, 100U); @@ -62,93 +62,93 @@ void test_implicit_conversions_runtime() BOOST_TEST_EQ(static_cast(as_float), 100); #if defined(BOOST_INT128_HAS_INT128) - const detail::builtin_i128 as_native_i = int128_t{1, 2U}; + const detail::builtin_i128 as_native_i = int128{1, 2U}; BOOST_TEST(as_native_i == ((static_cast(1) << 64) | 2)); - const detail::builtin_u128 as_native_u = uint128_t{3U, 4U}; + const detail::builtin_u128 as_native_u = uint128{3U, 4U}; BOOST_TEST(as_native_u == ((static_cast(3) << 64) | 4)); #endif } void test_uint_to_int_construction() { - const uint128_t u {1U, 42U}; + const uint128 u {1U, 42U}; // Copy construction with braces - const int128_t a {u}; + const int128 a {u}; BOOST_TEST_EQ(a.low, u.low); BOOST_TEST_EQ(a.high, u.high); // Copy-initialization (implicit conversion) - const int128_t b = u; + const int128 b = u; BOOST_TEST_EQ(b.low, u.low); BOOST_TEST_EQ(b.high, u.high); // Move construction - uint128_t u_movable {1U, 42U}; - const int128_t c {std::move(u_movable)}; + uint128 u_movable {1U, 42U}; + const int128 c {std::move(u_movable)}; BOOST_TEST_EQ(c.low, 42U); BOOST_TEST_EQ(c.high, UINT64_C(1)); } void test_int_to_uint_construction() { - const int128_t i {-1, 0xFFFFFFFFFFFFFFFFULL}; + const int128 i {-1, 0xFFFFFFFFFFFFFFFFULL}; - const uint128_t a {i}; + const uint128 a {i}; BOOST_TEST_EQ(a.low, i.low); BOOST_TEST_EQ(a.high, i.high); - const uint128_t b = i; + const uint128 b = i; BOOST_TEST_EQ(b.low, i.low); BOOST_TEST_EQ(b.high, i.high); - int128_t i_movable {-1, 0xFFFFFFFFFFFFFFFFULL}; - const uint128_t c {std::move(i_movable)}; + int128 i_movable {-1, 0xFFFFFFFFFFFFFFFFULL}; + const uint128 c {std::move(i_movable)}; BOOST_TEST_EQ(c.high, 0xFFFFFFFFFFFFFFFFULL); BOOST_TEST_EQ(c.low, 0xFFFFFFFFFFFFFFFFULL); } void test_uint_to_int_assignment() { - const uint128_t u {7U, 99U}; + const uint128 u {7U, 99U}; // Copy assignment via implicit conversion - int128_t a {}; + int128 a {}; a = u; BOOST_TEST_EQ(a.low, 99U); BOOST_TEST_EQ(a.high, 7); // Move assignment via implicit conversion - int128_t b {}; - b = uint128_t{7U, 99U}; + int128 b {}; + b = uint128{7U, 99U}; BOOST_TEST_EQ(b.low, 99U); BOOST_TEST_EQ(b.high, 7); } void test_int_to_uint_assignment() { - const int128_t i {-2, 0x1234U}; + const int128 i {-2, 0x1234U}; - uint128_t a {}; + uint128 a {}; a = i; BOOST_TEST_EQ(a.low, 0x1234U); BOOST_TEST_EQ(a.high, static_cast(-2)); - uint128_t b {}; - b = int128_t{-2, 0x1234U}; + uint128 b {}; + b = int128{-2, 0x1234U}; BOOST_TEST_EQ(b.low, 0x1234U); BOOST_TEST_EQ(b.high, static_cast(-2)); } void test_constexpr_cross_type() { - constexpr uint128_t u {1U, 42U}; - constexpr int128_t a {u}; + constexpr uint128 u {1U, 42U}; + constexpr int128 a {u}; static_assert(a.low == 42U, "constexpr cross-type construction"); - constexpr int128_t i {-1, 7U}; - constexpr uint128_t b {i}; + constexpr int128 i {-1, 7U}; + constexpr uint128 b {i}; static_assert(b.low == 7U, "constexpr cross-type construction"); } @@ -156,41 +156,41 @@ template void test_uint_from_float() { // Basic positive values - BOOST_TEST_EQ(uint128_t{Float{0}}.low, 0U); - BOOST_TEST_EQ(uint128_t{Float{0}}.high, 0U); - BOOST_TEST_EQ(uint128_t{Float{42}}.low, 42U); - BOOST_TEST_EQ(uint128_t{Float{42}}.high, 0U); + BOOST_TEST_EQ(uint128{Float{0}}.low, 0U); + BOOST_TEST_EQ(uint128{Float{0}}.high, 0U); + BOOST_TEST_EQ(uint128{Float{42}}.low, 42U); + BOOST_TEST_EQ(uint128{Float{42}}.high, 0U); // Truncation toward zero. Use Float{N}/Float{D} rather than a double literal // so the test compiles cleanly for float and long double without precision warnings. - BOOST_TEST_EQ((uint128_t{Float{37} / Float{10}}.low), 3U); // ~3.7 -> 3 - BOOST_TEST_EQ((uint128_t{Float{99} / Float{100}}.low), 0U); // ~0.99 -> 0 + BOOST_TEST_EQ((uint128{Float{37} / Float{10}}.low), 3U); // ~3.7 -> 3 + BOOST_TEST_EQ((uint128{Float{99} / Float{100}}.low), 0U); // ~0.99 -> 0 // NaN -> 0 const Float nan {std::numeric_limits::quiet_NaN()}; - BOOST_TEST_EQ(uint128_t{nan}.low, 0U); - BOOST_TEST_EQ(uint128_t{nan}.high, 0U); + BOOST_TEST_EQ(uint128{nan}.low, 0U); + BOOST_TEST_EQ(uint128{nan}.high, 0U); // Negative -> 0 (matches libgcc) - BOOST_TEST_EQ(uint128_t{Float{-1}}.low, 0U); - BOOST_TEST_EQ(uint128_t{Float{-1}}.high, 0U); + BOOST_TEST_EQ(uint128{Float{-1}}.low, 0U); + BOOST_TEST_EQ(uint128{Float{-1}}.high, 0U); // Saturation on overflow: infinity (or any value >= 2^128) -> UINT128_MAX. // For float, 2^128 itself is +infinity since the 8-bit exponent saturates. const Float two_64 {static_cast(UINT64_C(1) << 32) * static_cast(UINT64_C(1) << 32)}; - const uint128_t saturated {std::numeric_limits::infinity()}; + const uint128 saturated {std::numeric_limits::infinity()}; BOOST_TEST_EQ(saturated.low, UINT64_MAX); BOOST_TEST_EQ(saturated.high, UINT64_MAX); // 2^127 should fit (representable in float, double, long double) const Float two_127 {two_64 * static_cast(UINT64_C(1) << 63)}; - const uint128_t large {two_127}; + const uint128 large {two_127}; BOOST_TEST_EQ(large.low, 0U); BOOST_TEST_EQ(large.high, UINT64_C(1) << 63); // Round-trip for an exactly representable mid-range value const Float round_trip_src {two_64}; // 2^64 - const uint128_t round_trip {round_trip_src}; + const uint128 round_trip {round_trip_src}; BOOST_TEST_EQ(round_trip.low, 0U); BOOST_TEST_EQ(round_trip.high, 1U); } @@ -199,50 +199,50 @@ template void test_int_from_float() { // Basic positive and negative - BOOST_TEST_EQ(int128_t{Float{0}}.low, 0U); - BOOST_TEST_EQ(int128_t{Float{0}}.signed_high(), INT64_C(0)); - BOOST_TEST_EQ(int128_t{Float{42}}.low, 42U); - BOOST_TEST_EQ(int128_t{Float{-42}}.low, static_cast(-42)); - BOOST_TEST_EQ(int128_t{Float{-42}}.signed_high(), INT64_C(-1)); + BOOST_TEST_EQ(int128{Float{0}}.low, 0U); + BOOST_TEST_EQ(int128{Float{0}}.signed_high(), INT64_C(0)); + BOOST_TEST_EQ(int128{Float{42}}.low, 42U); + BOOST_TEST_EQ(int128{Float{-42}}.low, static_cast(-42)); + BOOST_TEST_EQ(int128{Float{-42}}.signed_high(), INT64_C(-1)); // Truncation toward zero (see note in test_uint_from_float on the literal style). - BOOST_TEST_EQ((int128_t{Float{37} / Float{10}}.low), 3U); // ~3.7 -> 3 - BOOST_TEST_EQ((int128_t{Float{-37} / Float{10}}.low), static_cast(-3)); // ~-3.7 -> -3 + BOOST_TEST_EQ((int128{Float{37} / Float{10}}.low), 3U); // ~3.7 -> 3 + BOOST_TEST_EQ((int128{Float{-37} / Float{10}}.low), static_cast(-3)); // ~-3.7 -> -3 // NaN -> 0 const Float nan {std::numeric_limits::quiet_NaN()}; - BOOST_TEST_EQ(int128_t{nan}.low, 0U); - BOOST_TEST_EQ(int128_t{nan}.signed_high(), INT64_C(0)); + BOOST_TEST_EQ(int128{nan}.low, 0U); + BOOST_TEST_EQ(int128{nan}.signed_high(), INT64_C(0)); // Positive saturation: f >= 2^127 -> INT128_MAX const Float two_64 {static_cast(UINT64_C(1) << 32) * static_cast(UINT64_C(1) << 32)}; const Float two_127 {two_64 * static_cast(UINT64_C(1) << 63)}; - const int128_t pos_sat {two_127}; + const int128 pos_sat {two_127}; BOOST_TEST_EQ(pos_sat.signed_high(), (std::numeric_limits::max)()); BOOST_TEST_EQ(pos_sat.low, UINT64_MAX); // Negative saturation: f <= -2^127 -> INT128_MIN - const int128_t neg_sat {-two_127}; + const int128 neg_sat {-two_127}; BOOST_TEST_EQ(neg_sat.signed_high(), (std::numeric_limits::min)()); BOOST_TEST_EQ(neg_sat.low, 0U); // Just below the positive boundary should not saturate. - const int128_t near_max {two_127 / Float{2}}; // 2^126 + const int128 near_max {two_127 / Float{2}}; // 2^126 BOOST_TEST_EQ(near_max.high, UINT64_C(1) << 62); BOOST_TEST_EQ(near_max.low, 0U); // Round-trip a negative power of two through the two's-complement path - const int128_t neg_round_trip {-two_64}; // -2^64 + const int128 neg_round_trip {-two_64}; // -2^64 BOOST_TEST_EQ(neg_round_trip.low, 0U); BOOST_TEST_EQ(neg_round_trip.signed_high(), INT64_C(-1)); } void test_constexpr_float_construction() { - constexpr uint128_t u {42.5}; + constexpr uint128 u {42.5}; static_assert(u.low == 42U, "constexpr uint from double"); - constexpr int128_t i {-7.9}; + constexpr int128 i {-7.9}; static_assert(i.signed_high() == -1, "constexpr int from double sign"); // NaN -> 0 is exercised at runtime in test_uint_from_float / test_int_from_float. diff --git a/test/test_div.cpp b/test/test_div.cpp index 252929b8..1e24106f 100644 --- a/test/test_div.cpp +++ b/test/test_div.cpp @@ -37,26 +37,26 @@ void test_unsigned_div() { for (std::size_t i {}; i < N; ++i) { - uint128_t lhs; - uint128_t rhs; + uint128 lhs; + uint128 rhs; switch (layout) { case 0U: - lhs = uint128_t {dist(rng), dist(rng)}; - rhs = uint128_t {dist(rng), dist(rng)}; + lhs = uint128 {dist(rng), dist(rng)}; + rhs = uint128 {dist(rng), dist(rng)}; break; case 1U: - lhs = uint128_t {dist(rng)}; - rhs = uint128_t {dist(rng), dist(rng)}; + lhs = uint128 {dist(rng)}; + rhs = uint128 {dist(rng), dist(rng)}; break; case 2U: - lhs = uint128_t {dist(rng), dist(rng)}; - rhs = uint128_t {dist(rng)}; + lhs = uint128 {dist(rng), dist(rng)}; + rhs = uint128 {dist(rng)}; break; case 3U: - lhs = uint128_t {dist(rng)}; - rhs = uint128_t {dist(rng)}; + lhs = uint128 {dist(rng)}; + rhs = uint128 {dist(rng)}; break; default: // LCOV_EXCL_LINE BOOST_INT128_UNREACHABLE; // LCOV_EXCL_LINE @@ -71,8 +71,8 @@ void test_unsigned_div() BOOST_TEST_EQ(inv_div_res.rem, rhs % lhs); } - uint128_t lhs {dist(rng), dist(rng)}; - uint128_t zero {dist(rng) * 0U, dist(rng) * 0U}; + uint128 lhs {dist(rng), dist(rng)}; + uint128 zero {dist(rng) * 0U, dist(rng) * 0U}; const auto lhs_num {boost::int128::div(lhs, zero)}; BOOST_TEST_EQ(lhs_num.quot, 0U); BOOST_TEST_EQ(lhs_num.rem, 0U); @@ -87,26 +87,26 @@ void test_signed_div() { for (std::size_t i {}; i < N; ++i) { - int128_t lhs; - int128_t rhs; + int128 lhs; + int128 rhs; switch (layout) { case 0U: - lhs = int128_t {idist(rng), dist(rng)}; - rhs = int128_t {idist(rng), dist(rng)}; + lhs = int128 {idist(rng), dist(rng)}; + rhs = int128 {idist(rng), dist(rng)}; break; case 1U: - lhs = int128_t {idist(rng)}; - rhs = int128_t {idist(rng), dist(rng)}; + lhs = int128 {idist(rng)}; + rhs = int128 {idist(rng), dist(rng)}; break; case 2U: - lhs = int128_t {idist(rng), dist(rng)}; - rhs = int128_t {idist(rng)}; + lhs = int128 {idist(rng), dist(rng)}; + rhs = int128 {idist(rng)}; break; case 3U: - lhs = int128_t {idist(rng)}; - rhs = int128_t {idist(rng)}; + lhs = int128 {idist(rng)}; + rhs = int128 {idist(rng)}; break; default: // LCOV_EXCL_LINE BOOST_INT128_UNREACHABLE; // LCOV_EXCL_LINE @@ -121,8 +121,8 @@ void test_signed_div() BOOST_TEST_EQ(inv_div_res.rem, rhs % lhs); } - int128_t lhs {idist(rng), dist(rng)}; - int128_t zero {idist(rng) * 0, dist(rng) * 0U}; + int128 lhs {idist(rng), dist(rng)}; + int128 zero {idist(rng) * 0, dist(rng) * 0U}; const auto lhs_num {boost::int128::div(lhs, zero)}; BOOST_TEST_EQ(lhs_num.quot, 0); BOOST_TEST_EQ(lhs_num.rem, 0); diff --git a/test/test_div_primitives.cpp b/test/test_div_primitives.cpp index 694f0fef..e75b7045 100644 --- a/test/test_div_primitives.cpp +++ b/test/test_div_primitives.cpp @@ -27,14 +27,14 @@ static std::uniform_int_distribution dist(0, UINT64_MAX); // Knuth Algorithm D that the library retains. Returns quotient and remainder. static void knuth_oracle(const std::uint64_t uh, const std::uint64_t ul, const std::uint64_t vh, const std::uint64_t vl, - uint128_t& quot, uint128_t& rem) + uint128& quot, uint128& rem) { - const uint128_t u_val {uh, ul}; - const uint128_t v_val {vh, vl}; + const uint128 u_val {uh, ul}; + const uint128 v_val {vh, vl}; if (u_val < v_val) { - quot = uint128_t{UINT64_C(0)}; + quot = uint128{UINT64_C(0)}; rem = u_val; return; } @@ -48,8 +48,8 @@ static void knuth_oracle(const std::uint64_t uh, const std::uint64_t ul, detail::impl::knuth_divide(u, m, v, n, q); - quot = detail::impl::from_words(q); - rem = detail::impl::from_words(u); + quot = detail::impl::from_words(q); + rem = detail::impl::from_words(u); } static void check_div3by2(const std::uint64_t uh, const std::uint64_t ul, @@ -59,14 +59,14 @@ static void check_div3by2(const std::uint64_t uh, const std::uint64_t ul, std::uint64_t rem_lo {}; const auto q {detail::div3by2(uh, ul, vh, vl, rem_hi, rem_lo)}; - uint128_t expected_q {}; - uint128_t expected_r {}; + uint128 expected_q {}; + uint128 expected_r {}; knuth_oracle(uh, ul, vh, vl, expected_q, expected_r); // The quotient always fits in 64 bits when the divisor is >= 2^64 BOOST_TEST_EQ(expected_q.high, UINT64_C(0)); BOOST_TEST_EQ(q, expected_q.low); - BOOST_TEST_EQ(uint128_t(rem_hi, rem_lo), expected_r); + BOOST_TEST_EQ(uint128(rem_hi, rem_lo), expected_r); } static void test_div3by2_random() @@ -179,7 +179,7 @@ static void test_div3by2_boundary() const auto got_q {detail::div3by2(uh, ul, vh, vl, rem_hi, rem_lo)}; BOOST_TEST_EQ(got_q, static_cast(u_val / v_val)); - BOOST_TEST_EQ(uint128_t(rem_hi, rem_lo), static_cast(u_val % v_val)); + BOOST_TEST_EQ(uint128(rem_hi, rem_lo), static_cast(u_val % v_val)); } } } diff --git a/test/test_fmt_format.cpp b/test/test_fmt_format.cpp index 3115de79..6696c2a2 100644 --- a/test/test_fmt_format.cpp +++ b/test/test_fmt_format.cpp @@ -194,30 +194,30 @@ void test_alignment_negative() int main() { - test_empty(); - test_empty(); - test_empty_negative(); + test_empty(); + test_empty(); + test_empty_negative(); - test_binary(); - test_binary(); + test_binary(); + test_binary(); - test_octal(); - test_octal(); + test_octal(); + test_octal(); - test_decimal(); - test_decimal(); - test_decimal_negative(); + test_decimal(); + test_decimal(); + test_decimal_negative(); - test_hex(); - test_hex(); - test_hex_negative(); + test_hex(); + test_hex(); + test_hex_negative(); - test_string_insertion(); - test_string_insertion(); + test_string_insertion(); + test_string_insertion(); - test_alignment(); - test_alignment(); - test_alignment_negative(); + test_alignment(); + test_alignment(); + test_alignment_negative(); return boost::report_errors(); } diff --git a/test/test_format.cpp b/test/test_format.cpp index 98462ceb..622927e4 100644 --- a/test/test_format.cpp +++ b/test/test_format.cpp @@ -19,7 +19,7 @@ void test_empty() BOOST_TEST_CSTR_EQ(std::format("{}", T{22222}).c_str(), "22222"); BOOST_TEST_CSTR_EQ(std::format("{}", T{222222}).c_str(), "222222"); - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { BOOST_TEST_CSTR_EQ(std::format("{}", T{-2}).c_str(), "-2"); BOOST_TEST_CSTR_EQ(std::format("{}", T{-22}).c_str(), "-22"); @@ -74,7 +74,7 @@ void test_decimal() BOOST_TEST_CSTR_EQ(std::format("{:-3d}", T{42}).c_str(), " 42"); BOOST_TEST_CSTR_EQ(std::format("{:-#3d}", T{42}).c_str(), " 42"); - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { BOOST_TEST_CSTR_EQ(std::format("{: 3d}", T{42}).c_str(), " 42"); BOOST_TEST_CSTR_EQ(std::format("{: #3d}", T{42}).c_str(), " 42"); @@ -104,7 +104,7 @@ void test_hex() BOOST_TEST_CSTR_EQ(std::format("{:+X}", T{42}).c_str(), "+2A"); BOOST_TEST_CSTR_EQ(std::format("{:+#X}", T{42}).c_str(), "+0X2A"); - if constexpr (std::is_same_v) + if constexpr (std::is_same_v) { BOOST_TEST_CSTR_EQ(std::format("{:-X}", T{-42}).c_str(), "-2A"); BOOST_TEST_CSTR_EQ(std::format("{:-#X}", T{-42}).c_str(), "-0X2A"); @@ -194,27 +194,27 @@ static_assert(std::format("num: {}", 1234_u128) == "num: 1234"); int main() { - test_empty(); - test_empty(); + test_empty(); + test_empty(); - test_binary(); - test_binary(); + test_binary(); + test_binary(); - test_octal(); - test_octal(); + test_octal(); + test_octal(); - test_decimal(); - test_decimal(); + test_decimal(); + test_decimal(); - test_hex(); - test_hex(); + test_hex(); + test_hex(); - test_string_insertion(); - test_string_insertion(); + test_string_insertion(); + test_string_insertion(); - test_alignment(); - test_alignment(); - test_alignment_negative(); + test_alignment(); + test_alignment(); + test_alignment_negative(); return boost::report_errors(); } diff --git a/test/test_from_chars_bases.cpp b/test/test_from_chars_bases.cpp index 4e637c3a..269465cd 100644 --- a/test/test_from_chars_bases.cpp +++ b/test/test_from_chars_bases.cpp @@ -3,7 +3,7 @@ // https://www.boost.org/LICENSE_1_0.txt // Exercises boost::int128::detail::from_chars across every base it supports -// (2..36) for both int128_t and uint128_t. Locks in the fix to the per-iteration +// (2..36) for both int128 and uint128. Locks in the fix to the per-iteration // overflow threshold (the spurious overflow_value <<= 1 was masking MAX+1 // overflow in mini_from_chars). @@ -27,21 +27,21 @@ import boost.int128; namespace { -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; -// Format a uint128_t into a base-N string (lowercase). Self-contained so the +// Format a uint128 into a base-N string (lowercase). Self-contained so the // test does not pull in boost::charconv just to generate inputs. -std::string format_unsigned(uint128_t value, int base) +std::string format_unsigned(uint128 value, int base) { - if (value == uint128_t{0U}) + if (value == uint128{0U}) { return "0"; } const auto ubase {static_cast(base)}; std::string out; - while (value != uint128_t{0U}) + while (value != uint128{0U}) { const auto digit {static_cast(value % ubase)}; const char c {digit < 10U ? static_cast('0' + digit) @@ -53,38 +53,38 @@ std::string format_unsigned(uint128_t value, int base) return out; } -std::string format_signed(int128_t value, int base) +std::string format_signed(int128 value, int base) { - if (value == int128_t{0}) + if (value == int128{0}) { return "0"; } - if (value == (std::numeric_limits::min)()) + if (value == (std::numeric_limits::min)()) { - // |INT128_MIN| does not fit in int128_t; do the magnitude in uint128_t. - const uint128_t magnitude {uint128_t{1} << 127U}; + // |INT128_MIN| does not fit in int128; do the magnitude in uint128. + const uint128 magnitude {uint128{1} << 127U}; std::string out {format_unsigned(magnitude, base)}; out.insert(out.begin(), '-'); return out; } - if (value < int128_t{0}) + if (value < int128{0}) { - std::string out {format_unsigned(static_cast(-value), base)}; + std::string out {format_unsigned(static_cast(-value), base)}; out.insert(out.begin(), '-'); return out; } - return format_unsigned(static_cast(value), base); + return format_unsigned(static_cast(value), base); } -inline std::string format_value(int128_t value, int base) +inline std::string format_value(int128 value, int base) { return format_signed(value, base); } -inline std::string format_value(uint128_t value, int base) +inline std::string format_value(uint128 value, int base) { return format_unsigned(value, base); } @@ -112,57 +112,57 @@ void check_overflow(const std::string& s, int base) void test_uint128_all_bases() { - constexpr auto max_value {(std::numeric_limits::max)()}; + constexpr auto max_value {(std::numeric_limits::max)()}; for (int base {2}; base <= 36; ++base) { // Canonical small values. - check_roundtrip(uint128_t{0U}, base); - check_roundtrip(uint128_t{1U}, base); - check_roundtrip(static_cast(static_cast(base) - 1U), base); - check_roundtrip(static_cast(static_cast(base)), base); + check_roundtrip(uint128{0U}, base); + check_roundtrip(uint128{1U}, base); + check_roundtrip(static_cast(static_cast(base) - 1U), base); + check_roundtrip(static_cast(static_cast(base)), base); // A handful of mid-range values that span the per-base digit window. - check_roundtrip(uint128_t{42U}, base); - check_roundtrip(uint128_t{1234567890U}, base); - check_roundtrip(uint128_t{0xFFFFFFFFFFFFFFFFULL}, base); - check_roundtrip(uint128_t{1U} << 100U, base); + check_roundtrip(uint128{42U}, base); + check_roundtrip(uint128{1234567890U}, base); + check_roundtrip(uint128{0xFFFFFFFFFFFFFFFFULL}, base); + check_roundtrip(uint128{1U} << 100U, base); // The boundary itself parses correctly. - check_roundtrip(max_value, base); + check_roundtrip(max_value, base); // MAX with any extra digit appended is at least MAX * base, which - // overflows uint128_t for every base in [2, 36]. + // overflows uint128 for every base in [2, 36]. const auto max_str {format_unsigned(max_value, base)}; - check_overflow(max_str + "0", base); + check_overflow(max_str + "0", base); } } void test_int128_all_bases() { - constexpr auto max_value {(std::numeric_limits::max)()}; - constexpr auto min_value {(std::numeric_limits::min)()}; + constexpr auto max_value {(std::numeric_limits::max)()}; + constexpr auto min_value {(std::numeric_limits::min)()}; for (int base {2}; base <= 36; ++base) { - check_roundtrip(int128_t{0}, base); - check_roundtrip(int128_t{1}, base); - check_roundtrip(int128_t{-1}, base); - check_roundtrip(int128_t{42}, base); - check_roundtrip(int128_t{-42}, base); - check_roundtrip(int128_t{1234567890}, base); - check_roundtrip(int128_t{-1234567890}, base); + check_roundtrip(int128{0}, base); + check_roundtrip(int128{1}, base); + check_roundtrip(int128{-1}, base); + check_roundtrip(int128{42}, base); + check_roundtrip(int128{-42}, base); + check_roundtrip(int128{1234567890}, base); + check_roundtrip(int128{-1234567890}, base); // Both signed boundaries parse correctly. - check_roundtrip(max_value, base); - check_roundtrip(min_value, base); + check_roundtrip(max_value, base); + check_roundtrip(min_value, base); // Append a digit to push past the magnitude bound on each side. const auto max_str {format_signed(max_value, base)}; - check_overflow(max_str + "0", base); + check_overflow(max_str + "0", base); const auto min_str {format_signed(min_value, base)}; - check_overflow(min_str + "0", base); + check_overflow(min_str + "0", base); } } @@ -174,38 +174,38 @@ void test_decimal_boundaries() // UINT128_MAX exactly. { const std::string s {"340282366920938463463374607431768211455"}; - uint128_t v {}; + uint128 v {}; const auto r {boost::int128::detail::from_chars(s.data(), s.data() + s.size(), v)}; BOOST_TEST_LT(r, 0); - BOOST_TEST(v == (std::numeric_limits::max)()); + BOOST_TEST(v == (std::numeric_limits::max)()); } // UINT128_MAX + 1. - check_overflow("340282366920938463463374607431768211456", 10); + check_overflow("340282366920938463463374607431768211456", 10); // INT128_MAX exactly. { const std::string s {"170141183460469231731687303715884105727"}; - int128_t v {}; + int128 v {}; const auto r {boost::int128::detail::from_chars(s.data(), s.data() + s.size(), v)}; BOOST_TEST_LT(r, 0); - BOOST_TEST(v == (std::numeric_limits::max)()); + BOOST_TEST(v == (std::numeric_limits::max)()); } // INT128_MAX + 1. - check_overflow("170141183460469231731687303715884105728", 10); + check_overflow("170141183460469231731687303715884105728", 10); // INT128_MIN exactly. { const std::string s {"-170141183460469231731687303715884105728"}; - int128_t v {}; + int128 v {}; const auto r {boost::int128::detail::from_chars(s.data(), s.data() + s.size(), v)}; BOOST_TEST_LT(r, 0); - BOOST_TEST(v == (std::numeric_limits::min)()); + BOOST_TEST(v == (std::numeric_limits::min)()); } // INT128_MIN - 1. - check_overflow("-170141183460469231731687303715884105729", 10); + check_overflow("-170141183460469231731687303715884105729", 10); } void test_invalid_inputs() @@ -213,7 +213,7 @@ void test_invalid_inputs() // Empty range is EINVAL. { const char* s {""}; - uint128_t v {}; + uint128 v {}; const auto r {boost::int128::detail::from_chars(s, s, v)}; BOOST_TEST_EQ(r, EINVAL); } @@ -221,7 +221,7 @@ void test_invalid_inputs() // Lone sign is EINVAL. { const std::string s {"-"}; - int128_t v {}; + int128 v {}; const auto r {boost::int128::detail::from_chars(s.data(), s.data() + s.size(), v)}; BOOST_TEST_EQ(r, EINVAL); } @@ -229,7 +229,7 @@ void test_invalid_inputs() // Leading sign on the unsigned overload is EINVAL. { const std::string s {"-1"}; - uint128_t v {}; + uint128 v {}; const auto r {boost::int128::detail::from_chars(s.data(), s.data() + s.size(), v)}; BOOST_TEST_EQ(r, EINVAL); } diff --git a/test/test_gcd_lcm.cpp b/test/test_gcd_lcm.cpp index 7d645c4c..bf0b390b 100644 --- a/test/test_gcd_lcm.cpp +++ b/test/test_gcd_lcm.cpp @@ -152,19 +152,19 @@ void test_negative_value() // These should always return positive values // Also exercises our constexpr-ness - constexpr int128_t p {2 * 2 * 3}; - constexpr int128_t q {2 * 3 * 3}; + constexpr int128 p {2 * 2 * 3}; + constexpr int128 q {2 * 3 * 3}; static_assert(2 * 3 == gcd(p, q), "Wrong"); - static_assert(gcd(int128_t{6}, int128_t{10}) == 2, "Wrong"); - static_assert(gcd(int128_t{6}, int128_t{-10}) == 2, "Wrong"); - static_assert(gcd(int128_t{-6}, int128_t{-10}) == 2, "Wrong"); + static_assert(gcd(int128{6}, int128{10}) == 2, "Wrong"); + static_assert(gcd(int128{6}, int128{-10}) == 2, "Wrong"); + static_assert(gcd(int128{-6}, int128{-10}) == 2, "Wrong"); - static_assert(gcd(int128_t{24}, int128_t{0}) == 24, "Wrong"); - static_assert(gcd(int128_t{-24}, int128_t{0}) == 24, "Wrong"); + static_assert(gcd(int128{24}, int128{0}) == 24, "Wrong"); + static_assert(gcd(int128{-24}, int128{0}) == 24, "Wrong"); - static_assert(gcd(int128_t{0}, int128_t{24}) == 24, "Wrong"); - static_assert(gcd(int128_t{0}, int128_t{-24}) == 24, "Wrong"); + static_assert(gcd(int128{0}, int128{24}) == 24, "Wrong"); + static_assert(gcd(int128{0}, int128{-24}) == 24, "Wrong"); } #ifdef _MSC_VER @@ -173,13 +173,13 @@ void test_negative_value() int main() { - test_gcd(); - test_lcm(); - test_gcd_lcm_properties(); + test_gcd(); + test_lcm(); + test_gcd_lcm_properties(); - test_gcd(); - test_lcm(); - test_gcd_lcm_properties(); + test_gcd(); + test_lcm(); + test_gcd_lcm_properties(); test_negative_value(); return boost::report_errors(); diff --git a/test/test_has_single_bit.cu b/test/test_has_single_bit.cu index 3dd4985a..b141a694 100644 --- a/test/test_has_single_bit.cu +++ b/test/test_has_single_bit.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, bool *out, int numElements) { diff --git a/test/test_has_single_bit_sycl.cpp b/test/test_has_single_bit_sycl.cpp index 53089127..6bee28ba 100644 --- a/test/test_has_single_bit_sycl.cpp +++ b/test/test_has_single_bit_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return static_cast(boost::int128::has_single_bit(a)); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return static_cast(boost::int128::has_single_bit(a)); }); } diff --git a/test/test_hash.cpp b/test/test_hash.cpp index a3b54c5e..69db781e 100644 --- a/test/test_hash.cpp +++ b/test/test_hash.cpp @@ -23,89 +23,89 @@ import boost.int128; void test_uint128_equivalent_hashes() { - using boost::int128::uint128_t; + using boost::int128::uint128; - std::hash hasher {}; + std::hash hasher {}; // Same value built different ways must hash identically - const uint128_t a {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE)}; - const uint128_t b {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE)}; + const uint128 a {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE)}; + const uint128 b {UINT64_C(0xDEADBEEF), UINT64_C(0xCAFEBABE)}; BOOST_TEST_EQ(hasher(a), hasher(b)); // Equality across assignment - uint128_t c {}; + uint128 c {}; c = a; BOOST_TEST_EQ(hasher(a), hasher(c)); // Zero hashes to a stable value - const uint128_t zero1 {}; - const uint128_t zero2 {0}; + const uint128 zero1 {}; + const uint128 zero2 {0}; BOOST_TEST_EQ(hasher(zero1), hasher(zero2)); // Values constructed from a small integer match equivalent two-word form - const uint128_t small_a {42}; - const uint128_t small_b {0, 42}; + const uint128 small_a {42}; + const uint128 small_b {0, 42}; BOOST_TEST_EQ(hasher(small_a), hasher(small_b)); } void test_int128_equivalent_hashes() { - using boost::int128::int128_t; + using boost::int128::int128; - std::hash hasher {}; + std::hash hasher {}; - const int128_t a {INT64_C(-1), UINT64_C(0xCAFEBABE)}; - const int128_t b {INT64_C(-1), UINT64_C(0xCAFEBABE)}; + const int128 a {INT64_C(-1), UINT64_C(0xCAFEBABE)}; + const int128 b {INT64_C(-1), UINT64_C(0xCAFEBABE)}; BOOST_TEST_EQ(hasher(a), hasher(b)); - int128_t c {}; + int128 c {}; c = a; BOOST_TEST_EQ(hasher(a), hasher(c)); - const int128_t zero1 {}; - const int128_t zero2 {0}; + const int128 zero1 {}; + const int128 zero2 {0}; BOOST_TEST_EQ(hasher(zero1), hasher(zero2)); - const int128_t pos_a {42}; - const int128_t pos_b {0, 42}; + const int128 pos_a {42}; + const int128 pos_b {0, 42}; BOOST_TEST_EQ(hasher(pos_a), hasher(pos_b)); } void test_int128_negative_no_collision_with_absolute() { - using boost::int128::int128_t; + using boost::int128::int128; - std::hash hasher {}; + std::hash hasher {}; // hash(-x) must not equal hash(x) for non-zero x for (std::int64_t i {1}; i <= 1024; ++i) { - const int128_t pos {i}; - const int128_t neg {-i}; + const int128 pos {i}; + const int128 neg {-i}; BOOST_TEST_NE(hasher(pos), hasher(neg)); } // Larger magnitudes including values that span beyond 64 bits - const int128_t big_pos {INT64_C(0x0000000100000000), UINT64_C(0)}; - const int128_t big_neg {-big_pos}; + const int128 big_pos {INT64_C(0x0000000100000000), UINT64_C(0)}; + const int128 big_neg {-big_pos}; BOOST_TEST_NE(hasher(big_pos), hasher(big_neg)); // Values whose low word matches their negation's low word arithmetic (mod 2^64) are still distinct - const int128_t one {1}; - const int128_t minus_one {-1}; + const int128 one {1}; + const int128 minus_one {-1}; BOOST_TEST_NE(hasher(one), hasher(minus_one)); // INT128_MIN and a value with the same low word but opposite high word - const int128_t edge_pos {1}; - const int128_t edge_neg {-1}; + const int128 edge_pos {1}; + const int128 edge_neg {-1}; BOOST_TEST_NE(hasher(edge_pos), hasher(edge_neg)); } void test_hash_distribution_uint128() { - using boost::int128::uint128_t; + using boost::int128::uint128; - std::hash hasher {}; + std::hash hasher {}; std::unordered_set seen {}; // A few thousand random values should produce nearly distinct hashes @@ -113,7 +113,7 @@ void test_hash_distribution_uint128() constexpr int num_samples {4096}; for (int i {0}; i < num_samples; ++i) { - const uint128_t v {rng(), rng()}; + const uint128 v {rng(), rng()}; seen.insert(hasher(v)); } @@ -123,16 +123,16 @@ void test_hash_distribution_uint128() void test_hash_distribution_int128() { - using boost::int128::int128_t; + using boost::int128::int128; - std::hash hasher {}; + std::hash hasher {}; std::unordered_set seen {}; std::mt19937_64 rng {123}; constexpr int num_samples {4096}; for (int i {0}; i < num_samples; ++i) { - const int128_t v {static_cast(rng()), rng()}; + const int128 v {static_cast(rng()), rng()}; seen.insert(hasher(v)); } @@ -141,47 +141,47 @@ void test_hash_distribution_int128() void test_use_in_unordered_map_uint128() { - using boost::int128::uint128_t; - - std::unordered_map map {}; - map[uint128_t{0, 1}] = 1; - map[uint128_t{0, 2}] = 2; - map[uint128_t{1, 0}] = 3; - map[uint128_t{UINT64_MAX, UINT64_MAX}] = 4; - - BOOST_TEST_EQ((map[uint128_t{0, 1}]), 1); - BOOST_TEST_EQ((map[uint128_t{0, 2}]), 2); - BOOST_TEST_EQ((map[uint128_t{1, 0}]), 3); - BOOST_TEST_EQ((map[uint128_t{UINT64_MAX, UINT64_MAX}]), 4); + using boost::int128::uint128; + + std::unordered_map map {}; + map[uint128{0, 1}] = 1; + map[uint128{0, 2}] = 2; + map[uint128{1, 0}] = 3; + map[uint128{UINT64_MAX, UINT64_MAX}] = 4; + + BOOST_TEST_EQ((map[uint128{0, 1}]), 1); + BOOST_TEST_EQ((map[uint128{0, 2}]), 2); + BOOST_TEST_EQ((map[uint128{1, 0}]), 3); + BOOST_TEST_EQ((map[uint128{UINT64_MAX, UINT64_MAX}]), 4); BOOST_TEST_EQ(map.size(), (std::size_t {4})); } void test_use_in_unordered_map_int128() { - using boost::int128::int128_t; - - std::unordered_map map {}; - map[int128_t{0, 1}] = 1; - map[int128_t{-1, UINT64_MAX}] = 2; - map[int128_t{1, 0}] = 3; - map[int128_t{-1, 0}] = 4; - - BOOST_TEST_EQ((map[int128_t{0, 1}]), 1); - BOOST_TEST_EQ((map[int128_t{-1, UINT64_MAX}]), 2); - BOOST_TEST_EQ((map[int128_t{1, 0}]), 3); - BOOST_TEST_EQ((map[int128_t{-1, 0}]), 4); + using boost::int128::int128; + + std::unordered_map map {}; + map[int128{0, 1}] = 1; + map[int128{-1, UINT64_MAX}] = 2; + map[int128{1, 0}] = 3; + map[int128{-1, 0}] = 4; + + BOOST_TEST_EQ((map[int128{0, 1}]), 1); + BOOST_TEST_EQ((map[int128{-1, UINT64_MAX}]), 2); + BOOST_TEST_EQ((map[int128{1, 0}]), 3); + BOOST_TEST_EQ((map[int128{-1, 0}]), 4); BOOST_TEST_EQ(map.size(), (std::size_t {4})); } void test_high_low_swap_not_colliding() { - using boost::int128::uint128_t; + using boost::int128::uint128; - std::hash hasher {}; + std::hash hasher {}; // hash({a, b}) should not equal hash({b, a}) in general - const uint128_t a {UINT64_C(0x1111), UINT64_C(0x2222)}; - const uint128_t b {UINT64_C(0x2222), UINT64_C(0x1111)}; + const uint128 a {UINT64_C(0x1111), UINT64_C(0x2222)}; + const uint128 b {UINT64_C(0x2222), UINT64_C(0x1111)}; BOOST_TEST_NE(hasher(a), hasher(b)); } diff --git a/test/test_i128.cpp b/test/test_i128.cpp index ad053d68..facd2241 100644 --- a/test/test_i128.cpp +++ b/test/test_i128.cpp @@ -161,7 +161,7 @@ void test_arithmetic_constructor() { const IntType value {dist(rng)}; builtin_i128 builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; builtin_i128 emulated_bits; std::memcpy(&emulated_bits, &emulated_value, sizeof(builtin_i128)); @@ -181,7 +181,7 @@ void test_assignment_operators() const IntType value {dist(rng)}; builtin_i128 builtin_value; builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; builtin_i128 emulated_bits; @@ -202,7 +202,7 @@ void test_integer_conversion_operators() const IntType value {dist(rng)}; builtin_i128 builtin_value; builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -214,7 +214,7 @@ void test_integer_conversion_operators() if (builtin_value) { BOOST_TEST(emulated_value); - const boost::int128::int128_t high_only {static_cast(builtin_value), 0}; + const boost::int128::int128 high_only {static_cast(builtin_value), 0}; BOOST_TEST(high_only); } } @@ -239,7 +239,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value; builtin_value = static_cast(value) << 64 | static_cast(value); - boost::int128::int128_t emulated_value {static_cast(value), value}; + boost::int128::int128 emulated_value {static_cast(value), value}; // Converts the value and then normalizes the range const auto builtin_value_return = static_cast(builtin_value) / static_cast(1e27L); @@ -258,7 +258,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = value; - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -283,7 +283,7 @@ void test_unary_plus() const IntType value {dist(rng)}; builtin_i128 builtin_value = static_cast(value); builtin_value = +builtin_value; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; emulated_value = +emulated_value; builtin_i128 emulated_bits; @@ -304,7 +304,7 @@ void test_unary_minus() const IntType value {dist(rng)}; auto builtin_value = static_cast(value); builtin_value = -builtin_value; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; emulated_value = -emulated_value; builtin_i128 emulated_bits; @@ -325,7 +325,7 @@ void test_operator_equality() { const IntType value {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value)) == ((value == builtin_value) == (builtin_value == value))); @@ -337,26 +337,26 @@ void test_operator_equality() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2)) == ((value2 == builtin_value) == (builtin_value == value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {1, static_cast(value)}; + boost::int128::int128 emulated_value {1, static_cast(value)}; BOOST_TEST((value == emulated_value) == (emulated_value == value)); } } - const boost::int128::int128_t bool_val {dist(rng)}; + const boost::int128::int128 bool_val {dist(rng)}; BOOST_TEST((true == bool_val) == (bool_val == true)); - const boost::int128::int128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::int128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true == bool_val2) == (bool_val2 == true)); BOOST_TEST(!(bool_val == bool_val2)); BOOST_TEST(bool_val == bool_val); @@ -376,7 +376,7 @@ void test_operator_inequality() { const IntType value {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value)) == ((value != builtin_value) == (builtin_value != value))); @@ -388,26 +388,26 @@ void test_operator_inequality() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2)) == ((value2 != builtin_value) == (builtin_value != value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {1, static_cast(value)}; + boost::int128::int128 emulated_value {1, static_cast(value)}; BOOST_TEST((value != emulated_value) == (emulated_value != value)); } } - const boost::int128::int128_t bool_val {dist(rng)}; + const boost::int128::int128 bool_val {dist(rng)}; BOOST_TEST((true != bool_val) == (bool_val != true)); - const boost::int128::int128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::int128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true != bool_val2) == (bool_val2 != true)); BOOST_TEST(bool_val != bool_val2); BOOST_TEST(!(bool_val != bool_val)); @@ -427,18 +427,18 @@ void test_operator_less() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 < emulated_value) == (value2 < builtin_value)) == ((emulated_value < value2) == (builtin_value < value2))); } - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t) && std::is_unsigned::value) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128) && std::is_unsigned::value) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {-1, static_cast(value)}; + boost::int128::int128 emulated_value {-1, static_cast(value)}; BOOST_TEST((value < emulated_value) != (emulated_value < value)); } } @@ -455,18 +455,18 @@ void test_operator_greater() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 > emulated_value) == (value2 > builtin_value)) == ((emulated_value > value2) == (builtin_value > value2))); } - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t) && std::is_unsigned::value) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128) && std::is_unsigned::value) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {-1, static_cast(value)}; + boost::int128::int128 emulated_value {-1, static_cast(value)}; BOOST_TEST((value > emulated_value) != (emulated_value > value)); } } @@ -483,7 +483,7 @@ void test_operator_le() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 <= emulated_value) == (value2 <= builtin_value)) == ((emulated_value <= value2) == (builtin_value <= value2))); @@ -501,7 +501,7 @@ void test_operator_ge() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 >= emulated_value) == (value2 >= builtin_value)) == ((emulated_value >= value2) == (builtin_value >= value2))); @@ -518,7 +518,7 @@ void test_operator_not() { const IntType value {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(~emulated_value == ~builtin_value); } @@ -535,7 +535,7 @@ void test_operator_or() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value |= value2; @@ -570,7 +570,7 @@ void test_operator_and() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value &= value2; @@ -605,7 +605,7 @@ void test_operator_xor() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value ^= value2; @@ -642,7 +642,7 @@ void test_operator_left_shift() const IntType value {dist(rng)}; const unsigned shift_value {shift_dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Test 1: Test the <<= operator auto builtin_copy = builtin_value; @@ -678,7 +678,7 @@ void test_operator_left_shift() // documentation), so only the well-defined in-range counts are exercised. // The constant-evaluated (default_ls_impl) path must agree with the runtime // path for every in-range count. - const boost::int128::int128_t val {UINT64_MAX}; + const boost::int128::int128 val {UINT64_MAX}; BOOST_TEST((val << 0) == val); for (unsigned s {}; s < 128U; ++s) { @@ -699,7 +699,7 @@ void test_operator_right_shift() const IntType value {dist(rng)}; const unsigned shift_value {shift_dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Test 1: Test the >>= operator auto builtin_copy = builtin_value; @@ -735,8 +735,8 @@ void test_operator_right_shift() // documentation), so only the well-defined in-range counts are exercised. // Both a positive and a negative value are checked so the arithmetic // (sign-extending) right shift is covered for every in-range count. - const boost::int128::int128_t val {UINT64_MAX}; - const boost::int128::int128_t neg {-(boost::int128::int128_t{1} << 96)}; + const boost::int128::int128 val {UINT64_MAX}; + const boost::int128::int128 neg {-(boost::int128::int128{1} << 96)}; BOOST_TEST((val >> 0) == val); for (unsigned s {}; s < 128U; ++s) { @@ -747,7 +747,7 @@ void test_operator_right_shift() void test_increment_operator() { - boost::int128::int128_t emulated_value {INT64_MAX - N/2}; + boost::int128::int128 emulated_value {INT64_MAX - N/2}; builtin_i128 builtin_value {INT64_MAX - N/2}; for (std::size_t i {}; i < N; ++i) @@ -778,7 +778,7 @@ void test_operator_add() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value += value2; @@ -788,7 +788,7 @@ void test_operator_add() // Edge case where we go from low word to high word builtin_i128 builtin_value = UINT64_MAX - 2U; - boost::int128::int128_t emulated_value = UINT64_MAX - 2U; + boost::int128::int128 emulated_value = UINT64_MAX - 2U; for (std::size_t i {}; i < N; ++i) { @@ -815,7 +815,7 @@ void test_operator_sub() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Avoid UB from signed rollover if (value > value2) @@ -833,7 +833,7 @@ void test_operator_sub() // Edge case where we go from high word to low word builtin_i128 builtin_value = UINT64_MAX; builtin_value += 10; - boost::int128::int128_t emulated_value = UINT64_MAX; + boost::int128::int128 emulated_value = UINT64_MAX; emulated_value += 10; for (std::size_t i {}; i < N; ++i) @@ -853,7 +853,7 @@ void test_operator_mul() IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value *= value2; @@ -874,7 +874,7 @@ void test_operator_div() BOOST_INT128_IF_CONSTEXPR(std::is_same::value) { IntType value {24}; - boost::int128::int128_t emulated_value {48}; + boost::int128::int128 emulated_value {48}; BOOST_TEST(emulated_value / value == 2); BOOST_TEST(value / emulated_value == 0); emulated_value /= value; @@ -901,7 +901,7 @@ void test_operator_div() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -917,7 +917,7 @@ void test_operator_div() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t) && sizeof(IntType) > sizeof(char)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128) && sizeof(IntType) > sizeof(char)) { for (std::size_t i {}; i < N; ++i) { @@ -934,9 +934,9 @@ void test_operator_div() value2 = dist(rng); // LCOV_EXCL_LINE } - const boost::int128::int128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::int128 emulated_value {static_cast(value), static_cast(value)}; const auto builtin_value = static_cast(emulated_value); - const boost::int128::int128_t small_emulated_value {0, static_cast(value)}; + const boost::int128::int128 small_emulated_value {0, static_cast(value)}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -951,7 +951,7 @@ void test_operator_div() BOOST_TEST((value2 / emulated_value) == (value2 / builtin_value)); // Forces decision process - const boost::int128::int128_t check_2_value {value2}; + const boost::int128::int128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value / check_2_value)); // Division by zero is undefined behavior (matching the builtin __int128 types), so it is not tested. @@ -963,9 +963,9 @@ void test_operator_div() } // Check large value - constexpr auto lhs {(std::numeric_limits::max)()}; - constexpr boost::int128::int128_t rhs {0x1, UINT64_MAX}; - constexpr boost::int128::int128_t res {UINT64_C(0x4000000000000000)}; + constexpr auto lhs {(std::numeric_limits::max)()}; + constexpr boost::int128::int128 rhs {0x1, UINT64_MAX}; + constexpr boost::int128::int128 res {UINT64_C(0x4000000000000000)}; BOOST_TEST(lhs / rhs == res); } @@ -983,7 +983,7 @@ void test_operator_mod() BOOST_INT128_IF_CONSTEXPR(std::is_same::value) { IntType value {24}; - boost::int128::int128_t emulated_value {48}; + boost::int128::int128 emulated_value {48}; BOOST_TEST(emulated_value % value == 0); BOOST_TEST(value % emulated_value == 24); emulated_value %= value; @@ -1010,14 +1010,14 @@ void test_operator_mod() } // With too large an unsigned __int128 value we end up with bitwise equal but signed results - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) == sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) == sizeof(boost::int128::int128)) { value >>= 2; value2 >>= 2; } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -1033,7 +1033,7 @@ void test_operator_mod() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t) && sizeof(IntType) > sizeof(char)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128) && sizeof(IntType) > sizeof(char)) { for (std::size_t i {}; i < N; ++i) { @@ -1050,9 +1050,9 @@ void test_operator_mod() value2 = dist(rng); // LCOV_EXCL_LINE } - const boost::int128::int128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::int128 emulated_value {static_cast(value), static_cast(value)}; const auto builtin_value = static_cast(emulated_value); - const boost::int128::int128_t small_emulated_value {0, static_cast(value)}; + const boost::int128::int128 small_emulated_value {0, static_cast(value)}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -1067,7 +1067,7 @@ void test_operator_mod() BOOST_TEST((value2 % emulated_value) == (value2 % builtin_value)); // Forces decision process - const boost::int128::int128_t check_2_value {value2}; + const boost::int128::int128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value % check_2_value)); // Remainder by zero is undefined behavior (matching the builtin __int128 types), so it is not tested. @@ -1088,7 +1088,7 @@ void test_abs() for (std::size_t i {}; i < N; ++i) { const auto value {dist(rng)}; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto builtin_value = static_cast(value); if (value < 0) @@ -1120,7 +1120,7 @@ void test_abs() value /= 100; } - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto builtin_value = static_cast(value); BOOST_TEST(abs(emulated_value) == emulated_value); @@ -1132,7 +1132,7 @@ template void test_spot_mod(const IntType value, const IntType value2) { auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value{value}; + boost::int128::int128 emulated_value{value}; auto check_1_value{emulated_value}; check_1_value %= value2; @@ -1258,7 +1258,7 @@ void test_operator_equality() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value))); } @@ -1268,25 +1268,25 @@ void test_operator_equality() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {1, static_cast(value)}; + boost::int128::int128 emulated_value {1, static_cast(value)}; BOOST_TEST((value == emulated_value) == (emulated_value == value)); } } - const boost::int128::int128_t bool_val {dist(rng)}; + const boost::int128::int128 bool_val {dist(rng)}; BOOST_TEST((true == bool_val) == (bool_val == true)); - const boost::int128::int128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::int128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true == bool_val2) == (bool_val2 == true)); BOOST_TEST(!(bool_val == bool_val2)); BOOST_TEST(bool_val == bool_val); @@ -1305,7 +1305,7 @@ void test_operator_inequality() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value))); } @@ -1315,25 +1315,25 @@ void test_operator_inequality() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::int128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::int128_t emulated_value {1, static_cast(value)}; + boost::int128::int128 emulated_value {1, static_cast(value)}; BOOST_TEST((value != emulated_value) == (emulated_value != value)); } } - const boost::int128::int128_t bool_val {dist(rng)}; + const boost::int128::int128 bool_val {dist(rng)}; BOOST_TEST((true != bool_val) == (bool_val != true)); - const boost::int128::int128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::int128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true != bool_val2) == (bool_val2 != true)); BOOST_TEST(bool_val != bool_val2); BOOST_TEST(!(bool_val != bool_val)); @@ -1358,7 +1358,7 @@ void test_operator_less() value2 = dist(rng); } - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 < emulated_value) != (emulated_value < value2))); } @@ -1367,7 +1367,7 @@ void test_operator_less() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value < emulated_value) == (emulated_value < value))); } @@ -1389,7 +1389,7 @@ void test_operator_greater() value2 = dist(rng); } - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 > emulated_value) != (emulated_value > value2))); } @@ -1398,7 +1398,7 @@ void test_operator_greater() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value > emulated_value) == (emulated_value > value))); } @@ -1415,7 +1415,7 @@ void test_operator_le() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; if (value == value2) { @@ -1431,7 +1431,7 @@ void test_operator_le() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value <= emulated_value) == (emulated_value <= value))); } @@ -1447,7 +1447,7 @@ void test_operator_ge() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; if (value == value2) { @@ -1463,7 +1463,7 @@ void test_operator_ge() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::int128_t emulated_value {value}; + const boost::int128::int128 emulated_value {value}; BOOST_TEST(((value >= emulated_value) == (emulated_value >= value))); } @@ -1480,8 +1480,8 @@ void test_operator_add() const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE const IntType res = value + value2; - boost::int128::int128_t test_value {value}; - const boost::int128::int128_t test_value2 {value2}; + boost::int128::int128 test_value {value}; + const boost::int128::int128 test_value2 {value2}; BOOST_TEST(test_value + test_value2 == res); // LCOV_EXCL_LINE test_value += value2; @@ -1489,8 +1489,8 @@ void test_operator_add() } // Known Values - boost::int128::int128_t test_value {UINT64_MAX}; - boost::int128::int128_t correct_value {1, 0}; + boost::int128::int128 test_value {UINT64_MAX}; + boost::int128::int128 correct_value {1, 0}; BOOST_TEST_EQ(test_value + 1, correct_value); BOOST_TEST_EQ(test_value + UINT64_MAX, correct_value + (UINT64_MAX - 1U)); @@ -1514,8 +1514,8 @@ void test_operator_sub() const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE const IntType res = value - value2; - boost::int128::int128_t test_value {value}; - const boost::int128::int128_t test_value2 {value2}; + boost::int128::int128 test_value {value}; + const boost::int128::int128 test_value2 {value2}; BOOST_TEST(test_value - test_value2 == res); // LCOV_EXCL_LINE test_value -= value2; @@ -1523,8 +1523,8 @@ void test_operator_sub() } // Known Values - boost::int128::int128_t correct_value {UINT64_MAX}; - boost::int128::int128_t test_value {1, 0}; + boost::int128::int128 correct_value {UINT64_MAX}; + boost::int128::int128 test_value {1, 0}; BOOST_TEST_EQ(test_value - 1, correct_value); BOOST_TEST_EQ(test_value - INT64_MAX, correct_value - (INT64_MAX - 1U)); @@ -1546,8 +1546,8 @@ void test_operator_mul() const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE const IntType res = value * value2; - boost::int128::int128_t test_value {value}; - const boost::int128::int128_t test_value2 {value2}; + boost::int128::int128 test_value {value}; + const boost::int128::int128 test_value2 {value2}; BOOST_TEST(test_value * test_value2 == res); // LCOV_EXCL_LINE @@ -1555,8 +1555,8 @@ void test_operator_mul() BOOST_TEST(test_value == res); // LCOV_EXCL_LINE } - boost::int128::int128_t shift_val {1}; - boost::int128::int128_t mul_val {1}; + boost::int128::int128 shift_val {1}; + boost::int128::int128 mul_val {1}; for (std::size_t i {1}; i < 127; ++i) { @@ -1593,8 +1593,8 @@ void test_operator_div() const IntType res = value / value2; - boost::int128::int128_t test_value {value}; - const boost::int128::int128_t test_value2 {value2}; + boost::int128::int128 test_value {value}; + const boost::int128::int128 test_value2 {value2}; BOOST_TEST(test_value / test_value2 == res); // LCOV_EXCL_LINE @@ -1602,21 +1602,21 @@ void test_operator_div() BOOST_TEST(test_value == res); // LCOV_EXCL_LINE } - boost::int128::int128_t shift_val {INT64_MAX, UINT64_MAX}; - boost::int128::int128_t mul_val {INT64_MAX, UINT64_MAX}; + boost::int128::int128 shift_val {INT64_MAX, UINT64_MAX}; + boost::int128::int128 mul_val {INT64_MAX, UINT64_MAX}; for (std::size_t i {2}; i < 126; ++i) { const auto current_shift_val {shift_val >> i}; - const auto current_mul_val {mul_val / (boost::int128::int128_t{2} << (i-1))}; + const auto current_mul_val {mul_val / (boost::int128::int128{2} << (i-1))}; BOOST_TEST(current_shift_val == current_mul_val); // LCOV_EXCL_LINE } // Check large value - constexpr auto lhs {(std::numeric_limits::max)()}; - constexpr boost::int128::int128_t rhs {0x1, UINT64_MAX}; - constexpr boost::int128::int128_t res {UINT64_C(0x4000000000000000)}; + constexpr auto lhs {(std::numeric_limits::max)()}; + constexpr boost::int128::int128 rhs {0x1, UINT64_MAX}; + constexpr boost::int128::int128 res {UINT64_C(0x4000000000000000)}; BOOST_TEST(lhs / rhs == res); } diff --git a/test/test_i128_no_sign_conv.cpp b/test/test_i128_no_sign_conv.cpp index 299156f2..71751650 100644 --- a/test/test_i128_no_sign_conv.cpp +++ b/test/test_i128_no_sign_conv.cpp @@ -151,7 +151,7 @@ void test_arithmetic_constructor() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; builtin_i128 emulated_bits; std::memcpy(&emulated_bits, &emulated_value, sizeof(builtin_i128)); @@ -171,7 +171,7 @@ void test_assignment_operators() const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value; builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; builtin_i128 emulated_bits; @@ -192,7 +192,7 @@ void test_integer_conversion_operators() const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value; builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -227,7 +227,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value; builtin_value = static_cast(value) << 64 | static_cast(value); - boost::int128::int128_t emulated_value {static_cast(value), value}; + boost::int128::int128 emulated_value {static_cast(value), value}; // Converts the value and then normalizes the range const auto builtin_value_return = static_cast(builtin_value) / static_cast(1e27L); @@ -246,7 +246,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = value; - boost::int128::int128_t emulated_value {}; + boost::int128::int128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -271,7 +271,7 @@ void test_unary_plus() const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_i128 builtin_value = static_cast(value); builtin_value = +builtin_value; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; emulated_value = +emulated_value; builtin_i128 emulated_bits; @@ -292,7 +292,7 @@ void test_unary_minus() const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); builtin_value = -builtin_value; - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; emulated_value = -emulated_value; builtin_i128 emulated_bits; @@ -313,7 +313,7 @@ void test_operator_equality() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value)) == ((value == builtin_value) == (builtin_value == value))); // LCOV_EXCL_LINE } @@ -324,12 +324,12 @@ void test_operator_equality() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2)) == ((value2 == builtin_value) == (builtin_value == value2))); // LCOV_EXCL_LINE } - const boost::int128::int128_t bool_val {dist(rng)}; // LCOV_EXCL_LINE + const boost::int128::int128 bool_val {dist(rng)}; // LCOV_EXCL_LINE BOOST_TEST((true == bool_val) == (bool_val == true)); // LCOV_EXCL_LINE } @@ -344,7 +344,7 @@ void test_operator_inequality() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value)) == ((value != builtin_value) == (builtin_value != value))); // LCOV_EXCL_LINE } @@ -355,12 +355,12 @@ void test_operator_inequality() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2)) == ((value2 != builtin_value) == (builtin_value != value2))); // LCOV_EXCL_LINE } - const boost::int128::int128_t bool_val {dist(rng)}; // LCOV_EXCL_LINE + const boost::int128::int128 bool_val {dist(rng)}; // LCOV_EXCL_LINE BOOST_TEST((true != bool_val) == (bool_val != true)); // LCOV_EXCL_LINE } @@ -375,7 +375,7 @@ void test_operator_less() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 < emulated_value) == (value2 < builtin_value)) == ((emulated_value < value2) == (builtin_value < value2))); // LCOV_EXCL_LINE } @@ -392,7 +392,7 @@ void test_operator_greater() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 > emulated_value) == (value2 > builtin_value)) == ((emulated_value > value2) == (builtin_value > value2))); // LCOV_EXCL_LINE } @@ -409,7 +409,7 @@ void test_operator_le() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 <= emulated_value) == (value2 <= builtin_value)) == ((emulated_value <= value2) == (builtin_value <= value2))); // LCOV_EXCL_LINE } @@ -426,7 +426,7 @@ void test_operator_ge() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(((value2 >= emulated_value) == (value2 >= builtin_value)) == ((emulated_value >= value2) == (builtin_value >= value2))); // LCOV_EXCL_LINE } @@ -442,7 +442,7 @@ void test_operator_not() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; BOOST_TEST(~emulated_value == ~builtin_value); // LCOV_EXCL_LINE } @@ -459,7 +459,7 @@ void test_operator_or() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value |= value2; @@ -494,7 +494,7 @@ void test_operator_and() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value &= value2; @@ -529,7 +529,7 @@ void test_operator_xor() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value ^= value2; @@ -566,7 +566,7 @@ void test_operator_left_shift() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const unsigned shift_value {shift_dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Test 1: Test the <<= operator auto builtin_copy = builtin_value; @@ -607,7 +607,7 @@ void test_operator_right_shift() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const unsigned shift_value {shift_dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Test 1: Test the >>= operator auto builtin_copy = builtin_value; @@ -637,7 +637,7 @@ void test_operator_right_shift() void test_increment_operator() { - boost::int128::int128_t emulated_value {INT64_MAX - N/2}; + boost::int128::int128 emulated_value {INT64_MAX - N/2}; builtin_i128 builtin_value {INT64_MAX - N/2}; for (std::size_t i {}; i < N; ++i) @@ -668,7 +668,7 @@ void test_operator_add() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value += value2; @@ -678,7 +678,7 @@ void test_operator_add() // Edge case where we go from low word to high word builtin_i128 builtin_value = UINT64_MAX - 2U; - boost::int128::int128_t emulated_value = UINT64_MAX - 2U; + boost::int128::int128 emulated_value = UINT64_MAX - 2U; for (std::size_t i {}; i < N; ++i) { @@ -705,7 +705,7 @@ void test_operator_sub() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; // Avoid UB from signed rollover if (value > value2) @@ -723,7 +723,7 @@ void test_operator_sub() // Edge case where we go from high word to low word builtin_i128 builtin_value = UINT64_MAX; builtin_value += 10; - boost::int128::int128_t emulated_value = UINT64_MAX; + boost::int128::int128 emulated_value = UINT64_MAX; emulated_value += 10; for (std::size_t i {}; i < N; ++i) @@ -744,7 +744,7 @@ void test_operator_mul() IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value *= value2; @@ -775,7 +775,7 @@ void test_operator_div() } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -791,7 +791,7 @@ void test_operator_div() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -808,7 +808,7 @@ void test_operator_div() value2 = dist(rng); // LCOV_EXCL_LINE } - const boost::int128::int128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::int128 emulated_value {static_cast(value), static_cast(value)}; const auto builtin_value = static_cast(emulated_value); auto check_1_value {emulated_value}; @@ -824,7 +824,7 @@ void test_operator_div() BOOST_TEST((value2 / emulated_value) == (value2 / builtin_value)); // LCOV_EXCL_LINE // Forces decision process - const boost::int128::int128_t check_2_value {value2}; + const boost::int128::int128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value / check_2_value)); // LCOV_EXCL_LINE } } @@ -852,14 +852,14 @@ void test_operator_mod() } // With too large an unsigned __int128 value we end up with bitwise equal but signed results - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) == sizeof(boost::int128::int128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) == sizeof(boost::int128::int128)) { value >>= 2; value2 >>= 2; } auto builtin_value = static_cast(value); - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -875,7 +875,7 @@ void test_operator_mod() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -892,7 +892,7 @@ void test_operator_mod() value2 = dist(rng); // LCOV_EXCL_LINE } - const boost::int128::int128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::int128 emulated_value {static_cast(value), static_cast(value)}; const auto builtin_value = static_cast(emulated_value); auto check_1_value {emulated_value}; @@ -908,7 +908,7 @@ void test_operator_mod() BOOST_TEST((value2 % emulated_value) == (value2 % builtin_value)); // LCOV_EXCL_LINE // Forces decision process - const boost::int128::int128_t check_2_value {value2}; + const boost::int128::int128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value % check_2_value)); // LCOV_EXCL_LINE } } @@ -925,7 +925,7 @@ void test_abs() for (std::size_t i {}; i < N; ++i) { const auto value {dist(rng)}; // LCOV_EXCL_LINE - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto builtin_value = static_cast(value); if (value < 0) @@ -957,7 +957,7 @@ void test_abs() value /= 100; } - boost::int128::int128_t emulated_value {value}; + boost::int128::int128 emulated_value {value}; auto builtin_value = static_cast(value); BOOST_TEST(abs(emulated_value) == emulated_value); // LCOV_EXCL_LINE diff --git a/test/test_int_div.cpp b/test/test_int_div.cpp index cfb2aba6..a995630a 100644 --- a/test/test_int_div.cpp +++ b/test/test_int_div.cpp @@ -107,10 +107,10 @@ struct mode_entry { const char* name; long long (*reference)(long long, long long); - int128_t (*signed_quotient)(int128_t, int128_t); - div_result (*signed_div_rem)(int128_t, int128_t); - uint128_t (*unsigned_quotient)(uint128_t, uint128_t); - div_result (*unsigned_div_rem)(uint128_t, uint128_t); + int128 (*signed_quotient)(int128, int128); + div_result (*signed_div_rem)(int128, int128); + uint128 (*unsigned_quotient)(uint128, uint128); + div_result (*unsigned_div_rem)(uint128, uint128); bool nearest; }; @@ -148,23 +148,23 @@ static void test_signed_sweep() for (const auto& mode : modes) { - const int128_t wide_x {x}; - const int128_t wide_y {y}; + const int128 wide_x {x}; + const int128 wide_y {y}; const auto expected {mode.reference(x, y)}; - if (!BOOST_TEST_EQ(mode.signed_quotient(wide_x, wide_y), int128_t{expected})) + if (!BOOST_TEST_EQ(mode.signed_quotient(wide_x, wide_y), int128{expected})) { context(mode, x, y); } const auto res {mode.signed_div_rem(wide_x, wide_y)}; - if (!BOOST_TEST_EQ(res.quotient, int128_t{expected})) + if (!BOOST_TEST_EQ(res.quotient, int128{expected})) { context(mode, x, y); } - if (!BOOST_TEST_EQ(res.remainder, int128_t{x - expected * y})) + if (!BOOST_TEST_EQ(res.remainder, int128{x - expected * y})) { context(mode, x, y); } @@ -172,7 +172,7 @@ static void test_signed_sweep() const auto rem {x % y}; const auto expected_rem {rem < 0 ? rem + (y < 0 ? -y : y) : rem}; - BOOST_TEST_EQ(rem_euclid(int128_t{x}, int128_t{y}), int128_t{expected_rem}); + BOOST_TEST_EQ(rem_euclid(int128{x}, int128{y}), int128{expected_rem}); } } } @@ -186,10 +186,10 @@ static void test_unsigned_sweep() { for (const auto& mode : modes) { - const uint128_t wide_x {static_cast(x)}; - const uint128_t wide_y {static_cast(y)}; + const uint128 wide_x {static_cast(x)}; + const uint128 wide_y {static_cast(y)}; const auto expected {mode.reference(x, y)}; - const uint128_t wide_expected {static_cast(expected)}; + const uint128 wide_expected {static_cast(expected)}; if (!BOOST_TEST_EQ(mode.unsigned_quotient(wide_x, wide_y), wide_expected)) { @@ -205,14 +205,14 @@ static void test_unsigned_sweep() // The remainder of a rounded up unsigned quotient is negative, and is // returned reduced modulo 2^128 - if (!BOOST_TEST_EQ(res.remainder, uint128_t{wide_x - wide_expected * wide_y})) + if (!BOOST_TEST_EQ(res.remainder, uint128{wide_x - wide_expected * wide_y})) { context(mode, x, y); } } - BOOST_TEST_EQ(rem_euclid(uint128_t{static_cast(x)}, uint128_t{static_cast(y)}), - uint128_t{static_cast(x % y)}); + BOOST_TEST_EQ(rem_euclid(uint128{static_cast(x)}, uint128{static_cast(y)}), + uint128{static_cast(x % y)}); } } } @@ -221,7 +221,7 @@ static void test_unsigned_sweep() // which puts the full 128-bit division path under the same reference static void test_scaled_sweep() { - const int128_t scale {int128_t{1} << 70}; + const int128 scale {int128{1} << 70}; for (long long x {-40}; x <= 40; ++x) { @@ -234,17 +234,17 @@ static void test_scaled_sweep() for (const auto& mode : modes) { - const int128_t wide_x {int128_t{x} * scale}; - const int128_t wide_y {int128_t{y} * scale}; + const int128 wide_x {int128{x} * scale}; + const int128 wide_y {int128{y} * scale}; const auto expected {mode.reference(x, y)}; const auto res {mode.signed_div_rem(wide_x, wide_y)}; - if (!BOOST_TEST_EQ(res.quotient, int128_t{expected})) + if (!BOOST_TEST_EQ(res.quotient, int128{expected})) { context(mode, x, y); } - if (!BOOST_TEST_EQ(res.remainder, wide_x - int128_t{expected} * wide_y)) + if (!BOOST_TEST_EQ(res.remainder, wide_x - int128{expected} * wide_y)) { context(mode, x, y); } @@ -256,22 +256,22 @@ static void test_scaled_sweep() // Properties that hold for arbitrary operands, checked on values with no small equivalent static void test_signed_invariants() { - constexpr auto int_min {(std::numeric_limits::min)()}; - constexpr auto int_max {(std::numeric_limits::max)()}; + constexpr auto int_min {(std::numeric_limits::min)()}; + constexpr auto int_max {(std::numeric_limits::max)()}; - const int128_t dividends[] + const int128 dividends[] { int_max, int_min, int_min + 1, int_max - 1, BOOST_INT128_INT128_C(-170141183460469231731687303715884105727), BOOST_INT128_INT128_C(99999999999999999999999999999999999999), BOOST_INT128_INT128_C(-12345678901234567890123456789012345678), - int128_t{1} << 100, -(int128_t{1} << 100) + int128{1} << 100, -(int128{1} << 100) }; - const int128_t divisors[] + const int128 divisors[] { - int128_t{1}, int128_t{-1}, int128_t{2}, int128_t{-2}, int128_t{3}, int128_t{-3}, - int128_t{1} << 64, -(int128_t{1} << 64), int_max, int_min, + int128{1}, int128{-1}, int128{2}, int128{-2}, int128{3}, int128{-3}, + int128{1} << 64, -(int128{1} << 64), int_max, int_min, BOOST_INT128_INT128_C(1000000000000000000000000000000000000) }; @@ -299,16 +299,16 @@ static void test_signed_invariants() // x == quotient * y + remainder, evaluated modulo 2^128 so that no // intermediate overflows - const uint128_t unsigned_x {x.high, x.low}; - const uint128_t unsigned_y {y.high, y.low}; - const uint128_t unsigned_quot {res.quotient.high, res.quotient.low}; - const uint128_t unsigned_rem {res.remainder.high, res.remainder.low}; - const uint128_t reconstructed {unsigned_quot * unsigned_y + unsigned_rem}; + const uint128 unsigned_x {x.high, x.low}; + const uint128 unsigned_y {y.high, y.low}; + const uint128 unsigned_quot {res.quotient.high, res.quotient.low}; + const uint128 unsigned_rem {res.remainder.high, res.remainder.low}; + const uint128 reconstructed {unsigned_quot * unsigned_y + unsigned_rem}; BOOST_TEST_EQ(unsigned_x, reconstructed); // abs(remainder) < abs(y) - const auto abs_rem {static_cast(boost::int128::abs(res.remainder))}; - const auto abs_y {static_cast(boost::int128::abs(y))}; + const auto abs_rem {static_cast(boost::int128::abs(res.remainder))}; + const auto abs_y {static_cast(boost::int128::abs(y))}; BOOST_TEST(abs_rem < abs_y); // A nearest mode never leaves more than half the divisor behind @@ -327,7 +327,7 @@ static void test_signed_invariants() // The Euclidean remainder is always non-negative and below abs(y) const auto euclid_rem {rem_euclid(x, y)}; BOOST_TEST(euclid_rem >= 0); - BOOST_TEST(static_cast(euclid_rem) < static_cast(boost::int128::abs(y))); + BOOST_TEST(static_cast(euclid_rem) < static_cast(boost::int128::abs(y))); BOOST_TEST_EQ(euclid_rem, div_rem_euclid(x, y).remainder); } } @@ -335,18 +335,18 @@ static void test_signed_invariants() static void test_unsigned_invariants() { - constexpr auto uint_max {(std::numeric_limits::max)()}; + constexpr auto uint_max {(std::numeric_limits::max)()}; - const uint128_t dividends[] + const uint128 dividends[] { - uint_max, uint_max - 1U, uint128_t{1} << 127U, uint128_t{1} << 100U, + uint_max, uint_max - 1U, uint128{1} << 127U, uint128{1} << 100U, BOOST_INT128_UINT128_C(340282366920938463463374607431768211451), BOOST_INT128_UINT128_C(99999999999999999999999999999999999999) }; - const uint128_t divisors[] + const uint128 divisors[] { - uint128_t{1}, uint128_t{2}, uint128_t{3}, uint128_t{1} << 64U, uint_max, + uint128{1}, uint128{2}, uint128{3}, uint128{1} << 64U, uint_max, BOOST_INT128_UINT128_C(1000000000000000000000000000000000000) }; @@ -367,7 +367,7 @@ static void test_unsigned_invariants() // x == quotient * y + remainder modulo 2^128, including when the // remainder has wrapped - const uint128_t reconstructed {res.quotient * y + res.remainder}; + const uint128 reconstructed {res.quotient * y + res.remainder}; BOOST_TEST_EQ(x, reconstructed); if (res.quotient == truncated.quot) @@ -390,136 +390,136 @@ static void test_unsigned_invariants() } } -// The divisor whose magnitude is not representable as a positive int128_t +// The divisor whose magnitude is not representable as a positive int128 static void test_int128_min_divisor() { - constexpr auto int_min {(std::numeric_limits::min)()}; - constexpr auto int_max {(std::numeric_limits::max)()}; + constexpr auto int_min {(std::numeric_limits::min)()}; + constexpr auto int_max {(std::numeric_limits::max)()}; // -3 / INT128_MIN is a tiny positive fraction: only the modes that round up in // magnitude leave zero - BOOST_TEST_EQ(div_to_zero(int128_t{-3}, int_min), int128_t{0}); - BOOST_TEST_EQ(div_away_zero(int128_t{-3}, int_min), int128_t{1}); - BOOST_TEST_EQ(div_to_pos_inf(int128_t{-3}, int_min), int128_t{1}); - BOOST_TEST_EQ(div_to_neg_inf(int128_t{-3}, int_min), int128_t{0}); - BOOST_TEST_EQ(div_euclid(int128_t{-3}, int_min), int128_t{1}); - BOOST_TEST_EQ(div_ties_to_zero(int128_t{-3}, int_min), int128_t{0}); - BOOST_TEST_EQ(div_ties_away_zero(int128_t{-3}, int_min), int128_t{0}); - BOOST_TEST_EQ(div_ties_to_even(int128_t{-3}, int_min), int128_t{0}); + BOOST_TEST_EQ(div_to_zero(int128{-3}, int_min), int128{0}); + BOOST_TEST_EQ(div_away_zero(int128{-3}, int_min), int128{1}); + BOOST_TEST_EQ(div_to_pos_inf(int128{-3}, int_min), int128{1}); + BOOST_TEST_EQ(div_to_neg_inf(int128{-3}, int_min), int128{0}); + BOOST_TEST_EQ(div_euclid(int128{-3}, int_min), int128{1}); + BOOST_TEST_EQ(div_ties_to_zero(int128{-3}, int_min), int128{0}); + BOOST_TEST_EQ(div_ties_away_zero(int128{-3}, int_min), int128{0}); + BOOST_TEST_EQ(div_ties_to_even(int128{-3}, int_min), int128{0}); // The matching remainder is -3 - 1 * INT128_MIN, which is 2^127 - 3 - BOOST_TEST_EQ(div_rem_euclid(int128_t{-3}, int_min).remainder, int_max - 2); - BOOST_TEST_EQ(rem_euclid(int128_t{-3}, int_min), int_max - 2); - BOOST_TEST_EQ(div_rem_to_zero(int128_t{-3}, int_min).remainder, int128_t{-3}); + BOOST_TEST_EQ(div_rem_euclid(int128{-3}, int_min).remainder, int_max - 2); + BOOST_TEST_EQ(rem_euclid(int128{-3}, int_min), int_max - 2); + BOOST_TEST_EQ(div_rem_to_zero(int128{-3}, int_min).remainder, int128{-3}); // INT128_MIN / 2 is exact, so no mode adjusts it for (const auto& mode : modes) { - BOOST_TEST_EQ(mode.signed_quotient(int_min, int128_t{2}), int_min / 2); - BOOST_TEST_EQ(mode.signed_div_rem(int_min, int128_t{2}).remainder, int128_t{0}); + BOOST_TEST_EQ(mode.signed_quotient(int_min, int128{2}), int_min / 2); + BOOST_TEST_EQ(mode.signed_div_rem(int_min, int128{2}).remainder, int128{0}); } // A quotient at the limits of the type is never rounded further for (const auto& mode : modes) { - BOOST_TEST_EQ(mode.signed_quotient(int_max, int128_t{1}), int_max); - BOOST_TEST_EQ(mode.signed_quotient(int_min, int128_t{1}), int_min); - BOOST_TEST_EQ(mode.signed_quotient(int_max, int128_t{-1}), -int_max); + BOOST_TEST_EQ(mode.signed_quotient(int_max, int128{1}), int_max); + BOOST_TEST_EQ(mode.signed_quotient(int_min, int128{1}), int_min); + BOOST_TEST_EQ(mode.signed_quotient(int_max, int128{-1}), -int_max); } // 2^127 is congruent to 2 modulo 7, so INT128_MIN is congruent to 5 - BOOST_TEST_EQ(rem_euclid(int_min, int128_t{7}), int128_t{5}); - BOOST_TEST_EQ(rem_euclid(int_min, int128_t{-7}), int128_t{5}); + BOOST_TEST_EQ(rem_euclid(int_min, int128{7}), int128{5}); + BOOST_TEST_EQ(rem_euclid(int_min, int128{-7}), int128{5}); } static void test_unsigned_limits() { - constexpr auto uint_max {(std::numeric_limits::max)()}; + constexpr auto uint_max {(std::numeric_limits::max)()}; // No mode overflows a quotient that is already the maximum for (const auto& mode : modes) { - BOOST_TEST_EQ(mode.unsigned_quotient(uint_max, uint128_t{1}), uint_max); + BOOST_TEST_EQ(mode.unsigned_quotient(uint_max, uint128{1}), uint_max); } // UINT128_MAX is odd, so halving it is a tie in neither direction - BOOST_TEST_EQ(div_ties_to_zero(uint_max, uint128_t{2}), uint_max / 2U); - BOOST_TEST_EQ(div_ties_away_zero(uint_max, uint128_t{2}), uint_max / 2U + 1U); - BOOST_TEST_EQ(div_away_zero(uint_max, uint128_t{2}), uint_max / 2U + 1U); - BOOST_TEST_EQ(div_to_zero(uint_max, uint128_t{2}), uint_max / 2U); + BOOST_TEST_EQ(div_ties_to_zero(uint_max, uint128{2}), uint_max / 2U); + BOOST_TEST_EQ(div_ties_away_zero(uint_max, uint128{2}), uint_max / 2U + 1U); + BOOST_TEST_EQ(div_away_zero(uint_max, uint128{2}), uint_max / 2U + 1U); + BOOST_TEST_EQ(div_to_zero(uint_max, uint128{2}), uint_max / 2U); // A tie against an even divisor at the top of the range - const uint128_t even_tie {uint_max - 1U}; - BOOST_TEST_EQ(div_ties_to_zero(even_tie, uint128_t{2}), even_tie / 2U); - BOOST_TEST_EQ(div_ties_away_zero(even_tie, uint128_t{2}), even_tie / 2U); + const uint128 even_tie {uint_max - 1U}; + BOOST_TEST_EQ(div_ties_to_zero(even_tie, uint128{2}), even_tie / 2U); + BOOST_TEST_EQ(div_ties_away_zero(even_tie, uint128{2}), even_tie / 2U); } // The worked example from P3724 static void test_paper_example() { - const int128_t x {-12}; - const int128_t y {5}; - - BOOST_TEST_EQ(div_to_zero(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_away_zero(x, y), int128_t{-3}); - BOOST_TEST_EQ(div_to_pos_inf(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_to_neg_inf(x, y), int128_t{-3}); - BOOST_TEST_EQ(div_euclid(x, y), int128_t{-3}); - BOOST_TEST_EQ(div_ties_to_zero(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_ties_away_zero(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_ties_to_pos_inf(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_ties_to_neg_inf(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_ties_to_odd(x, y), int128_t{-2}); - BOOST_TEST_EQ(div_ties_to_even(x, y), int128_t{-2}); - - BOOST_TEST_EQ(div_rem_to_zero(x, y).remainder, int128_t{-2}); - BOOST_TEST_EQ(div_rem_to_neg_inf(x, y).remainder, int128_t{3}); - BOOST_TEST_EQ(rem_euclid(x, y), int128_t{3}); + const int128 x {-12}; + const int128 y {5}; + + BOOST_TEST_EQ(div_to_zero(x, y), int128{-2}); + BOOST_TEST_EQ(div_away_zero(x, y), int128{-3}); + BOOST_TEST_EQ(div_to_pos_inf(x, y), int128{-2}); + BOOST_TEST_EQ(div_to_neg_inf(x, y), int128{-3}); + BOOST_TEST_EQ(div_euclid(x, y), int128{-3}); + BOOST_TEST_EQ(div_ties_to_zero(x, y), int128{-2}); + BOOST_TEST_EQ(div_ties_away_zero(x, y), int128{-2}); + BOOST_TEST_EQ(div_ties_to_pos_inf(x, y), int128{-2}); + BOOST_TEST_EQ(div_ties_to_neg_inf(x, y), int128{-2}); + BOOST_TEST_EQ(div_ties_to_odd(x, y), int128{-2}); + BOOST_TEST_EQ(div_ties_to_even(x, y), int128{-2}); + + BOOST_TEST_EQ(div_rem_to_zero(x, y).remainder, int128{-2}); + BOOST_TEST_EQ(div_rem_to_neg_inf(x, y).remainder, int128{3}); + BOOST_TEST_EQ(rem_euclid(x, y), int128{3}); } // Every tie-breaking rule on the same exact tie static void test_tie_breaking() { // 7 / 2 and -7 / 2 are ties, and the truncated quotients are 3 and -3 - BOOST_TEST_EQ(div_ties_to_zero(int128_t{7}, int128_t{2}), int128_t{3}); - BOOST_TEST_EQ(div_ties_away_zero(int128_t{7}, int128_t{2}), int128_t{4}); - BOOST_TEST_EQ(div_ties_to_pos_inf(int128_t{7}, int128_t{2}), int128_t{4}); - BOOST_TEST_EQ(div_ties_to_neg_inf(int128_t{7}, int128_t{2}), int128_t{3}); - BOOST_TEST_EQ(div_ties_to_odd(int128_t{7}, int128_t{2}), int128_t{3}); - BOOST_TEST_EQ(div_ties_to_even(int128_t{7}, int128_t{2}), int128_t{4}); - - BOOST_TEST_EQ(div_ties_to_zero(int128_t{-7}, int128_t{2}), int128_t{-3}); - BOOST_TEST_EQ(div_ties_away_zero(int128_t{-7}, int128_t{2}), int128_t{-4}); - BOOST_TEST_EQ(div_ties_to_pos_inf(int128_t{-7}, int128_t{2}), int128_t{-3}); - BOOST_TEST_EQ(div_ties_to_neg_inf(int128_t{-7}, int128_t{2}), int128_t{-4}); - BOOST_TEST_EQ(div_ties_to_odd(int128_t{-7}, int128_t{2}), int128_t{-3}); - BOOST_TEST_EQ(div_ties_to_even(int128_t{-7}, int128_t{2}), int128_t{-4}); + BOOST_TEST_EQ(div_ties_to_zero(int128{7}, int128{2}), int128{3}); + BOOST_TEST_EQ(div_ties_away_zero(int128{7}, int128{2}), int128{4}); + BOOST_TEST_EQ(div_ties_to_pos_inf(int128{7}, int128{2}), int128{4}); + BOOST_TEST_EQ(div_ties_to_neg_inf(int128{7}, int128{2}), int128{3}); + BOOST_TEST_EQ(div_ties_to_odd(int128{7}, int128{2}), int128{3}); + BOOST_TEST_EQ(div_ties_to_even(int128{7}, int128{2}), int128{4}); + + BOOST_TEST_EQ(div_ties_to_zero(int128{-7}, int128{2}), int128{-3}); + BOOST_TEST_EQ(div_ties_away_zero(int128{-7}, int128{2}), int128{-4}); + BOOST_TEST_EQ(div_ties_to_pos_inf(int128{-7}, int128{2}), int128{-3}); + BOOST_TEST_EQ(div_ties_to_neg_inf(int128{-7}, int128{2}), int128{-4}); + BOOST_TEST_EQ(div_ties_to_odd(int128{-7}, int128{2}), int128{-3}); + BOOST_TEST_EQ(div_ties_to_even(int128{-7}, int128{2}), int128{-4}); // 5 / 2 has an even quotient after rounding away from zero - BOOST_TEST_EQ(div_ties_to_odd(int128_t{5}, int128_t{2}), int128_t{3}); - BOOST_TEST_EQ(div_ties_to_even(int128_t{5}, int128_t{2}), int128_t{2}); - - BOOST_TEST_EQ(div_ties_to_zero(uint128_t{7}, uint128_t{2}), uint128_t{3}); - BOOST_TEST_EQ(div_ties_away_zero(uint128_t{7}, uint128_t{2}), uint128_t{4}); - BOOST_TEST_EQ(div_ties_to_pos_inf(uint128_t{7}, uint128_t{2}), uint128_t{4}); - BOOST_TEST_EQ(div_ties_to_neg_inf(uint128_t{7}, uint128_t{2}), uint128_t{3}); - BOOST_TEST_EQ(div_ties_to_odd(uint128_t{7}, uint128_t{2}), uint128_t{3}); - BOOST_TEST_EQ(div_ties_to_even(uint128_t{7}, uint128_t{2}), uint128_t{4}); + BOOST_TEST_EQ(div_ties_to_odd(int128{5}, int128{2}), int128{3}); + BOOST_TEST_EQ(div_ties_to_even(int128{5}, int128{2}), int128{2}); + + BOOST_TEST_EQ(div_ties_to_zero(uint128{7}, uint128{2}), uint128{3}); + BOOST_TEST_EQ(div_ties_away_zero(uint128{7}, uint128{2}), uint128{4}); + BOOST_TEST_EQ(div_ties_to_pos_inf(uint128{7}, uint128{2}), uint128{4}); + BOOST_TEST_EQ(div_ties_to_neg_inf(uint128{7}, uint128{2}), uint128{3}); + BOOST_TEST_EQ(div_ties_to_odd(uint128{7}, uint128{2}), uint128{3}); + BOOST_TEST_EQ(div_ties_to_even(uint128{7}, uint128{2}), uint128{4}); } static void test_div_result() { - const div_result a {int128_t{3}, int128_t{1}}; - const div_result b {int128_t{3}, int128_t{2}}; - const div_result c {int128_t{4}, int128_t{1}}; + const div_result a {int128{3}, int128{1}}; + const div_result b {int128{3}, int128{2}}; + const div_result c {int128{4}, int128{1}}; BOOST_TEST(a == a); BOOST_TEST(a != b); BOOST_TEST(!(a == b)); - BOOST_TEST(a == div_rem_to_zero(int128_t{10}, int128_t{3})); + BOOST_TEST(a == div_rem_to_zero(int128{10}, int128{3})); - const div_result ua {uint128_t{3}, uint128_t{1}}; - BOOST_TEST(ua == div_rem_to_zero(uint128_t{10}, uint128_t{3})); + const div_result ua {uint128{3}, uint128{1}}; + BOOST_TEST(ua == div_rem_to_zero(uint128{10}, uint128{3})); #ifdef BOOST_INT128_HAS_SPACESHIP_OPERATOR @@ -528,7 +528,7 @@ static void test_div_result() BOOST_TEST(c > a); BOOST_TEST(a <= a); BOOST_TEST((a <=> a) == std::strong_ordering::equal); - BOOST_TEST((ua <=> div_result{uint128_t{3}, uint128_t{2}}) == std::strong_ordering::less); + BOOST_TEST((ua <=> div_result{uint128{3}, uint128{2}}) == std::strong_ordering::less); #else @@ -539,27 +539,27 @@ static void test_div_result() static void test_constexpr() { - static_assert(div_to_zero(int128_t{-7}, int128_t{2}) == -3, "div_to_zero"); - static_assert(div_away_zero(int128_t{-7}, int128_t{2}) == -4, "div_away_zero"); - static_assert(div_to_pos_inf(int128_t{-7}, int128_t{2}) == -3, "div_to_pos_inf"); - static_assert(div_to_neg_inf(int128_t{-7}, int128_t{2}) == -4, "div_to_neg_inf"); - static_assert(div_euclid(int128_t{-7}, int128_t{2}) == -4, "div_euclid"); - static_assert(div_ties_to_zero(int128_t{-7}, int128_t{2}) == -3, "div_ties_to_zero"); - static_assert(div_ties_away_zero(int128_t{-7}, int128_t{2}) == -4, "div_ties_away_zero"); - static_assert(div_ties_to_pos_inf(int128_t{-7}, int128_t{2}) == -3, "div_ties_to_pos_inf"); - static_assert(div_ties_to_neg_inf(int128_t{-7}, int128_t{2}) == -4, "div_ties_to_neg_inf"); - static_assert(div_ties_to_odd(int128_t{-7}, int128_t{2}) == -3, "div_ties_to_odd"); - static_assert(div_ties_to_even(int128_t{-7}, int128_t{2}) == -4, "div_ties_to_even"); - static_assert(rem_euclid(int128_t{-7}, int128_t{2}) == 1, "rem_euclid"); - - static_assert(div_rem_to_neg_inf(int128_t{-7}, int128_t{2}).remainder == 1, "div_rem_to_neg_inf"); - static_assert(div_rem_euclid(int128_t{-7}, int128_t{2}).quotient == -4, "div_rem_euclid"); - - static_assert(div_to_zero(uint128_t{7}, uint128_t{2}) == 3U, "unsigned div_to_zero"); - static_assert(div_away_zero(uint128_t{7}, uint128_t{2}) == 4U, "unsigned div_away_zero"); - static_assert(div_euclid(uint128_t{7}, uint128_t{2}) == 3U, "unsigned div_euclid"); - static_assert(rem_euclid(uint128_t{7}, uint128_t{2}) == 1U, "unsigned rem_euclid"); - static_assert(div_rem_ties_to_even(uint128_t{7}, uint128_t{2}).quotient == 4U, "unsigned ties_to_even"); + static_assert(div_to_zero(int128{-7}, int128{2}) == -3, "div_to_zero"); + static_assert(div_away_zero(int128{-7}, int128{2}) == -4, "div_away_zero"); + static_assert(div_to_pos_inf(int128{-7}, int128{2}) == -3, "div_to_pos_inf"); + static_assert(div_to_neg_inf(int128{-7}, int128{2}) == -4, "div_to_neg_inf"); + static_assert(div_euclid(int128{-7}, int128{2}) == -4, "div_euclid"); + static_assert(div_ties_to_zero(int128{-7}, int128{2}) == -3, "div_ties_to_zero"); + static_assert(div_ties_away_zero(int128{-7}, int128{2}) == -4, "div_ties_away_zero"); + static_assert(div_ties_to_pos_inf(int128{-7}, int128{2}) == -3, "div_ties_to_pos_inf"); + static_assert(div_ties_to_neg_inf(int128{-7}, int128{2}) == -4, "div_ties_to_neg_inf"); + static_assert(div_ties_to_odd(int128{-7}, int128{2}) == -3, "div_ties_to_odd"); + static_assert(div_ties_to_even(int128{-7}, int128{2}) == -4, "div_ties_to_even"); + static_assert(rem_euclid(int128{-7}, int128{2}) == 1, "rem_euclid"); + + static_assert(div_rem_to_neg_inf(int128{-7}, int128{2}).remainder == 1, "div_rem_to_neg_inf"); + static_assert(div_rem_euclid(int128{-7}, int128{2}).quotient == -4, "div_rem_euclid"); + + static_assert(div_to_zero(uint128{7}, uint128{2}) == 3U, "unsigned div_to_zero"); + static_assert(div_away_zero(uint128{7}, uint128{2}) == 4U, "unsigned div_away_zero"); + static_assert(div_euclid(uint128{7}, uint128{2}) == 3U, "unsigned div_euclid"); + static_assert(rem_euclid(uint128{7}, uint128{2}) == 1U, "unsigned rem_euclid"); + static_assert(div_rem_ties_to_even(uint128{7}, uint128{2}).quotient == 4U, "unsigned ties_to_even"); } #ifdef _MSC_VER diff --git a/test/test_integer_comparison.cpp b/test/test_integer_comparison.cpp index 1eb01ec3..028ed322 100644 --- a/test/test_integer_comparison.cpp +++ b/test/test_integer_comparison.cpp @@ -9,8 +9,8 @@ #include #include -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; using boost::int128::cmp_equal; using boost::int128::cmp_not_equal; using boost::int128::cmp_less; @@ -25,73 +25,73 @@ using boost::int128::in_range; // void test_known_answers() { - constexpr auto u_max {(std::numeric_limits::max)()}; - constexpr auto i_max {(std::numeric_limits::max)()}; - constexpr auto i_min {(std::numeric_limits::min)()}; + constexpr auto u_max {(std::numeric_limits::max)()}; + constexpr auto i_max {(std::numeric_limits::max)()}; + constexpr auto i_min {(std::numeric_limits::min)()}; // The signature case: a large unsigned value against a negative signed one. // The built-in operators would convert -1 to 2^128-1 and report equal; the // cmp_* functions compare the true mathematical values. - BOOST_TEST(!cmp_equal(u_max, int128_t{-1})); - BOOST_TEST(cmp_not_equal(u_max, int128_t{-1})); - BOOST_TEST(cmp_greater(u_max, int128_t{-1})); - BOOST_TEST(!cmp_less(u_max, int128_t{-1})); - BOOST_TEST(cmp_less(int128_t{-1}, u_max)); - BOOST_TEST(cmp_greater_equal(u_max, int128_t{-1})); - BOOST_TEST(cmp_less_equal(int128_t{-1}, u_max)); - - // uint128_t vs builtin - BOOST_TEST(cmp_equal(uint128_t{5}, 5)); - BOOST_TEST(cmp_equal(uint128_t{5}, 5U)); - BOOST_TEST(!cmp_equal(uint128_t{5}, -5)); - BOOST_TEST(cmp_not_equal(uint128_t{5}, -5)); - BOOST_TEST(cmp_greater(uint128_t{5}, -5)); - BOOST_TEST(!cmp_less(uint128_t{0}, -1)); - BOOST_TEST(cmp_greater(uint128_t{0}, -1)); - BOOST_TEST(cmp_less(uint128_t{5}, 10)); - BOOST_TEST(cmp_less_equal(uint128_t{5}, 5)); - BOOST_TEST(cmp_greater_equal(uint128_t{5}, 5)); - - // int128_t vs builtin, both signs - BOOST_TEST(cmp_less(int128_t{-5}, 0U)); - BOOST_TEST(cmp_less(int128_t{-5}, -3)); - BOOST_TEST(cmp_greater(int128_t{-3}, -5)); - BOOST_TEST(cmp_equal(int128_t{-5}, -5)); - BOOST_TEST(!cmp_equal(int128_t{-5}, 5U)); - BOOST_TEST(cmp_less(int128_t{-1}, 0U)); - BOOST_TEST(cmp_greater_equal(int128_t{5}, -5)); - BOOST_TEST(cmp_less_equal(int128_t{-5}, 5U)); + BOOST_TEST(!cmp_equal(u_max, int128{-1})); + BOOST_TEST(cmp_not_equal(u_max, int128{-1})); + BOOST_TEST(cmp_greater(u_max, int128{-1})); + BOOST_TEST(!cmp_less(u_max, int128{-1})); + BOOST_TEST(cmp_less(int128{-1}, u_max)); + BOOST_TEST(cmp_greater_equal(u_max, int128{-1})); + BOOST_TEST(cmp_less_equal(int128{-1}, u_max)); + + // uint128 vs builtin + BOOST_TEST(cmp_equal(uint128{5}, 5)); + BOOST_TEST(cmp_equal(uint128{5}, 5U)); + BOOST_TEST(!cmp_equal(uint128{5}, -5)); + BOOST_TEST(cmp_not_equal(uint128{5}, -5)); + BOOST_TEST(cmp_greater(uint128{5}, -5)); + BOOST_TEST(!cmp_less(uint128{0}, -1)); + BOOST_TEST(cmp_greater(uint128{0}, -1)); + BOOST_TEST(cmp_less(uint128{5}, 10)); + BOOST_TEST(cmp_less_equal(uint128{5}, 5)); + BOOST_TEST(cmp_greater_equal(uint128{5}, 5)); + + // int128 vs builtin, both signs + BOOST_TEST(cmp_less(int128{-5}, 0U)); + BOOST_TEST(cmp_less(int128{-5}, -3)); + BOOST_TEST(cmp_greater(int128{-3}, -5)); + BOOST_TEST(cmp_equal(int128{-5}, -5)); + BOOST_TEST(!cmp_equal(int128{-5}, 5U)); + BOOST_TEST(cmp_less(int128{-1}, 0U)); + BOOST_TEST(cmp_greater_equal(int128{5}, -5)); + BOOST_TEST(cmp_less_equal(int128{-5}, 5U)); // builtin on the left BOOST_TEST(cmp_less(-1, u_max)); - BOOST_TEST(!cmp_greater(-1, uint128_t{0})); - BOOST_TEST(cmp_less(-1, uint128_t{0})); + BOOST_TEST(!cmp_greater(-1, uint128{0})); + BOOST_TEST(cmp_less(-1, uint128{0})); BOOST_TEST(!cmp_equal(-1, u_max)); - BOOST_TEST(cmp_greater(5, int128_t{-5})); - BOOST_TEST(cmp_equal(5U, uint128_t{5})); + BOOST_TEST(cmp_greater(5, int128{-5})); + BOOST_TEST(cmp_equal(5U, uint128{5})); // same-type 128-bit - BOOST_TEST(cmp_equal(uint128_t{7}, uint128_t{7})); - BOOST_TEST(cmp_not_equal(uint128_t{7}, uint128_t{8})); - BOOST_TEST(cmp_less(uint128_t{7}, uint128_t{8})); - BOOST_TEST(cmp_equal(int128_t{-7}, int128_t{-7})); - BOOST_TEST(cmp_less(int128_t{-7}, int128_t{-3})); - BOOST_TEST(cmp_greater(int128_t{-3}, int128_t{-7})); + BOOST_TEST(cmp_equal(uint128{7}, uint128{7})); + BOOST_TEST(cmp_not_equal(uint128{7}, uint128{8})); + BOOST_TEST(cmp_less(uint128{7}, uint128{8})); + BOOST_TEST(cmp_equal(int128{-7}, int128{-7})); + BOOST_TEST(cmp_less(int128{-7}, int128{-3})); + BOOST_TEST(cmp_greater(int128{-3}, int128{-7})); // extremes across the two 128-bit types BOOST_TEST(cmp_less(i_max, u_max)); BOOST_TEST(cmp_greater(u_max, i_max)); - BOOST_TEST(cmp_less(i_min, uint128_t{0})); - BOOST_TEST(cmp_greater(uint128_t{0}, i_min)); - BOOST_TEST(cmp_equal(uint128_t{i_max}, i_max)); + BOOST_TEST(cmp_less(i_min, uint128{0})); + BOOST_TEST(cmp_greater(uint128{0}, i_min)); + BOOST_TEST(cmp_equal(uint128{i_max}, i_max)); BOOST_TEST(!cmp_equal(u_max, i_max)); // zero comparisons - BOOST_TEST(cmp_equal(uint128_t{0}, 0)); - BOOST_TEST(cmp_equal(int128_t{0}, 0U)); - BOOST_TEST(cmp_equal(int128_t{0}, uint128_t{0})); - BOOST_TEST(cmp_greater_equal(uint128_t{0}, int128_t{0})); - BOOST_TEST(cmp_less_equal(uint128_t{0}, int128_t{0})); + BOOST_TEST(cmp_equal(uint128{0}, 0)); + BOOST_TEST(cmp_equal(int128{0}, 0U)); + BOOST_TEST(cmp_equal(int128{0}, uint128{0})); + BOOST_TEST(cmp_greater_equal(uint128{0}, int128{0})); + BOOST_TEST(cmp_less_equal(uint128{0}, int128{0})); } // @@ -100,41 +100,41 @@ void test_known_answers() // void test_in_range() { - constexpr auto u_max {(std::numeric_limits::max)()}; - constexpr auto i_max {(std::numeric_limits::max)()}; - constexpr auto i_min {(std::numeric_limits::min)()}; + constexpr auto u_max {(std::numeric_limits::max)()}; + constexpr auto i_max {(std::numeric_limits::max)()}; + constexpr auto i_min {(std::numeric_limits::min)()}; // library value -> narrow builtin target - BOOST_TEST(in_range(int128_t{127})); - BOOST_TEST(!in_range(int128_t{128})); - BOOST_TEST(in_range(int128_t{-128})); - BOOST_TEST(!in_range(int128_t{-129})); - BOOST_TEST(!in_range(int128_t{-1})); - BOOST_TEST(in_range(uint128_t{255})); - BOOST_TEST(!in_range(uint128_t{256})); + BOOST_TEST(in_range(int128{127})); + BOOST_TEST(!in_range(int128{128})); + BOOST_TEST(in_range(int128{-128})); + BOOST_TEST(!in_range(int128{-129})); + BOOST_TEST(!in_range(int128{-1})); + BOOST_TEST(in_range(uint128{255})); + BOOST_TEST(!in_range(uint128{256})); // library value -> wide builtin target BOOST_TEST(!in_range(u_max)); - BOOST_TEST(in_range(uint128_t{(std::numeric_limits::max)()})); + BOOST_TEST(in_range(uint128{(std::numeric_limits::max)()})); BOOST_TEST(!in_range(i_max)); - BOOST_TEST(in_range(int128_t{(std::numeric_limits::max)()})); + BOOST_TEST(in_range(int128{(std::numeric_limits::max)()})); BOOST_TEST(!in_range(u_max)); // builtin value -> library target (every builtin fits, except negatives in // an unsigned target) - BOOST_TEST(!in_range(-1)); - BOOST_TEST(in_range(5)); - BOOST_TEST(in_range(-5)); - BOOST_TEST(in_range((std::numeric_limits::min)())); - BOOST_TEST(in_range((std::numeric_limits::max)())); + BOOST_TEST(!in_range(-1)); + BOOST_TEST(in_range(5)); + BOOST_TEST(in_range(-5)); + BOOST_TEST(in_range((std::numeric_limits::min)())); + BOOST_TEST(in_range((std::numeric_limits::max)())); // library value -> library target - BOOST_TEST(!in_range(u_max)); - BOOST_TEST(in_range(uint128_t{i_max})); - BOOST_TEST(!in_range(int128_t{-1})); - BOOST_TEST(in_range(i_max)); - BOOST_TEST(in_range(u_max)); - BOOST_TEST(in_range(i_min)); + BOOST_TEST(!in_range(u_max)); + BOOST_TEST(in_range(uint128{i_max})); + BOOST_TEST(!in_range(int128{-1})); + BOOST_TEST(in_range(i_max)); + BOOST_TEST(in_range(u_max)); + BOOST_TEST(in_range(i_min)); } // @@ -159,8 +159,8 @@ void test_constraints() static_assert(!is_valid_comparison_type_v, "char32_t is not permitted"); static_assert(!is_valid_comparison_type_v, "wchar_t is not permitted"); static_assert(!is_valid_comparison_type_v, "double is not permitted"); - static_assert(!is_valid_comparison_type_v, "int128_t is handled by its own overloads"); - static_assert(!is_valid_comparison_type_v, "uint128_t is handled by its own overloads"); + static_assert(!is_valid_comparison_type_v, "int128 is handled by its own overloads"); + static_assert(!is_valid_comparison_type_v, "uint128 is handled by its own overloads"); #if defined(__cpp_char8_t) static_assert(!is_valid_comparison_type_v, "char8_t is not permitted"); @@ -172,20 +172,20 @@ void test_constraints() // void test_constexpr() { - constexpr auto u_max {(std::numeric_limits::max)()}; - - static_assert(cmp_equal(uint128_t{5}, 5), ""); - static_assert(cmp_not_equal(u_max, int128_t{-1}), ""); - static_assert(cmp_less(int128_t{-1}, uint128_t{0}), ""); - static_assert(cmp_greater(uint128_t{0}, int128_t{-1}), ""); - static_assert(cmp_less_equal(int128_t{-1}, u_max), ""); - static_assert(cmp_greater_equal(uint128_t{5}, int128_t{5}), ""); - static_assert(!cmp_equal(u_max, int128_t{-1}), ""); - - static_assert(in_range(int128_t{127}), ""); - static_assert(!in_range(int128_t{-1}), ""); - static_assert(in_range(5), ""); - static_assert(!in_range(u_max), ""); + constexpr auto u_max {(std::numeric_limits::max)()}; + + static_assert(cmp_equal(uint128{5}, 5), ""); + static_assert(cmp_not_equal(u_max, int128{-1}), ""); + static_assert(cmp_less(int128{-1}, uint128{0}), ""); + static_assert(cmp_greater(uint128{0}, int128{-1}), ""); + static_assert(cmp_less_equal(int128{-1}, u_max), ""); + static_assert(cmp_greater_equal(uint128{5}, int128{5}), ""); + static_assert(!cmp_equal(u_max, int128{-1}), ""); + + static_assert(in_range(int128{127}), ""); + static_assert(!in_range(int128{-1}), ""); + static_assert(in_range(5), ""); + static_assert(!in_range(u_max), ""); } #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) @@ -219,13 +219,13 @@ static void ref_sign_mag(builtin_u128 v, bool& neg, builtin_u128& mag) noexcept mag = v; } -static void ref_sign_mag(uint128_t v, bool& neg, builtin_u128& mag) noexcept +static void ref_sign_mag(uint128 v, bool& neg, builtin_u128& mag) noexcept { neg = false; mag = static_cast(v); } -static void ref_sign_mag(int128_t v, bool& neg, builtin_u128& mag) noexcept +static void ref_sign_mag(int128 v, bool& neg, builtin_u128& mag) noexcept { ref_sign_mag(static_cast(v), neg, mag); } @@ -292,10 +292,10 @@ void test_random_oracle() const std::uint64_t hi2 {u_dist(rng)}; const std::uint64_t lo2 {u_dist(rng)}; - const uint128_t ua {hi, lo}; - const uint128_t ub {hi2, lo2}; - const int128_t ia {static_cast(hi), lo}; - const int128_t ib {static_cast(hi2), lo2}; + const uint128 ua {hi, lo}; + const uint128 ub {hi2, lo2}; + const int128 ia {static_cast(hi), lo}; + const int128 ib {static_cast(hi2), lo2}; const std::int64_t si {i_dist(rng)}; const std::uint64_t su {u_dist(rng)}; @@ -341,21 +341,21 @@ void test_builtin_128() const builtin_i128 bi_5 {5}; const builtin_u128 bu_5 {5}; - constexpr auto u_max {(std::numeric_limits::max)()}; - constexpr auto i_max {(std::numeric_limits::max)()}; + constexpr auto u_max {(std::numeric_limits::max)()}; + constexpr auto i_max {(std::numeric_limits::max)()}; // trait classification - static_assert(boost::int128::detail::is_int128_type_v, "builtin signed is a 128-bit type"); - static_assert(boost::int128::detail::is_int128_type_v, "builtin unsigned is a 128-bit type"); + static_assert(boost::int128::detail::is_int128ype_v, "builtin signed is a 128-bit type"); + static_assert(boost::int128::detail::is_int128ype_v, "builtin unsigned is a 128-bit type"); static_assert(boost::int128::detail::is_valid_comparison_operand_v, "builtin signed is an operand"); static_assert(boost::int128::detail::is_valid_comparison_operand_v, "builtin unsigned is an operand"); // library 128-bit vs builtin 128-bit BOOST_TEST(!boost::int128::cmp_equal(u_max, bi_neg1)); - BOOST_TEST(!boost::int128::cmp_equal(bu_max, int128_t{-1})); - BOOST_TEST(boost::int128::cmp_less(bi_neg1, uint128_t{0})); - BOOST_TEST(boost::int128::cmp_greater(uint128_t{0}, bi_neg1)); - BOOST_TEST(boost::int128::cmp_equal(uint128_t{bu_max}, bu_max)); + BOOST_TEST(!boost::int128::cmp_equal(bu_max, int128{-1})); + BOOST_TEST(boost::int128::cmp_less(bi_neg1, uint128{0})); + BOOST_TEST(boost::int128::cmp_greater(uint128{0}, bi_neg1)); + BOOST_TEST(boost::int128::cmp_equal(uint128{bu_max}, bu_max)); // builtin 128-bit vs builtin 128-bit, cross signedness BOOST_TEST(!boost::int128::cmp_equal(bu_max, bi_neg1)); @@ -373,7 +373,7 @@ void test_builtin_128() // in_range with a builtin 128-bit target and/or value BOOST_TEST(!boost::int128::in_range(u_max)); - BOOST_TEST(!boost::int128::in_range(int128_t{-1})); + BOOST_TEST(!boost::int128::in_range(int128{-1})); BOOST_TEST(!boost::int128::in_range(bu_max)); BOOST_TEST(boost::int128::in_range(bi_neg1)); BOOST_TEST(boost::int128::in_range(bi_5)); diff --git a/test/test_ipow.cpp b/test/test_ipow.cpp index ec30c452..872f42bc 100644 --- a/test/test_ipow.cpp +++ b/test/test_ipow.cpp @@ -46,21 +46,21 @@ constexpr T ipow_ref(T base, std::uint64_t exp) noexcept void test_uint128_ipow_basic() { - BOOST_TEST_EQ(ipow(uint128_t{0}, 0U), uint128_t{1}); - BOOST_TEST_EQ(ipow(uint128_t{1}, 0U), uint128_t{1}); - BOOST_TEST_EQ(ipow(uint128_t{42}, 0U), uint128_t{1}); - BOOST_TEST_EQ(ipow(uint128_t{0}, 1U), uint128_t{0}); - BOOST_TEST_EQ(ipow(uint128_t{0}, 5U), uint128_t{0}); - BOOST_TEST_EQ(ipow(uint128_t{1}, 1000U), uint128_t{1}); - BOOST_TEST_EQ(ipow(uint128_t{42}, 1U), uint128_t{42}); - - BOOST_TEST_EQ(ipow(uint128_t{2}, 0U), uint128_t{1}); - BOOST_TEST_EQ(ipow(uint128_t{2}, 1U), uint128_t{2}); - BOOST_TEST_EQ(ipow(uint128_t{2}, 2U), uint128_t{4}); - BOOST_TEST_EQ(ipow(uint128_t{2}, 10U), uint128_t{1024}); - BOOST_TEST_EQ(ipow(uint128_t{3}, 5U), uint128_t{243}); - BOOST_TEST_EQ(ipow(uint128_t{10}, 9U), uint128_t{UINT64_C(1000000000)}); - BOOST_TEST_EQ(ipow(uint128_t{10}, 18U), uint128_t{UINT64_C(1000000000000000000)}); + BOOST_TEST_EQ(ipow(uint128{0}, 0U), uint128{1}); + BOOST_TEST_EQ(ipow(uint128{1}, 0U), uint128{1}); + BOOST_TEST_EQ(ipow(uint128{42}, 0U), uint128{1}); + BOOST_TEST_EQ(ipow(uint128{0}, 1U), uint128{0}); + BOOST_TEST_EQ(ipow(uint128{0}, 5U), uint128{0}); + BOOST_TEST_EQ(ipow(uint128{1}, 1000U), uint128{1}); + BOOST_TEST_EQ(ipow(uint128{42}, 1U), uint128{42}); + + BOOST_TEST_EQ(ipow(uint128{2}, 0U), uint128{1}); + BOOST_TEST_EQ(ipow(uint128{2}, 1U), uint128{2}); + BOOST_TEST_EQ(ipow(uint128{2}, 2U), uint128{4}); + BOOST_TEST_EQ(ipow(uint128{2}, 10U), uint128{1024}); + BOOST_TEST_EQ(ipow(uint128{3}, 5U), uint128{243}); + BOOST_TEST_EQ(ipow(uint128{10}, 9U), uint128{UINT64_C(1000000000)}); + BOOST_TEST_EQ(ipow(uint128{10}, 18U), uint128{UINT64_C(1000000000000000000)}); } void test_uint128_ipow_power_of_two() @@ -68,27 +68,27 @@ void test_uint128_ipow_power_of_two() // 2^k fills bit k, so we can hit every bit position up to 127. for (std::uint64_t k {0}; k < 64; ++k) { - const uint128_t expected {static_cast(1) << k}; - BOOST_TEST_EQ(ipow(uint128_t{2}, k), expected); + const uint128 expected {static_cast(1) << k}; + BOOST_TEST_EQ(ipow(uint128{2}, k), expected); } for (std::uint64_t k {64}; k < 128; ++k) { - const uint128_t expected {static_cast(1) << (k - 64), 0U}; - BOOST_TEST_EQ(ipow(uint128_t{2}, k), expected); + const uint128 expected {static_cast(1) << (k - 64), 0U}; + BOOST_TEST_EQ(ipow(uint128{2}, k), expected); } // 2^128 wraps to 0 in uint128 arithmetic. - BOOST_TEST_EQ(ipow(uint128_t{2}, 128U), uint128_t{0}); - BOOST_TEST_EQ(ipow(uint128_t{2}, 200U), uint128_t{0}); + BOOST_TEST_EQ(ipow(uint128{2}, 128U), uint128{0}); + BOOST_TEST_EQ(ipow(uint128{2}, 200U), uint128{0}); } void test_uint128_ipow_large() { // 10^38 is the largest power of 10 that fits in 128 bits. // 10^38 = 100000000000000000000000000000000000000. - const uint128_t ten_pow_38 {UINT64_C(0x4B3B4CA85A86C47A), UINT64_C(0x098A224000000000)}; - BOOST_TEST_EQ(ipow(uint128_t{10}, 38U), ten_pow_38); + const uint128 ten_pow_38 {UINT64_C(0x4B3B4CA85A86C47A), UINT64_C(0x098A224000000000)}; + BOOST_TEST_EQ(ipow(uint128{10}, 38U), ten_pow_38); // Cross-check a range of bases against the naive reference for small // exponents where the result is hand-verifiable through repeated mul. @@ -96,7 +96,7 @@ void test_uint128_ipow_large() { for (std::uint64_t exp {0}; exp < 12; ++exp) { - BOOST_TEST_EQ(ipow(uint128_t{base}, exp), ipow_ref(uint128_t{base}, exp)); + BOOST_TEST_EQ(ipow(uint128{base}, exp), ipow_ref(uint128{base}, exp)); } } } @@ -104,91 +104,91 @@ void test_uint128_ipow_large() void test_uint128_ipow_wrap() { // Squaring 2^64 yields 2^128 which wraps to 0. - const uint128_t two_pow_64 {1U, 0U}; - BOOST_TEST_EQ(ipow(two_pow_64, 2U), uint128_t{0}); + const uint128 two_pow_64 {1U, 0U}; + BOOST_TEST_EQ(ipow(two_pow_64, 2U), uint128{0}); // (2^64 - 1)^2 mod 2^128 = 2^128 - 2^65 + 1, which has a known bit pattern. - const uint128_t u64_max {(std::numeric_limits::max)()}; - const uint128_t expected {UINT64_C(0xFFFFFFFFFFFFFFFE), 1U}; + const uint128 u64_max {(std::numeric_limits::max)()}; + const uint128 expected {UINT64_C(0xFFFFFFFFFFFFFFFE), 1U}; BOOST_TEST_EQ(ipow(u64_max, 2U), expected); // Anything to a sufficiently large power eventually wraps to 0 if the base // shares a factor of 2 with 2^128. - BOOST_TEST_EQ(ipow(uint128_t{4}, 64U), uint128_t{0}); - BOOST_TEST_EQ(ipow(uint128_t{6}, 200U), uint128_t{0}); + BOOST_TEST_EQ(ipow(uint128{4}, 64U), uint128{0}); + BOOST_TEST_EQ(ipow(uint128{6}, 200U), uint128{0}); } void test_uint128_ipow_identities() { // a^(b+c) == a^b * a^c (under wrap modulo 2^128). - const uint128_t a {UINT64_C(0xDEADBEEF)}; + const uint128 a {UINT64_C(0xDEADBEEF)}; BOOST_TEST_EQ(ipow(a, 7U), ipow(a, 3U) * ipow(a, 4U)); BOOST_TEST_EQ(ipow(a, 20U), ipow(a, 13U) * ipow(a, 7U)); // (a*b)^e == a^e * b^e. - const uint128_t aa {7}; - const uint128_t bb {11}; + const uint128 aa {7}; + const uint128 bb {11}; BOOST_TEST_EQ(ipow(aa * bb, 6U), ipow(aa, 6U) * ipow(bb, 6U)); // (a^b)^c == a^(b*c). - BOOST_TEST_EQ(ipow(ipow(uint128_t{3}, 4U), 5U), ipow(uint128_t{3}, 4U * 5U)); + BOOST_TEST_EQ(ipow(ipow(uint128{3}, 4U), 5U), ipow(uint128{3}, 4U * 5U)); } void test_int128_ipow_basic() { - BOOST_TEST_EQ(ipow(int128_t{0}, 0U), int128_t{1}); - BOOST_TEST_EQ(ipow(int128_t{1}, 0U), int128_t{1}); - BOOST_TEST_EQ(ipow(int128_t{-1}, 0U), int128_t{1}); - BOOST_TEST_EQ(ipow(int128_t{0}, 5U), int128_t{0}); - BOOST_TEST_EQ(ipow(int128_t{42}, 1U), int128_t{42}); - - BOOST_TEST_EQ(ipow(int128_t{2}, 10U), int128_t{1024}); - BOOST_TEST_EQ(ipow(int128_t{3}, 5U), int128_t{243}); - BOOST_TEST_EQ(ipow(int128_t{10}, 18U), int128_t{INT64_C(1000000000000000000)}); + BOOST_TEST_EQ(ipow(int128{0}, 0U), int128{1}); + BOOST_TEST_EQ(ipow(int128{1}, 0U), int128{1}); + BOOST_TEST_EQ(ipow(int128{-1}, 0U), int128{1}); + BOOST_TEST_EQ(ipow(int128{0}, 5U), int128{0}); + BOOST_TEST_EQ(ipow(int128{42}, 1U), int128{42}); + + BOOST_TEST_EQ(ipow(int128{2}, 10U), int128{1024}); + BOOST_TEST_EQ(ipow(int128{3}, 5U), int128{243}); + BOOST_TEST_EQ(ipow(int128{10}, 18U), int128{INT64_C(1000000000000000000)}); } void test_int128_ipow_negative_base() { // Even exponents are non-negative, odd exponents preserve the sign. - BOOST_TEST_EQ(ipow(int128_t{-2}, 0U), int128_t{1}); - BOOST_TEST_EQ(ipow(int128_t{-2}, 1U), int128_t{-2}); - BOOST_TEST_EQ(ipow(int128_t{-2}, 2U), int128_t{4}); - BOOST_TEST_EQ(ipow(int128_t{-2}, 3U), int128_t{-8}); - BOOST_TEST_EQ(ipow(int128_t{-2}, 10U), int128_t{1024}); - BOOST_TEST_EQ(ipow(int128_t{-3}, 5U), int128_t{-243}); - - BOOST_TEST_EQ(ipow(int128_t{-1}, 100U), int128_t{1}); - BOOST_TEST_EQ(ipow(int128_t{-1}, 101U), int128_t{-1}); - - BOOST_TEST_EQ(ipow(int128_t{-10}, 18U), int128_t{INT64_C(1000000000000000000)}); - BOOST_TEST_EQ(ipow(int128_t{-10}, 17U), int128_t{INT64_C(-100000000000000000)}); + BOOST_TEST_EQ(ipow(int128{-2}, 0U), int128{1}); + BOOST_TEST_EQ(ipow(int128{-2}, 1U), int128{-2}); + BOOST_TEST_EQ(ipow(int128{-2}, 2U), int128{4}); + BOOST_TEST_EQ(ipow(int128{-2}, 3U), int128{-8}); + BOOST_TEST_EQ(ipow(int128{-2}, 10U), int128{1024}); + BOOST_TEST_EQ(ipow(int128{-3}, 5U), int128{-243}); + + BOOST_TEST_EQ(ipow(int128{-1}, 100U), int128{1}); + BOOST_TEST_EQ(ipow(int128{-1}, 101U), int128{-1}); + + BOOST_TEST_EQ(ipow(int128{-10}, 18U), int128{INT64_C(1000000000000000000)}); + BOOST_TEST_EQ(ipow(int128{-10}, 17U), int128{INT64_C(-100000000000000000)}); } void test_int128_ipow_large() { - // 10^38 still fits in int128_t (signed max is roughly 1.7e38). - const int128_t ten_pow_38 {static_cast(uint128_t{UINT64_C(0x4B3B4CA85A86C47A), UINT64_C(0x098A224000000000)})}; - BOOST_TEST_EQ(ipow(int128_t{10}, 38U), ten_pow_38); - BOOST_TEST_EQ(ipow(int128_t{-10}, 38U), ten_pow_38); + // 10^38 still fits in int128 (signed max is roughly 1.7e38). + const int128 ten_pow_38 {static_cast(uint128{UINT64_C(0x4B3B4CA85A86C47A), UINT64_C(0x098A224000000000)})}; + BOOST_TEST_EQ(ipow(int128{10}, 38U), ten_pow_38); + BOOST_TEST_EQ(ipow(int128{-10}, 38U), ten_pow_38); // Cross-check small bases against the naive reference. for (std::int64_t base {-7}; base < 8; ++base) { for (std::uint64_t exp {0}; exp < 12; ++exp) { - BOOST_TEST_EQ(ipow(int128_t{base}, exp), ipow_ref(int128_t{base}, exp)); + BOOST_TEST_EQ(ipow(int128{base}, exp), ipow_ref(int128{base}, exp)); } } } void test_int128_ipow_identities() { - const int128_t a {12345}; + const int128 a {12345}; BOOST_TEST_EQ(ipow(a, 7U), ipow(a, 3U) * ipow(a, 4U)); - BOOST_TEST_EQ(ipow(ipow(int128_t{3}, 4U), 5U), ipow(int128_t{3}, 4U * 5U)); + BOOST_TEST_EQ(ipow(ipow(int128{3}, 4U), 5U), ipow(int128{3}, 4U * 5U)); // Sign behaves multiplicatively. - BOOST_TEST_EQ(ipow(int128_t{-7}, 3U) * ipow(int128_t{-7}, 4U), ipow(int128_t{-7}, 7U)); + BOOST_TEST_EQ(ipow(int128{-7}, 3U) * ipow(int128{-7}, 4U), ipow(int128{-7}, 7U)); } #ifdef _MSC_VER @@ -199,20 +199,20 @@ void test_int128_ipow_identities() void test_constexpr_ipow() { - constexpr uint128_t r1 {ipow(uint128_t{2}, 10U)}; - static_assert(r1 == uint128_t{1024}, "ipow constexpr uint128 small case"); + constexpr uint128 r1 {ipow(uint128{2}, 10U)}; + static_assert(r1 == uint128{1024}, "ipow constexpr uint128 small case"); - constexpr uint128_t r2 {ipow(uint128_t{10}, 18U)}; - static_assert(r2 == uint128_t{UINT64_C(1000000000000000000)}, "ipow constexpr uint128 18 digits"); + constexpr uint128 r2 {ipow(uint128{10}, 18U)}; + static_assert(r2 == uint128{UINT64_C(1000000000000000000)}, "ipow constexpr uint128 18 digits"); - constexpr int128_t r3 {ipow(int128_t{-3}, 5U)}; - static_assert(r3 == int128_t{-243}, "ipow constexpr int128 negative base odd exp"); + constexpr int128 r3 {ipow(int128{-3}, 5U)}; + static_assert(r3 == int128{-243}, "ipow constexpr int128 negative base odd exp"); - constexpr int128_t r4 {ipow(int128_t{-3}, 4U)}; - static_assert(r4 == int128_t{81}, "ipow constexpr int128 negative base even exp"); + constexpr int128 r4 {ipow(int128{-3}, 4U)}; + static_assert(r4 == int128{81}, "ipow constexpr int128 negative base even exp"); - constexpr uint128_t r5 {ipow(uint128_t{2}, 128U)}; - static_assert(r5 == uint128_t{0}, "ipow constexpr uint128 wrap to zero"); + constexpr uint128 r5 {ipow(uint128{2}, 128U)}; + static_assert(r5 == uint128{0}, "ipow constexpr uint128 wrap to zero"); } #ifdef _MSC_VER diff --git a/test/test_isqrt.cpp b/test/test_isqrt.cpp index 5d485e31..ece29005 100644 --- a/test/test_isqrt.cpp +++ b/test/test_isqrt.cpp @@ -30,15 +30,15 @@ namespace { // Naive bit-by-bit reference. Independent of the Newton implementation under // test, so it serves as a ground truth for cross-checking. -constexpr uint128_t isqrt_ref(uint128_t n) noexcept +constexpr uint128 isqrt_ref(uint128 n) noexcept { if (n < 2U) { return n; } - uint128_t res {0}; - uint128_t bit {uint128_t{1} << 126}; + uint128 res {0}; + uint128 bit {uint128{1} << 126}; while (bit > n) { @@ -66,17 +66,17 @@ constexpr uint128_t isqrt_ref(uint128_t n) noexcept // Verify the defining invariant: r == isqrt(n) iff r*r <= n < (r+1)^2. // Computed with overflow-safe comparisons so callers can pass values near the // uint128 upper bound. -void check_invariant(const uint128_t n) +void check_invariant(const uint128 n) { - const uint128_t r {isqrt(n)}; + const uint128 r {isqrt(n)}; BOOST_TEST(r * r <= n); - const uint128_t r_plus_1 {r + 1U}; + const uint128 r_plus_1 {r + 1U}; // (r+1)^2 may overflow uint128 when r is close to 2^64; in that case the // invariant n < (r+1)^2 is trivially satisfied since n fits in 128 bits. - if (r_plus_1 != 0U && r_plus_1 <= ((std::numeric_limits::max)() / r_plus_1)) + if (r_plus_1 != 0U && r_plus_1 <= ((std::numeric_limits::max)() / r_plus_1)) { BOOST_TEST(n < r_plus_1 * r_plus_1); } @@ -86,25 +86,25 @@ void check_invariant(const uint128_t n) void test_uint128_isqrt_small() { - BOOST_TEST_EQ(isqrt(uint128_t{0}), uint128_t{0}); - BOOST_TEST_EQ(isqrt(uint128_t{1}), uint128_t{1}); - BOOST_TEST_EQ(isqrt(uint128_t{2}), uint128_t{1}); - BOOST_TEST_EQ(isqrt(uint128_t{3}), uint128_t{1}); - BOOST_TEST_EQ(isqrt(uint128_t{4}), uint128_t{2}); - BOOST_TEST_EQ(isqrt(uint128_t{5}), uint128_t{2}); - BOOST_TEST_EQ(isqrt(uint128_t{8}), uint128_t{2}); - BOOST_TEST_EQ(isqrt(uint128_t{9}), uint128_t{3}); - BOOST_TEST_EQ(isqrt(uint128_t{10}), uint128_t{3}); - BOOST_TEST_EQ(isqrt(uint128_t{15}), uint128_t{3}); - BOOST_TEST_EQ(isqrt(uint128_t{16}), uint128_t{4}); - BOOST_TEST_EQ(isqrt(uint128_t{99}), uint128_t{9}); - BOOST_TEST_EQ(isqrt(uint128_t{100}), uint128_t{10}); - BOOST_TEST_EQ(isqrt(uint128_t{101}), uint128_t{10}); + BOOST_TEST_EQ(isqrt(uint128{0}), uint128{0}); + BOOST_TEST_EQ(isqrt(uint128{1}), uint128{1}); + BOOST_TEST_EQ(isqrt(uint128{2}), uint128{1}); + BOOST_TEST_EQ(isqrt(uint128{3}), uint128{1}); + BOOST_TEST_EQ(isqrt(uint128{4}), uint128{2}); + BOOST_TEST_EQ(isqrt(uint128{5}), uint128{2}); + BOOST_TEST_EQ(isqrt(uint128{8}), uint128{2}); + BOOST_TEST_EQ(isqrt(uint128{9}), uint128{3}); + BOOST_TEST_EQ(isqrt(uint128{10}), uint128{3}); + BOOST_TEST_EQ(isqrt(uint128{15}), uint128{3}); + BOOST_TEST_EQ(isqrt(uint128{16}), uint128{4}); + BOOST_TEST_EQ(isqrt(uint128{99}), uint128{9}); + BOOST_TEST_EQ(isqrt(uint128{100}), uint128{10}); + BOOST_TEST_EQ(isqrt(uint128{101}), uint128{10}); // Exhaustive cross-check against the reference for every small n. for (std::uint64_t i {0}; i < 200; ++i) { - BOOST_TEST_EQ(isqrt(uint128_t{i}), isqrt_ref(uint128_t{i})); + BOOST_TEST_EQ(isqrt(uint128{i}), isqrt_ref(uint128{i})); } } @@ -114,7 +114,7 @@ void test_uint128_isqrt_perfect_squares() // square still fits in 128 bits (k = 2^64 - 1). for (std::uint64_t k {0}; k < 10000; ++k) { - const uint128_t kk {k}; + const uint128 kk {k}; BOOST_TEST_EQ(isqrt(kk * kk), kk); if (k > 0) @@ -128,12 +128,12 @@ void test_uint128_isqrt_perfect_squares() // is (2^63)^2 = 2^126. for (int i {0}; i < 64; ++i) { - const uint128_t k {uint128_t{1} << i}; + const uint128 k {uint128{1} << i}; BOOST_TEST_EQ(isqrt(k * k), k); } // Largest representable perfect square: (2^64 - 1)^2 = 2^128 - 2^65 + 1. - const uint128_t k_max {(std::numeric_limits::max)()}; + const uint128 k_max {(std::numeric_limits::max)()}; BOOST_TEST_EQ(isqrt(k_max * k_max), k_max); } @@ -142,21 +142,21 @@ void test_uint128_isqrt_bit_boundaries() // 2^(2k) has integer square root 2^k. for (int k {0}; k < 64; ++k) { - const uint128_t n {uint128_t{1} << (2 * k)}; - BOOST_TEST_EQ(isqrt(n), uint128_t{1} << k); + const uint128 n {uint128{1} << (2 * k)}; + BOOST_TEST_EQ(isqrt(n), uint128{1} << k); } // 2^(2k+1) has integer square root floor(2^(k+0.5)) = floor(sqrt(2) * 2^k). // Check the invariant holds rather than hard-coding the value. for (int k {0}; k < 63; ++k) { - check_invariant(uint128_t{1} << (2 * k + 1)); + check_invariant(uint128{1} << (2 * k + 1)); } // Just below and just above bit boundaries. for (int k {2}; k < 128; ++k) { - const uint128_t boundary {uint128_t{1} << k}; + const uint128 boundary {uint128{1} << k}; check_invariant(boundary - 1U); check_invariant(boundary); check_invariant(boundary + 1U); @@ -166,8 +166,8 @@ void test_uint128_isqrt_bit_boundaries() void test_uint128_isqrt_extreme() { // (uint128 max). (2^64)^2 = 2^128 wraps, so isqrt(2^128 - 1) = 2^64 - 1. - const uint128_t u128_max {(std::numeric_limits::max)()}; - const uint128_t u64_max {(std::numeric_limits::max)()}; + const uint128 u128_max {(std::numeric_limits::max)()}; + const uint128 u64_max {(std::numeric_limits::max)()}; BOOST_TEST_EQ(isqrt(u128_max), u64_max); // 2^128 - 2^65 + 1 = (2^64 - 1)^2 - exact square at the very top. @@ -178,9 +178,9 @@ void test_uint128_isqrt_extreme() // A handful of large hand-picked values, cross-checked against the bit-by- // bit reference. - const uint128_t big_a {UINT64_C(0x0123456789ABCDEF), UINT64_C(0xFEDCBA9876543210)}; - const uint128_t big_b {UINT64_C(0xDEADBEEFCAFEBABE), UINT64_C(0x0123456789ABCDEF)}; - const uint128_t big_c {UINT64_C(0x8000000000000000), 0U}; + const uint128 big_a {UINT64_C(0x0123456789ABCDEF), UINT64_C(0xFEDCBA9876543210)}; + const uint128 big_b {UINT64_C(0xDEADBEEFCAFEBABE), UINT64_C(0x0123456789ABCDEF)}; + const uint128 big_c {UINT64_C(0x8000000000000000), 0U}; BOOST_TEST_EQ(isqrt(big_a), isqrt_ref(big_a)); BOOST_TEST_EQ(isqrt(big_b), isqrt_ref(big_b)); @@ -194,22 +194,22 @@ void test_uint128_isqrt_extreme() void test_int128_isqrt() { - BOOST_TEST_EQ(isqrt(int128_t{0}), int128_t{0}); - BOOST_TEST_EQ(isqrt(int128_t{1}), int128_t{1}); - BOOST_TEST_EQ(isqrt(int128_t{2}), int128_t{1}); - BOOST_TEST_EQ(isqrt(int128_t{100}), int128_t{10}); - BOOST_TEST_EQ(isqrt(int128_t{144}), int128_t{12}); - BOOST_TEST_EQ(isqrt(int128_t{INT64_C(1000000000000000000)}), int128_t{INT64_C(1000000000)}); + BOOST_TEST_EQ(isqrt(int128{0}), int128{0}); + BOOST_TEST_EQ(isqrt(int128{1}), int128{1}); + BOOST_TEST_EQ(isqrt(int128{2}), int128{1}); + BOOST_TEST_EQ(isqrt(int128{100}), int128{10}); + BOOST_TEST_EQ(isqrt(int128{144}), int128{12}); + BOOST_TEST_EQ(isqrt(int128{INT64_C(1000000000000000000)}), int128{INT64_C(1000000000)}); // int128 max = 2^127 - 1. floor(sqrt) = floor(2^63.5) = 6074001000.7e9 // Use the unsigned implementation as the source of truth. - const int128_t i128_max {(std::numeric_limits::max)()}; - BOOST_TEST_EQ(isqrt(i128_max), static_cast(isqrt(static_cast(i128_max)))); + const int128 i128_max {(std::numeric_limits::max)()}; + BOOST_TEST_EQ(isqrt(i128_max), static_cast(isqrt(static_cast(i128_max)))); // Negative inputs are documented to return 0. - BOOST_TEST_EQ(isqrt(int128_t{-1}), int128_t{0}); - BOOST_TEST_EQ(isqrt(int128_t{-100}), int128_t{0}); - BOOST_TEST_EQ(isqrt((std::numeric_limits::min)()), int128_t{0}); + BOOST_TEST_EQ(isqrt(int128{-1}), int128{0}); + BOOST_TEST_EQ(isqrt(int128{-100}), int128{0}); + BOOST_TEST_EQ(isqrt((std::numeric_limits::min)()), int128{0}); } void test_isqrt_against_ipow() @@ -217,15 +217,15 @@ void test_isqrt_against_ipow() // isqrt(ipow(k, 2)) == k for any k whose square fits. for (std::uint64_t k {0}; k < 1000; ++k) { - BOOST_TEST_EQ(isqrt(ipow(uint128_t{k}, 2U)), uint128_t{k}); + BOOST_TEST_EQ(isqrt(ipow(uint128{k}, 2U)), uint128{k}); } // isqrt is monotonically non-decreasing. - uint128_t prev {0}; + uint128 prev {0}; for (std::uint64_t i {0}; i < 1000; ++i) { - const uint128_t curr {isqrt(uint128_t{i})}; + const uint128 curr {isqrt(uint128{i})}; BOOST_TEST(curr >= prev); prev = curr; } @@ -239,23 +239,23 @@ void test_isqrt_against_ipow() void test_constexpr_isqrt() { - constexpr uint128_t r1 {isqrt(uint128_t{0})}; - static_assert(r1 == uint128_t{0}, "isqrt(0) constexpr"); + constexpr uint128 r1 {isqrt(uint128{0})}; + static_assert(r1 == uint128{0}, "isqrt(0) constexpr"); - constexpr uint128_t r2 {isqrt(uint128_t{1})}; - static_assert(r2 == uint128_t{1}, "isqrt(1) constexpr"); + constexpr uint128 r2 {isqrt(uint128{1})}; + static_assert(r2 == uint128{1}, "isqrt(1) constexpr"); - constexpr uint128_t r3 {isqrt(uint128_t{100})}; - static_assert(r3 == uint128_t{10}, "isqrt(100) constexpr"); + constexpr uint128 r3 {isqrt(uint128{100})}; + static_assert(r3 == uint128{10}, "isqrt(100) constexpr"); - constexpr uint128_t r4 {isqrt(uint128_t{UINT64_C(1000000000000000000)})}; - static_assert(r4 == uint128_t{UINT64_C(1000000000)}, "isqrt(10^18) constexpr"); + constexpr uint128 r4 {isqrt(uint128{UINT64_C(1000000000000000000)})}; + static_assert(r4 == uint128{UINT64_C(1000000000)}, "isqrt(10^18) constexpr"); - constexpr int128_t r5 {isqrt(int128_t{-5})}; - static_assert(r5 == int128_t{0}, "isqrt negative constexpr"); + constexpr int128 r5 {isqrt(int128{-5})}; + static_assert(r5 == int128{0}, "isqrt negative constexpr"); - constexpr int128_t r6 {isqrt(int128_t{12321})}; - static_assert(r6 == int128_t{111}, "isqrt(12321) constexpr"); + constexpr int128 r6 {isqrt(int128{12321})}; + static_assert(r6 == int128{111}, "isqrt(12321) constexpr"); } #ifdef _MSC_VER diff --git a/test/test_layout.cpp b/test/test_layout.cpp index 5a6f54cc..be75fef2 100644 --- a/test/test_layout.cpp +++ b/test/test_layout.cpp @@ -2,9 +2,9 @@ // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // -// Pins the storage layout of int128_t and uint128_t. Both halves of int128_t are +// Pins the storage layout of int128 and uint128. Both halves of int128 are // deliberately std::uint64_t so that the two words have the same type; when they -// differ the vectorizer cannot merge them and loops over int128_t are scalarized. +// differ the vectorizer cannot merge them and loops over int128 are scalarized. // Sign is recovered through signed_high(), which these tests also exercise. #ifndef BOOST_INT128_BUILD_MODULE @@ -24,42 +24,42 @@ import boost.int128; #include #include -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; // Both words of both types are unsigned. Changing either of these regresses the // codegen this layout exists to enable. -static_assert(std::is_same::value, - "int128_t::high must be std::uint64_t; use signed_high() to read it as signed"); -static_assert(std::is_same::value, - "int128_t::low must be std::uint64_t"); -static_assert(std::is_same::value, - "uint128_t::high must be std::uint64_t"); -static_assert(std::is_same::value, - "uint128_t::low must be std::uint64_t"); - -static_assert(std::is_same::value, +static_assert(std::is_same::value, + "int128::high must be std::uint64_t; use signed_high() to read it as signed"); +static_assert(std::is_same::value, + "int128::low must be std::uint64_t"); +static_assert(std::is_same::value, + "uint128::high must be std::uint64_t"); +static_assert(std::is_same::value, + "uint128::low must be std::uint64_t"); + +static_assert(std::is_same::value, "signed_high() must yield std::int64_t"); -static_assert(sizeof(int128_t) == 16, "int128_t must be exactly 128 bits wide"); -static_assert(sizeof(uint128_t) == 16, "uint128_t must be exactly 128 bits wide"); -static_assert(alignof(int128_t) == alignof(uint128_t), "both types must agree on alignment"); +static_assert(sizeof(int128) == 16, "int128 must be exactly 128 bits wide"); +static_assert(sizeof(uint128) == 16, "uint128 must be exactly 128 bits wide"); +static_assert(alignof(int128) == alignof(uint128), "both types must agree on alignment"); -static_assert(std::is_trivially_copyable::value, "int128_t must be trivially copyable"); -static_assert(std::is_trivially_copyable::value, "uint128_t must be trivially copyable"); -static_assert(std::is_standard_layout::value, "int128_t must be standard layout"); -static_assert(std::is_standard_layout::value, "uint128_t must be standard layout"); +static_assert(std::is_trivially_copyable::value, "int128 must be trivially copyable"); +static_assert(std::is_trivially_copyable::value, "uint128 must be trivially copyable"); +static_assert(std::is_standard_layout::value, "int128 must be standard layout"); +static_assert(std::is_standard_layout::value, "uint128 must be standard layout"); // The words sit in memory in the platform's own order, so a memcpy of the object // matches a memcpy of the two words in that order. void test_word_order() { - const int128_t v {INT64_C(-2), UINT64_C(0x0123456789ABCDEF)}; + const int128 v {INT64_C(-2), UINT64_C(0x0123456789ABCDEF)}; - unsigned char from_object[sizeof(int128_t)] {}; + unsigned char from_object[sizeof(int128)] {}; std::memcpy(from_object, &v, sizeof(v)); - unsigned char from_words[sizeof(int128_t)] {}; + unsigned char from_words[sizeof(int128)] {}; #if BOOST_INT128_ENDIAN_LITTLE_BYTE std::memcpy(from_words, &v.low, sizeof(v.low)); std::memcpy(from_words + sizeof(v.low), &v.high, sizeof(v.high)); @@ -68,7 +68,7 @@ void test_word_order() std::memcpy(from_words + sizeof(v.high), &v.low, sizeof(v.low)); #endif - BOOST_TEST_EQ(std::memcmp(from_object, from_words, sizeof(int128_t)), 0); + BOOST_TEST_EQ(std::memcmp(from_object, from_words, sizeof(int128)), 0); } // signed_high() is a pure reinterpretation of the stored bits. @@ -81,7 +81,7 @@ void test_signed_high_round_trip() for (const auto h : highs) { - const int128_t v {h, UINT64_C(0xDEADBEEFCAFEF00D)}; + const int128 v {h, UINT64_C(0xDEADBEEFCAFEF00D)}; BOOST_TEST_EQ(v.signed_high(), h); BOOST_TEST_EQ(v.high, static_cast(h)); @@ -96,22 +96,22 @@ void test_signed_high_round_trip() // The two types share a representation, so converting between them moves no bits. void test_interconversion_is_bit_preserving() { - const int128_t signed_values[] { - int128_t{0, 0}, - int128_t{-1, UINT64_MAX}, - int128_t{INT64_MIN, 0}, - int128_t{INT64_MAX, UINT64_MAX}, - int128_t{-1, 0}, - int128_t{0, UINT64_MAX} + const int128 signed_values[] { + int128{0, 0}, + int128{-1, UINT64_MAX}, + int128{INT64_MIN, 0}, + int128{INT64_MAX, UINT64_MAX}, + int128{-1, 0}, + int128{0, UINT64_MAX} }; for (const auto& s : signed_values) { - const uint128_t u {s}; + const uint128 u {s}; BOOST_TEST_EQ(u.high, s.high); BOOST_TEST_EQ(u.low, s.low); - const int128_t back {u}; + const int128 back {u}; BOOST_TEST_EQ(back.high, s.high); BOOST_TEST_EQ(back.low, s.low); } @@ -121,16 +121,16 @@ void test_interconversion_is_bit_preserving() // from a negative literal keeps working. void test_two_word_construction() { - constexpr int128_t minus_one {-1, UINT64_MAX}; + constexpr int128 minus_one {-1, UINT64_MAX}; static_assert(minus_one.high == UINT64_MAX, "-1 sign extends into the high word"); static_assert(minus_one.signed_high() == -1, "signed_high sees the sign"); - constexpr int128_t int128_min {INT64_MIN, 0}; + constexpr int128 int128_min {INT64_MIN, 0}; static_assert(int128_min.high == (UINT64_C(1) << 63), "INT128_MIN high word"); static_assert(int128_min.signed_high() == INT64_MIN, "INT128_MIN reads back signed"); BOOST_TEST(minus_one == -1); - BOOST_TEST(int128_min == (std::numeric_limits::min)()); + BOOST_TEST(int128_min == (std::numeric_limits::min)()); } int main() diff --git a/test/test_limits_i128.cpp b/test/test_limits_i128.cpp index 6a6968fa..1af0e22f 100644 --- a/test/test_limits_i128.cpp +++ b/test/test_limits_i128.cpp @@ -20,13 +20,13 @@ import boost.int128; void test_basics() { - static_assert(std::numeric_limits::is_specialized, "Should be true"); - static_assert(std::numeric_limits::is_signed, "Should be true"); - static_assert(std::numeric_limits::is_integer, "Should be true"); - static_assert(std::numeric_limits::is_exact, "Should be true"); - static_assert(!std::numeric_limits::has_infinity, "Should be false"); - static_assert(!std::numeric_limits::has_quiet_NaN, "Should be false"); - static_assert(!std::numeric_limits::has_signaling_NaN, "Should be false"); + static_assert(std::numeric_limits::is_specialized, "Should be true"); + static_assert(std::numeric_limits::is_signed, "Should be true"); + static_assert(std::numeric_limits::is_integer, "Should be true"); + static_assert(std::numeric_limits::is_exact, "Should be true"); + static_assert(!std::numeric_limits::has_infinity, "Should be false"); + static_assert(!std::numeric_limits::has_quiet_NaN, "Should be false"); + static_assert(!std::numeric_limits::has_signaling_NaN, "Should be false"); // C++23 deprecated the following two members #if defined(__GNUC__) && __cplusplus > 202002L @@ -37,8 +37,8 @@ void test_basics() # pragma warning(disable:4996) #endif - static_assert(std::numeric_limits::has_denorm == std::denorm_absent, "No denorm"); - static_assert(!std::numeric_limits::has_denorm_loss, "No denorm"); + static_assert(std::numeric_limits::has_denorm == std::denorm_absent, "No denorm"); + static_assert(!std::numeric_limits::has_denorm_loss, "No denorm"); #if defined(__GNUC__) && __cplusplus > 202002L # pragma GCC diagnostic pop @@ -46,22 +46,22 @@ void test_basics() # pragma warning(pop) #endif - static_assert(std::numeric_limits::round_style == std::round_toward_zero, "Integer rounding"); - static_assert(!std::numeric_limits::is_iec559, "Should be false"); - static_assert(std::numeric_limits::is_bounded, "Should be true"); - static_assert(std::numeric_limits::is_modulo, "Should be true"); - static_assert(std::numeric_limits::digits == CHAR_BIT * sizeof(boost::int128::int128_t) - 1, "127 bits"); - - // std::numeric_limits::digits * std::log10(2) = 38.23 - static_assert(std::numeric_limits::digits10 == 38, "38 base 10 digits"); - static_assert(std::numeric_limits::max_digits10 == 0, "0 since not fp"); - static_assert(std::numeric_limits::radix == 2, "Should be 2"); - static_assert(std::numeric_limits::min_exponent == 0, "Should be 0"); - static_assert(std::numeric_limits::min_exponent10 == 0, "Should be 0"); - static_assert(std::numeric_limits::max_exponent == 0, "Should be 0"); - static_assert(std::numeric_limits::max_exponent10 == 0, "Should be 0"); - static_assert(std::numeric_limits::traps == std::numeric_limits::traps, "Uses what std::uint64_t does"); - static_assert(!std::numeric_limits::tinyness_before, "should be false"); + static_assert(std::numeric_limits::round_style == std::round_toward_zero, "Integer rounding"); + static_assert(!std::numeric_limits::is_iec559, "Should be false"); + static_assert(std::numeric_limits::is_bounded, "Should be true"); + static_assert(std::numeric_limits::is_modulo, "Should be true"); + static_assert(std::numeric_limits::digits == CHAR_BIT * sizeof(boost::int128::int128) - 1, "127 bits"); + + // std::numeric_limits::digits * std::log10(2) = 38.23 + static_assert(std::numeric_limits::digits10 == 38, "38 base 10 digits"); + static_assert(std::numeric_limits::max_digits10 == 0, "0 since not fp"); + static_assert(std::numeric_limits::radix == 2, "Should be 2"); + static_assert(std::numeric_limits::min_exponent == 0, "Should be 0"); + static_assert(std::numeric_limits::min_exponent10 == 0, "Should be 0"); + static_assert(std::numeric_limits::max_exponent == 0, "Should be 0"); + static_assert(std::numeric_limits::max_exponent10 == 0, "Should be 0"); + static_assert(std::numeric_limits::traps == std::numeric_limits::traps, "Uses what std::uint64_t does"); + static_assert(!std::numeric_limits::tinyness_before, "should be false"); } #ifdef BOOST_INT128_HAS_INT128 @@ -74,7 +74,7 @@ void test_member_functions() // Numeric limits are only defined in GNU mode for old compilers or GCC 13+ automatically BOOST_INT128_IF_CONSTEXPR (builtin_max != 0) { - using lib_i128 = boost::int128::int128_t; + using lib_i128 = boost::int128::int128; BOOST_TEST(std::numeric_limits::min() == std::numeric_limits::min()); BOOST_TEST(std::numeric_limits::lowest() == std::numeric_limits::lowest()); diff --git a/test/test_limits_u128.cpp b/test/test_limits_u128.cpp index db80de90..5a340ea8 100644 --- a/test/test_limits_u128.cpp +++ b/test/test_limits_u128.cpp @@ -20,13 +20,13 @@ import boost.int128; void test_basics() { - static_assert(std::numeric_limits::is_specialized, "Should be true"); - static_assert(!std::numeric_limits::is_signed, "Should be false"); - static_assert(std::numeric_limits::is_integer, "Should be true"); - static_assert(std::numeric_limits::is_exact, "Should be true"); - static_assert(!std::numeric_limits::has_infinity, "Should be false"); - static_assert(!std::numeric_limits::has_quiet_NaN, "Should be false"); - static_assert(!std::numeric_limits::has_signaling_NaN, "Should be false"); + static_assert(std::numeric_limits::is_specialized, "Should be true"); + static_assert(!std::numeric_limits::is_signed, "Should be false"); + static_assert(std::numeric_limits::is_integer, "Should be true"); + static_assert(std::numeric_limits::is_exact, "Should be true"); + static_assert(!std::numeric_limits::has_infinity, "Should be false"); + static_assert(!std::numeric_limits::has_quiet_NaN, "Should be false"); + static_assert(!std::numeric_limits::has_signaling_NaN, "Should be false"); // C++23 deprecated the following two members #if defined(__GNUC__) && __cplusplus > 202002L @@ -37,8 +37,8 @@ void test_basics() # pragma warning(disable:4996) #endif - static_assert(std::numeric_limits::has_denorm == std::denorm_absent, "No denorm"); - static_assert(!std::numeric_limits::has_denorm_loss, "No denorm"); + static_assert(std::numeric_limits::has_denorm == std::denorm_absent, "No denorm"); + static_assert(!std::numeric_limits::has_denorm_loss, "No denorm"); #if defined(__GNUC__) && __cplusplus > 202002L # pragma GCC diagnostic pop @@ -46,22 +46,22 @@ void test_basics() # pragma warning(pop) #endif - static_assert(std::numeric_limits::round_style == std::round_toward_zero, "Integer rounding"); - static_assert(!std::numeric_limits::is_iec559, "Should be false"); - static_assert(std::numeric_limits::is_bounded, "Should be true"); - static_assert(std::numeric_limits::is_modulo, "Should be true"); - static_assert(std::numeric_limits::digits == CHAR_BIT * sizeof(boost::int128::uint128_t), "128 bits"); - - // std::numeric_limits::digits * std::log10(2) = 38.532 - static_assert(std::numeric_limits::digits10 == 38, "38 base 10 digits"); - static_assert(std::numeric_limits::max_digits10 == 0, "0 since not fp"); - static_assert(std::numeric_limits::radix == 2, "Should be 2"); - static_assert(std::numeric_limits::min_exponent == 0, "Should be 0"); - static_assert(std::numeric_limits::min_exponent10 == 0, "Should be 0"); - static_assert(std::numeric_limits::max_exponent == 0, "Should be 0"); - static_assert(std::numeric_limits::max_exponent10 == 0, "Should be 0"); - static_assert(std::numeric_limits::traps == std::numeric_limits::traps, "Uses what std::uint64_t does"); - static_assert(!std::numeric_limits::tinyness_before, "should be false"); + static_assert(std::numeric_limits::round_style == std::round_toward_zero, "Integer rounding"); + static_assert(!std::numeric_limits::is_iec559, "Should be false"); + static_assert(std::numeric_limits::is_bounded, "Should be true"); + static_assert(std::numeric_limits::is_modulo, "Should be true"); + static_assert(std::numeric_limits::digits == CHAR_BIT * sizeof(boost::int128::uint128), "128 bits"); + + // std::numeric_limits::digits * std::log10(2) = 38.532 + static_assert(std::numeric_limits::digits10 == 38, "38 base 10 digits"); + static_assert(std::numeric_limits::max_digits10 == 0, "0 since not fp"); + static_assert(std::numeric_limits::radix == 2, "Should be 2"); + static_assert(std::numeric_limits::min_exponent == 0, "Should be 0"); + static_assert(std::numeric_limits::min_exponent10 == 0, "Should be 0"); + static_assert(std::numeric_limits::max_exponent == 0, "Should be 0"); + static_assert(std::numeric_limits::max_exponent10 == 0, "Should be 0"); + static_assert(std::numeric_limits::traps == std::numeric_limits::traps, "Uses what std::uint64_t does"); + static_assert(!std::numeric_limits::tinyness_before, "should be false"); } #ifdef BOOST_INT128_HAS_INT128 @@ -74,7 +74,7 @@ void test_member_functions() // Numeric limits are only defined in GNU mode for old compilers or GCC 13+ automatically BOOST_INT128_IF_CONSTEXPR (builtin_max != 0) { - using lib_u128 = boost::int128::uint128_t; + using lib_u128 = boost::int128::uint128; BOOST_TEST(std::numeric_limits::min() == std::numeric_limits::min()); BOOST_TEST(std::numeric_limits::lowest() == std::numeric_limits::lowest()); diff --git a/test/test_literals.cpp b/test/test_literals.cpp index 5fade8b7..f5749b0c 100644 --- a/test/test_literals.cpp +++ b/test/test_literals.cpp @@ -23,11 +23,11 @@ using namespace boost::int128::literals; void test_u128_literals() { - BOOST_TEST(boost::int128::uint128_t{0} == 0_u128); - BOOST_TEST(boost::int128::uint128_t{10} == "10"_U128); - BOOST_TEST(boost::int128::uint128_t{0} == BOOST_INT128_UINT128_C(0)); + BOOST_TEST(boost::int128::uint128{0} == 0_u128); + BOOST_TEST(boost::int128::uint128{10} == "10"_U128); + BOOST_TEST(boost::int128::uint128{0} == BOOST_INT128_UINT128_C(0)); - const boost::int128::uint128_t max_val {std::numeric_limits::max()}; + const boost::int128::uint128 max_val {std::numeric_limits::max()}; const auto macro_val {BOOST_INT128_UINT128_C(340282366920938463463374607431768211455)}; BOOST_TEST(max_val == macro_val); } @@ -41,25 +41,25 @@ void test_u128_literals() void test_u128_digit_separators() { // C++ digit separators (') are ignored inside numeric literals - BOOST_TEST(boost::int128::uint128_t{1234567} == 1'234'567_u128); - BOOST_TEST(boost::int128::uint128_t{1000} == 1'000_U128); - BOOST_TEST(boost::int128::uint128_t{1234} == 12'34_u128); + BOOST_TEST(boost::int128::uint128{1234567} == 1'234'567_u128); + BOOST_TEST(boost::int128::uint128{1000} == 1'000_U128); + BOOST_TEST(boost::int128::uint128{1234} == 12'34_u128); // Separators are also honored through the convenience macro - BOOST_TEST(boost::int128::uint128_t{1234} == BOOST_INT128_UINT128_C(1'234)); + BOOST_TEST(boost::int128::uint128{1234} == BOOST_INT128_UINT128_C(1'234)); // The string form of the literal skips separators as well - BOOST_TEST(boost::int128::uint128_t{1234} == "1'234"_u128); - BOOST_TEST(boost::int128::uint128_t{1234} == "1'234"_U128); + BOOST_TEST(boost::int128::uint128{1234} == "1'234"_u128); + BOOST_TEST(boost::int128::uint128{1234} == "1'234"_U128); // Full-width value with a separator between every group of three digits - const boost::int128::uint128_t max_val {std::numeric_limits::max()}; + const boost::int128::uint128 max_val {std::numeric_limits::max()}; BOOST_TEST(max_val == 340'282'366'920'938'463'463'374'607'431'768'211'455_u128); // MSVC 14.1 ICE #if !defined(_MSC_VER) || _MSC_VER >= 1920 // Separators must be usable in a constant expression - static_assert(100'000_u128 == boost::int128::uint128_t{100000}, "constexpr separator"); + static_assert(100'000_u128 == boost::int128::uint128{100000}, "constexpr separator"); #endif } @@ -68,44 +68,44 @@ void test_u128_base_prefixes() // A C++ base prefix is recognized and the digits parsed in that base // Hexadecimal (0x / 0X) - BOOST_TEST(boost::int128::uint128_t{255} == 0xFF_u128); - BOOST_TEST(boost::int128::uint128_t{255} == 0XfF_U128); - BOOST_TEST(boost::int128::uint128_t{255} == "0xff"_u128); - BOOST_TEST(boost::int128::uint128_t{0xDEADBEEFULL} == 0xDEAD'BEEF_u128); + BOOST_TEST(boost::int128::uint128{255} == 0xFF_u128); + BOOST_TEST(boost::int128::uint128{255} == 0XfF_U128); + BOOST_TEST(boost::int128::uint128{255} == "0xff"_u128); + BOOST_TEST(boost::int128::uint128{0xDEADBEEFULL} == 0xDEAD'BEEF_u128); // Binary (0b / 0B) - BOOST_TEST(boost::int128::uint128_t{10} == 0b1010_u128); - BOOST_TEST(boost::int128::uint128_t{240} == 0B1111'0000_U128); + BOOST_TEST(boost::int128::uint128{10} == 0b1010_u128); + BOOST_TEST(boost::int128::uint128{240} == 0B1111'0000_U128); // Octal (leading 0) - BOOST_TEST(boost::int128::uint128_t{511} == 0777_u128); - BOOST_TEST(boost::int128::uint128_t{8} == 010_u128); - BOOST_TEST(boost::int128::uint128_t{0} == 00_u128); + BOOST_TEST(boost::int128::uint128{511} == 0777_u128); + BOOST_TEST(boost::int128::uint128{8} == 010_u128); + BOOST_TEST(boost::int128::uint128{0} == 00_u128); // A full-width value written in hexadecimal is the maximum - const boost::int128::uint128_t max_val {std::numeric_limits::max()}; + const boost::int128::uint128 max_val {std::numeric_limits::max()}; BOOST_TEST(max_val == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128); // MSVC 14.1 ICE #if !defined(_MSC_VER) || _MSC_VER >= 1920 // Prefixes must be usable in a constant expression - static_assert(0x10_u128 == boost::int128::uint128_t{16}, "constexpr hex"); - static_assert(0b100_u128 == boost::int128::uint128_t{4}, "constexpr binary"); - static_assert(010_u128 == boost::int128::uint128_t{8}, "constexpr octal"); + static_assert(0x10_u128 == boost::int128::uint128{16}, "constexpr hex"); + static_assert(0b100_u128 == boost::int128::uint128{4}, "constexpr binary"); + static_assert(010_u128 == boost::int128::uint128{8}, "constexpr octal"); #endif } void test_i128_literals() { - BOOST_TEST(boost::int128::int128_t{0} == 0_i128); - BOOST_TEST(boost::int128::int128_t{10} == "10"_I128); - BOOST_TEST(boost::int128::int128_t{0} == BOOST_INT128_INT128_C(0)); + BOOST_TEST(boost::int128::int128{0} == 0_i128); + BOOST_TEST(boost::int128::int128{10} == "10"_I128); + BOOST_TEST(boost::int128::int128{0} == BOOST_INT128_INT128_C(0)); - const boost::int128::int128_t max_val {std::numeric_limits::max()}; + const boost::int128::int128 max_val {std::numeric_limits::max()}; const auto macro_val {BOOST_INT128_INT128_C(170141183460469231731687303715884105727)}; BOOST_TEST(max_val == macro_val); - const boost::int128::int128_t min_val {std::numeric_limits::min()}; + const boost::int128::int128 min_val {std::numeric_limits::min()}; const auto min_macro_val {BOOST_INT128_INT128_C(-170141183460469231731687303715884105728)}; BOOST_TEST(min_val == min_macro_val); @@ -115,54 +115,54 @@ void test_i128_literals() void test_i128_digit_separators() { // C++ digit separators (') are ignored inside numeric literals - BOOST_TEST(boost::int128::int128_t{1000} == 1'000_i128); - BOOST_TEST(boost::int128::int128_t{9999} == 9'999_I128); + BOOST_TEST(boost::int128::int128{1000} == 1'000_i128); + BOOST_TEST(boost::int128::int128{9999} == 9'999_I128); // A leading unary minus is applied after the (separated) literal is parsed - BOOST_TEST(boost::int128::int128_t{-1000000} == -1'000'000_i128); + BOOST_TEST(boost::int128::int128{-1000000} == -1'000'000_i128); // Separators are also honored through the convenience macro - BOOST_TEST(boost::int128::int128_t{9999} == BOOST_INT128_INT128_C(9'999)); + BOOST_TEST(boost::int128::int128{9999} == BOOST_INT128_INT128_C(9'999)); // The string form of the literal skips separators as well - BOOST_TEST(boost::int128::int128_t{1234} == "1'234"_i128); - BOOST_TEST(boost::int128::int128_t{1234} == "1'234"_I128); + BOOST_TEST(boost::int128::int128{1234} == "1'234"_i128); + BOOST_TEST(boost::int128::int128{1234} == "1'234"_I128); // Full-width value with a separator between every group of three digits - const boost::int128::int128_t max_val {std::numeric_limits::max()}; + const boost::int128::int128 max_val {std::numeric_limits::max()}; BOOST_TEST(max_val == 170'141'183'460'469'231'731'687'303'715'884'105'727_i128); // MSVC 14.1 ICE #if !defined(_MSC_VER) || _MSC_VER >= 1920 // Separators must be usable in a constant expression - static_assert(100'000_i128 == boost::int128::int128_t{100000}, "constexpr separator"); + static_assert(100'000_i128 == boost::int128::int128{100000}, "constexpr separator"); #endif } void test_i128_base_prefixes() { // Hexadecimal, binary and octal prefixes are recognized for the signed type too - BOOST_TEST(boost::int128::int128_t{127} == 0x7F_i128); - BOOST_TEST(boost::int128::int128_t{255} == "0xFF"_I128); - BOOST_TEST(boost::int128::int128_t{10} == 0b1010_i128); - BOOST_TEST(boost::int128::int128_t{511} == 0777_i128); + BOOST_TEST(boost::int128::int128{127} == 0x7F_i128); + BOOST_TEST(boost::int128::int128{255} == "0xFF"_I128); + BOOST_TEST(boost::int128::int128{10} == 0b1010_i128); + BOOST_TEST(boost::int128::int128{511} == 0777_i128); // A leading unary minus is applied after the (prefixed) literal is parsed - BOOST_TEST(boost::int128::int128_t{-255} == -0xFF_i128); - BOOST_TEST(boost::int128::int128_t{-511} == -0777_i128); + BOOST_TEST(boost::int128::int128{-255} == -0xFF_i128); + BOOST_TEST(boost::int128::int128{-511} == -0777_i128); // The string form may embed the sign ahead of the prefix - BOOST_TEST(boost::int128::int128_t{-255} == "-0xFF"_i128); - BOOST_TEST(boost::int128::int128_t{-10} == "-0b1010"_I128); - BOOST_TEST(boost::int128::int128_t{-511} == "-0777"_i128); + BOOST_TEST(boost::int128::int128{-255} == "-0xFF"_i128); + BOOST_TEST(boost::int128::int128{-10} == "-0b1010"_I128); + BOOST_TEST(boost::int128::int128{-511} == "-0777"_i128); // A full-width positive value written in hexadecimal is the maximum - const boost::int128::int128_t max_val {std::numeric_limits::max()}; + const boost::int128::int128 max_val {std::numeric_limits::max()}; BOOST_TEST(max_val == 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_i128); // MSVC 14.1 ICE #if !defined(_MSC_VER) || _MSC_VER >= 1920 - static_assert(-0x10_i128 == boost::int128::int128_t{-16}, "constexpr signed hex"); + static_assert(-0x10_i128 == boost::int128::int128{-16}, "constexpr signed hex"); #endif } diff --git a/test/test_midpoint.cpp b/test/test_midpoint.cpp index 4c056b81..e1476fa8 100644 --- a/test/test_midpoint.cpp +++ b/test/test_midpoint.cpp @@ -40,25 +40,25 @@ template void test_big(); template <> -void test_big() +void test_big() { - using boost::int128::uint128_t; + using boost::int128::uint128; using boost::int128::midpoint; - constexpr auto max = std::numeric_limits::max(); + constexpr auto max = std::numeric_limits::max(); - BOOST_TEST_EQ(BOOST_INT128_UINT128_C(170141183460469231731687303715884105728), midpoint(max, std::numeric_limits::min())); + BOOST_TEST_EQ(BOOST_INT128_UINT128_C(170141183460469231731687303715884105728), midpoint(max, std::numeric_limits::min())); BOOST_TEST_EQ(max - 1u, midpoint(max, max - 2u)); } template <> -void test_big() +void test_big() { - using boost::int128::int128_t; + using boost::int128::int128; using boost::int128::midpoint; - constexpr auto max = std::numeric_limits::max(); - constexpr auto min = std::numeric_limits::min(); + constexpr auto max = std::numeric_limits::max(); + constexpr auto min = std::numeric_limits::min(); BOOST_TEST_EQ(0, midpoint(max, min)); @@ -69,14 +69,14 @@ void test_big() int main() { - test_trivial(); - test_trivial(); + test_trivial(); + test_trivial(); - test_rounding(); - test_rounding(); + test_rounding(); + test_rounding(); - test_big(); - test_big(); + test_big(); + test_big(); return boost::report_errors(); } diff --git a/test/test_mixed_type_sign_compare.cpp b/test/test_mixed_type_sign_compare.cpp index b2e868f3..833e2a8b 100644 --- a/test/test_mixed_type_sign_compare.cpp +++ b/test/test_mixed_type_sign_compare.cpp @@ -30,8 +30,8 @@ void test_left_unsigned() const auto lhs {u_dist(rng)}; const auto rhs {i_dist(rng)}; - const uint128_t lib_lhs {lhs}; - const int128_t lib_rhs {rhs}; + const uint128 lib_lhs {lhs}; + const int128 lib_rhs {rhs}; // Builtin oracle: same-rank int128/uint128 -> both promote to unsigned __int128 const builtin_u128 builtin_lhs {lhs}; @@ -47,10 +47,10 @@ void test_left_unsigned() // Edge cases that the old deviations would have answered differently { - const uint128_t lhs {42u}; - const int128_t rhs {-42}; + const uint128 lhs {42u}; + const int128 rhs {-42}; - // Builtin: int128_t(-42) -> unsigned huge; 42 vs huge + // Builtin: int128(-42) -> unsigned huge; 42 vs huge BOOST_TEST_EQ(lhs == rhs, false); BOOST_TEST_EQ(lhs != rhs, true); BOOST_TEST_EQ(lhs < rhs, true); // 42 < huge @@ -69,8 +69,8 @@ void test_right_unsigned() const auto lhs {i_dist(rng)}; const auto rhs {u_dist(rng)}; - const int128_t lib_lhs {lhs}; - const uint128_t lib_rhs {rhs}; + const int128 lib_lhs {lhs}; + const uint128 lib_rhs {rhs}; const builtin_u128 builtin_lhs = static_cast(static_cast<__int128>(lhs)); const builtin_u128 builtin_rhs {rhs}; @@ -84,10 +84,10 @@ void test_right_unsigned() } { - const int128_t lhs {-42}; - const uint128_t rhs {42u}; + const int128 lhs {-42}; + const uint128 rhs {42u}; - // Builtin: int128_t(-42) -> unsigned huge; huge vs 42 + // Builtin: int128(-42) -> unsigned huge; huge vs 42 BOOST_TEST_EQ(lhs == rhs, false); BOOST_TEST_EQ(lhs != rhs, true); BOOST_TEST_EQ(lhs < rhs, false); // huge not < 42 diff --git a/test/test_mixed_type_sign_conversion.cpp b/test/test_mixed_type_sign_conversion.cpp index 8c5f41ad..fe7c261a 100644 --- a/test/test_mixed_type_sign_conversion.cpp +++ b/test/test_mixed_type_sign_conversion.cpp @@ -39,29 +39,29 @@ void test() continue; // skip divide/modulo by zero } - const uint128_t lhs_u {u_val}; - const int128_t rhs_i {i_val}; + const uint128 lhs_u {u_val}; + const int128 rhs_i {i_val}; // Builtin oracle: both operands promoted to unsigned __int128 const builtin_u128 builtin_lhs {u_val}; const builtin_u128 builtin_rhs = static_cast(static_cast<__int128>(i_val)); - BOOST_TEST_EQ(lhs_u + rhs_i, uint128_t{builtin_lhs + builtin_rhs}); - BOOST_TEST_EQ(lhs_u - rhs_i, uint128_t{builtin_lhs - builtin_rhs}); - BOOST_TEST_EQ(lhs_u * rhs_i, uint128_t{builtin_lhs * builtin_rhs}); - BOOST_TEST_EQ(lhs_u / rhs_i, uint128_t{builtin_lhs / builtin_rhs}); - BOOST_TEST_EQ(lhs_u % rhs_i, uint128_t{builtin_lhs % builtin_rhs}); + BOOST_TEST_EQ(lhs_u + rhs_i, uint128{builtin_lhs + builtin_rhs}); + BOOST_TEST_EQ(lhs_u - rhs_i, uint128{builtin_lhs - builtin_rhs}); + BOOST_TEST_EQ(lhs_u * rhs_i, uint128{builtin_lhs * builtin_rhs}); + BOOST_TEST_EQ(lhs_u / rhs_i, uint128{builtin_lhs / builtin_rhs}); + BOOST_TEST_EQ(lhs_u % rhs_i, uint128{builtin_lhs % builtin_rhs}); // Reverse operand order if (u_val == 0) { continue; } - BOOST_TEST_EQ(rhs_i + lhs_u, uint128_t{builtin_rhs + builtin_lhs}); - BOOST_TEST_EQ(rhs_i - lhs_u, uint128_t{builtin_rhs - builtin_lhs}); - BOOST_TEST_EQ(rhs_i * lhs_u, uint128_t{builtin_rhs * builtin_lhs}); - BOOST_TEST_EQ(rhs_i / lhs_u, uint128_t{builtin_rhs / builtin_lhs}); - BOOST_TEST_EQ(rhs_i % lhs_u, uint128_t{builtin_rhs % builtin_lhs}); + BOOST_TEST_EQ(rhs_i + lhs_u, uint128{builtin_rhs + builtin_lhs}); + BOOST_TEST_EQ(rhs_i - lhs_u, uint128{builtin_rhs - builtin_lhs}); + BOOST_TEST_EQ(rhs_i * lhs_u, uint128{builtin_rhs * builtin_lhs}); + BOOST_TEST_EQ(rhs_i / lhs_u, uint128{builtin_rhs / builtin_lhs}); + BOOST_TEST_EQ(rhs_i % lhs_u, uint128{builtin_rhs % builtin_lhs}); } } diff --git a/test/test_num_digits.cpp b/test/test_num_digits.cpp index e709b4d0..c01cf23c 100644 --- a/test/test_num_digits.cpp +++ b/test/test_num_digits.cpp @@ -20,18 +20,18 @@ #endif static std::mt19937_64 rng{42}; -boost::random::uniform_int_distribution dist(std::numeric_limits::min(), - std::numeric_limits::max()); - -constexpr std::array edge_cases {{ - boost::int128::uint128_t{1, 0}, - boost::int128::uint128_t{1, 1}, - boost::int128::uint128_t{2, 0}, - boost::int128::uint128_t{2, UINT64_MAX - 1U}, - boost::int128::uint128_t{4, 0}, +boost::random::uniform_int_distribution dist(std::numeric_limits::min(), + std::numeric_limits::max()); + +constexpr std::array edge_cases {{ + boost::int128::uint128{1, 0}, + boost::int128::uint128{1, 1}, + boost::int128::uint128{2, 0}, + boost::int128::uint128{2, UINT64_MAX - 1U}, + boost::int128::uint128{4, 0}, }}; -constexpr int trivial_num_digits(boost::int128::uint128_t x) noexcept +constexpr int trivial_num_digits(boost::int128::uint128 x) noexcept { int digits = 0; diff --git a/test/test_popcount.cu b/test/test_popcount.cu index a819ee09..8c50be38 100644 --- a/test/test_popcount.cu +++ b/test/test_popcount.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, int *out, int numElements) { diff --git a/test/test_popcount_sycl.cpp b/test/test_popcount_sycl.cpp index dcddf7b3..6f82dd10 100644 --- a/test/test_popcount_sycl.cpp +++ b/test/test_popcount_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return boost::int128::popcount(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return boost::int128::popcount(a); }); } diff --git a/test/test_powm.cpp b/test/test_powm.cpp index f1045ba7..87442bb5 100644 --- a/test/test_powm.cpp +++ b/test/test_powm.cpp @@ -28,113 +28,113 @@ using namespace boost::int128; void test_uint128_powm_basic() { - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{10}, uint128_t{1000}), uint128_t{24}); - BOOST_TEST_EQ(powm(uint128_t{3}, uint128_t{5}, uint128_t{7}), uint128_t{5}); - BOOST_TEST_EQ(powm(uint128_t{7}, uint128_t{13}, uint128_t{19}), uint128_t{7}); - BOOST_TEST_EQ(powm(uint128_t{5}, uint128_t{10}, uint128_t{13}), uint128_t{12}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{10}, uint128{1000}), uint128{24}); + BOOST_TEST_EQ(powm(uint128{3}, uint128{5}, uint128{7}), uint128{5}); + BOOST_TEST_EQ(powm(uint128{7}, uint128{13}, uint128{19}), uint128{7}); + BOOST_TEST_EQ(powm(uint128{5}, uint128{10}, uint128{13}), uint128{12}); // 10^9 ~ -7 (mod 1000000007), so 10^18 ~ 49. - BOOST_TEST_EQ(powm(uint128_t{10}, uint128_t{18}, uint128_t{1000000007}), uint128_t{49}); + BOOST_TEST_EQ(powm(uint128{10}, uint128{18}, uint128{1000000007}), uint128{49}); // exp == 0 - BOOST_TEST_EQ(powm(uint128_t{5}, uint128_t{0}, uint128_t{1000}), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{0}, uint128_t{0}, uint128_t{7}), uint128_t{1}); + BOOST_TEST_EQ(powm(uint128{5}, uint128{0}, uint128{1000}), uint128{1}); + BOOST_TEST_EQ(powm(uint128{0}, uint128{0}, uint128{7}), uint128{1}); // base == 0 - BOOST_TEST_EQ(powm(uint128_t{0}, uint128_t{5}, uint128_t{7}), uint128_t{0}); - BOOST_TEST_EQ(powm(uint128_t{0}, uint128_t{1}, uint128_t{7}), uint128_t{0}); + BOOST_TEST_EQ(powm(uint128{0}, uint128{5}, uint128{7}), uint128{0}); + BOOST_TEST_EQ(powm(uint128{0}, uint128{1}, uint128{7}), uint128{0}); // base == 1 - BOOST_TEST_EQ(powm(uint128_t{1}, uint128_t{1000}, uint128_t{42}), uint128_t{1}); + BOOST_TEST_EQ(powm(uint128{1}, uint128{1000}, uint128{42}), uint128{1}); // exp == 1 - BOOST_TEST_EQ(powm(uint128_t{42}, uint128_t{1}, uint128_t{100}), uint128_t{42}); + BOOST_TEST_EQ(powm(uint128{42}, uint128{1}, uint128{100}), uint128{42}); // m == 1 - BOOST_TEST_EQ(powm(uint128_t{42}, uint128_t{17}, uint128_t{1}), uint128_t{0}); + BOOST_TEST_EQ(powm(uint128{42}, uint128{17}, uint128{1}), uint128{0}); // m == 0 - documented to return 0 - BOOST_TEST_EQ(powm(uint128_t{42}, uint128_t{17}, uint128_t{0}), uint128_t{0}); + BOOST_TEST_EQ(powm(uint128{42}, uint128{17}, uint128{0}), uint128{0}); // Base larger than the modulus must be reduced first. - BOOST_TEST_EQ(powm(uint128_t{1234567}, uint128_t{2}, uint128_t{1000}), uint128_t{(1234567ULL * 1234567ULL) % 1000ULL}); + BOOST_TEST_EQ(powm(uint128{1234567}, uint128{2}, uint128{1000}), uint128{(1234567ULL * 1234567ULL) % 1000ULL}); } void test_uint128_powm_power_of_two_modulus() { - BOOST_TEST_EQ(powm(uint128_t{3}, uint128_t{10}, uint128_t{128}), uint128_t{41}); - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{7}, uint128_t{128}), uint128_t{0}); - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{6}, uint128_t{128}), uint128_t{64}); - - const uint128_t m32 {static_cast(1) << 32}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{32}, m32), uint128_t{0}); - BOOST_TEST_EQ(powm(uint128_t{3}, uint128_t{20}, m32), uint128_t{3486784401ULL}); - - const uint128_t m64 {1U, 0U}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{64}, m64), uint128_t{0}); - const uint128_t high_bit {0U, static_cast(1) << 63}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{63}, m64), high_bit); - - const uint128_t m127 {static_cast(1) << 63, 0U}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{127}, m127), uint128_t{0}); - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{126}, m127), m127 >> 1); + BOOST_TEST_EQ(powm(uint128{3}, uint128{10}, uint128{128}), uint128{41}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{7}, uint128{128}), uint128{0}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{6}, uint128{128}), uint128{64}); + + const uint128 m32 {static_cast(1) << 32}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{32}, m32), uint128{0}); + BOOST_TEST_EQ(powm(uint128{3}, uint128{20}, m32), uint128{3486784401ULL}); + + const uint128 m64 {1U, 0U}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{64}, m64), uint128{0}); + const uint128 high_bit {0U, static_cast(1) << 63}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{63}, m64), high_bit); + + const uint128 m127 {static_cast(1) << 63, 0U}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{127}, m127), uint128{0}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{126}, m127), m127 >> 1); } void test_uint128_powm_fermat_64bit() { // Mersenne prime p = 2^61 - 1. - const uint128_t p {UINT64_C(2305843009213693951)}; + const uint128 p {UINT64_C(2305843009213693951)}; for (std::uint64_t a {2}; a < 25; ++a) { - BOOST_TEST_EQ(powm(uint128_t{a}, p - 1U, p), uint128_t{1}); + BOOST_TEST_EQ(powm(uint128{a}, p - 1U, p), uint128{1}); } // Common 32-bit primes that show up in competitive math problems. - const uint128_t mod_a {UINT64_C(1000000007)}; - const uint128_t mod_b {UINT64_C(998244353)}; + const uint128 mod_a {UINT64_C(1000000007)}; + const uint128 mod_b {UINT64_C(998244353)}; for (std::uint64_t a {2}; a < 10; ++a) { - BOOST_TEST_EQ(powm(uint128_t{a}, mod_a - 1U, mod_a), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{a}, mod_b - 1U, mod_b), uint128_t{1}); + BOOST_TEST_EQ(powm(uint128{a}, mod_a - 1U, mod_a), uint128{1}); + BOOST_TEST_EQ(powm(uint128{a}, mod_b - 1U, mod_b), uint128{1}); } } void test_uint128_powm_fermat_128bit() { // Mersenne prime p = 2^127 - 1 = 170141183460469231731687303715884105727. - const uint128_t p {UINT64_C(0x7FFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF)}; + const uint128 p {UINT64_C(0x7FFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF)}; for (std::uint64_t a {2}; a < 6; ++a) { - BOOST_TEST_EQ(powm(uint128_t{a}, p - 1U, p), uint128_t{1}); + BOOST_TEST_EQ(powm(uint128{a}, p - 1U, p), uint128{1}); } // a^p mod p == a mod p for prime p (Fermat). - const uint128_t big_base {UINT64_C(0x0123456789ABCDEF), UINT64_C(0xFEDCBA9876543210)}; + const uint128 big_base {UINT64_C(0x0123456789ABCDEF), UINT64_C(0xFEDCBA9876543210)}; BOOST_TEST_EQ(powm(big_base, p, p), big_base % p); } void test_uint128_powm_properties() { // (a^(b+c)) mod m == ((a^b)(a^c)) mod m - const uint128_t m {UINT64_C(1000000007)}; - const uint128_t a {42}; - const uint128_t b {17}; - const uint128_t c {23}; + const uint128 m {UINT64_C(1000000007)}; + const uint128 a {42}; + const uint128 b {17}; + const uint128 c {23}; BOOST_TEST_EQ(powm(a, b + c, m), (powm(a, b, m) * powm(a, c, m)) % m); // (a^e * b^e) mod m == ((a*b)^e) mod m - const uint128_t aa {7}; - const uint128_t bb {11}; - const uint128_t e {30}; + const uint128 aa {7}; + const uint128 bb {11}; + const uint128 e {30}; BOOST_TEST_EQ(powm(aa * bb, e, m), (powm(aa, e, m) * powm(bb, e, m)) % m); // Same identities through the full-128-bit code path. - const uint128_t big_m {1U, UINT64_C(0xDEADBEEFCAFEBABE)}; - const uint128_t big_a {UINT64_C(0x00000000DEADBEEF), UINT64_C(0xBEEFCAFEFACEFEED)}; - const uint128_t b1 {13}; - const uint128_t b2 {21}; + const uint128 big_m {1U, UINT64_C(0xDEADBEEFCAFEBABE)}; + const uint128 big_a {UINT64_C(0x00000000DEADBEEF), UINT64_C(0xBEEFCAFEFACEFEED)}; + const uint128 b1 {13}; + const uint128 b2 {21}; BOOST_TEST_EQ(powm(big_a, b1 + b2, big_m), detail::mulmod_shift(powm(big_a, b1, big_m), powm(big_a, b2, big_m), big_m)); } @@ -142,54 +142,54 @@ void test_uint128_powm_extreme() { // Modulus exactly 2^64 - 1: not a power of two, exercises the small-m path // at its upper boundary. Since 2^64 ~ 1 (mod 2^64 - 1), 2^64 mod m == 1. - const uint128_t m_u64max {(std::numeric_limits::max)()}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{64}, m_u64max), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{3}, uint128_t{0}, m_u64max), uint128_t{1}); + const uint128 m_u64max {(std::numeric_limits::max)()}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{64}, m_u64max), uint128{1}); + BOOST_TEST_EQ(powm(uint128{3}, uint128{0}, m_u64max), uint128{1}); // 2^65 - 1 forces the general 128-bit path. 2^65 ~ 1 (mod 2^65 - 1). - const uint128_t m65 {1U, UINT64_C(0xFFFFFFFFFFFFFFFF)}; - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{65}, m65), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{130}, m65), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{2}, uint128_t{64}, m65), (uint128_t{1U, 0U})); - BOOST_TEST_EQ(powm(uint128_t{4}, uint128_t{65}, m65), uint128_t{1}); + const uint128 m65 {1U, UINT64_C(0xFFFFFFFFFFFFFFFF)}; + BOOST_TEST_EQ(powm(uint128{2}, uint128{65}, m65), uint128{1}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{130}, m65), uint128{1}); + BOOST_TEST_EQ(powm(uint128{2}, uint128{64}, m65), (uint128{1U, 0U})); + BOOST_TEST_EQ(powm(uint128{4}, uint128{65}, m65), uint128{1}); // Full 128-bit modulus with high bit set so addmod must take the overflow // branch when doubling values near m. - const uint128_t m_high {UINT64_C(0x8000000000000001), 0U}; - BOOST_TEST_EQ(powm(uint128_t{1}, uint128_t{1234567}, m_high), uint128_t{1}); - BOOST_TEST_EQ(powm(uint128_t{0}, uint128_t{1234567}, m_high), uint128_t{0}); + const uint128 m_high {UINT64_C(0x8000000000000001), 0U}; + BOOST_TEST_EQ(powm(uint128{1}, uint128{1234567}, m_high), uint128{1}); + BOOST_TEST_EQ(powm(uint128{0}, uint128{1234567}, m_high), uint128{0}); // Small base whose square still fits in 128 bits gives a hand-verifiable // answer while still routing through the shift-and-add path. - BOOST_TEST_EQ(powm(uint128_t{10}, uint128_t{4}, m_high), uint128_t{10000}); + BOOST_TEST_EQ(powm(uint128{10}, uint128{4}, m_high), uint128{10000}); } void test_int128_powm() { - BOOST_TEST_EQ(powm(int128_t{2}, int128_t{10}, int128_t{1000}), int128_t{24}); - BOOST_TEST_EQ(powm(int128_t{3}, int128_t{5}, int128_t{7}), int128_t{5}); + BOOST_TEST_EQ(powm(int128{2}, int128{10}, int128{1000}), int128{24}); + BOOST_TEST_EQ(powm(int128{3}, int128{5}, int128{7}), int128{5}); // Negative bases reduce to non-negative residues. - BOOST_TEST_EQ(powm(int128_t{-3}, int128_t{2}, int128_t{5}), int128_t{4}); - BOOST_TEST_EQ(powm(int128_t{-3}, int128_t{3}, int128_t{5}), int128_t{3}); - BOOST_TEST_EQ(powm(int128_t{-1}, int128_t{100}, int128_t{1000}), int128_t{1}); - BOOST_TEST_EQ(powm(int128_t{-1}, int128_t{101}, int128_t{1000}), int128_t{999}); + BOOST_TEST_EQ(powm(int128{-3}, int128{2}, int128{5}), int128{4}); + BOOST_TEST_EQ(powm(int128{-3}, int128{3}, int128{5}), int128{3}); + BOOST_TEST_EQ(powm(int128{-1}, int128{100}, int128{1000}), int128{1}); + BOOST_TEST_EQ(powm(int128{-1}, int128{101}, int128{1000}), int128{999}); // Negative base where the magnitude is a multiple of m reduces to 0. - BOOST_TEST_EQ(powm(int128_t{-10}, int128_t{5}, int128_t{5}), int128_t{0}); + BOOST_TEST_EQ(powm(int128{-10}, int128{5}, int128{5}), int128{0}); // INT128_MIN handling: abs() preserves the bit pattern, which maps to 2^127 - // when reinterpreted as uint128_t. 2^127 mod 5 == 3 (since 2^4 ~ 1 (mod 5) + // when reinterpreted as uint128. 2^127 mod 5 == 3 (since 2^4 ~ 1 (mod 5) // gives 2^127 = 2^(4*31+3) ~ 8 ~ 3), so the negative residue is 5 - 3 = 2. - BOOST_TEST_EQ(powm((std::numeric_limits::min)(), int128_t{1}, int128_t{5}), int128_t{2}); + BOOST_TEST_EQ(powm((std::numeric_limits::min)(), int128{1}, int128{5}), int128{2}); // 2^127 mod 7 == 2 (since 2^3 ~ 1 (mod 7), 2^127 = 2^(3*42+1) ~ 2), so the // residue of -2^127 mod 7 is 7 - 2 = 5. - BOOST_TEST_EQ(powm((std::numeric_limits::min)(), int128_t{1}, int128_t{7}), int128_t{5}); + BOOST_TEST_EQ(powm((std::numeric_limits::min)(), int128{1}, int128{7}), int128{5}); // Invalid arguments are documented to return 0. - BOOST_TEST_EQ(powm(int128_t{2}, int128_t{10}, int128_t{0}), int128_t{0}); - BOOST_TEST_EQ(powm(int128_t{2}, int128_t{10}, int128_t{-5}), int128_t{0}); - BOOST_TEST_EQ(powm(int128_t{2}, int128_t{-1}, int128_t{5}), int128_t{0}); + BOOST_TEST_EQ(powm(int128{2}, int128{10}, int128{0}), int128{0}); + BOOST_TEST_EQ(powm(int128{2}, int128{10}, int128{-5}), int128{0}); + BOOST_TEST_EQ(powm(int128{2}, int128{-1}, int128{5}), int128{0}); } // Only present with MSVC 14.1 @@ -201,14 +201,14 @@ void test_int128_powm() void test_constexpr_powm() { - constexpr uint128_t r1 {powm(uint128_t{2}, uint128_t{10}, uint128_t{1000})}; - static_assert(r1 == uint128_t{24}, "powm constexpr small case"); + constexpr uint128 r1 {powm(uint128{2}, uint128{10}, uint128{1000})}; + static_assert(r1 == uint128{24}, "powm constexpr small case"); - constexpr uint128_t r2 {powm(uint128_t{3}, uint128_t{10}, uint128_t{128})}; - static_assert(r2 == uint128_t{41}, "powm constexpr power-of-two modulus"); + constexpr uint128 r2 {powm(uint128{3}, uint128{10}, uint128{128})}; + static_assert(r2 == uint128{41}, "powm constexpr power-of-two modulus"); - constexpr int128_t r3 {powm(int128_t{-3}, int128_t{3}, int128_t{5})}; - static_assert(r3 == int128_t{3}, "powm constexpr signed"); + constexpr int128 r3 {powm(int128{-3}, int128{3}, int128{5})}; + static_assert(r3 == int128{3}, "powm constexpr signed"); } int main() diff --git a/test/test_rotl.cu b/test/test_rotl.cu index 6056552f..45b31b42 100644 --- a/test/test_rotl.cu +++ b/test/test_rotl.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const int *shift, test_type *out, int numElements) { diff --git a/test/test_rotl_sycl.cpp b/test/test_rotl_sycl.cpp index 455937e2..0351c45f 100644 --- a/test/test_rotl_sycl.cpp +++ b/test/test_rotl_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int i) { return boost::int128::rotl(a, i % 128); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int i) { return boost::int128::rotl(a, i % 128); }); } diff --git a/test/test_rotr.cu b/test/test_rotr.cu index 619bab6f..259f15d7 100644 --- a/test/test_rotr.cu +++ b/test/test_rotr.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const int *shift, test_type *out, int numElements) { diff --git a/test/test_rotr_sycl.cpp b/test/test_rotr_sycl.cpp index 3b84d634..9eca2818 100644 --- a/test/test_rotr_sycl.cpp +++ b/test/test_rotr_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int i) { return boost::int128::rotr(a, i % 128); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int i) { return boost::int128::rotr(a, i % 128); }); } diff --git a/test/test_saturating_arith.cpp b/test/test_saturating_arith.cpp index 6e790195..58f20be3 100644 --- a/test/test_saturating_arith.cpp +++ b/test/test_saturating_arith.cpp @@ -15,26 +15,26 @@ template void test_add_sat(); template <> -void test_add_sat() +void test_add_sat() { using boost::int128::saturating_add; - auto near_max {std::numeric_limits::max() - boost::int128::uint128_t{5}}; + auto near_max {std::numeric_limits::max() - boost::int128::uint128{5}}; - for (boost::int128::uint128_t i {0}; i < boost::int128::uint128_t{5}; ++i) + for (boost::int128::uint128 i {0}; i < boost::int128::uint128{5}; ++i) { const auto sat_res {saturating_add(near_max, i)}; - BOOST_TEST(sat_res < std::numeric_limits::max()); + BOOST_TEST(sat_res < std::numeric_limits::max()); const auto res {near_max + i}; BOOST_TEST(sat_res == res); } - near_max += boost::int128::uint128_t{5}; - for (boost::int128::uint128_t i {1}; i < boost::int128::uint128_t{5}; ++i) + near_max += boost::int128::uint128{5}; + for (boost::int128::uint128 i {1}; i < boost::int128::uint128{5}; ++i) { const auto sat_res {saturating_add(near_max, i)}; - BOOST_TEST(sat_res == std::numeric_limits::max()); + BOOST_TEST(sat_res == std::numeric_limits::max()); const auto res {near_max + i}; BOOST_TEST(sat_res != res); @@ -42,7 +42,7 @@ void test_add_sat() } template <> -void test_add_sat() +void test_add_sat() { // There are four branches that need to be tested // 1) x > 0 && y > 0 @@ -52,14 +52,14 @@ void test_add_sat() using boost::int128::saturating_add; - constexpr auto min {std::numeric_limits::min()}; - constexpr auto max {std::numeric_limits::max()}; + constexpr auto min {std::numeric_limits::min()}; + constexpr auto max {std::numeric_limits::max()}; // 1 - We can only overflow, but there are many such cases { - auto near_max {max - boost::int128::int128_t{5}}; + auto near_max {max - boost::int128::int128{5}}; - for (boost::int128::int128_t i {0}; i < boost::int128::int128_t{5}; ++i) + for (boost::int128::int128 i {0}; i < boost::int128::int128{5}; ++i) { const auto sat_res {saturating_add(near_max, i)}; BOOST_TEST(sat_res < max); @@ -68,8 +68,8 @@ void test_add_sat() BOOST_TEST(sat_res == res); } - near_max += boost::int128::int128_t{5}; - for (boost::int128::int128_t i {1}; i < boost::int128::int128_t{5}; ++i) + near_max += boost::int128::int128{5}; + for (boost::int128::int128 i {1}; i < boost::int128::int128{5}; ++i) { const auto sat_res {saturating_add(near_max, i)}; BOOST_TEST(sat_res == max); @@ -80,8 +80,8 @@ void test_add_sat() { for (std::size_t i {0}; i < N; ++i) { - boost::int128::int128_t x {signed_dist(rng), dist(rng)}; - boost::int128::int128_t y {signed_dist(rng), dist(rng)}; + boost::int128::int128 x {signed_dist(rng), dist(rng)}; + boost::int128::int128 y {signed_dist(rng), dist(rng)}; if (x > 0) { @@ -106,8 +106,8 @@ void test_add_sat() { for (std::size_t i {0}; i < N; ++i) { - boost::int128::int128_t x {signed_dist(rng), dist(rng)}; - boost::int128::int128_t y {signed_dist(rng), dist(rng)}; + boost::int128::int128 x {signed_dist(rng), dist(rng)}; + boost::int128::int128 y {signed_dist(rng), dist(rng)}; if (x < 0) { @@ -130,9 +130,9 @@ void test_add_sat() // 4 - We can only underflow, and there exist many ways to do so { - auto near_min {min + boost::int128::int128_t{5}}; + auto near_min {min + boost::int128::int128{5}}; - for (boost::int128::int128_t i {0}; i > boost::int128::int128_t{-5}; --i) + for (boost::int128::int128 i {0}; i > boost::int128::int128{-5}; --i) { const auto sat_res {saturating_add(near_min, i)}; BOOST_TEST(sat_res > min); @@ -141,8 +141,8 @@ void test_add_sat() BOOST_TEST(sat_res == res); } - near_min -= boost::int128::int128_t{5}; - for (boost::int128::int128_t i {-1}; i > boost::int128::int128_t{-5}; --i) + near_min -= boost::int128::int128{5}; + for (boost::int128::int128 i {-1}; i > boost::int128::int128{-5}; --i) { const auto sat_res {saturating_add(near_min, i)}; BOOST_TEST(sat_res == min); @@ -154,26 +154,26 @@ template void test_sub_sat(); template <> -void test_sub_sat() +void test_sub_sat() { using boost::int128::saturating_sub; - auto near_min {std::numeric_limits::min() + boost::int128::uint128_t{5}}; + auto near_min {std::numeric_limits::min() + boost::int128::uint128{5}}; - for (boost::int128::uint128_t i {0}; i < boost::int128::uint128_t{5}; ++i) + for (boost::int128::uint128 i {0}; i < boost::int128::uint128{5}; ++i) { const auto sat_res {saturating_sub(near_min, i)}; - BOOST_TEST(sat_res > std::numeric_limits::min()); + BOOST_TEST(sat_res > std::numeric_limits::min()); const auto res {near_min - i}; BOOST_TEST(sat_res == res); } - near_min -= boost::int128::uint128_t{5}; - for (boost::int128::uint128_t i {1}; i < boost::int128::uint128_t{5}; ++i) + near_min -= boost::int128::uint128{5}; + for (boost::int128::uint128 i {1}; i < boost::int128::uint128{5}; ++i) { const auto sat_res {saturating_sub(near_min, i)}; - BOOST_TEST(sat_res == std::numeric_limits::min()); + BOOST_TEST(sat_res == std::numeric_limits::min()); const auto res {near_min + i}; BOOST_TEST(sat_res != res); @@ -181,7 +181,7 @@ void test_sub_sat() } template <> -void test_sub_sat() +void test_sub_sat() { // The same as saturating_add but the logic backwards // There are four branches that need to be tested @@ -192,15 +192,15 @@ void test_sub_sat() using boost::int128::saturating_sub; - constexpr auto min {std::numeric_limits::min()}; - constexpr auto max {std::numeric_limits::max()}; + constexpr auto min {std::numeric_limits::min()}; + constexpr auto max {std::numeric_limits::max()}; // 1 - Nothing bad can happen here { for (std::size_t i {0}; i < N; ++i) { - boost::int128::int128_t x {signed_dist(rng), dist(rng)}; - boost::int128::int128_t y {signed_dist(rng), dist(rng)}; + boost::int128::int128 x {signed_dist(rng), dist(rng)}; + boost::int128::int128 y {signed_dist(rng), dist(rng)}; if (x < 0) { @@ -223,9 +223,9 @@ void test_sub_sat() // 2 - Underflow is possible in this case { - auto near_min {min + boost::int128::int128_t{5}}; + auto near_min {min + boost::int128::int128{5}}; - for (boost::int128::int128_t i {0}; i < boost::int128::int128_t{5}; ++i) + for (boost::int128::int128 i {0}; i < boost::int128::int128{5}; ++i) { const auto sat_res {saturating_sub(near_min, i)}; BOOST_TEST(sat_res > min); @@ -235,7 +235,7 @@ void test_sub_sat() } near_min = min; - for (boost::int128::int128_t i {1}; i < boost::int128::int128_t{5}; ++i) + for (boost::int128::int128 i {1}; i < boost::int128::int128{5}; ++i) { const auto sat_res {saturating_sub(near_min, i)}; BOOST_TEST(sat_res == min); @@ -250,9 +250,9 @@ void test_sub_sat() // 3 - Overflow is possible in this case { - auto near_max {max - boost::int128::int128_t{5}}; + auto near_max {max - boost::int128::int128{5}}; - for (boost::int128::int128_t i {0}; i > boost::int128::int128_t{-5}; --i) + for (boost::int128::int128 i {0}; i > boost::int128::int128{-5}; --i) { const auto sat_res {saturating_sub(near_max, i)}; BOOST_TEST(sat_res < max); @@ -261,8 +261,8 @@ void test_sub_sat() BOOST_TEST(sat_res == res); } - near_max += boost::int128::int128_t{5}; - for (boost::int128::int128_t i {-1}; i > boost::int128::int128_t{-5}; --i) + near_max += boost::int128::int128{5}; + for (boost::int128::int128 i {-1}; i > boost::int128::int128{-5}; --i) { const auto sat_res {saturating_sub(near_max, i)}; BOOST_TEST(sat_res == max); @@ -273,8 +273,8 @@ void test_sub_sat() { for (std::size_t i {0}; i < N; ++i) { - boost::int128::int128_t x {signed_dist(rng), dist(rng)}; - boost::int128::int128_t y {signed_dist(rng), dist(rng)}; + boost::int128::int128 x {signed_dist(rng), dist(rng)}; + boost::int128::int128 y {signed_dist(rng), dist(rng)}; if (x > 0) { @@ -300,18 +300,18 @@ template void test_mul_sat(); template <> -void test_mul_sat() +void test_mul_sat() { using boost::int128::saturating_mul; - boost::int128::uint128_t x {2U}; - boost::int128::uint128_t y {2U}; + boost::int128::uint128 x {2U}; + boost::int128::uint128 y {2U}; int bit_count {4}; while (bit_count <= 128) { const auto sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res < std::numeric_limits::max()); + BOOST_TEST(sat_res < std::numeric_limits::max()); const auto res {x * y}; BOOST_TEST(res == sat_res); @@ -325,7 +325,7 @@ void test_mul_sat() while (bit_count < 256) { const auto sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res == std::numeric_limits::max()); + BOOST_TEST(sat_res == std::numeric_limits::max()); const auto res {x * y}; BOOST_TEST(res != sat_res); @@ -339,19 +339,19 @@ void test_mul_sat() } template <> -void test_mul_sat() +void test_mul_sat() { using boost::int128::saturating_mul; { - boost::int128::int128_t x {2}; - boost::int128::int128_t y {2}; + boost::int128::int128 x {2}; + boost::int128::int128 y {2}; int bit_count {4}; while (bit_count < 128) { const auto sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res < std::numeric_limits::max()); + BOOST_TEST(sat_res < std::numeric_limits::max()); const auto res {x * y}; BOOST_TEST(res == sat_res); @@ -365,7 +365,7 @@ void test_mul_sat() while (bit_count < 254) { const auto sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res == std::numeric_limits::max()); + BOOST_TEST(sat_res == std::numeric_limits::max()); const auto res {x * y}; BOOST_TEST(res != sat_res); @@ -377,17 +377,17 @@ void test_mul_sat() } } { - boost::int128::int128_t x {2}; - boost::int128::int128_t y {-2}; + boost::int128::int128 x {2}; + boost::int128::int128 y {-2}; int bit_count {4}; while (bit_count < 128) { const auto sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res < std::numeric_limits::max()); - BOOST_TEST(sat_res > std::numeric_limits::min()); + BOOST_TEST(sat_res < std::numeric_limits::max()); + BOOST_TEST(sat_res > std::numeric_limits::min()); - const boost::int128::int128_t res {x * y}; + const boost::int128::int128 res {x * y}; BOOST_TEST(res == sat_res); x <<= 1; @@ -403,8 +403,8 @@ void test_mul_sat() return; // LCOV_EXCL_LINE } - const boost::int128::int128_t sat_res {saturating_mul(x, y)}; - BOOST_TEST(sat_res == std::numeric_limits::min()); + const boost::int128::int128 sat_res {saturating_mul(x, y)}; + BOOST_TEST(sat_res == std::numeric_limits::min()); x <<= 1; y *= 2; @@ -417,14 +417,14 @@ template void test_div_sat(); template <> -void test_div_sat() +void test_div_sat() { using boost::int128::saturating_div; for (std::size_t i {}; i < N; ++i) { - const boost::int128::uint128_t value1{dist(rng), dist(rng)}; - const boost::int128::uint128_t value2{dist(rng), dist(rng)}; + const boost::int128::uint128 value1{dist(rng), dist(rng)}; + const boost::int128::uint128 value2{dist(rng), dist(rng)}; const auto sat_res {saturating_div(value1, value2)}; const auto res {value1 / value2}; @@ -434,14 +434,14 @@ void test_div_sat() } template <> -void test_div_sat() +void test_div_sat() { using boost::int128::saturating_div; for (std::size_t i {}; i < N; ++i) { - const boost::int128::int128_t value1{signed_dist(rng), dist(rng)}; - const boost::int128::int128_t value2{signed_dist(rng), dist(rng)}; + const boost::int128::int128 value1{signed_dist(rng), dist(rng)}; + const boost::int128::int128 value2{signed_dist(rng), dist(rng)}; const auto sat_res {saturating_div(value1, value2)}; const auto res {value1 / value2}; @@ -449,8 +449,8 @@ void test_div_sat() BOOST_TEST(sat_res == res); } - constexpr auto min_val {std::numeric_limits::min()}; - constexpr auto max_val{std::numeric_limits::max()}; + constexpr auto min_val {std::numeric_limits::min()}; + constexpr auto max_val{std::numeric_limits::max()}; BOOST_TEST(saturating_div(min_val, -1) == max_val); } @@ -458,14 +458,14 @@ template void test_saturate_cast(); template <> -void test_saturate_cast() +void test_saturate_cast() { using boost::int128::saturating_cast; for (std::size_t i {}; i < N; ++i) { const auto value {dist(rng)}; - const boost::int128::uint128_t big_value{value}; + const boost::int128::uint128 big_value{value}; BOOST_TEST(saturating_cast(big_value) == value); BOOST_TEST(saturating_cast(big_value) == static_cast(big_value)); @@ -474,21 +474,21 @@ void test_saturate_cast() for (std::size_t i {}; i < N; ++i) { const auto value {dist(rng)}; - const boost::int128::uint128_t big_value{value, value}; + const boost::int128::uint128 big_value{value, value}; BOOST_TEST(saturating_cast(big_value) == std::numeric_limits::max()); BOOST_TEST(saturating_cast(big_value) != static_cast(big_value)); } } template <> -void test_saturate_cast() +void test_saturate_cast() { using boost::int128::saturating_cast; for (std::size_t i {}; i < N; ++i) { const auto value {signed_dist(rng)}; - const boost::int128::int128_t big_value{value}; + const boost::int128::int128 big_value{value}; BOOST_TEST(saturating_cast(big_value) == value); BOOST_TEST(saturating_cast(big_value) == static_cast(big_value)); @@ -498,7 +498,7 @@ void test_saturate_cast() { const auto hi_word {signed_dist(rng)}; const auto lo_word {dist(rng)}; - const boost::int128::int128_t big_value{hi_word, lo_word}; + const boost::int128::int128 big_value{hi_word, lo_word}; if (hi_word > 0) { @@ -513,17 +513,17 @@ void test_saturate_cast() int main() { - test_add_sat(); - test_sub_sat(); - test_mul_sat(); - test_div_sat(); - test_saturate_cast(); - - test_add_sat(); - test_sub_sat(); - test_mul_sat(); - test_div_sat(); - test_saturate_cast(); + test_add_sat(); + test_sub_sat(); + test_mul_sat(); + test_div_sat(); + test_saturate_cast(); + + test_add_sat(); + test_sub_sat(); + test_mul_sat(); + test_div_sat(); + test_saturate_cast(); return boost::report_errors(); } diff --git a/test/test_sign_compare.cpp b/test/test_sign_compare.cpp index b6314a12..b915ed12 100644 --- a/test/test_sign_compare.cpp +++ b/test/test_sign_compare.cpp @@ -7,7 +7,7 @@ void test_u128() { - constexpr boost::int128::uint128_t x {5U}; + constexpr boost::int128::uint128 x {5U}; BOOST_TEST(x > 4); BOOST_TEST(x >= 4); BOOST_TEST(x == 5); @@ -18,7 +18,7 @@ void test_u128() void test_int128() { - constexpr boost::int128::int128_t x {5}; + constexpr boost::int128::int128 x {5}; BOOST_TEST(x > 4U); BOOST_TEST(x >= 4U); BOOST_TEST(x == 5U); diff --git a/test/test_signed_add.cu b/test/test_signed_add.cu index c691671f..3a0faf43 100644 --- a/test/test_signed_add.cu +++ b/test/test_signed_add.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_add_sycl.cpp b/test/test_signed_add_sycl.cpp index 503607e9..b8f14bec 100644 --- a/test/test_signed_add_sycl.cpp +++ b/test/test_signed_add_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a + b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a + b; }); } diff --git a/test/test_signed_and.cu b/test/test_signed_and.cu index 36622e5a..a544df6c 100644 --- a/test/test_signed_and.cu +++ b/test/test_signed_and.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_and_sycl.cpp b/test/test_signed_and_sycl.cpp index b07cb135..8b177a30 100644 --- a/test/test_signed_and_sycl.cpp +++ b/test/test_signed_and_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a & b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a & b; }); } diff --git a/test/test_signed_cstdlib_div.cu b/test/test_signed_cstdlib_div.cu index 0c30a435..4790bddc 100644 --- a/test/test_signed_cstdlib_div.cu +++ b/test/test_signed_cstdlib_div.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; using result_type = boost::int128::i128div_t; __global__ void cuda_test(const test_type *in, const test_type *in2, result_type *out, int numElements) diff --git a/test/test_signed_cstdlib_div_sycl.cpp b/test/test_signed_cstdlib_div_sycl.cpp index d29d1e19..60aa0201 100644 --- a/test/test_signed_cstdlib_div_sycl.cpp +++ b/test/test_signed_cstdlib_div_sycl.cpp @@ -4,12 +4,12 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) + return int128_sycl_test::run( + [](int128 a, int128 b, int) { const auto d {boost::int128::div(a, int128_sycl_test::safe_divisor(a, b))}; return d.quot ^ d.rem; diff --git a/test/test_signed_div.cu b/test/test_signed_div.cu index 04957feb..2de54ba6 100644 --- a/test/test_signed_div.cu +++ b/test/test_signed_div.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_div_sycl.cpp b/test/test_signed_div_sycl.cpp index c1e79735..9e82da86 100644 --- a/test/test_signed_div_sycl.cpp +++ b/test/test_signed_div_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return int128_sycl_test::safe_div(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return int128_sycl_test::safe_div(a, b); }); } diff --git a/test/test_signed_eq.cu b/test/test_signed_eq.cu index 7713a3f4..693c4bc7 100644 --- a/test/test_signed_eq.cu +++ b/test/test_signed_eq.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_eq_sycl.cpp b/test/test_signed_eq_sycl.cpp index a189c583..7c1f7b92 100644 --- a/test/test_signed_eq_sycl.cpp +++ b/test/test_signed_eq_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a == b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a == b; }); } diff --git a/test/test_signed_from_chars.cu b/test/test_signed_from_chars.cu index d868fb4c..b2e0001a 100644 --- a/test/test_signed_from_chars.cu +++ b/test/test_signed_from_chars.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; constexpr int BUF_SIZE = 64; diff --git a/test/test_signed_from_chars_bases.cu b/test/test_signed_from_chars_bases.cu index 929d29b7..65ca2605 100644 --- a/test/test_signed_from_chars_bases.cu +++ b/test/test_signed_from_chars_bases.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; constexpr int BUF_SIZE = 192; diff --git a/test/test_signed_from_chars_bases_sycl.cpp b/test/test_signed_from_chars_bases_sycl.cpp index 4eff473f..1579a027 100644 --- a/test/test_signed_from_chars_bases_sycl.cpp +++ b/test/test_signed_from_chars_bases_sycl.cpp @@ -4,14 +4,14 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { int result {0}; - result |= int128_sycl_test::run_from_chars(2); - result |= int128_sycl_test::run_from_chars(8); - result |= int128_sycl_test::run_from_chars(16); - result |= int128_sycl_test::run_from_chars(36); + result |= int128_sycl_test::run_from_chars(2); + result |= int128_sycl_test::run_from_chars(8); + result |= int128_sycl_test::run_from_chars(16); + result |= int128_sycl_test::run_from_chars(36); return result; } diff --git a/test/test_signed_from_chars_sycl.cpp b/test/test_signed_from_chars_sycl.cpp index 0c79d30a..fd0de0e3 100644 --- a/test/test_signed_from_chars_sycl.cpp +++ b/test/test_signed_from_chars_sycl.cpp @@ -4,9 +4,9 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_from_chars(10); + return int128_sycl_test::run_from_chars(10); } diff --git a/test/test_signed_gcd.cu b/test/test_signed_gcd.cu index 358dfa5a..80238cb4 100644 --- a/test/test_signed_gcd.cu +++ b/test/test_signed_gcd.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_gcd_sycl.cpp b/test/test_signed_gcd_sycl.cpp index ee10860c..c26dc9ee 100644 --- a/test/test_signed_gcd_sycl.cpp +++ b/test/test_signed_gcd_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::gcd(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::gcd(a, b); }); } diff --git a/test/test_signed_ge.cu b/test/test_signed_ge.cu index 76e154e4..d11476a9 100644 --- a/test/test_signed_ge.cu +++ b/test/test_signed_ge.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_ge_sycl.cpp b/test/test_signed_ge_sycl.cpp index 25d69c00..70f6d676 100644 --- a/test/test_signed_ge_sycl.cpp +++ b/test/test_signed_ge_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a >= b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a >= b; }); } diff --git a/test/test_signed_gt.cu b/test/test_signed_gt.cu index e4a136e0..33565c99 100644 --- a/test/test_signed_gt.cu +++ b/test/test_signed_gt.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_gt_sycl.cpp b/test/test_signed_gt_sycl.cpp index d5298102..046e4b5d 100644 --- a/test/test_signed_gt_sycl.cpp +++ b/test/test_signed_gt_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a > b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a > b; }); } diff --git a/test/test_signed_lcm.cu b/test/test_signed_lcm.cu index cb6ab9fa..84c94133 100644 --- a/test/test_signed_lcm.cu +++ b/test/test_signed_lcm.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_lcm_sycl.cpp b/test/test_signed_lcm_sycl.cpp index 11962a42..53dd5057 100644 --- a/test/test_signed_lcm_sycl.cpp +++ b/test/test_signed_lcm_sycl.cpp @@ -4,11 +4,11 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { // Restrict inputs so the true LCM stays within 128 bits. - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::lcm(a >> 65, b >> 65); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::lcm(a >> 65, b >> 65); }); } diff --git a/test/test_signed_le.cu b/test/test_signed_le.cu index 96645085..bc5e5d67 100644 --- a/test/test_signed_le.cu +++ b/test/test_signed_le.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_le_sycl.cpp b/test/test_signed_le_sycl.cpp index 75aa2607..b45a45bc 100644 --- a/test/test_signed_le_sycl.cpp +++ b/test/test_signed_le_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a <= b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a <= b; }); } diff --git a/test/test_signed_left_shift.cu b/test/test_signed_left_shift.cu index 279d327d..f959bf0f 100644 --- a/test/test_signed_left_shift.cu +++ b/test/test_signed_left_shift.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const unsigned *shift, test_type *out, int numElements) { diff --git a/test/test_signed_left_shift_sycl.cpp b/test/test_signed_left_shift_sycl.cpp index 0a1e1d03..d958360e 100644 --- a/test/test_signed_left_shift_sycl.cpp +++ b/test/test_signed_left_shift_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t, int i) { return a << (i % 128); }); + return int128_sycl_test::run( + [](int128 a, int128, int i) { return a << (i % 128); }); } diff --git a/test/test_signed_literals.cu b/test/test_signed_literals.cu index 1e7ff273..aaa9f358 100644 --- a/test/test_signed_literals.cu +++ b/test/test_signed_literals.cu @@ -13,7 +13,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using boost::int128::int128_t; +using boost::int128::int128; using namespace boost::int128::literals; // Number of test cases: we test each literal operator with several values @@ -27,7 +27,7 @@ using namespace boost::int128::literals; constexpr int NUM_TESTS = 30; -__global__ void cuda_test(int128_t *out) +__global__ void cuda_test(int128 *out) { int i = threadIdx.x; @@ -80,7 +80,7 @@ int main(void) std::cout << "[Signed literal tests: " << NUM_TESTS << " cases]" << std::endl; - cuda_managed_ptr output(NUM_TESTS); + cuda_managed_ptr output(NUM_TESTS); // Launch with 1 block of NUM_TESTS threads watch w; @@ -98,7 +98,7 @@ int main(void) } // Build expected values on host using the same literals - int128_t expected[NUM_TESTS]; + int128 expected[NUM_TESTS]; // operator""_i128(const char*) - raw literal (values must fit unsigned long long to avoid NVCC warnings) expected[0] = 0_i128; diff --git a/test/test_signed_literals_sycl.cpp b/test/test_signed_literals_sycl.cpp index 9c48fe2c..ce62d1db 100644 --- a/test/test_signed_literals_sycl.cpp +++ b/test/test_signed_literals_sycl.cpp @@ -7,7 +7,7 @@ #include #include -using boost::int128::int128_t; +using boost::int128::int128; using namespace boost::int128::literals; // Exercises the signed user-defined literal operators inside a SYCL kernel and checks the @@ -19,7 +19,7 @@ int main() sycl::queue q; std::cout << "SYCL device: " << q.get_device().get_info() << "\n"; - int128_t* out {sycl::malloc_shared(N, q)}; + int128* out {sycl::malloc_shared(N, q)}; q.submit([&](sycl::handler& h) { @@ -48,7 +48,7 @@ int main() }); }).wait(); - int128_t expected[N]; + int128 expected[N]; expected[0] = 0_i128; expected[1] = 1_i128; expected[2] = -1_i128; diff --git a/test/test_signed_lt.cu b/test/test_signed_lt.cu index 6cd4ef89..45c251cf 100644 --- a/test/test_signed_lt.cu +++ b/test/test_signed_lt.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_lt_sycl.cpp b/test/test_signed_lt_sycl.cpp index 0c0d5a75..7ba22b5d 100644 --- a/test/test_signed_lt_sycl.cpp +++ b/test/test_signed_lt_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a < b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a < b; }); } diff --git a/test/test_signed_midpoint.cu b/test/test_signed_midpoint.cu index f2cba237..701fbebe 100644 --- a/test/test_signed_midpoint.cu +++ b/test/test_signed_midpoint.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_midpoint_sycl.cpp b/test/test_signed_midpoint_sycl.cpp index d350bfe5..0188ce92 100644 --- a/test/test_signed_midpoint_sycl.cpp +++ b/test/test_signed_midpoint_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::midpoint(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::midpoint(a, b); }); } diff --git a/test/test_signed_mod.cu b/test/test_signed_mod.cu index 325c94ea..a367b5fa 100644 --- a/test/test_signed_mod.cu +++ b/test/test_signed_mod.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_mod_sycl.cpp b/test/test_signed_mod_sycl.cpp index 1b022a29..f9143abe 100644 --- a/test/test_signed_mod_sycl.cpp +++ b/test/test_signed_mod_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return int128_sycl_test::safe_mod(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return int128_sycl_test::safe_mod(a, b); }); } diff --git a/test/test_signed_mul.cu b/test/test_signed_mul.cu index 4ff6828a..959e4e4a 100644 --- a/test/test_signed_mul.cu +++ b/test/test_signed_mul.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_mul_sycl.cpp b/test/test_signed_mul_sycl.cpp index d04d886c..7c0eb309 100644 --- a/test/test_signed_mul_sycl.cpp +++ b/test/test_signed_mul_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a * b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a * b; }); } diff --git a/test/test_signed_ne.cu b/test/test_signed_ne.cu index 6e256401..5614b239 100644 --- a/test/test_signed_ne.cu +++ b/test/test_signed_ne.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_ne_sycl.cpp b/test/test_signed_ne_sycl.cpp index 5fce2bf3..e324e7dc 100644 --- a/test/test_signed_ne_sycl.cpp +++ b/test/test_signed_ne_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_compare( - [](int128_t a, int128_t b) { return a != b; }); + return int128_sycl_test::run_compare( + [](int128 a, int128 b) { return a != b; }); } diff --git a/test/test_signed_not.cu b/test/test_signed_not.cu index 7bfc6a88..3eb677e3 100644 --- a/test/test_signed_not.cu +++ b/test/test_signed_not.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, test_type *out, int numElements) { diff --git a/test/test_signed_not_sycl.cpp b/test/test_signed_not_sycl.cpp index c846f1cf..055c3f89 100644 --- a/test/test_signed_not_sycl.cpp +++ b/test/test_signed_not_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t, int) { return ~a; }); + return int128_sycl_test::run( + [](int128 a, int128, int) { return ~a; }); } diff --git a/test/test_signed_or.cu b/test/test_signed_or.cu index cc73d6a8..dac2c1e1 100644 --- a/test/test_signed_or.cu +++ b/test/test_signed_or.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_or_sycl.cpp b/test/test_signed_or_sycl.cpp index e15cb187..83fdaa3e 100644 --- a/test/test_signed_or_sycl.cpp +++ b/test/test_signed_or_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a | b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a | b; }); } diff --git a/test/test_signed_right_shift.cu b/test/test_signed_right_shift.cu index 73f4aedd..66bfeb11 100644 --- a/test/test_signed_right_shift.cu +++ b/test/test_signed_right_shift.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const unsigned *shift, test_type *out, int numElements) { diff --git a/test/test_signed_right_shift_sycl.cpp b/test/test_signed_right_shift_sycl.cpp index 1ebf1b56..21b56386 100644 --- a/test/test_signed_right_shift_sycl.cpp +++ b/test/test_signed_right_shift_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t, int i) { return a >> (i % 128); }); + return int128_sycl_test::run( + [](int128 a, int128, int i) { return a >> (i % 128); }); } diff --git a/test/test_signed_saturating_add.cu b/test/test_signed_saturating_add.cu index 5ca06a3d..20711b3c 100644 --- a/test/test_signed_saturating_add.cu +++ b/test/test_signed_saturating_add.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_saturating_add_sycl.cpp b/test/test_signed_saturating_add_sycl.cpp index 91bdb58b..92e7f1fa 100644 --- a/test/test_signed_saturating_add_sycl.cpp +++ b/test/test_signed_saturating_add_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::saturating_add(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::saturating_add(a, b); }); } diff --git a/test/test_signed_saturating_div.cu b/test/test_signed_saturating_div.cu index 7753deff..6ba7ee48 100644 --- a/test/test_signed_saturating_div.cu +++ b/test/test_signed_saturating_div.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_saturating_div_sycl.cpp b/test/test_signed_saturating_div_sycl.cpp index 2b94634d..53bc5e89 100644 --- a/test/test_signed_saturating_div_sycl.cpp +++ b/test/test_signed_saturating_div_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::saturating_div(a, int128_sycl_test::safe_divisor(a, b)); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::saturating_div(a, int128_sycl_test::safe_divisor(a, b)); }); } diff --git a/test/test_signed_saturating_mul.cu b/test/test_signed_saturating_mul.cu index 264deb82..e0599f8d 100644 --- a/test/test_signed_saturating_mul.cu +++ b/test/test_signed_saturating_mul.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_saturating_mul_sycl.cpp b/test/test_signed_saturating_mul_sycl.cpp index 6a77bcf7..17391206 100644 --- a/test/test_signed_saturating_mul_sycl.cpp +++ b/test/test_signed_saturating_mul_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::saturating_mul(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::saturating_mul(a, b); }); } diff --git a/test/test_signed_saturating_sub.cu b/test/test_signed_saturating_sub.cu index 26ec3fd5..9cdbe249 100644 --- a/test/test_signed_saturating_sub.cu +++ b/test/test_signed_saturating_sub.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_saturating_sub_sycl.cpp b/test/test_signed_saturating_sub_sycl.cpp index 21decc2a..f1632030 100644 --- a/test/test_signed_saturating_sub_sycl.cpp +++ b/test/test_signed_saturating_sub_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return boost::int128::saturating_sub(a, b); }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return boost::int128::saturating_sub(a, b); }); } diff --git a/test/test_signed_sub.cu b/test/test_signed_sub.cu index 5fc8339a..fb6ed066 100644 --- a/test/test_signed_sub.cu +++ b/test/test_signed_sub.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; /** * CUDA Kernel Device code diff --git a/test/test_signed_sub_sycl.cpp b/test/test_signed_sub_sycl.cpp index f0b18f31..2dce668a 100644 --- a/test/test_signed_sub_sycl.cpp +++ b/test/test_signed_sub_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a - b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a - b; }); } diff --git a/test/test_signed_to_chars.cu b/test/test_signed_to_chars.cu index 064dcd50..fa517d0f 100644 --- a/test/test_signed_to_chars.cu +++ b/test/test_signed_to_chars.cu @@ -19,7 +19,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; constexpr int BUF_SIZE = 64; diff --git a/test/test_signed_to_chars_bases.cu b/test/test_signed_to_chars_bases.cu index aa6faaac..58c8fdea 100644 --- a/test/test_signed_to_chars_bases.cu +++ b/test/test_signed_to_chars_bases.cu @@ -19,7 +19,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; constexpr int BUF_SIZE = 192; diff --git a/test/test_signed_to_chars_bases_sycl.cpp b/test/test_signed_to_chars_bases_sycl.cpp index b64c9114..4be7aba3 100644 --- a/test/test_signed_to_chars_bases_sycl.cpp +++ b/test/test_signed_to_chars_bases_sycl.cpp @@ -4,14 +4,14 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { int result {0}; - result |= int128_sycl_test::run_to_chars(2); - result |= int128_sycl_test::run_to_chars(8); - result |= int128_sycl_test::run_to_chars(16); - result |= int128_sycl_test::run_to_chars(36); + result |= int128_sycl_test::run_to_chars(2); + result |= int128_sycl_test::run_to_chars(8); + result |= int128_sycl_test::run_to_chars(16); + result |= int128_sycl_test::run_to_chars(36); return result; } diff --git a/test/test_signed_to_chars_sycl.cpp b/test/test_signed_to_chars_sycl.cpp index 176b5e95..ee90f5b8 100644 --- a/test/test_signed_to_chars_sycl.cpp +++ b/test/test_signed_to_chars_sycl.cpp @@ -4,9 +4,9 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run_to_chars(10); + return int128_sycl_test::run_to_chars(10); } diff --git a/test/test_signed_to_unsigned_conversion.cu b/test/test_signed_to_unsigned_conversion.cu index 35cd558f..4ca40610 100644 --- a/test/test_signed_to_unsigned_conversion.cu +++ b/test/test_signed_to_unsigned_conversion.cu @@ -17,8 +17,8 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using signed_type = boost::int128::int128_t; -using unsigned_type = boost::int128::uint128_t; +using signed_type = boost::int128::int128; +using unsigned_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_signed_to_unsigned_conversion_sycl.cpp b/test/test_signed_to_unsigned_conversion_sycl.cpp index 093d06b1..e319397e 100644 --- a/test/test_signed_to_unsigned_conversion_sycl.cpp +++ b/test/test_signed_to_unsigned_conversion_sycl.cpp @@ -4,11 +4,11 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t, int) { return static_cast(a); }); + return int128_sycl_test::run( + [](int128 a, int128, int) { return static_cast(a); }); } diff --git a/test/test_signed_xor.cu b/test/test_signed_xor.cu index bcd70dce..d4f53013 100644 --- a/test/test_signed_xor.cu +++ b/test/test_signed_xor.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::int128_t; +using test_type = boost::int128::int128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_signed_xor_sycl.cpp b/test/test_signed_xor_sycl.cpp index 8687865d..004c3fa9 100644 --- a/test/test_signed_xor_sycl.cpp +++ b/test/test_signed_xor_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; +using boost::int128::int128; int main() { - return int128_sycl_test::run( - [](int128_t a, int128_t b, int) { return a ^ b; }); + return int128_sycl_test::run( + [](int128 a, int128 b, int) { return a ^ b; }); } diff --git a/test/test_spaceship_operator.cpp b/test/test_spaceship_operator.cpp index bf839583..b5cdb26a 100644 --- a/test/test_spaceship_operator.cpp +++ b/test/test_spaceship_operator.cpp @@ -10,7 +10,7 @@ void test_u128() { - constexpr boost::int128::uint128_t x {5U}; + constexpr boost::int128::uint128 x {5U}; BOOST_TEST((x <=> 4U) == std::strong_ordering::greater); BOOST_TEST((x <=> 5U) == std::strong_ordering::equivalent); BOOST_TEST((x <=> 5U) == std::strong_ordering::equal); @@ -19,7 +19,7 @@ void test_u128() void test_int128() { - constexpr boost::int128::int128_t x {5}; + constexpr boost::int128::int128 x {5}; BOOST_TEST((x <=> 4) == std::strong_ordering::greater); BOOST_TEST((x <=> 5) == std::strong_ordering::equivalent); BOOST_TEST((x <=> 5) == std::strong_ordering::equal); diff --git a/test/test_stream.cpp b/test/test_stream.cpp index 532f868d..d84c6e56 100644 --- a/test/test_stream.cpp +++ b/test/test_stream.cpp @@ -118,26 +118,26 @@ void test_ostream() octal_out_upper << octal_val; BOOST_TEST_CSTR_EQ(octal_out.str().c_str(), "4"); - BOOST_INT128_IF_CONSTEXPR (std::is_same::value) + BOOST_INT128_IF_CONSTEXPR (std::is_same::value) { - boost::int128::uint128_t max_val {std::numeric_limits::max()}; + boost::int128::uint128 max_val {std::numeric_limits::max()}; std::stringstream max_out; max_out << max_val; BOOST_TEST_CSTR_EQ(max_out.str().c_str(), "340282366920938463463374607431768211455"); } else { - boost::int128::int128_t max_val {std::numeric_limits::max()}; + boost::int128::int128 max_val {std::numeric_limits::max()}; std::stringstream max_out; max_out << max_val; BOOST_TEST_CSTR_EQ(max_out.str().c_str(), "170141183460469231731687303715884105727"); - boost::int128::int128_t min_val {std::numeric_limits::min()}; + boost::int128::int128 min_val {std::numeric_limits::min()}; std::stringstream min_out; min_out << min_val; BOOST_TEST_CSTR_EQ(min_out.str().c_str(), "-170141183460469231731687303715884105728"); - boost::int128::int128_t regular_val {-4500}; + boost::int128::int128 regular_val {-4500}; std::stringstream reg_out; reg_out << regular_val; BOOST_TEST_CSTR_EQ(reg_out.str().c_str(), "-4500"); @@ -146,46 +146,46 @@ void test_ostream() void test_error_values() { - using boost::int128::uint128_t; - using boost::int128::int128_t; + using boost::int128::uint128; + using boost::int128::int128; - uint128_t val; + uint128 val; std::stringstream in; in.str("-42"); in >> val; BOOST_TEST_EQ(val, 0U); - uint128_t val2; + uint128 val2; std::stringstream in2; in2.str("+42"); in2 >> val2; BOOST_TEST_EQ(val2, 0U); - uint128_t val3; + uint128 val3; std::stringstream in3; in3.str(""); in3 >> val3; BOOST_TEST_EQ(val3, 0U); - int128_t val4; + int128 val4; std::stringstream in4; in4.str("-"); in4 >> val4; BOOST_TEST_EQ(val4, 0); - uint128_t val5; + uint128 val5; std::stringstream in5; in5.str("F"); in5 >> val5; BOOST_TEST_EQ(val5, 0U); - uint128_t val6; + uint128 val6; std::stringstream in6; in6.str("3F"); in6 >> val6; BOOST_TEST_EQ(val6, 3U); - uint128_t val7; + uint128 val7; std::stringstream in7; in7.str("100000000000000000000000000000000000000000000000000000000000000000000000000000000000"); in7 >> val7; @@ -194,7 +194,7 @@ void test_error_values() boost::int128::detail::from_chars(nullptr, nullptr, val7); BOOST_TEST_EQ(val7, 0U); - uint128_t overflow_val; + uint128 overflow_val; std::stringstream huge_str; // 100 digits huge_str.str("123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345"); @@ -206,9 +206,9 @@ template void test_round_trip(); template <> -void test_round_trip() +void test_round_trip() { - boost::random::uniform_int_distribution dist(0, (std::numeric_limits::max)()); + boost::random::uniform_int_distribution dist(0, (std::numeric_limits::max)()); // Decimal for (std::size_t i = 0; i < N; ++i) @@ -216,7 +216,7 @@ void test_round_trip() const auto val {dist(rng)}; std::stringstream out; out << val; - boost::int128::uint128_t return_val; + boost::int128::uint128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); @@ -229,7 +229,7 @@ void test_round_trip() std::stringstream out; out.flags(std::ios_base::hex); out << val; - boost::int128::uint128_t return_val; + boost::int128::uint128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); @@ -242,7 +242,7 @@ void test_round_trip() std::stringstream out; out.flags(std::ios_base::hex | std::ios_base::uppercase); out << val; - boost::int128::uint128_t return_val; + boost::int128::uint128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); @@ -255,7 +255,7 @@ void test_round_trip() std::stringstream out; out.flags(std::ios_base::oct); out << val; - boost::int128::uint128_t return_val; + boost::int128::uint128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); @@ -263,27 +263,27 @@ void test_round_trip() } template <> -void test_round_trip() +void test_round_trip() { std::uniform_int_distribution low(0, (std::numeric_limits::max)()); std::uniform_int_distribution high((std::numeric_limits::min)(), (std::numeric_limits::max)()); for (std::size_t i = 0; i < N; ++i) { - const boost::int128::int128_t val {high(rng), low(rng)}; + const boost::int128::int128 val {high(rng), low(rng)}; std::stringstream out; out << val; - boost::int128::int128_t return_val; + boost::int128::int128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); } - boost::int128::int128_t val {-1}; + boost::int128::int128 val {-1}; std::stringstream out; out << val; BOOST_TEST_CSTR_EQ(out.str().c_str(), "-1"); - boost::int128::int128_t return_val; + boost::int128::int128 return_val; out >> return_val; BOOST_TEST_EQ(val, return_val); } @@ -294,17 +294,17 @@ void test_round_trip() int main() { - test_istream(); - test_istream(); + test_istream(); + test_istream(); - test_ostream(); - test_ostream(); + test_ostream(); + test_ostream(); // 32-bit windows does not set the iomanip flags correctly in CI #ifndef _M_IX86 - test_round_trip(); - test_round_trip(); + test_round_trip(); + test_round_trip(); #endif diff --git a/test/test_to_string.cpp b/test/test_to_string.cpp index 36240f57..72340a41 100644 --- a/test/test_to_string.cpp +++ b/test/test_to_string.cpp @@ -53,12 +53,12 @@ void test_builtin() BOOST_TEST(r); *r.ptr = '\0'; - const auto value_str {to_string(int128_t{value})}; + const auto value_str {to_string(int128{value})}; BOOST_TEST_CSTR_EQ(buffer, value_str.c_str()); BOOST_TEST_CSTR_EQ(std::to_string(value).c_str(), value_str.c_str()); - const auto value_wstr {to_wstring(int128_t{value})}; + const auto value_wstr {to_wstring(int128{value})}; BOOST_TEST(value_wstr == std::to_wstring(value)); } @@ -79,22 +79,22 @@ void test_builtin() *r.ptr = '\0'; { - const auto value_str {to_string(int128_t{value})}; + const auto value_str {to_string(int128{value})}; BOOST_TEST_CSTR_EQ(buffer, value_str.c_str()); BOOST_TEST_CSTR_EQ(std::to_string(value).c_str(), value_str.c_str()); - const auto value_wstr {to_wstring(int128_t{value})}; + const auto value_wstr {to_wstring(int128{value})}; BOOST_TEST(value_wstr == std::to_wstring(value)); } { - const auto value_str {to_string(uint128_t{value})}; + const auto value_str {to_string(uint128{value})}; BOOST_TEST_CSTR_EQ(buffer, value_str.c_str()); BOOST_TEST_CSTR_EQ(std::to_string(value).c_str(), value_str.c_str()); - const auto value_wstr {to_wstring(uint128_t{value})}; + const auto value_wstr {to_wstring(uint128{value})}; BOOST_TEST(value_wstr == std::to_wstring(value)); } @@ -103,8 +103,8 @@ void test_builtin() int main() { - test(); - test(); + test(); + test(); test_builtin(); test_builtin(); diff --git a/test/test_u128.cpp b/test/test_u128.cpp index 305cdc4f..fa910c78 100644 --- a/test/test_u128.cpp +++ b/test/test_u128.cpp @@ -151,7 +151,7 @@ void test_arithmetic_constructor() { const IntType value {dist(rng)}; const auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; builtin_u128 emulated_bits; std::memcpy(&emulated_bits, &emulated_value, sizeof(builtin_u128)); @@ -171,7 +171,7 @@ void test_assignment_operators() const IntType value {dist(rng)}; builtin_u128 builtin_value {}; builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; builtin_u128 emulated_bits; @@ -192,7 +192,7 @@ void test_integer_conversion_operators() const IntType value {dist(rng)}; builtin_u128 builtin_value; builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -227,7 +227,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = static_cast(value) << 64 | static_cast(value); - boost::int128::uint128_t emulated_value {value, value}; + boost::int128::uint128 emulated_value {value, value}; // Converts the value and then normalizes the range const auto builtin_value_return = static_cast(builtin_value) / static_cast(1e27L); @@ -246,7 +246,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = value; - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -271,7 +271,7 @@ void test_unary_plus() const IntType value {dist(rng)}; auto builtin_value = static_cast(value); builtin_value = +builtin_value; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; emulated_value = +emulated_value; builtin_u128 emulated_bits; @@ -292,7 +292,7 @@ void test_unary_minus() const IntType value {dist(rng)}; auto builtin_value = static_cast(value); builtin_value = -builtin_value; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; emulated_value = -emulated_value; builtin_u128 emulated_bits; @@ -313,7 +313,7 @@ void test_operator_equality() { const IntType value {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value)) == ((value == builtin_value) == (builtin_value == value))); @@ -327,18 +327,18 @@ void test_operator_equality() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2)) == ((value2 == builtin_value) == (builtin_value == value2))); } - const boost::int128::uint128_t bool_val {dist(rng)}; + const boost::int128::uint128 bool_val {dist(rng)}; BOOST_TEST((true == bool_val) == (bool_val == true)); - const boost::int128::uint128_t bool_val2 {1, static_cast(dist(rng))}; + const boost::int128::uint128 bool_val2 {1, static_cast(dist(rng))}; BOOST_TEST((true == bool_val2) == (bool_val2 == true)); - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -352,7 +352,7 @@ void test_operator_equality() } } - boost::int128::uint128_t emulated_value {1, static_cast(value)}; + boost::int128::uint128 emulated_value {1, static_cast(value)}; BOOST_TEST(!(emulated_value == value)); BOOST_TEST(emulated_value == emulated_value); } @@ -370,7 +370,7 @@ void test_operator_inequality() { const IntType value {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value)) == ((value != builtin_value) == (builtin_value != value))); @@ -382,18 +382,18 @@ void test_operator_inequality() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2)) == ((value2 != builtin_value) == (builtin_value != value2))); } - const boost::int128::uint128_t bool_val {dist(rng)}; + const boost::int128::uint128 bool_val {dist(rng)}; BOOST_TEST((true != bool_val) == (bool_val != true)); - const boost::int128::uint128_t bool_val2 {1, static_cast(dist(rng))}; + const boost::int128::uint128 bool_val2 {1, static_cast(dist(rng))}; BOOST_TEST((true == bool_val2) == (bool_val2 == true)); - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -407,8 +407,8 @@ void test_operator_inequality() } } - const boost::int128::uint128_t emulated_value {1, static_cast(value)}; - const boost::int128::uint128_t emulated_value2 {2, static_cast(value)}; + const boost::int128::uint128 emulated_value {1, static_cast(value)}; + const boost::int128::uint128 emulated_value2 {2, static_cast(value)}; BOOST_TEST(emulated_value != value); BOOST_TEST(emulated_value != emulated_value2); } @@ -426,7 +426,7 @@ void test_operator_less() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -453,8 +453,8 @@ void test_operator_less() // On 32-bits we check the words all the way down // low low - boost::int128::uint128_t lhs {0, 1}; - boost::int128::uint128_t rhs {0, 2}; + boost::int128::uint128 lhs {0, 1}; + boost::int128::uint128 rhs {0, 2}; BOOST_TEST(lhs < rhs); BOOST_TEST(!(rhs < lhs)); // low high @@ -485,7 +485,7 @@ void test_operator_le() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -512,8 +512,8 @@ void test_operator_le() // On 32-bits we check the words all the way down // low low - boost::int128::uint128_t lhs {0, 1}; - boost::int128::uint128_t rhs {0, 2}; + boost::int128::uint128 lhs {0, 1}; + boost::int128::uint128 rhs {0, 2}; BOOST_TEST(lhs <= rhs); BOOST_TEST(!(rhs <= lhs)); BOOST_TEST(lhs <= lhs); @@ -548,7 +548,7 @@ void test_operator_greater() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -575,8 +575,8 @@ void test_operator_greater() // On 32-bits we check the words all the way down // low low - boost::int128::uint128_t lhs {0, 1}; - boost::int128::uint128_t rhs {0, 2}; + boost::int128::uint128 lhs {0, 1}; + boost::int128::uint128 rhs {0, 2}; BOOST_TEST(rhs > lhs); BOOST_TEST(!(lhs > rhs)); // low high @@ -607,7 +607,7 @@ void test_operator_ge() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -634,8 +634,8 @@ void test_operator_ge() // On 32-bits we check the words all the way down // low low - boost::int128::uint128_t lhs {0, 1}; - boost::int128::uint128_t rhs {0, 2}; + boost::int128::uint128 lhs {0, 1}; + boost::int128::uint128 rhs {0, 2}; BOOST_TEST(rhs >= lhs); BOOST_TEST(!(lhs >= rhs)); BOOST_TEST(lhs >= lhs); @@ -669,7 +669,7 @@ void test_operator_not() { const IntType value {dist(rng)}; const auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(~emulated_value == ~builtin_value); } @@ -686,7 +686,7 @@ void test_operator_or() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value |= value2; @@ -721,7 +721,7 @@ void test_operator_and() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value &= value2; @@ -756,7 +756,7 @@ void test_operator_xor() const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value ^= value2; @@ -793,7 +793,7 @@ void test_operator_left_shift() const IntType value {dist(rng)}; const unsigned shift_value {shift_dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Test 1: Test the <<= operator auto builtin_copy = builtin_value; @@ -803,7 +803,7 @@ void test_operator_left_shift() emulated_copy <<= shift_value; BOOST_TEST(emulated_copy == builtin_copy); - BOOST_TEST(emulated_copy == (emulated_value << static_cast(shift_value))); + BOOST_TEST(emulated_copy == (emulated_value << static_cast(shift_value))); // Test 2: Test the binary << operator auto shifted_builtin = builtin_value << shift_value; @@ -828,18 +828,18 @@ void test_operator_left_shift() // Edge cases. A shift by a negative amount or by an amount >= 128 is // undefined behavior, exactly as for the built-in shift operators (see the // documentation), so only the well-defined in-range counts are exercised. - // The scalar, uint128_t-count, and consteval paths must all agree. - const boost::int128::uint128_t val {UINT64_MAX}; + // The scalar, uint128-count, and consteval paths must all agree. + const boost::int128::uint128 val {UINT64_MAX}; BOOST_TEST((val << 0) == val); - BOOST_TEST((val << static_cast(0)) == val); + BOOST_TEST((val << static_cast(0)) == val); for (unsigned s {}; s < 128U; ++s) { BOOST_TEST(boost::int128::detail::default_ls_impl(val, s) == (val << s)); - BOOST_TEST((val << static_cast(s)) == (val << s)); + BOOST_TEST((val << static_cast(s)) == (val << s)); } const auto builtin_value {static_cast(dist(rng))}; - const boost::int128::uint128_t small_shift {1u}; + const boost::int128::uint128 small_shift {1u}; BOOST_TEST((builtin_value << small_shift) == (builtin_value << 1u)); } @@ -856,7 +856,7 @@ void test_operator_right_shift() const IntType value {dist(rng)}; const unsigned shift_value {shift_dist(rng)}; auto builtin_value = static_cast(value); - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; // Test 1: Test the >>= operator auto builtin_copy = builtin_value; @@ -866,7 +866,7 @@ void test_operator_right_shift() emulated_copy >>= shift_value; BOOST_TEST(emulated_copy == builtin_copy); - BOOST_TEST(emulated_copy == (emulated_value >> static_cast(shift_value))); + BOOST_TEST(emulated_copy == (emulated_value >> static_cast(shift_value))); // Test 2: Test the binary >> operator auto shifted_builtin = builtin_value >> shift_value; @@ -891,24 +891,24 @@ void test_operator_right_shift() // Edge cases. A shift by a negative amount or by an amount >= 128 is // undefined behavior, exactly as for the built-in shift operators (see the // documentation), so only the well-defined in-range counts are exercised. - // The scalar, uint128_t-count, and consteval paths must all agree. - const boost::int128::uint128_t val {UINT64_MAX}; + // The scalar, uint128-count, and consteval paths must all agree. + const boost::int128::uint128 val {UINT64_MAX}; BOOST_TEST((val >> 0) == val); - BOOST_TEST((val >> static_cast(0)) == val); + BOOST_TEST((val >> static_cast(0)) == val); for (unsigned s {}; s < 128U; ++s) { BOOST_TEST(boost::int128::detail::default_rs_impl(val, s) == (val >> s)); - BOOST_TEST((val >> static_cast(s)) == (val >> s)); + BOOST_TEST((val >> static_cast(s)) == (val >> s)); } const auto builtin_value {static_cast(dist(rng))}; - const boost::int128::uint128_t small_shift {1u}; + const boost::int128::uint128 small_shift {1u}; BOOST_TEST((builtin_value >> small_shift) == (builtin_value >> 1u)); } void test_increment_operator() { - boost::int128::uint128_t emulated_value {UINT64_MAX - N/2}; + boost::int128::uint128 emulated_value {UINT64_MAX - N/2}; builtin_u128 builtin_value {UINT64_MAX - N/2}; for (std::size_t i {}; i < N; ++i) @@ -922,7 +922,7 @@ void test_increment_operator() void test_decrement_operator() { - boost::int128::uint128_t emulated_value {UINT64_MAX + N/2}; + boost::int128::uint128 emulated_value {UINT64_MAX + N/2}; builtin_u128 builtin_value {UINT64_MAX + N/2}; for (std::size_t i {}; i < N; ++i) @@ -953,7 +953,7 @@ void test_operator_add() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value += value2; @@ -963,7 +963,7 @@ void test_operator_add() // Edge case where we go from low word to high word builtin_u128 builtin_value = UINT64_MAX - 2U; - boost::int128::uint128_t emulated_value = UINT64_MAX - 2U; + boost::int128::uint128 emulated_value = UINT64_MAX - 2U; for (std::size_t i {}; i < N; ++i) { @@ -990,7 +990,7 @@ void test_operator_sub() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value -= value2; @@ -1001,7 +1001,7 @@ void test_operator_sub() // Edge case where we go from low word to high word builtin_u128 builtin_value = UINT64_MAX; builtin_value += 2U; - boost::int128::uint128_t emulated_value = UINT64_MAX; + boost::int128::uint128 emulated_value = UINT64_MAX; emulated_value += 2U; for (std::size_t i {}; i < N; ++i) @@ -1021,7 +1021,7 @@ void test_operator_mul() IntType value2 {dist(rng)}; auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value *= value2; @@ -1066,7 +1066,7 @@ void test_operator_div() // LCOV_EXCL_STOP auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -1082,7 +1082,7 @@ void test_operator_div() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -1102,8 +1102,8 @@ void test_operator_div() // LCOV_EXCL_STOP const auto builtin_value = (static_cast(static_cast(value)) << 64) | static_cast(value); - const boost::int128::uint128_t emulated_value {static_cast(value), static_cast(value)}; - const boost::int128::uint128_t small_emulated_value {UINT64_C(0), static_cast(value)}; + const boost::int128::uint128 emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::uint128 small_emulated_value {UINT64_C(0), static_cast(value)}; assert(builtin_value == emulated_value); @@ -1120,7 +1120,7 @@ void test_operator_div() BOOST_TEST((value2 / emulated_value) == (value2 / builtin_value)); // Forces decision process - const boost::int128::uint128_t check_2_value {value2}; + const boost::int128::uint128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value / check_2_value)); // Division by zero is undefined behavior (matching the builtin __int128 types), so it is not tested. @@ -1168,7 +1168,7 @@ void test_operator_mod() // LCOV_EXCL_STOP auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -1184,7 +1184,7 @@ void test_operator_mod() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -1204,8 +1204,8 @@ void test_operator_mod() // LCOV_EXCL_STOP const auto builtin_value = (static_cast(static_cast(value)) << 64) | static_cast(value); - const boost::int128::uint128_t emulated_value {static_cast(value), static_cast(value)}; - const boost::int128::uint128_t small_emulated_value {UINT64_C(0), static_cast(value)}; + const boost::int128::uint128 emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::uint128 small_emulated_value {UINT64_C(0), static_cast(value)}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -1220,7 +1220,7 @@ void test_operator_mod() BOOST_TEST((value2 % emulated_value) == (value2 % builtin_value)); // Forces decision process - const boost::int128::uint128_t check_2_value {value2}; + const boost::int128::uint128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value % check_2_value)); // Remainder by zero is undefined behavior (matching the builtin __int128 types), so it is not tested. @@ -1235,7 +1235,7 @@ template void test_spot_div(IntType value, IntType value2) { auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -1350,7 +1350,7 @@ int main() test_spot_div(-3237361348456748317LL, 8011834041509972187LL); - test_spot_div(boost::int128::uint128_t{50012077812411ULL, 6429278683030093824ULL}, boost::int128::uint128_t{542101086ULL, 4477988020393345024ULL}, boost::int128::uint128_t{92256}); + test_spot_div(boost::int128::uint128{50012077812411ULL, 6429278683030093824ULL}, boost::int128::uint128{542101086ULL, 4477988020393345024ULL}, boost::int128::uint128{92256}); return boost::report_errors(); } @@ -1371,7 +1371,7 @@ void test_operator_equality() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value))); } @@ -1381,25 +1381,25 @@ void test_operator_equality() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::uint128_t emulated_value {1, static_cast(value)}; + boost::int128::uint128 emulated_value {1, static_cast(value)}; BOOST_TEST((value == emulated_value) == (emulated_value == value)); } } - const boost::int128::uint128_t bool_val {dist(rng)}; + const boost::int128::uint128 bool_val {dist(rng)}; BOOST_TEST((true == bool_val) == (bool_val == true)); - const boost::int128::uint128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::uint128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true == bool_val2) == (bool_val2 == true)); BOOST_TEST(!(bool_val == bool_val2)); BOOST_TEST(bool_val == bool_val); @@ -1418,7 +1418,7 @@ void test_operator_inequality() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value))); } @@ -1428,25 +1428,25 @@ void test_operator_inequality() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2))); } // Never equal - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - boost::int128::uint128_t emulated_value {1, static_cast(value)}; + boost::int128::uint128 emulated_value {1, static_cast(value)}; BOOST_TEST((value != emulated_value) == (emulated_value != value)); } } - const boost::int128::uint128_t bool_val {dist(rng)}; + const boost::int128::uint128 bool_val {dist(rng)}; BOOST_TEST((true != bool_val) == (bool_val != true)); - const boost::int128::uint128_t bool_val2 {static_cast(dist(rng)), 0}; + const boost::int128::uint128 bool_val2 {static_cast(dist(rng)), 0}; BOOST_TEST((true != bool_val2) == (bool_val2 != true)); BOOST_TEST(bool_val != bool_val2); BOOST_TEST(!(bool_val != bool_val)); @@ -1470,7 +1470,7 @@ void test_operator_less() value2 = dist(rng); } - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 < emulated_value) != (emulated_value < value2))); } @@ -1479,7 +1479,7 @@ void test_operator_less() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value < emulated_value) == (emulated_value < value))); } @@ -1500,7 +1500,7 @@ void test_operator_greater() value2 = dist(rng); } - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 > emulated_value) != (emulated_value > value2))); } @@ -1509,7 +1509,7 @@ void test_operator_greater() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value > emulated_value) == (emulated_value > value))); } @@ -1525,7 +1525,7 @@ void test_operator_le() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; if (value == value2) { @@ -1541,7 +1541,7 @@ void test_operator_le() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value <= emulated_value) == (emulated_value <= value))); } @@ -1556,7 +1556,7 @@ void test_operator_ge() { const IntType value {dist(rng)}; const IntType value2 {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; if (value == value2) { @@ -1572,7 +1572,7 @@ void test_operator_ge() for (std::size_t i {}; i < N; ++i) { const IntType value {dist(rng)}; - const boost::int128::uint128_t emulated_value {value}; + const boost::int128::uint128 emulated_value {value}; const auto lhs {(value >= emulated_value)}; const auto rhs {(emulated_value >= value)}; @@ -1586,7 +1586,7 @@ void test_operator_ge() // Spot test const IntType value {0}; - const boost::int128::uint128_t emulated_value {0}; + const boost::int128::uint128 emulated_value {0}; const auto lhs {(value >= emulated_value)}; const auto rhs {(emulated_value >= value)}; @@ -1605,8 +1605,8 @@ void test_operator_add() const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE const IntType res = value + value2; - boost::int128::uint128_t test_value {value}; - const boost::int128::uint128_t test_value2 {value2}; + boost::int128::uint128 test_value {value}; + const boost::int128::uint128 test_value2 {value2}; BOOST_TEST(test_value + test_value2 == res); // LCOV_EXCL_LINE test_value += value2; @@ -1614,8 +1614,8 @@ void test_operator_add() } // Bigger value spots - boost::int128::uint128_t lhs{UINT64_MAX}; - boost::int128::uint128_t rhs{1, 0}; + boost::int128::uint128 lhs{UINT64_MAX}; + boost::int128::uint128 rhs{1, 0}; BOOST_TEST_EQ(lhs + 1, rhs); BOOST_TEST_EQ(++lhs, rhs); @@ -1638,8 +1638,8 @@ void test_operator_sub() const IntType res = value - value2; - boost::int128::uint128_t test_value {value}; - const boost::int128::uint128_t test_value2 {value2}; + boost::int128::uint128 test_value {value}; + const boost::int128::uint128 test_value2 {value2}; BOOST_TEST(test_value - test_value2 == res); // LCOV_EXCL_LINE test_value -= value2; @@ -1647,8 +1647,8 @@ void test_operator_sub() } // Bigger value spots - boost::int128::uint128_t rhs{UINT64_MAX}; - boost::int128::uint128_t lhs{1, 0}; + boost::int128::uint128 rhs{UINT64_MAX}; + boost::int128::uint128 lhs{1, 0}; BOOST_TEST_EQ(lhs - 1, rhs); BOOST_TEST_EQ(--lhs, rhs); @@ -1665,8 +1665,8 @@ void test_operator_mul() const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE const IntType res = value * value2; - boost::int128::uint128_t test_value {value}; - const boost::int128::uint128_t test_value2 {value2}; + boost::int128::uint128 test_value {value}; + const boost::int128::uint128 test_value2 {value2}; BOOST_TEST(test_value * test_value2 == res); // LCOV_EXCL_LINE @@ -1674,8 +1674,8 @@ void test_operator_mul() BOOST_TEST(test_value == res); // LCOV_EXCL_LINE } - boost::int128::uint128_t shift_val {1}; - boost::int128::uint128_t mul_val {1}; + boost::int128::uint128 shift_val {1}; + boost::int128::uint128 mul_val {1}; for (std::size_t i {1}; i < 128; ++i) { @@ -1712,8 +1712,8 @@ void test_operator_div() const IntType res = value / value2; - boost::int128::uint128_t test_value {value}; - const boost::int128::uint128_t test_value2 {value2}; + boost::int128::uint128 test_value {value}; + const boost::int128::uint128 test_value2 {value2}; BOOST_TEST(test_value / test_value2 == res); // LCOV_EXCL_LINE @@ -1721,21 +1721,21 @@ void test_operator_div() BOOST_TEST(test_value == res); // LCOV_EXCL_LINE } - boost::int128::uint128_t shift_val {UINT64_MAX, UINT64_MAX}; - boost::int128::uint128_t mul_val {UINT64_MAX, UINT64_MAX}; + boost::int128::uint128 shift_val {UINT64_MAX, UINT64_MAX}; + boost::int128::uint128 mul_val {UINT64_MAX, UINT64_MAX}; for (std::size_t i {1}; i < 127; ++i) { const auto current_shift_val {shift_val >> i}; - const auto current_mul_val {mul_val / (boost::int128::uint128_t{2} << (i-1))}; + const auto current_mul_val {mul_val / (boost::int128::uint128{2} << (i-1))}; BOOST_TEST(current_shift_val == current_mul_val); // LCOV_EXCL_LINE } // Check large value - constexpr auto lhs {(std::numeric_limits::max)()}; - constexpr boost::int128::uint128_t rhs {0x1, UINT64_MAX}; - constexpr boost::int128::uint128_t res {UINT64_C(0x8000000000000000)}; + constexpr auto lhs {(std::numeric_limits::max)()}; + constexpr boost::int128::uint128 rhs {0x1, UINT64_MAX}; + constexpr boost::int128::uint128 res {UINT64_C(0x8000000000000000)}; BOOST_TEST(lhs / rhs == res); } diff --git a/test/test_u128_no_sign_conv.cpp b/test/test_u128_no_sign_conv.cpp index 7b1c4490..b3be0c5e 100644 --- a/test/test_u128_no_sign_conv.cpp +++ b/test/test_u128_no_sign_conv.cpp @@ -126,7 +126,7 @@ void test_arithmetic_constructor() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE const auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; builtin_u128 emulated_bits; std::memcpy(&emulated_bits, &emulated_value, sizeof(builtin_u128)); @@ -146,7 +146,7 @@ void test_assignment_operators() const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value {}; builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; builtin_u128 emulated_bits; @@ -167,7 +167,7 @@ void test_integer_conversion_operators() const IntType value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -202,7 +202,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = static_cast(value) << 64 | static_cast(value); - boost::int128::uint128_t emulated_value {value, value}; + boost::int128::uint128 emulated_value {value, value}; // Converts the value and then normalizes the range const auto builtin_value_return = static_cast(builtin_value) / static_cast(1e27L); @@ -221,7 +221,7 @@ void test_float_conversion_operators() const auto value {dist(rng)}; // LCOV_EXCL_LINE builtin_u128 builtin_value; builtin_value = value; - boost::int128::uint128_t emulated_value {}; + boost::int128::uint128 emulated_value {}; emulated_value = value; const auto builtin_value_return = static_cast(builtin_value); @@ -246,7 +246,7 @@ void test_unary_plus() const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); builtin_value = +builtin_value; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; emulated_value = +emulated_value; builtin_u128 emulated_bits; @@ -267,7 +267,7 @@ void test_unary_minus() const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); builtin_value = -builtin_value; - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; emulated_value = -emulated_value; builtin_u128 emulated_bits; @@ -288,7 +288,7 @@ void test_operator_equality() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value == emulated_value) == (emulated_value == value)) == ((value == builtin_value) == (builtin_value == value))); // LCOV_EXCL_LINE } @@ -299,12 +299,12 @@ void test_operator_equality() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 == emulated_value) == (emulated_value == value2)) == ((value2 == builtin_value) == (builtin_value == value2))); // LCOV_EXCL_LINE } - const boost::int128::uint128_t bool_val {dist(rng)}; // LCOV_EXCL_LINE + const boost::int128::uint128 bool_val {dist(rng)}; // LCOV_EXCL_LINE BOOST_TEST((true == bool_val) == (bool_val == true)); // LCOV_EXCL_LINE } @@ -319,7 +319,7 @@ void test_operator_inequality() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value != emulated_value) == (emulated_value != value)) == ((value != builtin_value) == (builtin_value != value))); // LCOV_EXCL_LINE } @@ -330,12 +330,12 @@ void test_operator_inequality() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(((value2 != emulated_value) == (emulated_value != value2)) == ((value2 != builtin_value) == (builtin_value != value2))); // LCOV_EXCL_LINE } - const boost::int128::uint128_t bool_val {dist(rng)}; // LCOV_EXCL_LINE + const boost::int128::uint128 bool_val {dist(rng)}; // LCOV_EXCL_LINE BOOST_TEST((true != bool_val) == (bool_val != true)); // LCOV_EXCL_LINE } @@ -350,7 +350,7 @@ void test_operator_less() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -386,7 +386,7 @@ void test_operator_le() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -422,7 +422,7 @@ void test_operator_greater() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -458,7 +458,7 @@ void test_operator_ge() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Some platforms get this wrong where for example -99 < 340282366920938463463374607431768211408 evaluates to false // These values happen to be bitwise equal @@ -493,7 +493,7 @@ void test_operator_not() { const IntType value {dist(rng)}; // LCOV_EXCL_LINE const auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; BOOST_TEST(~emulated_value == ~builtin_value); // LCOV_EXCL_LINE } @@ -510,7 +510,7 @@ void test_operator_or() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value |= value2; @@ -545,7 +545,7 @@ void test_operator_and() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value &= value2; @@ -580,7 +580,7 @@ void test_operator_xor() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value ^= value2; @@ -617,7 +617,7 @@ void test_operator_left_shift() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const unsigned shift_value {shift_dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Test 1: Test the <<= operator auto builtin_copy = builtin_value; @@ -658,7 +658,7 @@ void test_operator_right_shift() const IntType value {dist(rng)}; // LCOV_EXCL_LINE const unsigned shift_value {shift_dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; // Test 1: Test the >>= operator auto builtin_copy = builtin_value; @@ -688,7 +688,7 @@ void test_operator_right_shift() void test_increment_operator() { - boost::int128::uint128_t emulated_value {UINT64_MAX - N/2}; + boost::int128::uint128 emulated_value {UINT64_MAX - N/2}; builtin_u128 builtin_value {UINT64_MAX - N/2}; for (std::size_t i {}; i < N; ++i) @@ -702,7 +702,7 @@ void test_increment_operator() void test_decrement_operator() { - boost::int128::uint128_t emulated_value {UINT64_MAX + N/2}; + boost::int128::uint128 emulated_value {UINT64_MAX + N/2}; builtin_u128 builtin_value {UINT64_MAX + N/2}; for (std::size_t i {}; i < N; ++i) @@ -733,7 +733,7 @@ void test_operator_add() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value += value2; @@ -743,7 +743,7 @@ void test_operator_add() // Edge case where we go from low word to high word builtin_u128 builtin_value = UINT64_MAX - 2U; - boost::int128::uint128_t emulated_value = UINT64_MAX - 2U; + boost::int128::uint128 emulated_value = UINT64_MAX - 2U; for (std::size_t i {}; i < N; ++i) { @@ -770,7 +770,7 @@ void test_operator_sub() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value -= value2; @@ -781,7 +781,7 @@ void test_operator_sub() // Edge case where we go from low word to high word builtin_u128 builtin_value = UINT64_MAX; builtin_value += 2U; - boost::int128::uint128_t emulated_value = UINT64_MAX; + boost::int128::uint128 emulated_value = UINT64_MAX; emulated_value += 2U; for (std::size_t i {}; i < N; ++i) @@ -801,7 +801,7 @@ void test_operator_mul() IntType value2 {dist(rng)}; // LCOV_EXCL_LINE auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value *= value2; @@ -831,7 +831,7 @@ void test_operator_div() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -847,7 +847,7 @@ void test_operator_div() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -865,7 +865,7 @@ void test_operator_div() } const auto builtin_value = (static_cast(static_cast(value)) << 64) | static_cast(value); - const boost::int128::uint128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::uint128 emulated_value {static_cast(value), static_cast(value)}; auto check_1_value {emulated_value}; check_1_value /= value2; @@ -880,7 +880,7 @@ void test_operator_div() BOOST_TEST((value2 / emulated_value) == (value2 / builtin_value)); // LCOV_EXCL_LINE // Forces decision process - const boost::int128::uint128_t check_2_value {value2}; + const boost::int128::uint128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value / check_2_value)); // LCOV_EXCL_LINE } } @@ -908,7 +908,7 @@ void test_operator_mod() } auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -924,7 +924,7 @@ void test_operator_mod() } // Test 2 word by 1 word and 1 word by 2 word - BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128_t)) + BOOST_INT128_IF_CONSTEXPR (sizeof(IntType) < sizeof(boost::int128::uint128)) { for (std::size_t i {}; i < N; ++i) { @@ -942,7 +942,7 @@ void test_operator_mod() } const auto builtin_value = (static_cast(static_cast(value)) << 64) | static_cast(value); - const boost::int128::uint128_t emulated_value {static_cast(value), static_cast(value)}; + const boost::int128::uint128 emulated_value {static_cast(value), static_cast(value)}; auto check_1_value {emulated_value}; check_1_value %= value2; @@ -957,7 +957,7 @@ void test_operator_mod() BOOST_TEST((value2 % emulated_value) == (value2 % builtin_value)); // LCOV_EXCL_LINE // Forces decision process - const boost::int128::uint128_t check_2_value {value2}; + const boost::int128::uint128 check_2_value {value2}; BOOST_TEST(check_1_value == (emulated_value % check_2_value)); // LCOV_EXCL_LINE } } @@ -967,7 +967,7 @@ template void test_spot_div(IntType value, IntType value2) { auto builtin_value = static_cast(value); - boost::int128::uint128_t emulated_value {value}; + boost::int128::uint128 emulated_value {value}; auto check_1_value {emulated_value}; check_1_value /= value2; diff --git a/test/test_unsigned_add.cu b/test/test_unsigned_add.cu index 443295be..479472cc 100644 --- a/test/test_unsigned_add.cu +++ b/test/test_unsigned_add.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_add_sycl.cpp b/test/test_unsigned_add_sycl.cpp index 85e35937..35777b02 100644 --- a/test/test_unsigned_add_sycl.cpp +++ b/test/test_unsigned_add_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a + b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a + b; }); } diff --git a/test/test_unsigned_and.cu b/test/test_unsigned_and.cu index 8e9f1bbd..e83a1cb8 100644 --- a/test/test_unsigned_and.cu +++ b/test/test_unsigned_and.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_and_sycl.cpp b/test/test_unsigned_and_sycl.cpp index 0f04a181..bfca6e03 100644 --- a/test/test_unsigned_and_sycl.cpp +++ b/test/test_unsigned_and_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a & b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a & b; }); } diff --git a/test/test_unsigned_cstdlib_div.cu b/test/test_unsigned_cstdlib_div.cu index f957e63e..068be80f 100644 --- a/test/test_unsigned_cstdlib_div.cu +++ b/test/test_unsigned_cstdlib_div.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; using result_type = boost::int128::u128div_t; __global__ void cuda_test(const test_type *in, const test_type *in2, result_type *out, int numElements) diff --git a/test/test_unsigned_cstdlib_div_sycl.cpp b/test/test_unsigned_cstdlib_div_sycl.cpp index 706261ab..7b57b18f 100644 --- a/test/test_unsigned_cstdlib_div_sycl.cpp +++ b/test/test_unsigned_cstdlib_div_sycl.cpp @@ -4,12 +4,12 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { const auto d {boost::int128::div(a, int128_sycl_test::safe_divisor(a, b))}; return d.quot ^ d.rem; diff --git a/test/test_unsigned_div.cu b/test/test_unsigned_div.cu index e1f47941..d0c1bbd6 100644 --- a/test/test_unsigned_div.cu +++ b/test/test_unsigned_div.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_div_sycl.cpp b/test/test_unsigned_div_sycl.cpp index 54b993dd..4dc5f946 100644 --- a/test/test_unsigned_div_sycl.cpp +++ b/test/test_unsigned_div_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return int128_sycl_test::safe_div(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return int128_sycl_test::safe_div(a, b); }); } diff --git a/test/test_unsigned_eq.cu b/test/test_unsigned_eq.cu index b3a7dca9..3f5fdc82 100644 --- a/test/test_unsigned_eq.cu +++ b/test/test_unsigned_eq.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_eq_sycl.cpp b/test/test_unsigned_eq_sycl.cpp index 41dc174c..0b32d14a 100644 --- a/test/test_unsigned_eq_sycl.cpp +++ b/test/test_unsigned_eq_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a == b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a == b; }); } diff --git a/test/test_unsigned_from_chars.cu b/test/test_unsigned_from_chars.cu index ba5de8f1..a9180ea4 100644 --- a/test/test_unsigned_from_chars.cu +++ b/test/test_unsigned_from_chars.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; constexpr int BUF_SIZE = 64; diff --git a/test/test_unsigned_from_chars_bases.cu b/test/test_unsigned_from_chars_bases.cu index 6e45842e..e2608459 100644 --- a/test/test_unsigned_from_chars_bases.cu +++ b/test/test_unsigned_from_chars_bases.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; constexpr int BUF_SIZE = 192; diff --git a/test/test_unsigned_from_chars_bases_sycl.cpp b/test/test_unsigned_from_chars_bases_sycl.cpp index 6b16e642..0f73ebc3 100644 --- a/test/test_unsigned_from_chars_bases_sycl.cpp +++ b/test/test_unsigned_from_chars_bases_sycl.cpp @@ -4,14 +4,14 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { int result {0}; - result |= int128_sycl_test::run_from_chars(2); - result |= int128_sycl_test::run_from_chars(8); - result |= int128_sycl_test::run_from_chars(16); - result |= int128_sycl_test::run_from_chars(36); + result |= int128_sycl_test::run_from_chars(2); + result |= int128_sycl_test::run_from_chars(8); + result |= int128_sycl_test::run_from_chars(16); + result |= int128_sycl_test::run_from_chars(36); return result; } diff --git a/test/test_unsigned_from_chars_sycl.cpp b/test/test_unsigned_from_chars_sycl.cpp index d37f1af5..2bf5bcb6 100644 --- a/test/test_unsigned_from_chars_sycl.cpp +++ b/test/test_unsigned_from_chars_sycl.cpp @@ -4,9 +4,9 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_from_chars(10); + return int128_sycl_test::run_from_chars(10); } diff --git a/test/test_unsigned_gcd.cu b/test/test_unsigned_gcd.cu index 6b44cf60..bbe96361 100644 --- a/test/test_unsigned_gcd.cu +++ b/test/test_unsigned_gcd.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_gcd_sycl.cpp b/test/test_unsigned_gcd_sycl.cpp index 58b821b0..df0be3eb 100644 --- a/test/test_unsigned_gcd_sycl.cpp +++ b/test/test_unsigned_gcd_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::gcd(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::gcd(a, b); }); } diff --git a/test/test_unsigned_ge.cu b/test/test_unsigned_ge.cu index ade4913c..eca4066f 100644 --- a/test/test_unsigned_ge.cu +++ b/test/test_unsigned_ge.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_ge_sycl.cpp b/test/test_unsigned_ge_sycl.cpp index 45a96fe3..5dfb3c4e 100644 --- a/test/test_unsigned_ge_sycl.cpp +++ b/test/test_unsigned_ge_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a >= b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a >= b; }); } diff --git a/test/test_unsigned_gt.cu b/test/test_unsigned_gt.cu index d4234d91..87ecbe74 100644 --- a/test/test_unsigned_gt.cu +++ b/test/test_unsigned_gt.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_gt_sycl.cpp b/test/test_unsigned_gt_sycl.cpp index 1525b9c5..39ac2eec 100644 --- a/test/test_unsigned_gt_sycl.cpp +++ b/test/test_unsigned_gt_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a > b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a > b; }); } diff --git a/test/test_unsigned_lcm.cu b/test/test_unsigned_lcm.cu index 83fe2171..7c4e930f 100644 --- a/test/test_unsigned_lcm.cu +++ b/test/test_unsigned_lcm.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_lcm_sycl.cpp b/test/test_unsigned_lcm_sycl.cpp index ca8e958c..adb32890 100644 --- a/test/test_unsigned_lcm_sycl.cpp +++ b/test/test_unsigned_lcm_sycl.cpp @@ -4,11 +4,11 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { // Restrict inputs so the true LCM stays within 128 bits. - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::lcm(a >> 64, b >> 64); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::lcm(a >> 64, b >> 64); }); } diff --git a/test/test_unsigned_le.cu b/test/test_unsigned_le.cu index 9d034350..c9354c13 100644 --- a/test/test_unsigned_le.cu +++ b/test/test_unsigned_le.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_le_sycl.cpp b/test/test_unsigned_le_sycl.cpp index 4f094f07..90a4116c 100644 --- a/test/test_unsigned_le_sycl.cpp +++ b/test/test_unsigned_le_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a <= b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a <= b; }); } diff --git a/test/test_unsigned_left_shift.cu b/test/test_unsigned_left_shift.cu index 7778d935..3b99c009 100644 --- a/test/test_unsigned_left_shift.cu +++ b/test/test_unsigned_left_shift.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const unsigned *shift, test_type *out, int numElements) { diff --git a/test/test_unsigned_left_shift_sycl.cpp b/test/test_unsigned_left_shift_sycl.cpp index 7580f4e1..3cbb5230 100644 --- a/test/test_unsigned_left_shift_sycl.cpp +++ b/test/test_unsigned_left_shift_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int i) { return a << (i % 128); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int i) { return a << (i % 128); }); } diff --git a/test/test_unsigned_literals.cu b/test/test_unsigned_literals.cu index bbac3b21..333b2c40 100644 --- a/test/test_unsigned_literals.cu +++ b/test/test_unsigned_literals.cu @@ -13,7 +13,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using boost::int128::uint128_t; +using boost::int128::uint128; using namespace boost::int128::literals; // Number of test cases: we test each literal operator with several values @@ -27,7 +27,7 @@ using namespace boost::int128::literals; constexpr int NUM_TESTS = 24; -__global__ void cuda_test(uint128_t *out) +__global__ void cuda_test(uint128 *out) { int i = threadIdx.x; @@ -74,7 +74,7 @@ int main(void) std::cout << "[Unsigned literal tests: " << NUM_TESTS << " cases]" << std::endl; - cuda_managed_ptr output(NUM_TESTS); + cuda_managed_ptr output(NUM_TESTS); // Launch with 1 block of NUM_TESTS threads watch w; @@ -92,7 +92,7 @@ int main(void) } // Build expected values on host using the same literals - uint128_t expected[NUM_TESTS]; + uint128 expected[NUM_TESTS]; // operator""_u128(const char*) - raw literal expected[0] = 0_u128; diff --git a/test/test_unsigned_literals_sycl.cpp b/test/test_unsigned_literals_sycl.cpp index dcbf6809..d9a46d22 100644 --- a/test/test_unsigned_literals_sycl.cpp +++ b/test/test_unsigned_literals_sycl.cpp @@ -7,7 +7,7 @@ #include #include -using boost::int128::uint128_t; +using boost::int128::uint128; using namespace boost::int128::literals; // Exercises the user-defined literal operators inside a SYCL kernel and checks the @@ -19,7 +19,7 @@ int main() sycl::queue q; std::cout << "SYCL device: " << q.get_device().get_info() << "\n"; - uint128_t* out {sycl::malloc_shared(N, q)}; + uint128* out {sycl::malloc_shared(N, q)}; q.submit([&](sycl::handler& h) { @@ -56,7 +56,7 @@ int main() }); }).wait(); - uint128_t expected[N]; + uint128 expected[N]; expected[0] = 0_u128; expected[1] = 1_u128; expected[2] = 18446744073709551615_u128; diff --git a/test/test_unsigned_lt.cu b/test/test_unsigned_lt.cu index 07b7c1df..f0aec260 100644 --- a/test/test_unsigned_lt.cu +++ b/test/test_unsigned_lt.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_lt_sycl.cpp b/test/test_unsigned_lt_sycl.cpp index daaa9a91..dbaf00bc 100644 --- a/test/test_unsigned_lt_sycl.cpp +++ b/test/test_unsigned_lt_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a < b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a < b; }); } diff --git a/test/test_unsigned_midpoint.cu b/test/test_unsigned_midpoint.cu index 505af9e1..fccc6a69 100644 --- a/test/test_unsigned_midpoint.cu +++ b/test/test_unsigned_midpoint.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_midpoint_sycl.cpp b/test/test_unsigned_midpoint_sycl.cpp index 7d9d4c4e..aa0cb9ee 100644 --- a/test/test_unsigned_midpoint_sycl.cpp +++ b/test/test_unsigned_midpoint_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::midpoint(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::midpoint(a, b); }); } diff --git a/test/test_unsigned_mod.cu b/test/test_unsigned_mod.cu index 7dc0a627..00cbd571 100644 --- a/test/test_unsigned_mod.cu +++ b/test/test_unsigned_mod.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_mod_sycl.cpp b/test/test_unsigned_mod_sycl.cpp index 0d032003..a762bc56 100644 --- a/test/test_unsigned_mod_sycl.cpp +++ b/test/test_unsigned_mod_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return int128_sycl_test::safe_mod(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return int128_sycl_test::safe_mod(a, b); }); } diff --git a/test/test_unsigned_mul.cu b/test/test_unsigned_mul.cu index ef7d89dd..b94e96b0 100644 --- a/test/test_unsigned_mul.cu +++ b/test/test_unsigned_mul.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_mul_sycl.cpp b/test/test_unsigned_mul_sycl.cpp index 7b08ecf3..59f21251 100644 --- a/test/test_unsigned_mul_sycl.cpp +++ b/test/test_unsigned_mul_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a * b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a * b; }); } diff --git a/test/test_unsigned_ne.cu b/test/test_unsigned_ne.cu index c9a02b41..9dbd5c90 100644 --- a/test/test_unsigned_ne.cu +++ b/test/test_unsigned_ne.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_ne_sycl.cpp b/test/test_unsigned_ne_sycl.cpp index 18af865b..5690db0b 100644 --- a/test/test_unsigned_ne_sycl.cpp +++ b/test/test_unsigned_ne_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_compare( - [](uint128_t a, uint128_t b) { return a != b; }); + return int128_sycl_test::run_compare( + [](uint128 a, uint128 b) { return a != b; }); } diff --git a/test/test_unsigned_not.cu b/test/test_unsigned_not.cu index 9bfb08b7..ac841490 100644 --- a/test/test_unsigned_not.cu +++ b/test/test_unsigned_not.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, test_type *out, int numElements) { diff --git a/test/test_unsigned_not_sycl.cpp b/test/test_unsigned_not_sycl.cpp index e359a9e2..a012bb4e 100644 --- a/test/test_unsigned_not_sycl.cpp +++ b/test/test_unsigned_not_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return ~a; }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return ~a; }); } diff --git a/test/test_unsigned_or.cu b/test/test_unsigned_or.cu index 9399341f..b5fa5d67 100644 --- a/test/test_unsigned_or.cu +++ b/test/test_unsigned_or.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_or_sycl.cpp b/test/test_unsigned_or_sycl.cpp index a19267a7..ba01216f 100644 --- a/test/test_unsigned_or_sycl.cpp +++ b/test/test_unsigned_or_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a | b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a | b; }); } diff --git a/test/test_unsigned_right_shift.cu b/test/test_unsigned_right_shift.cu index 2dd59fba..019b006b 100644 --- a/test/test_unsigned_right_shift.cu +++ b/test/test_unsigned_right_shift.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const unsigned *shift, test_type *out, int numElements) { diff --git a/test/test_unsigned_right_shift_sycl.cpp b/test/test_unsigned_right_shift_sycl.cpp index 300fdaae..88f6e02e 100644 --- a/test/test_unsigned_right_shift_sycl.cpp +++ b/test/test_unsigned_right_shift_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int i) { return a >> (i % 128); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int i) { return a >> (i % 128); }); } diff --git a/test/test_unsigned_saturating_add.cu b/test/test_unsigned_saturating_add.cu index 50faed85..c180f051 100644 --- a/test/test_unsigned_saturating_add.cu +++ b/test/test_unsigned_saturating_add.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_saturating_add_sycl.cpp b/test/test_unsigned_saturating_add_sycl.cpp index 02a4ca84..3424ad27 100644 --- a/test/test_unsigned_saturating_add_sycl.cpp +++ b/test/test_unsigned_saturating_add_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::saturating_add(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::saturating_add(a, b); }); } diff --git a/test/test_unsigned_saturating_div.cu b/test/test_unsigned_saturating_div.cu index 1925dd26..f96a0798 100644 --- a/test/test_unsigned_saturating_div.cu +++ b/test/test_unsigned_saturating_div.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_saturating_div_sycl.cpp b/test/test_unsigned_saturating_div_sycl.cpp index 83f08209..a1c91214 100644 --- a/test/test_unsigned_saturating_div_sycl.cpp +++ b/test/test_unsigned_saturating_div_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::saturating_div(a, int128_sycl_test::safe_divisor(a, b)); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::saturating_div(a, int128_sycl_test::safe_divisor(a, b)); }); } diff --git a/test/test_unsigned_saturating_mul.cu b/test/test_unsigned_saturating_mul.cu index b619cc6f..70836828 100644 --- a/test/test_unsigned_saturating_mul.cu +++ b/test/test_unsigned_saturating_mul.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_saturating_mul_sycl.cpp b/test/test_unsigned_saturating_mul_sycl.cpp index 49412e43..3378fe95 100644 --- a/test/test_unsigned_saturating_mul_sycl.cpp +++ b/test/test_unsigned_saturating_mul_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::saturating_mul(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::saturating_mul(a, b); }); } diff --git a/test/test_unsigned_saturating_sub.cu b/test/test_unsigned_saturating_sub.cu index d3fd7dcf..aab258be 100644 --- a/test/test_unsigned_saturating_sub.cu +++ b/test/test_unsigned_saturating_sub.cu @@ -16,7 +16,7 @@ #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_saturating_sub_sycl.cpp b/test/test_unsigned_saturating_sub_sycl.cpp index e0247ea2..90517855 100644 --- a/test/test_unsigned_saturating_sub_sycl.cpp +++ b/test/test_unsigned_saturating_sub_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return boost::int128::saturating_sub(a, b); }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return boost::int128::saturating_sub(a, b); }); } diff --git a/test/test_unsigned_sub.cu b/test/test_unsigned_sub.cu index be22b2fc..f82e9837 100644 --- a/test/test_unsigned_sub.cu +++ b/test/test_unsigned_sub.cu @@ -18,7 +18,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_sub_sycl.cpp b/test/test_unsigned_sub_sycl.cpp index 503d285c..8dff9b2a 100644 --- a/test/test_unsigned_sub_sycl.cpp +++ b/test/test_unsigned_sub_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a - b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a - b; }); } diff --git a/test/test_unsigned_to_chars.cu b/test/test_unsigned_to_chars.cu index 76dd830f..a3a2bb04 100644 --- a/test/test_unsigned_to_chars.cu +++ b/test/test_unsigned_to_chars.cu @@ -19,7 +19,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; constexpr int BUF_SIZE = 64; diff --git a/test/test_unsigned_to_chars_bases.cu b/test/test_unsigned_to_chars_bases.cu index b67c2bb5..e0081a0b 100644 --- a/test/test_unsigned_to_chars_bases.cu +++ b/test/test_unsigned_to_chars_bases.cu @@ -19,7 +19,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; constexpr int BUF_SIZE = 192; diff --git a/test/test_unsigned_to_chars_bases_sycl.cpp b/test/test_unsigned_to_chars_bases_sycl.cpp index 01066aca..6eaf2ba1 100644 --- a/test/test_unsigned_to_chars_bases_sycl.cpp +++ b/test/test_unsigned_to_chars_bases_sycl.cpp @@ -4,14 +4,14 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { int result {0}; - result |= int128_sycl_test::run_to_chars(2); - result |= int128_sycl_test::run_to_chars(8); - result |= int128_sycl_test::run_to_chars(16); - result |= int128_sycl_test::run_to_chars(36); + result |= int128_sycl_test::run_to_chars(2); + result |= int128_sycl_test::run_to_chars(8); + result |= int128_sycl_test::run_to_chars(16); + result |= int128_sycl_test::run_to_chars(36); return result; } diff --git a/test/test_unsigned_to_chars_sycl.cpp b/test/test_unsigned_to_chars_sycl.cpp index d4dd01f7..6edc4ae2 100644 --- a/test/test_unsigned_to_chars_sycl.cpp +++ b/test/test_unsigned_to_chars_sycl.cpp @@ -4,9 +4,9 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run_to_chars(10); + return int128_sycl_test::run_to_chars(10); } diff --git a/test/test_unsigned_to_signed_conversion.cu b/test/test_unsigned_to_signed_conversion.cu index 67195383..2ec01b13 100644 --- a/test/test_unsigned_to_signed_conversion.cu +++ b/test/test_unsigned_to_signed_conversion.cu @@ -17,8 +17,8 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using signed_type = boost::int128::int128_t; -using unsigned_type = boost::int128::uint128_t; +using signed_type = boost::int128::int128; +using unsigned_type = boost::int128::uint128; /** * CUDA Kernel Device code diff --git a/test/test_unsigned_to_signed_conversion_sycl.cpp b/test/test_unsigned_to_signed_conversion_sycl.cpp index e7c5aac2..4def121a 100644 --- a/test/test_unsigned_to_signed_conversion_sycl.cpp +++ b/test/test_unsigned_to_signed_conversion_sycl.cpp @@ -4,11 +4,11 @@ #include "sycl_test.hpp" -using boost::int128::int128_t; -using boost::int128::uint128_t; +using boost::int128::int128; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t, int) { return static_cast(a); }); + return int128_sycl_test::run( + [](uint128 a, uint128, int) { return static_cast(a); }); } diff --git a/test/test_unsigned_xor.cu b/test/test_unsigned_xor.cu index 1416fc87..9c74489b 100644 --- a/test/test_unsigned_xor.cu +++ b/test/test_unsigned_xor.cu @@ -17,7 +17,7 @@ // For the CUDA runtime routines (prefixed with "cuda_") #include -using test_type = boost::int128::uint128_t; +using test_type = boost::int128::uint128; __global__ void cuda_test(const test_type *in, const test_type *in2, test_type *out, int numElements) { diff --git a/test/test_unsigned_xor_sycl.cpp b/test/test_unsigned_xor_sycl.cpp index 30f9ea1d..bf38790b 100644 --- a/test/test_unsigned_xor_sycl.cpp +++ b/test/test_unsigned_xor_sycl.cpp @@ -4,10 +4,10 @@ #include "sycl_test.hpp" -using boost::int128::uint128_t; +using boost::int128::uint128; int main() { - return int128_sycl_test::run( - [](uint128_t a, uint128_t b, int) { return a ^ b; }); + return int128_sycl_test::run( + [](uint128 a, uint128 b, int) { return a ^ b; }); } diff --git a/test/test_x64_msvc_div.cpp b/test/test_x64_msvc_div.cpp index 40cbb70c..2c6ff896 100644 --- a/test/test_x64_msvc_div.cpp +++ b/test/test_x64_msvc_div.cpp @@ -16,7 +16,7 @@ #if defined(_M_AMD64) && !defined(__GNUC__) && !defined(__clang__) && _MSC_VER >= 1920 -using boost::int128::uint128_t; +using boost::int128::uint128; static std::mt19937_64 rng{42}; static constexpr std::size_t N{4096U}; @@ -26,14 +26,14 @@ static std::uniform_int_distribution dist{UINT64_C(0), UINT64_MAX // uses no 64-bit-divide or multiply intrinsics. static void knuth_oracle(const std::uint64_t uh, const std::uint64_t ul, const std::uint64_t vh, const std::uint64_t vl, - uint128_t& quot, uint128_t& rem) + uint128& quot, uint128& rem) { - const uint128_t u_val{uh, ul}; - const uint128_t v_val{vh, vl}; + const uint128 u_val{uh, ul}; + const uint128 v_val{vh, vl}; if (u_val < v_val) { - quot = uint128_t{UINT64_C(0)}; + quot = uint128{UINT64_C(0)}; rem = u_val; return; } @@ -47,8 +47,8 @@ static void knuth_oracle(const std::uint64_t uh, const std::uint64_t ul, boost::int128::detail::impl::knuth_divide(u, m, v, n, q); - quot = boost::int128::detail::impl::from_words(q); - rem = boost::int128::detail::impl::from_words(u); + quot = boost::int128::detail::impl::from_words(q); + rem = boost::int128::detail::impl::from_words(u); } // _udiv128 (udiv_2by1) versus the portable divlu, for 128/64 -> 64. @@ -82,13 +82,13 @@ static void check_div3by2(const std::uint64_t uh, const std::uint64_t ul, std::uint64_t rl{}; const auto q{boost::int128::detail::div3by2(uh, ul, vh, vl, rh, rl)}; - uint128_t expected_q{}; - uint128_t expected_r{}; + uint128 expected_q{}; + uint128 expected_r{}; knuth_oracle(uh, ul, vh, vl, expected_q, expected_r); BOOST_TEST_EQ(expected_q.high, UINT64_C(0)); BOOST_TEST_EQ(q, expected_q.low); - BOOST_TEST_EQ(uint128_t(rh, rl), expected_r); + BOOST_TEST_EQ(uint128(rh, rl), expected_r); } // _udiv128 + _umul128 (div3by2) versus the 32-bit-limb Knuth reference, for 128/128 -> 64. From a4a022c61eea64797f645500ee173b3ce4465f19 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 30 Jul 2026 09:10:00 -0400 Subject: [PATCH 2/4] Fix broken rename issues --- doc/modules/ROOT/pages/{int128_t.adoc => int128.adoc} | 0 doc/modules/ROOT/pages/{uint128_t.adoc => uint128.adoc} | 0 include/boost/int128/utilities.hpp | 6 +++--- test/benchmark_i128.cpp | 2 +- test/benchmark_u128.cpp | 2 +- test/test_integer_comparison.cpp | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) rename doc/modules/ROOT/pages/{int128_t.adoc => int128.adoc} (100%) rename doc/modules/ROOT/pages/{uint128_t.adoc => uint128.adoc} (100%) diff --git a/doc/modules/ROOT/pages/int128_t.adoc b/doc/modules/ROOT/pages/int128.adoc similarity index 100% rename from doc/modules/ROOT/pages/int128_t.adoc rename to doc/modules/ROOT/pages/int128.adoc diff --git a/doc/modules/ROOT/pages/uint128_t.adoc b/doc/modules/ROOT/pages/uint128.adoc similarity index 100% rename from doc/modules/ROOT/pages/uint128_t.adoc rename to doc/modules/ROOT/pages/uint128.adoc diff --git a/include/boost/int128/utilities.hpp b/include/boost/int128/utilities.hpp index 01fed4c0..fd63c308 100644 --- a/include/boost/int128/utilities.hpp +++ b/include/boost/int128/utilities.hpp @@ -460,7 +460,7 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_type_v = valid_comparison // Allow the builtins to be used when available template -BOOST_INT128_INLINE_CONSTEXPR bool is_int128ype_v = std::is_same::value || +BOOST_INT128_INLINE_CONSTEXPR bool is_int128_type_v = std::is_same::value || std::is_same::value #if defined(BOOST_INT128_HAS_INT128) || defined(BOOST_INT128_HAS_MSVC_INT128) || std::is_same::value @@ -470,7 +470,7 @@ BOOST_INT128_INLINE_CONSTEXPR bool is_int128ype_v = std::is_same::val template BOOST_INT128_INLINE_CONSTEXPR bool is_valid_comparison_operand_v = is_valid_comparison_type_v || - is_int128ype_v; + is_int128_type_v; // Maps the builtin 128-bit types onto the library equivalents template @@ -534,7 +534,7 @@ BOOST_INT128_HOST_DEVICE constexpr bool cmp_less_impl(const T lhs, const U rhs) template BOOST_INT128_INLINE_CONSTEXPR bool enable_comparison_v = is_valid_comparison_operand_v && is_valid_comparison_operand_v && - (is_int128ype_v || is_int128ype_v); + (is_int128_type_v || is_int128_type_v); } // namespace detail diff --git a/test/benchmark_i128.cpp b/test/benchmark_i128.cpp index e68149f6..112be6a3 100644 --- a/test/benchmark_i128.cpp +++ b/test/benchmark_i128.cpp @@ -85,7 +85,7 @@ using namespace std::chrono_literals; #include #include -using mp_i128 = boost::multiprecision::int128; +using mp_i128 = boost::multiprecision::int128_t; // Names of the implementations under test. The generated documentation tables and // the plot legends use these labels verbatim, so each one spells the type the way diff --git a/test/benchmark_u128.cpp b/test/benchmark_u128.cpp index 675e466d..077ed0d0 100644 --- a/test/benchmark_u128.cpp +++ b/test/benchmark_u128.cpp @@ -92,7 +92,7 @@ using namespace std::chrono_literals; #include #include -using mp_u128 = boost::multiprecision::uint128; +using mp_u128 = boost::multiprecision::uint128_t; // Names of the implementations under test. The generated documentation tables and // the plot legends use these labels verbatim, so each one spells the type the way diff --git a/test/test_integer_comparison.cpp b/test/test_integer_comparison.cpp index 028ed322..b4b85e10 100644 --- a/test/test_integer_comparison.cpp +++ b/test/test_integer_comparison.cpp @@ -345,8 +345,8 @@ void test_builtin_128() constexpr auto i_max {(std::numeric_limits::max)()}; // trait classification - static_assert(boost::int128::detail::is_int128ype_v, "builtin signed is a 128-bit type"); - static_assert(boost::int128::detail::is_int128ype_v, "builtin unsigned is a 128-bit type"); + static_assert(boost::int128::detail::is_int128_type_v, "builtin signed is a 128-bit type"); + static_assert(boost::int128::detail::is_int128_type_v, "builtin unsigned is a 128-bit type"); static_assert(boost::int128::detail::is_valid_comparison_operand_v, "builtin signed is an operand"); static_assert(boost::int128::detail::is_valid_comparison_operand_v, "builtin unsigned is an operand"); From b9ec9bb2d25034941a478c8c421c88e406664327 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 30 Jul 2026 09:42:43 -0400 Subject: [PATCH 3/4] Fix fuzzing typenames --- test/fuzzing/test_fuzzing_add_versus_wide_int.cpp | 4 ++-- test/fuzzing/test_fuzzing_div_versus_wide_int.cpp | 4 ++-- test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp | 4 ++-- test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp index 9b12bd88..421cd58f 100644 --- a/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_add_versus_wide_int.cpp @@ -107,9 +107,9 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; #else - using cntrl_uint_type = ::math::wide_integer::uint128; + using cntrl_uint_type = ::math::wide_integer::uint128_t; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp index 35104985..e5356874 100644 --- a/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_div_versus_wide_int.cpp @@ -107,9 +107,9 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; #else - using cntrl_uint_type = ::math::wide_integer::uint128; + using cntrl_uint_type = ::math::wide_integer::uint128_t; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp index 619937a4..4a437139 100644 --- a/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_mul_versus_wide_int.cpp @@ -107,9 +107,9 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; #else - using cntrl_uint_type = ::math::wide_integer::uint128; + using cntrl_uint_type = ::math::wide_integer::uint128_t; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; diff --git a/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp b/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp index 3af53c78..e1242845 100644 --- a/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp +++ b/test/fuzzing/test_fuzzing_sub_versus_wide_int.cpp @@ -107,9 +107,9 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) using local_uint_type = ::boost::int128::uint128; #if defined(WIDE_INTEGER_NAMESPACE) - using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128; + using cntrl_uint_type = ::WIDE_INTEGER_NAMESPACE::math::wide_integer::uint128_t; #else - using cntrl_uint_type = ::math::wide_integer::uint128; + using cntrl_uint_type = ::math::wide_integer::uint128_t; #endif cntrl_uint_type a_cntrl { a_hi64 }; a_cntrl <<= unsigned { UINT8_C(64) }; a_cntrl |= a_lo64; From bbe0ecb1a3b67b5358fe9d8813e024485662f1d6 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 30 Jul 2026 13:33:59 -0400 Subject: [PATCH 4/4] Update images with new name --- .../i128_graphs/linux/ARM32_benchmarks.png | Bin 365643 -> 364807 bytes .../linux/ARM32_relative_performance.png | Bin 189703 -> 189683 bytes .../i128_graphs/linux/ARM64_benchmarks.png | Bin 411697 -> 411304 bytes .../linux/ARM64_relative_performance.png | Bin 201153 -> 200713 bytes .../i128_graphs/linux/ppc64le_benchmarks.png | Bin 396054 -> 394919 bytes .../linux/ppc64le_relative_performance.png | Bin 192449 -> 191896 bytes .../i128_graphs/linux/s390x_benchmarks.png | Bin 433113 -> 432369 bytes .../linux/s390x_relative_performance.png | Bin 213946 -> 213601 bytes .../i128_graphs/linux/x64_benchmarks.png | Bin 429156 -> 428363 bytes .../linux/x64_relative_performance.png | Bin 203914 -> 203553 bytes .../i128_graphs/linux/x86_benchmarks.png | Bin 366635 -> 365797 bytes .../linux/x86_relative_performance.png | Bin 186740 -> 185910 bytes .../i128_graphs/macos/ARM64_benchmarks.png | Bin 432664 -> 431925 bytes .../macos/ARM64_relative_performance.png | Bin 219058 -> 218714 bytes .../i128_graphs/windows/ARM64_benchmarks.png | Bin 411202 -> 410363 bytes .../windows/ARM64_relative_performance.png | Bin 201505 -> 200990 bytes .../i128_graphs/windows/x64_benchmarks.png | Bin 403194 -> 402212 bytes .../windows/x64_relative_performance.png | Bin 202860 -> 202357 bytes .../i128_graphs/windows/x86_benchmarks.png | Bin 414099 -> 413122 bytes .../windows/x86_relative_performance.png | Bin 208968 -> 208475 bytes .../u128_graphs/linux/ARM32_benchmarks.png | Bin 371171 -> 370377 bytes .../linux/ARM32_relative_performance.png | Bin 196226 -> 195430 bytes .../u128_graphs/linux/ARM64_benchmarks.png | Bin 431804 -> 430861 bytes .../linux/ARM64_relative_performance.png | Bin 222091 -> 221511 bytes .../u128_graphs/linux/ppc64le_benchmarks.png | Bin 398181 -> 396967 bytes .../linux/ppc64le_relative_performance.png | Bin 212218 -> 211612 bytes .../u128_graphs/linux/s390x_benchmarks.png | Bin 431434 -> 430453 bytes .../linux/s390x_relative_performance.png | Bin 228847 -> 228330 bytes .../u128_graphs/linux/x64_benchmarks.png | Bin 424766 -> 424072 bytes .../linux/x64_relative_performance.png | Bin 216760 -> 216186 bytes .../u128_graphs/linux/x86_benchmarks.png | Bin 364915 -> 364142 bytes .../linux/x86_relative_performance.png | Bin 189315 -> 188443 bytes .../u128_graphs/macos/ARM64_benchmarks.png | Bin 439627 -> 438959 bytes .../macos/ARM64_relative_performance.png | Bin 236421 -> 235840 bytes .../u128_graphs/windows/ARM64_benchmarks.png | Bin 402367 -> 401262 bytes .../windows/ARM64_relative_performance.png | Bin 209219 -> 208609 bytes .../u128_graphs/windows/x64_benchmarks.png | Bin 402840 -> 401637 bytes .../windows/x64_relative_performance.png | Bin 203476 -> 202990 bytes .../u128_graphs/windows/x86_benchmarks.png | Bin 408696 -> 407320 bytes .../windows/x86_relative_performance.png | Bin 208392 -> 207715 bytes 40 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/modules/ROOT/images/i128_graphs/linux/ARM32_benchmarks.png b/doc/modules/ROOT/images/i128_graphs/linux/ARM32_benchmarks.png index c953cca1644748ea8a228c560198279e9db36243..f6790083fac1fc8a560809d5a1087c1b6438609d 100644 GIT binary patch literal 364807 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�XM3 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%0DnS05xE|6| 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 H#*{$Y%FfDU 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%0AOoNm?=uX%0%M33CI03 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%0A{l{9{l&8M)L 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 Nqh+u?Rnz9|{{e9WcnSaj literal 365643 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

5#cIZiiT2G-Aasnejpu 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%0AjiMy(CMfoVhJFuK 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 zﲲ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�F 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%0DIS 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 diff --git a/doc/modules/ROOT/images/i128_graphs/linux/ARM64_benchmarks.png b/doc/modules/ROOT/images/i128_graphs/linux/ARM64_benchmarks.png index a318ff751de68ad44f6f510f8ffe451f1bbe3129..99f50d8c8e5864511ddf12c742f3dae14fc7df87 100644 GIT binary patch literal 411304 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

S9q1*Ms!x6 zd^Qk{h(TG*NJ4h#$*o*vz9Cg~hwtsgR7k1lA!lo5j1L= zkA}4x30b-wJ;aeNY7abSqeh(}r+GyFj{)A)bAk&Nc6K@rOK^uIJ$K6u~0C2p; z?-NDa&@o*5t6q0NrqM*L>m*-sao75&i=Yn_IJE^fcXj9lJV)=1mnM5MZC`qej$eMQ zv&)V#&HU4+O%8d%&tJQ&MxW_dYL~_>r{>#%^|{DFA&YxUA(ra{mYEt3)t4gArd?S2 z0eI|QTNA&D91|~&<ltkaO(dG0*IB6-F_t+26965HpG^rh3rO zJ7{dxvRC6R%37KK3Ld?upzUnpgO2 z?yh)r^98ItQY6e_{|Z{9xDGjr@vJ-|?Ft@OM5-#RPgVZi+0Oj02D?lufRh&wZ%f_y zlj1UytSRoTcFIWUs?-kJQp59rXWK-zTQRxJcuUj1fO**kk?P6Rw9TMcqo&*P&P+=q z;jcYDWJ>loe7x}Q#kkvi=^y1E5R*~%&;0P2U+3-!Zu$T}X-)gPTt@`5>8ENch@if# zQ)r+#I3X?%X6>h@@pfFr>rbH`tFZuT!Q6(I({9!pxRwbwxd&xk+INm;arv@l-gN33DB@YSC2uN4*xx%|BBaoyS&>`b;62Vn4ROW7wait#$*BZ9m_)*usx8thR z?}{pwDYteWdAp32mA7es(*JcB**`R1p_<0JG!XyR^}Pw&M$LZ1eSd{7;*qF>L|a~` z?|~E6P!e}|A0!_%PleLm)yYQBtZSb8@56ek4p^;HsVi{+UTyKb!aQ?4m-lfIQEVSD z3MIjwN=ve7b$6=UQ)q&#cL#cGd8z{05I~FBFWln!%dJ1Osg6QTVod&pEL?{UAWCCw zA08Zky!m$hZfSi*|3VL#dipw1LNjnXioEokB_z zk9X83AS*QysGlgE0)O2Ye{ea@9L{HZ6Hki3mRV-nFMJz+Roqg-jduAb>jN>c6AF{x zZy+({^JRhh^$xIxC_dM(BCV8k-HXbkTCTf;YQkXQGcpqhwf2$zagldgsuX`gs==JJ!1ibpGt1lg z&PTYx)Ti_nLFM&TwYZVO(P?}4n9)`%ig%YRWu%DW`Knhz`@{sM_zE3$d+}8|=?e}< zh-}8)N&%YJ@}Uj8NhSXTsArn^2G^o%)2`{UfTGNW>@-8yP#g)T zV6ZPW8;a@toj$;}6{Gl>Q^d^^Rcl9rR+V&CwJw`@0!o@AWF=ssa94Ufviyh}3bq8a zqDqD{JYm8REq5Q^!nB*71-p$uijNN1(6BRf`pG#N(6`U(Hm+T~;mLMtn=(RWptrwc zQJmkFXH#W`rTkj9TA_h93eEydPy%pW_D>!uct8-OzpZU;*Xwd{()&>9rZ+6CtrMsB z8EHh9q+>k0H8Ml$@DNk#MXixcHx6NKib|!VVW;zV^8>DrKTWv_r#VV921C07hpIwF z9x@4KNd4S5Y7Fw`l|lpM-YG4%#yE+;ioIPcGo+&C-+bJj8lasLCuUxodVZ|mXY499 zGsfq75?d=RLli#?9%?|Ch~Cex)RW(-k4&6LWgi9LdEnZz$e48~W}0gDWCkvZhU!** zuPYQ|Sp$&R&Zqw=%{C;{mWFpG=Uu8)gIgQ_QyBK`hM>EW+cuI=4c!X-_bkvC`_k&N zH2f~S;IDlo7GP&tJNXioFOFjVG#txTvk%8q@ZApd0a-ncRI19Z42U_z)K$wg1@_ye z&`>IHoa3wYKhQC^jy}0=gsa5Tv&kYw|2!|~- zqYFFUb1szcnwUROpf(Ew^JFUWP&%&pfG4KUX*hWcxz`-?@RmkXkQ?l(WDr#cMBu9@ z4^>q{;FA;Vff_CB93^XK#V6@ri`i3>7K@@4BQO2BM&w@05qfMFe)=uEPW%H=`ij~Dv&hPuXf&xm z_3XnJDW)foot*^rC$qj0L2rcM)DE~oK%otI!SF`R3DnggxHkT`14ydqm`BE4IKQIi z>d)Frv*HHY^aSATka*~^e>gpD5MqJqc*KcVM%vOCM`fLayCekAbo!((G=l&Ocv;S{$SqM}O}W;Q zsFGhOeJ7l9`@!5kusunTDcxq}VQm!G&oSSRdQyYN1t!?jp+&~&>dT3+5ruyb1%3u- zFzs#S65P{K#Vdz750r`Ll`t00LHUY2a@}Ak`0cl4=cfk&NpDtYz?{?{HS?JL|6Cq& z7*|3p{evdIIiNPVkT~6_4t&z1nR9;PhF+TY^);7ON|(>p_>hs#|s(PUUs9d=)*7Lhx^|r4(w{>4G}x02dvi z?8&A{RGsLr_uM@theiN|gpUlOLwK*yK(OMSP{Z$vN5Foy=${E}|2sG3vq14-Y){n+ zH*@Li&xKP+JA}LsWc8=XTUYvq-HtNJ)VMi{+$6+J!)L(xQ>;c{yCn(|JRMCy`WC4w z;Ws%k3nPO-JAMEhLK-DDHk5REZrY)P`8?AyC>YD47|{c^Xme9!6y}Eyk*}y1g)x>J zmVgV!>}vhUjSDdM>q^DLeAme)JCFH=cpBo=OoP{MDf?wgWtePAI;4h#Er;h3XG^lk z=ljdL*l6rWhXdAr07PZ{_G=|NjDhu8Ur0Mgs#TtHZ86A{wGjofE5V+K?Fp1Td9t9A z6nLZV%3z?v^L9SEo6l%(ZZTk9HW(iTeTiD z;_bbD5ogZksX5Tg8`z!%3h(4*PfmGS^;<%@<4U>+oHG^a#Lrf={U8wnOU0Z?m{oTh z#m6%1M@dlta9EZ~`xIO&TNEo5$`2{$cWe>Ck(%KXDO|;LBx_MuJ^%K`* zdp+R}w@--jNN`A)#l2wrTZ|dRY&xN*@aOW8aL~)36 zkg+wZJI4=u8=?PtvhGCS@08)z%Gm9fM4=??E^Lw;sSzE}6X4AW2r%Wfye`PQ;vv-6 zdTkXqdPcZ)HX}H7V4VnPx?K?1TW;B5ua;1p%q{qDCiem6%yj?ckA{2si_6vYcLYs8 zMl5YY2iRdvI=_l)T4{VQ(xO&xjI9Hr$blkpY9_OO{@O${Vm(vr-o$QADJnU6Ud#!1 z{aC^qvtjd{YR~HR)qHh^Syf*qwAL0)(WAk3E zd)eB)pKl#jK-*HINj)6460*0Np$BTuJJ69<@>gNwPZZ)}(f~i6g?SE5-f`xf1w>ma zsVS>@Hh#NEjtJw;4#4bp(^xZ}I8%JaMit+TOI7wPNyHfhPV4IO-v#MB zv5CsOK{V=*h2bTnA=3k#$Rb>w229srPShgxwAqmKT+~$~vv56{3~~EF=Pwvx%`>-D zQEg5JZ6M_w7PQX(BzwGya*W!P##vg6U_$B#&wKgJb zHhc7{1M1h#ka`nAR#)SZXdE@yg1u7LmNbCdvFq!U{Au0YjarYR3Mq|g07X*!E@_%p zX<}aIRNzLQ!JUpM9Cjn24-7t@>oF}_UBrpiQRW-U~ z&Kx5Oi=ZQhGp3pp*e{72B7)bGMoSq(A6Gqd{VNRN!dR@a8qoi}I42U(tZj-Jq86Ck zjss=xXpWEA!UeBQQC=K6nK~~644EerZj#T)SBtRLO)zA24ln2jS8OpGt{b1Xz*Ang z4Ny;ne4VzQpdK^GQ)vKiOrt;36&56y}3F{Pj)**a6_ zgv8IZ`xg7qJdMuHQe8s=V|ju7jSwadKjhXLXm0vNBn-_P7;F$6`%H<6!yBB)9uHOa zZt`n)kDUr$IjS7evj~9>qsod>B~3r>KT|Ai+5uUEkg773MAd|gHhO^qy$bX#O~b={ zPH~vpl0&9MAoc<#N8 zARVt%wV}IdY;=PeCRBzEQ|D|0!vy~4(Fy^s8WQS}alA(?Uq-iBv_y44@DUG%r6iPD zKPiFh>pJD@Q$tBf&?#Fh$H-d?7mTw9$|UF2S)#l<&c8$;Vm0NU5--TICdEKK^7~mp zM6c$dWR^vRS2y&4LeMDbw<2|zsO zwKSHUH!SG?bz%tBZfjE(_v*JR3@)4F3ON5dj`l!@g8O)W$k>*QIgK@lG}o{8x4uitu6zLKj6}T|SDlH^ zBU^_>TN{b|2nTlc&>5DLp7>Q}>pH2f6IoK?Ps=J-O#Ig6(+FGGH6Qst$%$@`Azfp7 zTAzcQQ5;M6G__B=&~*Km&l+!w=CRgt#s7z>?~bQ>@&6}Lozg-@iBx9MutkWF%{ju~ImBm7?P?&tgX-G8pf?N*#~-mmdouWCaU!l8*V zhre+_z7q(%Z{7jszmz>V#kkh-HQKHe)Xm-g82mrK-geBWC7BXN=B zl5FY4@>b$)tjv$}(utjKfX56OkIBI?Q1uAF0|Z83srVNG`h4v0{I{!b^OpqAybfM+ zhU9d^S{b{1iJgPdqOxNM$zk}|s1>p0?F<3;E~bD4h5Eh{YP&0N9d7f1E-r-47|e7t z83;vLo%7@8>*!$?|6$l^wehW*M*o&uSgB_^^}OCFEFm#mqM$-pd)XLtYD63XIQDXP zHs+&)&W&&6{t}QWj*F>%1o)o0WCSMsOXcrBQJswvSpYY@91T z0LUT7=bBP#n$!A_Q9-z2;Lt)mZrYfU$de}|+YFvC8!y`PnN?rU^tw(uuX=};ze6yr7b zB^eK^w0D9yLhUO~OQn)sF)zdkh(IXHbL`*70uIk2paOECy6H`qEwTdzu)u5v2BS#-_|Hw1=7L4#_hQ67CM{_>r;OlyN+k5}) z8Y3=`Oa3}`cAiLx5TfB%>Ry8ZFnRppAmWg*u!Ggl9P!iC_VV8_FhW#A)fyz=`;!ov zbr8Oqp)v6DcX;linVMmJNJ0)D{)-|UnhO3U^^y*h8zb)Gb-4Uf5&r*luZV2;yIrT$ zp(%zU4!KkKn9c{IQ-Q%A>Q1+~g)SmdUNB@g*O$Ql_U(n;*J{?1F6f73j()Cji4r>}a;#eO9E{J15A!(UPA)a55cit(ltrYVF^{3MKwQcv18^;Bk!z${9l;!my19 z7!geZ$2Dc!)JmPdLw^AsX4*l=I!Zn>kzuIe8bLxRIjD|<+%c@q8QuIB5U^(NJWZVnlpXZGtLgGoosvi~SWD+ZqsBo72}(|rd!IXjj5t~+wn4Fs*kStPs$ zTq?QGlYpVs4^UznM*JN}cF1=LT24jiLp=btiq+S~WhJ^>g(V<@Tw1W3AP>+<1U$yu z6VBDYBA;Yvh8$%6E`~o$y76Q1+3UX2aO2}yR#7Ctsh5eOwA=B^EXd*E&gZ@i^CW!l zyj2IreqWJzji^@C_ny^(4)J^m{3i=wU;f!3!X3UP1JUR9f-W|$Fx&8gPgLsZs}y&j z_0PfQ`x)}>7tDTrS^FAf6UW>>a9YTBWp#q67ryam&XTzz1mfXnf-oYA8Bp92qy(c>hVcR=J^e1M3fW0?$~hhyQi+&eEOWfiZ3 z-pFkp{ka0Ja)1GQAi0&l$!H7SGw%7NS)}bFr6LvwV!w2RR8htwfGVQN&wK*$v-kIg z4pNK*u%!qvkO%xlYX1(VA}F=>FbB7E8)6V!h>s?JHMxtZKj8mRDh5954stQ{yBD%1 z--(3sCE0Vs;6MFoXR*w;YCxH|v_Ejkff?#wq$D4*amPXrSTh5sU0dVZUs6imJ_rkY zW%r`EdpZnEeM8&8fi%v+CyqB~6>)k*=FmI^qQw%Z1w~|%MBr@uZ%L3+%>^ee_>){< z3|N~2H&S%A0}wxY4!&s@5GZXBAiy4^jh_J>H9w3>nIhAFeEO^CTw_}H_xGc`M4VGi zjkxu=KFSAr4i<`aR&0N0jl4VKIrG-x z34UwAp?%W3s_mV~=#2Q18(-f}>~ryaZA&q|%F+#Z0gHCDhqeJpjD`5JXtYLwv6KT` zgB}J(y_f;8ZVv5Krz)@V>6vRf#@|C&o`vM}&6~r);%UIT1)6f7 zPk!I@v>vUlsA+d;v6zFN%YLYi$CC$)M(n3_+c(1&CRUg^S$Z(0RH9`s=#An>>+x zMo)7nb6)&_iFmT&MGCj4l>t_=&q~Wte|?lgIo32&HEGc@0X2(_Wu>5ifvjZf1Dt5Q z;;u$ z3u9TTEIa1T^rjktN|%t+xvZCy(@w@T(77)RSKMB(?W=@KayDP63@s@3poN-4BJHK{ z$jHbk=O}JWb1&Xth~IXwmxjV@x-~{n2hmfz<2ei5H>@0>4Kn6)V{oRht}&kf^CO(2 zLwz4FnR0Qk5nMNgOA1mas2k}uFyOMp|p`~8j3Jv4l!tSn?xhxr; z?>8v7OUdKSk_?MFIrQ=f-NePtHR>8T`MI7*->E3Wsp`Kdu&hLiez8$MC?oEuy3m>8 zKavlN*1IfkXi}-T8f5>Iz>wTtfbnq*>8n_Hkg^G&c(aO5CGd&C?Ab2uiyGp0bA#wO2Ahr-60IpH!t{Qb3b^Bgby58}4J{!4XodM|-ZFux2=N_Z zL*>sWTLHIYc4XXG3-_{TO_vzCt$%l@226IFJEgf6VdunQyL-a%q06N<^}z=DqVkx} zZ1tAtrK7*T0cpy7D>-Wk3rmmL&h8B;xfHA=%)56xkgq5x9%%$H1ejHG>X#Sf#b!Kk zt#5Fvr+IAQy9>h_?qRnS<9;CjTA?dMm>UgzG4=ZcJSyV2ux|KKnY_`d_;AwczN*}54G1OKcB%3H>u!@wsj-bgV5&rc* zDNU9XSA@K>PCo#hR?G#CAdA$SUbS7nS#e7Ejxq96c{<^YTVBVVcb_6ZNp^=T`Ke^m zv-KJR%pPr^telzic=$Pj{ln3Xnr!Z9;=bI!_X`{HKO~aX3ccHG?R33OD_0VOXu)yK zmUgeWt*~rKIiS^ufsv%UXC8b6KWMPkuTCAny7vQG`xx~8f)3DgUg>*-vO3W}6m^yJ z>$y2e-1m3qhdS$je7H=q=?OaBP7&|glytX_7De>bpw6`WA_Ea*w?WZW;LoqmnI3I{ z8V2o%|K_+r0Wob}fy%q4wK;za??CrKJ^DV?jy_yR?YyQ_@R@5lt5d5`y+k>{()0`Ce4jHBkc<K2tzTxOG=<0$cV zOuO=irsKj!g1>~3g^8bz`uTiPmq_;Kx21BVfQyywgfVrqxv;B>gA!&D+?WO5UFdcL z5{|a&Zi3dh-#Oj^b)RSI-?soObut3iu-E(4D(px}is&e6`_KEbcBzs$(NU{10rkN5 zWn`|(GNNk||XZT zdJa0u0q-CQ4(nUI%2zV?EOTeQvzEjOXVt5sMqZkbJu{Y=sO}b7vR#ep;DJv>h1b_O zJm1;ag=-p>$3Y}}dMEJP!ONnm^s#6)1Fs?Aeh2m<2T{9m?6N((50cD!_kW5jjy=Pk zz|V|puo#iT7b9YGm1puU0=L^?k>#00*=vZ+&-2b|f1DsjZvPDe=+YTy?(Us+W&SL$ z0?3{ix{GGfUV7Mr)z zDZFO`<3E2H^nh~+wW3sp0Ely7MRwHPgbiY|co(D}D#(%W)Y>-CCZZ~kRHjKwy*L5u z>Eclx8|zds3=u3@5RZ^meg!o8?7VpxjhrOfkpCqU0I<4y;ZlN7%eG zaa)ZufXdv&_T&tHw4n9b+DNoB#9yZn_Z9&xzz3x4N2r} z_Re4i9-E{&P&1a!qqaPkedu}hg?EvYph^6e8tzw$lfKLqoGraoeRyTl8eYz6?ld>(u6A{w7*>OG@OCRAV^C|W742v^V`Ni+xTUNab zQ1QJ@+9LOlT$=2=U{eWf+S(=ZRM~ui0U>p75P1}Q|1_WPxWS5iN%5ls@a6@}ZP@9C zi=U1RehtH^l(&245bX`K8=`PGW%RNcdj)QnMiJd&10LR9{%-PQ(=?VO9wT$>i&HY7 z@WOmKxMM--Rwr;2AI^_?sHBuO1mM`SP2MXCRKPbRrkxuogeg+HnkkcHjtfl3$)B=H-fzeZM=Hxjn7lt@NlUsgn9UREqKnsNwA-ufPI&W#%PlhfE^fE zs|7#&6Iia<4bd4YgdRiJacaG9Ede-@J20`9dcC`!fkieO*y9>Y9iY>eM9em1*!DbE z`2H?E2gEP3RvnPVIapWxSMp)Sb47B;PSKn}7EVb8=ymTLS>e2|bMukZ%PVD=9ZMJo-&;DL%cNSpaw#RmWv61x)31GDXJ_C{lG zod$IiJm*L z)oD3cYn!9^ma1)V%!z6z77pkCCAZ?7JkMA>6pFU+IZ4P)1 z`{8Pws&opnm#^^=jc^^O+SGCy+Q|C{qr4@Mcayc`zW_rDic>wTt)M${L%n0*)$hM@ zG{2|^XD`cblS9)83MJCbk&9m=qloPA2Hg}){8v zo|z=>lyFs1vP)4|b<2IE2riXc+8^NS!z)frEs#H;rafZR8m&3?!4<_~eBhXT)e{vHNw}^#_mJ-ti>_*R!n&7u0@9(# zIMCUOazIJi3hYb6xq=?h6pjse;vz5;MTCLC<&jcV)Z2!H)JhqO$%|Y#wPk?V&3^!w?JK%rH84n^BTo_RA z-L_lL(2CwCC%QsMU@t3&YKm+Tbd|J~h8s1X!G1#D(}%!ttswM27ttB7cpfLQ2pcb( z_djo(1Cmn!_kx_FB1#`S8pAYoMMn{j6dbs`x z(a%}%Yl7DzG_#w#z+WDJXop=dF3c)ZDaK^0;^@9_A*`Y7K4*~-r0%vW`M&L7=!lP` zWk`JUleNs49pJD-uc?{DoNYQi{NMLL2*jhXl7#aBTv-kjX7nU$2AqfAaHe?B_?j2+ zz3nXs8_JI1OpYVmqtb^(+B)Y6aa>niHJr*d;jI*5JJDy)jqU`_IJ5Z@Z-hzp@zd{~ zh-FC)qvk3!z7-<;Nrv?0uH$wv3HHnA@psT+sx<>|>7rvgT3Gj8#~x$2cn84}t*x5$ zI_zqE7I6g?%5I+;rK9%aOGIDo$ITpa4C-#9f4g?nk*jDg?nnl<5Bh@7Ms3)YqK)k< zK`{JnPV67RQDoGOJy!iq?d!7zJTgg=?A`6*ig${-m z(J)YamD>}pIgWfq@uR-FHFl`l%^_Tg|IfqQYgM8!mno;ZCL{=d7z+Mj`ME^;ATNJf zWj^kq$_t56MI@Bw>%q_P50uO~#k zYjn#*-9)ULos9dKCa!{pXnd40m_GEy?ER_YR4TOG3dH7lOI>QHcLhYD*T^UzBu5 zm_14!!c=^FsyU))#_!^wA@d=Of~KT?1i!&fW~zhsrI+zPplUPNK+U9cbW>(Z5j0BHP z3xY5w9 zB=U-nDn?#g@yu6=RLEK1vqvr-wN$)YE)gL56Ukb}>Ra;xN6!xK1<#wFA?k6-XZ}hc zzp0O06ZH#VCu+#5ZIF5+u}OK8IVbJ81AaJ$)PStA0Uw>Sl_wEx>V#URkIo;bG$}&Cil3Oq@?l@1P{k zSl%i}=HXg=RC75_B4>)g@m^>{0p!E99eu9`El5-w&z)F)3XJPMSEr-qYRy^FZpc_N zTd&|n?|=BuM3G+Z`0u0ddlix%kbYTp zs1kPW^txyN|L*o08 z>uKK|;|MC-$X!{fD8i?~PmkrkuOinter))F3iFh$W;xt^rdQp{H9nDNz4v!}F327v znCl3h>gK_r6djsq(KWbbcoA{wkfF%ld1ehPPl8dJeue!U04Z2okHS?L*V47K)#@z` zWP|BH?S58+x;gD;lx+|%>SPr;zXR$ZQq7Q)0elt}f7o8QWg3`8YKh`ABEzhiPz%R4 zlINjMKO-Z-Q?T;e_~e^5gwJqq|#bhcmdgvG3^4PTTcv^vsNG-PHy~xs@;7Tgt+S<*Z7ub^w9S8 zyhyU`n$Yu!uj|l!M3RPh`|R$x4&JV!hO-UhBEN4gj>s)=kHy1rW}X0g1L9G9Po7F6lDFGv_C{ z7~GYs+GI?tsg=h+;&arO&Z~ooe{Qld#6@=unsX26pW^laZ^$Tv@EA?KTgWCa(_d)z zrpLS2iJptk3uobZ@rdlsu;P#_NYREi`Kn64XLv39Anw}PO$6&s{0WNZI-8vzh_QHJ zCo{_FzWuID^ZefWYNv||X{f9WA|kxbJb=mkP7R*yQhEG1vnah|4Ut6x;^H=oLcEb2 z^2GKTKzh>eLVCjHjsPD_5gt2L_@x=B==Qq#Q5}bPdtW;n7y)S71DH&xZQLCIiq`=_ z5zCtg#9KK84M%F@Yxn;>Qt7<^%W3ir%(j0S)y!np{Bfmt4+^VWtjJv+96roIK!oqM znIf98!-#1Lod+URLlJPJ?;AB;tlX4+ZwXs}_$p zkx)ZoV9)Fw)hkMUoYDLMXy+`=jcT9|hlmtdd4@GKCK*7W(ihSN#M7Ugk<;im3dI2YdSlk889;blAa*?Y7_@g+vwWHw62*FW(l2lQ;g_Blt{Ch1ohyN3W@7ErMy*pIPSNv zRv~D6kf_VMI@9qiR_NJN78qt;8q{&q(bc-u7sBfq-Q~{6Qg`hV*q96&9+Zp(Z zfk(v#)0a#3_Cvd2#x}&^j#?%-_f$y!i;TGA{Q!6D#Bg39KAU&QC%fawjKO3oa_$9H zay()l$uirJ0B7AHy-%W5f)8!W_wpw|Fas~a?*7Z4Sxa0E8Kvt0w4y5Cazj2l{G)O9 ze_r^Lr~3RHBn%HdwJwm!mSRt_Po=(hH zGW~Q!{2DZw^e+c~*ohx)3Q$E%?|q6zkAvQ6b-fDdCJyp{K&EJqVn}eE2txRB6@OU<*LTjq z##JpexJke@o13t#6jOdvD>m|vx%v3jLr6Ja+pK||MP@kUqBckJf%Ets7TOo$ z5a-hhPR>&+dnh@$>RL!Uvu%;&eqE6LhDQ-a5WuXdKoAtd4 z-g+8p_Qxr3R6y{p9El-3v#UjV=(B}3fI|Urp{2+ayE7{rw!le^C#7f$Dksdk| zL{C4l18{C@-TvNrM-k<)WDiZ}6zQmftcH{iFRMM)XCJZ1SL?7m^Quelxc_O-lfD%S zM?$2g>m3et7NtjAeND8`I3sO^JH|koW5aP#r|60D4>Le+ZFlU*!{Hdc-|i;}Gnl@P z&%~pg^5v#Yr^6QPWZ9!|F1f~&Ryq?H@-X7=GdntiKo?J#)=Y*U&$U-wyRbo#7+EU?SSoExfZC6cG(J`1(+E zGWR(qn=>i_De~L6Ni#W023m5T?`PwBTUvRCyv~TX{EuN99((4mf@1T?b3Km*RZ>4? zE^hdjsH=uQFWo~+p%1%sv=-<<1^@E~R4%CxuHd)sl-$FEllVy%Du?M#UUO_$H;ALJ z<-DWm{%l08sK0ZlzWg}v7B!Ut&CnA$zfXWlPcTUz(UR?K*+Vsg_F%?wq2{2SG^Vk~ zcmh~nnGJEdqK;Xn?;EEtZb)O=^&8x}CSYR=EqGCcWomyz6QF};R+6IJkgM*Tq3rt{ zdY~4MY3%i`c$G~5yXAe$S6b9ZR&zU%QJk;KpXEp4IQ^aetBR5QB0;q-A~2S${gwoZ z#O0}V@19%C$7?)LOzb7{(c3L04{8QyWN4&otYAUS)0x(A;?;XL2;{>jDT6C5V{YxeyLSHFKVkB3$r1=UD z^;`6c@!vly&-3DERQ=w9{N$j)eM*8FW`urkS+_)xk?UAW@C%fMa^fA4r}=IOKxHL{ z-!jJxt(@*`!lJnpwr=-P1|S(JJ@yHrPOHVtsF!e&?uX?7RFEba#q3VZubSZiZq9>g ztf4%7RNp6&Td8)7WB09n0&cTbLZ?-Ucw&G(P^jpn*|+R*O*$wAxP$MO6##n5?v?=N z&b%tYs7%bMc(ukPXk)P>Dw5azF=~kh^6T2iQcg9swZ6ppX9P0b0u*% z(sgsqgwWUWp8GCLBm%^w78z1`i&K@`+LI#3ISo4AzM!Kol)wM;4aq)avT_bp*t*2DRLs+y%cvBH*w4GCXdppl&{PLKh=Ls+rEfvRGZ)lwb zPBYkj{i9)&AlYF7;c`A2tnE)1IUrX1vpFkljTdVvt!|Dk&3-Fcxw-xUb^ zdqNeCNaC?T>*cMc+NHjD`B3>ra%lX#d6-2N=6q+f`};h38ZiczGUd&*8FsM)@^t3+Car-Qg?Uv z!q!Q{?7>9qtD6ht6vKuZ(Xnc^fK_zdf&!_G{eXIb2BzdFJ?F`yK6jXf?j^F|x48Mn zBEG(mHUv_lW^Symt^!b1($+IkApyn@$*#SY-LK5~VqFaNFbsCh5?GbDA?UV8EkJEA@ccbDX2^8gO5#DeR z;@J6%PFSWC-$WV?j`IPzKtY(}E2f!1PR4p(MgAikzz|#N$hG*Dz}-H@PqeluC^}$_ zClps}-NqcYg99?qCe+eiTyHu_eEX7o?4f$65f!g?uFfMWZU9jux52`Z@Dq#Dz^!H% z+;^@<_kh+hBPhZGv(YQ5#YZXJS07W)uCMkD)hFSao$SQsYMGV#sjgw1iGNjNZZLx_ zyj+WAjhqP97W1WVxYdkKd1qTm{;zDl^evmL`Y2m0OA4#p(+pfI0NI-~xsePoe zi=a;6+lMhA-bXIQGJ(Z!Ca}E^z<@#TO73g8{cK5jT;Nm<+bR7aCgvi$!C3Of{1CS_ zZ_?f3XH-UCHmc-CT&lh0Qv14Js^acPTJcv9z5IA~a_oVu5vvqK<0OKLy%dNt5s>;%jE ztL+J5Vz1ZG8L|uthi7C%xLwLMHbN}gkLCM@9H4BH_fG~T4pk4JfU20IsmfG?Acx#6 z@VU!~o8dZ$+nw{^luUj2OCZ{Qb78>w?ilC{6M1N{Wce#Q>}UbF0-Jas9``E+ov^LnmQD8Am0ByanQh915S%v?F zqtyvQNAJr+vFUP{p9tA@zVpGAJ_=8joIly9!mh=fKRIeCFM90BDl(Tw?Kp&vmYp^X zI(=1%yJwFe!-|@~Tr^>BfAj74Iqa~U zU7pqK3-5oq#Ob{MOQdBr0ZoCUq2PctBa_aIS%C~&*;tFW%6G4K%T!je&-IF4m}97>$2z?R}bh56ZS z8GUUS{4S4ZX@1`9Nggvz+sUJ$u>Nd1`Td=3Mgu4s2D$y1W*4vKBA4n19@AfE>cm>H z1CkihvugE*z|Qelwopfd0=e|F`KO}OcmQ6|J9CHJ<>p1V+>=mQh3G3oiEl5t@azu)i22B8?%98ZZULyi8iK=4+OE!Nr(SLpo+u#PX z*DVo@%Adcpj+T?zau#vJFETI&&W3fD0Me^s%X*L65M2<))S10SjNe z`CmM!t+wIAXy@LmLyV|uT;*=nu{h?9~?zfF2Wxu7?jE_ zg<5rY0#nj`FN){a7`QaPmImRxf00 zoGfY3<3HezZEulK?A;5N^@t4=)ZMbj#0Hs1gzIoVEKFArBwA;Oh&^gJ7_RxpXIhKJ zFhzwLkNCb-=hcO!XAHSfPS4c-ECbwDM0Z&x?!Y1{Lgx0Lxsq73;>C9&0S#>+JMyRP zk&SC$BG%2jD;(^@;U8k$T4)<+3*EMBa`CEtYEdr|$L)3(!g2id1BjsZ%LJ}6Q_ZQu ze(Fx%V*n@FF@M2Nv3WbsdP-J?Jpn*E@tv}}$wV4s{iYIyHx)7KV>;X*S- zr84R!MJXpflJ%`M4O@XxsuIiw;=B|PdAC`?9;7a;dPyAPyw<%ryY@Efh`YwzXmap3 zTz5Lr91aBDNAqZK{lV5c6-)Eul1TxzTc5jjKf};4qQ!Tw%W2alL zFl|lj#r}g2?kwqYHE3Uw^-rf8hfW{>s!A8bTFCs#1RWYX#*(#?2V?WrTtJhgM?D6_ zvaP)sX59%nuVb^{X3cQ)0twtu&kda+uJh)|nJf9ASQDFNb?_l8A;-A~tn5V1>8tz9 zgFio*#wo?=eFO=<+pXgP{r2SA3J4jt#oXz;5&Pl@XuItVeQ+b^`9B1+%SA)L_3m)m zULHOL@uy8l_-`geH5t5E(XG&B$O?6$?u8Rq14r(lKj?=GVMXTv+9k~;#v63PebHKW z!~{ECtgmv^v7%G}A2IW#=GFSHoEG6xh}fd=OrI_&!Lw{NPx1@Bvg6UpwSZbTkbQ7I z45Wj^MLbCFNArS{D?|7UtNRlVk-a4flA?0yqSJL*E)AFRm#H59H~V9GOXRlxJsrO3 zF>Yiq@z@y}Vn)Kagfl4>0ByB5+=FtYpu-?e8+Z*Ehqcwg4*1Ig=L9ba)Ash-?7)Rf zC*4|5;yr;ea2lLWx3MY=H2lI&|7JEshyN-I4wqSlFCe#*rdZkYPhgzia0JMNn?2b; z)aD{LPAY>EZJEBz;nHAwTsimWHWHi$3n=86zyud%2~3;APPSQ^`jkKnSKw@h$r5PU%%K`6RQ)gggF^5o;>Z2w>FOF=ErJi;^JvVCog-%eOj%a=t1JGgLe` zC&ID9%~D482p|slGPhWbV6Y3Vq2a-W&4Kh`_6~)FkWQ^<#adxKJ43d9MIouL{0~(1 z1f$zRT_Wz#>cy^C0kU=AY(=QF$l6SYi>@<>v<1H|ngG|yE`(|A_WI(aK}~X?zQEAj z+(a*7Z~Mim!y7XC;v>Z&<=MX1OKL~ns~9n?+yQ0CG}4k7D)`lX6~|2KUr;{*#$;g6 z17N-Q9ZCFjd%`?dXB1~szmVoPWz1(J1+MMh331cA^Rph8F@f48-_!u2Fr|95@)Nud zp)FT>wp_Y?4f=GuSXCac=?7)8L&?&@;2ke~&u-&4fX096uNaV?vvDM?bRT!i`#Z;W z{d$|*fHBD$n2)rJ$w&L3wIoDV0l`c%A4f0Fz!HJJszI_WL=+MWTgF`$;s4&vrvFaY zQcwg2BamKizR_3@t7qHAq-*lO$fugLe4Xe#P zV5_d;{6uN_tH6epR$3eX!&*`q^MGDWv!uqA*22+k*2`7EeceKAnL}qP{d2uCz!3a^ ze$Y-Pe2&0fEI&TlOzT$<83#Yz9@6GA17W9dkUGBi)yz84t=2CZ4+>ny9;-|ynY`d| zrXPW=u<*@P+ho^9NH1W|@T$P9Q0@*W!sE*8@)96zb}=l4KfJv~CHhAFZ}v)#?68=5 z-#LVEsV%S;zQurDb%H2PXqaG=XoHpEjC}9Hk5bShb;Kb!$@WF1;g?1mZ@<&R zAPX6EGYLFwTuPCsV0x~JV*S*d*YmfXvQ!e{cZj@%h*afE-D>DdY9a9rC3!1eb>jgN z_sYHZBMppnqzWN6X2g;is$4;MaJeg>OPVGPG|EiL+$M;13(e8Ia@rT;^kreTil;A> zyf9Gog=~0z(5oiCvjYw|C(=s4PUUui7Fw$y$h*thC-^UREVTOnL`N@QGJ7)U#0uJ4 z!B1co_Q)=3K6h^q-il4_*{i2fw8&)b{AvMAxP-a8M1jjyXCY;w1T(|>1)*u6;LnYSch!T%mEBD-*Z3~HCQh_Q0=9nDI zGb=KkzKyUbk7;H^%V4@RCHZu&7Q$hh?^;iSI4}-D&H*P%SnyybU?{ReBIN`?ExqcQ z-$u(%p+n_iK)@S_&DL2LQk_MT=g@~rxgB?4`iukbX)HSH2%kRJtg!drKLtiD0>gg4 z$1~~{2VHv7QLt_DS15z*n6%?e%Fi*0VgK|HI#(0+DZH3Nhn}ZMSR_e!N%Qt)t6z2i zdP*#B4Z6r1-7zgG;eZ<$FNt%Q$TvT~3L*Q9?o*hJq<9LdYVUgajIWN!q_Sr$H(yO3 z&tW~!Tk^(``%WX-wJ~`90vdoawj2XMs_9#j!8sTShpvx)R6^c^O z_4H&oe=pz}B9{o~*2*`uMW!>vo5V9Hce$EqRv3)rDqAf7+;Dh{oFf;kW_bgZ*Qlc; zDQoE_MoNMaK-dm_IFa1GFL$bKDQ^bkk>H$~xN}6W+%|jk@_(F*yzT$tYrV5~oA}Cq z9Z;=Hlj4O5MF@(zva3K1gb=oYDduy}5~ofoqbFj!IyCQ=BKZ^aFUE(gkkDM`&iI_O zhOYI9i?3%MTD`e5jaB}o1X$D4F}&GPWdxk)i8Rf` zN^Lbss>D+sO~U@JsXUL}jy&Ng3{D(;4YjDV*s_Pc<@Kmsigdt4r83i<+?}Ms8`Nj2 zhrb-awsr3O+ckXTw$gOaw?Uj;nRjPC19$)FO}AB3y}3RCPu`TxNjNn(-ka1VVh_)X zm^Sl|r_8sXv=(5(1v<4;^r$T~655~jN$n3FV$wnAd^c}qOt)RlV(6V}PeV1IyB|Te z^pT((|^#iZ>JjsSf|wGRsFXRhq?nI zr7Mul?x;j%6aUe`BcYCC&f32<6m+NlB4{ThE$Q0?t4rq7sPn&U0TV|wMA z8~S9oLDksd>oGZIuTb4PV`EP5YM32w}QkWPpjNZVkgz+5p1)5gEi=VJH&Xb>IH(;c`t zLAo3^ki@{+IX?n7P!qjX{SOO7k3$e{k^jBo8m8VnTY~q`&(yX#@5f-vw<*)4YGR9- z6FCEjE8qEKyNB%oG}pZ#uTw?JAMVHi(C@!ht;Twl2@q$k;NsZFSNIQ;;8k8-7h}@N zkV{7sZpKDL*t1c;fL5TIWrpcm18aBC>;}JDrTtX13MqbY1Wd=@kN+6bO;3)H@R?ha(sJaTEqaarHmvk00UF8ZtH%bL0TS9=O8LK{qKNs}3D5-; zGX&{3oUY||XIi*ul|a@X*Qn5m$V05jI~GKravT3eYvRs3#@pX7p3V1T*m$-ff$mZm zW1fvw$4o;mLz{Qj$zb-)u9{YXf{giFVyG?7PIwUUq4V1yl_mW~0i69uefMb%M}V?p zohrk|e4mT1%FKrsg0b|;5Y<|`l!B7=>wS%xgGPdVX{ zaVikofQT034p5^mY%Jjf^Os(%4{*g;zF_s5S=30;8S|eL&xuW3q~x_NmEa@lVDnSw zN9RpF>-UyEXN2V~{)-6o?Y;lMm^hi5<_?&9Nj{uaS|`_74(9G3RQ;VhOjh-#T}2oM z@qIka9oYK^B__r}d0XiB3gkJj1?Z}2+-E-o^M~GwfBcb|cJMj2_l8Y>K`5m-D zHtp7Xnq4c3kJ8M%qz?xoV6QV$6HF*>1qI2mP1+=p=MKJO>!INa;a4~yzV9?SENi{)DD>L=yH_e|xy zasZwX)4sGgQdLIF%qeMv)wp_ILi5}`Oq;+bHE#9JZxQ6AlmkXq^M$C{ZREBzX|iG_ zvFMSKvUB>Hvh53URqbTnPVQpHo3nhSjY9(cxekK5bh54l5ZuALL;Zn2CgOmah##Ig zU{RmS7WHZ_dgnlFr6A#ZwsMc@NkeWYF8xe68pJ7+ZT-{i1#Vb|l;5Dj>z8H6nLRxL zYhCFhiN22WlQHAM=mQ{r_GC^{o2Wu`y+^$+uIX!h)W>*Uq47Lnkcodz3v1(2_k$ z@gumQ8(%+;jEbe>U7es1%<@g-lZ?&=HphOxM1Zv|faW(lF4z#)S>pr7l+9B|amFux zXX1|GF&M&P_KQRsmCEj4-+{^>IJ9TPU=eVfU$S43!D57k{#-YeNE8j(J?7&*%42<2 zH!5NdJV9A!pUziwVxT>_6|heKwpjuFPR@VIpn;3&Z$42f1*e6bsFIj;Kk^DEt;NO@ zoC99i`?p)&p-+jzSjf~#7ZB8d4UT(DDUOL#L_6sREYk-+Kk~g?!%2er$!V#i5p>se z9a#lxWrm3s1ZDLlbt8P9L&KflG_^uUWxSuJ(`M+BJ@ z)lK|x7}ZdPenl(j_it-s6?nP#{l8Rl*4BD)h+Gdsl*S6O5PX@OaAd&jvr_6IQ)|1l zhER&o5lPlQ%GbEe4}3ZD43h6{5P7 zeaoNQzr34O2Xk2J55JwBKU&}y({f*$+=-o-OR=dBn?xh9`D=hQ4HN_%#ms8R^Qrr# z>ZlWLB$(riJEQ~p*Tr9uU!$JSXo=>-S+U5_7VPOT9Hp!#w~|bXvohto_$wbUm6+#* z3^q(^!}U+89XZI^%-*H&6lp(VSp@(UrM4#wmIUgvrPH`+ray8Ac4aR4f{)aO7Ycf{R$6U$tEK#D2E27}cGzAlF&G(Me0!sYFSq_1VI497lH_nvSA9K038L`+&{UtuV^%sv#M$2ltu=UK@9 zKYl~rTcFkKJwheKyHsZ9@e#N>S0TtlMAdE?^xCk$4fY3V`*!OT$iVYjnt>1?pg4YyV|z**eYJ$Ll0;W3LQ>kcza!} z45c5AYh;uFLpQLt1Q_W4ZDef%_XKLE1g=3JyX{0o4`o(r>A!E3P+%98FwDO&L&|Ni>je|-IMRj%WBpZ9pZp3legF=&r?#_xV% z5vUQ4pnP~?-I8l>3Ih1LiVgIaH>Xc*+dn(i(>t?Wi6h^+&%O_ATXq=f-m&F;0nlMl^(Zj$*sSDT3_kaT5#V!gZ<^z z)lFg$cFbG)oRKs%qN_-Qf18+dtq2`;2LgMs&P(>G*0wb@1Rn%AY@8q z)ib7Mw6AL7NFZ(Lf|UXrc^mKe#xp*+H<1Q_N0(W1;$g6C#FFhYK;|7HD>6|gC?)WU zR)xQCBW54UzLpS@Zu&r{{?L@!M7?#8iQ>+?!nbRkl9MS}4sIX4eIFXy+4}q5f574s z5WFu!V=(Nf?KW1pr(DUVGK=fc3TeGstlR@)33TGzG2J?A#2dMMc9`PPc^H4-vR#%8 zY8Am!kbKx`d%M$Lfy#FT!%jb+q5j*4wmtC8+)E=guz|b0t;2V>XupB2(4x;^@d~{l zjxI`02P6x~b1z-)v#K>|nvCaqM>E&%l&+!)u%^$D^WHe2qI`*0=&%V4i#`+V9Xd%7 zKv_4;LPi&zrk;Caw4AE#;eODMx1J`Ay~xWidg#Jzq@2UpxU&VH}*mK z>N_~|S}2Uq1JN0RR%(8}YOO+S(OdIYJ+tt3jFJ^2&BAl<6}4vPc^HV#UP~*eOikWnirRiz(SW|zHg z$||91cp7|5kwTWv<6}lOqe9ur@$YVZb$pPdMjMWsH;=e~R5;y7b=2r{Zr9lq6(%mH z=gJwpNnMT|k7E(5CDzsBJ9KEvX6DMlH(4hQ$0n!(3QFMRm>ggHM5R zZSOl5MoU*#?mm~qympSGcU5?=stfwAYkcZ*6b}9@{QS- z4~_*Li>NpU_ad(mJX?yG1sv^LMSv90@qc7*W?ERa+6R)6axfI*6YO09x~%P z!CdPvc-(8v+&ktohh3XWO*nmAKHW4^-@AorN^cGbVnuVfZn1Qo^J`4(IAIe%R75;U zq+e;>T(_#-llCc|v5=_KImz5#ReNXg?zLUY2?DoAB>-z=O;DILsP~O9=KKuAQUp>1 zYYjs!-v#lb?W6~sbHF0)s{CpQ8_zvv75{;i(Msij@4mLSZ-HI`ycfv?@AIwwYj^nZ zX?a0vOgljAvQ(S*J-tVZh*zvR&NbMhPuQR5(w1fnU+#CSKK>Nq1Go?&k)rzwhJ{hCGTx)y~LtXLQ`DDUm z@~CT9`kbK|)b9=mZBt5F*3&bTHl@L;)Du7x;k^*U>*~;2H8R*iAAK0e=@Idh*-Y0{qSONSzg>LF>#OmFO#dN~-co0YrD|As2przJ9=bw4rTN5|u$jWTy-bS;)9(0YFB9RS!gn_^RcD^kIC2sfOJo84SDBV=>PSv9@PWeh$!8rhmhW-|BHI_(=i+iW4^N)u7w$(vN_dyOcWMDoH*S39&ROqlb$(yeUnw0bOtJiSsS+Fcc#(PXak+L)U68d zmu$bNKVHyf9Qg1+iSDpk>vv6tC+BlBJmHqIW6jBCE!*5d6`OtUi;l&93+LsX9p!PC zlG1iI=Nz?2ebHdp+c`BGH$lLfMh}prckJS;i|*Db(RA9ZPZyhW`xX~P{je0vU`h>L zDRVfY`%sCj@9l)L8o83aPC9GYBnIl$i?jv}2kWK7w%240W=v7`WNTiy`CQ^CK<%N& zCkLO^n8vqeV7Ku+Bi|TV@jTFfpHt@cZ&V&!p^2|6NZ;sE)8Xj&NYu? z1;BiMDW#};*Q}_;@1_-~^l4v|jcfl&kR!`97V3NI{_01#n69NoxoEj(7BcKSDi`t5 zOyQd_v`4$wdDOCbxLu)qpE=jNL0)m;V#~u^^l9+FP5grHv>Ni~+b}S+ou;MPLHhx? zi}e*IcoPL|{ zGEBdRc$)&)jzt3~GxLasvqu>A`XKBQ0kGuohq|*;4+Yv#1w>>%1-M{3M99#OX-W{p z^}F&60MM7A$X4up6BCs>DE&1ZOi}figRBIYvAlPJo*aTT_~eHiee%0q>t1nOrT_C` zrvLP5!^GzV-|lAc%ImlFV}=qykSopeau>cdKcb)2bhyP#1){>5;XTb#gdc3Ox|Z3D4nFBRzvfr6)wJo6O|Wu@04=3ka2P47@mV z&U4$x)9?BH)=s6ApH4Xc`B0oMhzSCTw1#9(yndS?g24L$L_M>8ym&X+(!ng)6g+2- z5$ykPU08WF_=yRqUeVzu>Wf)(w`V;K?$ya-jQ%wEXdf}SIT8F-kNXv=cKLw=@|Zb zo7?`y_IMzL$v6$X1!!@pJ^$qm7B@g#UIw&2&`OEB z78m5XKkft*hh!UY?*^A<{=Q!Q{2l8n<~`GCd6d8E_h0$*U!t@AFSm#EKgk@w{gf;J z|LyqyiPQP*({HM|Hiq3(Ls8_8p#WFs2yupBYmhUh%5k$-nytuDNTs}`SRT(=@V=W zOLVcQ)fc$9#Dom{c&U)Hy=DdV+X_>Ull6)+g=#+Y9%Y|!Ya>sAR#PvGH}$YXw>$PA8}oDU>)at zKx7ZS>O>H!kp9O*XWKW`KxP9q_U(N_wcgGOz;T2H*0 z9zp)=rwcjAPoY2;Bp$J8ZY>Z-L=K6qD(v~lUK+CVWJ~;g4!r!q$L_3=IemXE-<*82 z27D4>v|1*~NJ76sZ;|?FPkfJ{=zZcGf)QK*^4UyAwZZ#TgiN~FU^CwC!xNV@ros2o z0ESk&{DfKm=a{7XKvX>@YZ$g9R(d(PO*r1G+4>by_-IdMS+O{|w#7;68W}1%$^Ery zyoi&YwKCj{bL$`X&h&f#Ki?hxIyuw7_Wx^dbG?iW*n^Y`&p!f-s1uC4&<*Pxc~^9)3`3o;zqcx%vFUxHG)Cj*RzJSfvS3lckG=2|j0G`tUh~hw z>(>Wj$X+zPO+-hd@G}|DgGWxR^hL(sUkH4$?`wVf=Bl8JEUFL9RB_@%_nag}zt4tg zQz+?!sPA>3w;sB~eXG*yUx&`w!cq>h(P4o1JVycHaBbbXwJM0bpiQ2vp7@LOF0_jG zzMnU>`|BLe#W_5k4Q*@1w0;hz1n^6$yu+tePKIN||F{iwg^0#;#Jiaku{bwDcpmGz zu{W3|l%~{KAjayiBe8Iwr$6 zL%RpJAvD^jAkkuo2=_})l9ov!Kp>VF_d;Ww=HgwO@v%`d&#PQLWOL5Bqg5iw+Ud_j z?~MvdNHphbf}q!9AMiRtu;(5TLjc1r`x-|qn_xB35HRvqlTM?)3I;T#deY*kOiwMe zvX+hs{RhuVt^wNh8Qq%@fDf-9!UQoQzSxEq=%r(XI&zKLNWsX-o$fAEW-|^1Z zmFCs9+wihxp_465u$<=pV%r{l=3i^+1WqG9Gl=j*$ zy{Pm(p)$$Mh~)QY+#D&b0sh=;GE*-ck*4e?a`Vp^Y|kLs1~V}5dv8%PN6%FZa*m0IiQA`5I5AlvJw&^|Xbwl6bZh~P)HgM{h8Ev6 zUvzeo$v|$h-P0|EFk~hKo1|l$T|PX$J|qm+2Sntuk*P^zVdDHLpOEA^A-f}uq8r|0 zOt$V-tGdmB#wd&JnrXYeFR4CCA_jV*O;m=a0Y#p4PnNNLxycBZcBi|ZFml#ZIp ztJqKP1V(z2I223`G;dCiwB_|DF%J#hMTgAPhUxH_D9HuCKqPp%C!+-!1z25fSU2UU z{7#tlkyHJ5sn)b8rznvNU+NwVttvZ+D#9u#sbBS?gjSW97Gqms8W)84lEra3Zv6(9M z?)}H$H){$aFYz)al-&7agDjS+J{C|3?RW1_i(-%mmiQVWFg_-`D%jqQ!Q;Ww?9lsU zn*_?8@;G9erVu2uwb3Rt-l3jw#R< z^x~A(us>YD`lyfT;n@YYQU|z5PKYRoOl1JqFX15Qp0rzC&UVPICDr!stU3ApJ2ZAx z6m)eGMLSX5E?Y!-PdnWVpTr=mUCI#28Taz#6qtp5iv9Q6fHi=DVXiy&;cZdU*WKn( z(y!4zCam(J$@08rIcy^TD$(4hc;kauhL?U?1}9)iQKH~Cu2HYBPR9Mr_!GBPuTwlE zVT41CrKo7X;5~L2<0^F+Tj@Sinz4q7k@ed5EC{=GZyu7FNjKM?Y{ag$TlaqD{%(~T zDfb0(?y|XRd$+r9W$dh@x!v)~_DXU2A>Rn2@csS3laJFT+hyNxql&57JlUUul%JA1 zBM-)t7g<)ll?>Q@-a0mn?@nwhRanY>j#GO?rZQ{dKJT?wxuX~nmJwgaC|Ui~oWnfrVtU^`aTk@SA9}se%&gG19PM(OcP#oJc z*2*TU)}dY^v@|DKW62>aPw(VQ1f~dGrX9i;`7Vz4`bY!cl(~V}m7FWAylUaKQiZXt zjTpT!ue(Y+7u&DZbB&iW`^`}2t(_+gba~#mjAb;7?Sy>lMB~=&#K51OVMsMbi0ZKg z#3p7_rrBDyPP{8(7*4D|5k}lmXFrYhkgnpl3rC_*xXV{%xqYQ&B>Pxl`jHVoM>){;D<-K0aBD1Wh__1iG-oNUM>3c#JX)9HGhovNwQH6}Ja-1NsG1zCOSo0NmpnI#~8|mqKQ&t0pdAID5Zz52< zVAb1JOxn}2F|+TP9}6Lf2>&VMq}C7eda}qLVWd`e0UFvTzpo~r_$vrnH|vgET2EJ{3`rQYoO!j zt{!qfO;kBH>Y#yHJ==U=E@C0any5mWDlM>`qrCb-9ukMXR7`kZl_gt5@JeyJROVFf z=uhsMhe{fxg5x-8yn?(6G4Fz1Qk6>HW2!Gq7*A5_ht*3gYm>Bxa!-8+#qQYZlRf>| z4*bbf__7^KU4YPu+swwBJQyu5z87aw$wn3Hsw=I0+c%^W<_}f=i7wRZk%u;B#Jz*3uo8z$|snc zPtIr}em>tcB0ECgb3CF!7>F3c<6ll4ICSXM!=#}yWE=G4*G#_LcDd7!@grsSSTGEM zSGs78#f|B@`~uEwfDlH|(Z0c0I^+%{K3|0`gemve7*HeJ9V-EH>Ufl$ndLci;c z?Wf=RTBNOiD5qRwt44bd>V{Kq3k;zX`B^~Gh2OPiI%5i3Z++E8m(6a=#1nhUd|F7& zU_#f!Ne$HjO!u;iv z7_&*1gQfqAc5H;++@7(8-fq^DFcA;oQCYf;s@<288#`kH#q4Q=7B*+%CYFBRBc`a2 z^5DeEFyehYn_9W_hE$+jCDLwo9A#i=aE$7q~UHICS@50cZTsN z$8`1^*%Y-qU}i(5t-e8NBIC$CC&flGorI zijQ*|8JpY#pvv)IvU=XWBRkziFJ!H8FJgH)u&8mC+9!UdeT+Qu(GzR7oQ>f%k)*hD zHzo9xdC8uDM@8B?kua2DrtHNpzK%1u>)Ti%tk@M=pKBP^mnMLDGy2kLL)XR;(y zI^6>TDyd&Dxye(wN7cvT%+FAmu14C#6iPvPSUZ;N_)y@)YaoBCbdc0bivUAXW|vW5P33e)qnt@Fga z2@l=dP?Kd#f5u~TW!sdqR_d&gwL5N#OgSZrDE5}P7kg7QN9Sy~q@8MX@&4R6{&;TB zq=UZo&2-jr^}5D(6k2n&J8Ptp;*9jq_4t*4hjFv1_;7>Y6mBz1ema{om0z{T4yxfx zlcC9MOdp&I;%tJaMpmYr+03Clr}~ohZz$^M)P7v-A^k^Ie}fHmZKgHF__u`e}Octrp>FiZnNuq}<}>UbZE8bAw^S zJxa#t$#llVWR`ff`0Xn@gTF0mCnId)1cB;fPfdd){JO*GQGC>oXXdqEFZRQO9^a=K zZxhNb-R%-WJK9F_xjv}2K9Q?{v&m0t5#~!mM5gD!_%mBXrQ-M zYF&@bxrhT(DrYeb6wgR_044qhG#_UnXlHy)EA7BuI^_>Fi%8?AiHfVfN@6cWgEyle zTv%_gSGK0-!n)o1Qk zlC)xlM_-D6T$cq})9)-7UeI)OxG6VAq$2etlo{pjH%x6Cqgq|0ZQdt4HVCr(IUUW5 zr6}u6#45(+WFq1j<9MS+xQ+Z--MA$s!kaM-~()T=#1%0X+Yp4r6HZgzDVkoAfd=iuh6EHdWHY)*iij^*5VD`kd zLN|Opftq;t`X+a-3Ax=AS^N5{7pX5uKvSn4MboLQ^>u(?8HPB5p@xWEC4H%k!A`B zgj?uv@SitSsTH8E>}#^yh>1pj-=xf}>w^rAOa^*#x=XQeLyLN9G!I~O9Yvpn8Zj4e zAErjjFJTX!cj1TDr$&GPs(u&UzNh4~@zK77{=CJgr%@lh!QFQ*z#NhoV%tF4PWW_9&avy=`@$G%?xi7OVm zw#-#QjNu8EXuL8bqh%A#mpRQyPx?B~e1lUO#d%aqYCx6U35lQe=5aaR8`U1BY-ci} z$_Qlrb#|mRi#e0WDge>ubSiiM?g+r}9F zXHa*Vkt|Au2$Ai$3rwF}Fi7lucF@RQY2E%5mIgieB0TSh7{(ts!M?!>p713v9t@?d zU(S2&GskjOzlZX2XE0ql5cqLTa$(m!AcWrs#wh(fhclt5PBmzKl|OGmPPS%HzXQ&~ zad?l0UJBlp@_y-~Lz(Ax`IGDfg+L*m4aZ_=Hk44Fwj?RmXbBkpmH`ehQ!6TVpI-*y z#tD>G%ZDa7cW1RYBoZelD^5LJ4yiLR_YDHnP)7@;B*F2nNs~6Hvrb^?MfyE@{|=w8 zF*$SYZP6CkANJ=BBuzlY(@VCqrl&1EylHbou7+RV_moF*oUYrG*vy`Juzn`$aNs!e zcL#3d$t$(8k-S?|Nq?3$E(j&R_ar@bKep1sH-avr1-t_2E?R6V^vl zGoJ`;!?2BYsN1oA=l5M#C~fxHcc0kb)W9V_Q5ETapE0iM^dyTc`;McRvr$D`Z7N0~ zS`H}s*#)$^pMgknt-Q%0)uQP=e`oOKqVjdkK?AEA*udTHMgPiAeCzx+Wi%1S+OS1x zq2a@)i8o&#X#W#pT};6YeB(`&L=KZ7gm@rppIK}a*u|zy(M;&mhHmdQ6riS!bZG#PDa4DS zN6wE8>9fa40^03oXct~X9CqtOW6f7SetMF&pnB9k<}+B98u(3&!qtul7*capSQv;i zsv<_3qzz6_N{i2gdFu6{Q|LV!N}{|aSEUba47EC@v`g!cC6$2hivWeyQUi zb$*FAnQp;KzhSL&TPbzReFA#~%O(R{{B zE&#+uyv6&jUEhPwQIR%(!Ts5@x%7`|g$Oh-dPfv10#WfW3jvjO{^%;&Q4xoMj%x-R zcB+0#$JDLCJcz=t93b#aGg23vRaKd1*a!n)f)hmSwh3*6Yvr`>hZ(gR@uIDWvw2u-N$i}OQ{G>$m8%k)NHJlW+28K{<)dq{ zr|95cEu9{)Y#$*k(`_T?$N852XAJfs-UN`UUni<<7wg1PJAD@c$^vhzmR!*f6Kiis z>m;bfxaFI2C-)}8rZ*roag+)UfTDGrk52&>EPI0zLKPLCwe|^6)cq4Hx-MvNcjD>{ zjR4IMRW1(C{6Kt37PZ>m|5i^Ju>hxhd9ID2fonXM1#-l^rVmqWN+JA5WMc~n*4oqb zmB(!PLh5}>6zxtw%Co@)2q60Z3osH7NPa;W#)R?l83qyj4<6-@&vbxWZy=9he(v=Q z4e>v&e2dwKAsb32=djxQ87a?}xgOgqy-51a58Or)TMMv-D#%>IqPEud66R;u0wf&I zJ@1DO2Kb%R)YBb}zftay|1y+JW1b&OOA#NrhHCzChDD@|zYat}h>v zkSzplXT}U6j)^T*5sB#c0>HC5Cf@rt!S~EA<@QLIPkHhLLe0GBFwjk}&@6XE!zM5} zfi>|#&4zSJ$bJVWSY;Xpw5W^2cEyg&+Wz&GtGX+N@F-dqL@#DF08{(WfGLCOt({_t zGh9oz>OHDde{=JS5Y4Fs#lUfpMr?rYsH_7&q2+es&C zw#U7~cb^wYjr+Vw@zv#Vjd^J^$q|Uq#bp_;x{pLG>wG%1?>WjQmES^n=#SE`f#i*? zl!CKN_y}&$bUlNbqZ1=;sD4@;CA7vb{V-_R{jU#8{<@eC>$;B+i~I^<^E=t#C5GJP z*l~1EY&&Kd;^qN`MPrkGzOwcJL=@7hw=BaWD?q%YpTAy4pyllMSJ;D{r=UJ%&R!Hn zGRR|%iriL?xfEZXC*rA%(#fY_3=f?NEs5nN(K?cpZO``6F~A4MPd_HuqGn7V@h&X` z`*>B~@HCGXV9&Dclm=dvM|fmB8LE(trikh(YE%qhK+J1c8lmsjFx-&E2YVc1iMp>+ zfmPAAnQv||_xqM*1CA&2M`Ev&P?eySf~LpBE0WDk-YM)bAJ#waU1dLo_y!Yk4k+sh z(qbvkPc3K7(=uGF-~0QR-sb{1;Kpy>cyKug`dmKO+hWYCVHVs`#t`Y{y4FWgMZw!9 z;i#_BTxm?hu8E{{52jfrwaRIBtFcB9UNNcAJ9?e5-v;nbkvmckGK&58)n&q9ynI}v z3h7>VnU8fGFG4^b=POr(RHwy1`VX(^m!^CiVRYzwx=h(0p)>1`UGIQtb`UaKHdR*; z`wYu0(cAqIV0(Th$z$(j>X97WtaQ({4mMe*HLmSzyxnX8G2WBeFE5l_0P6c0PQyav zk-r{WNMDqx_(Hm*Rw_I$wF;~&E2u424Gbd&*CtCa!x~f>>M|ClODsCM$P8CV+H_|3>Yn~x{KsNBHMgYrs&td7eQZ0Nw08pe zJzhH4TH5;AUU!|vnmLa0HTp`Py89rm!Luv^(ljyCiQYLn+$#i9Pl=Ka)E@BY_Cm#!|$J0LG0wtcd9wJ1x~ zBY6gf+yO->P%S|;xYMC1yEM|p?eKwt>^;(pvR?vo=-E&S$(o=IeFyMJ&oW}f-TcsL1nt~KbSh0%V zp4g+lHyQ3DJjN5#zB=&GNo(GAe+t5bS7{e(N7EbUT)Z?iC>}V*x0|9p__eta;=>|I z67*(ySanQ=+MSjLS`xc|e~RQ=#1QDpR18iqHL_`|&i#z6hZl#v8GRH3g?3;JwovE& zNi?+D)`!le=woVl1`kXShDVK()19C3&9xF@$5xbuF>ax-m}&|01=9DwJ2i@FLZm^N z$`PTSZsIy7sRg4UCr3drAK2^WMGr?Y#1-$39C|gidM++}^G;&7+}xXgMu+;0MQjc3 zedeA=Dvy&tQLPTO%W0l%j_>(KTrQaB^1kkX3#!Ry09k3&7hce_`n+WWduK%ovF>SXRee?g8u|8D zF0Z-<&wZ&oGVEKvndyTbx7iTD3{!FV$ETdYZG5+z?mQ58PWapLqK@1!nA<;p0I$n- zt5SV>j)l}G>>rub&9?d=BkoFW_n@7?c#&(v+qhKcEwqBsg3J`p|pdmGwJ{S+YH57h0$|yfZEj z7QNmgG(J_t8-TC~Qkw>dSn0&tcrfmySde;p96;JisT5R6oxo=^yL+%y#kN!4h{H)V zp!Pj`M@sljw^b0_g%{7;9Bg!39~-APR)uQv#u*!b_?wTi`{+RruT`aAf^f{r^GCdb=xILF%3lq!)Ky_^?P&S z$b1)C=>VA&lcqs4YP5A~^7yc!QY6J8$KXPyW&P3C_PuQS$0{OV*w@(q5!y9jGUTFP z_wpUOde6oz82XMH;ja1Zv)3O>wsJg;B66**^@zI9Ao#20cF8Kq z<)S^y+|wAJH0GNSk1pK_)uMe)(khSdbgX1Msu&@tuLU7==0z=c4pybtv_Su%Y+g>< zDw@>xqLRa^M(Q&xrxxFJqnS?)Jaa9;hFIMMdP6MOD5j`jGe-?@%gNlElx8H73G3{{3oM0?-?`2Il3ykH)=@XlA!E9c#$+cP^X}p+S zq_J0pm5FN4pU7}PDYE;3%uc4tv*lwKa7PZ^@&h1IpIU{EC-l1@HQ+`@I+98>RWw}7 z*@EBfP%~5UChgg3%%C!vRZ>p?h}52aL)IRxT2C)e(?`P@3X7=H)JkQ#PdP`PSLV9J zaH@3#XCz~x!;fTTrWbF$c>QDflN!pTDVm7_M+H`1yh{L8f(S^X1G^VV{o&V_QeJSrAz;@2T(I$iXx# zZGLM4tr2UavGt?(SE6eDnk7}93NA?$8rbJ@9rMsjD`>z;n)kmyS za@Hxby!ClX50kwMY5I{vn>E|Z$*>u?nDwQT4N^tHr(g19-fjlY;Gdv&x1rRik?p=y zH9(xP21?s3gG9=3#}ZEiGNE5I+AzA4%B=2}PKN%J8HrmBG36}n(YW>i#kEpzmBr)5 zH@mm3pc}J33if6!xERqYO;d@>)R~cS_;hm?Z8Fw4`K1LdxYK3pHoZsR;y=x2+lEj{ z^DLIi{(CjuCRxnp_vEN&cf({p&9a}7$MZbQn2u?$tFR4=XAGsObvd`U9S^!%d!fAceMU*ysqoG?7!`DU*o zmgc3T#BdyH>)*ZqU=VNtE(c!*2GJEx%N~WJxTsn&yyxg;9v^qq-*x*R32{pDYedL= zsAtykzDyr<&=#rfU1y{3Aklox1)&1{u%>Oenj-5Z#oSbY2DYalan-H)?rTipGN0HP zPf^p1;64F&GUm=7vMvTgGMX~?4zKPvVtJ@y7KH=@kvkn6lJge0@{A7<5=5$;c*S() z6k;wKY_8Gvn6Rd)g?~WxksiUb=5b;8wajOqGMv^aQE#X{+e9s+ET}ML^-*;fb(bm^ z?^jT6Ke=nn7&AGnZUT3Ck3CaEg>5x=h%iAQ`AmL`BuhT(BlD(54>}Q~o(=7dz6kF@&krUD-lCp-Mkx^lXO<%{i8$M_Ze4M$d0ZFP=Ayv5EFHCj48V zu!Y;Ul!<8GFiIB9E#{u%zO<|-+V>5M5(sZURM0$%)pC*MDYf=882K81%^$OV?DFB6 zZ7X3A4C$#gh7aFiWqNQnMfI?5ge0A=Zf1p^kwjpg3*+(31<@nCF^Uqqv-zxVHaxdN z$~QHSy*<|<%+jImewcb*BPhk_M7-5Nm1s&Pu`~OOW_FSG4$a{XqBQ1oLSLCSuCm(u zObj|PBI--+ag%MO-Jwmoxjm(<*w?V_hV%Asqty>E;r*W#fHRx-VlzGHsd(u=GELY0p}*gle?eCgu^U&aB_ z7`|Qe+*!lt&^&vptGckT`%)GoP-!*lx~Z-*tWOb$XHBwL!Ad;}x~t_Adz$}U^>`g$ z-st;aq!FI*6=oJM^~yG|!@M2s`1vSm+}yD$*Lc_Q=urU)5rMX@-tXfxXd7Dc<7vj)qGk(tVVU5rSnf9*ZWAgSD;77PlQW0sM-08n zKH4efp!W;uby7@hHERGqoRX&$VJ7E{SP=7V{7y=5bV^um3uv$l1FaZ*pq7=SYfBwU`;-IZmJA8~gh zI~rGg{K0!5C=j3|GiMz`o5sMW|GCx-(TuZ;Hn7YtoXPOvdj34UN+}s7=8jGI7nU+G zWZx0|<^&qkUG>=^G=!R~1nU9nG=&>xZIOk&Ggr z8wBAYIeVW`lZlWlAFzjJm0a{36It-|7W|8<`@0SKXKKQk< zC~H2Wn$7&Pxua6|MTc;fox*gvlm#4o$$~A*Du`R zpUb{6W1MRa=vG(jAD-|9f{+dhO3Fk%`lgVMGRD)M0|RG?tZ&cBeO~IIDzjgfE1%Yd z5dJTW0McP(mVTyPNj>TC4s|$foPpzJ5Fm!2T>GedzEWp9e29Uc6PUWszO>{u<{MzN z_8L}WN1^RwulcE*{O3@n|KwR+$u8xbJFPpzgKAl`*@cqJ9q$uDIJ97Ynuw>U#dt9D zGn57v+fzn4b1=Lxfv#j}-pcHkXm`utu~PZZRQCE?gl{t?NpY0Q~7p^vwM6f+O<7*{w;}y^zD#H9+ z5i`0c&LIE)@%7C`E%{D42zn-bi}VreY5L>adyxeZT?QAujmV4v%xGWF5;(&x%j%iK z@JM~GZiGcEq1q4RE@b+~qL8Q_=f$I+^H3CKp9%}ZT@She2=*&+n zUzj_X=C_X&yFv4xb3b|*ec|QY^Cq8&J<#x;X1beu{~qd~fkWq}F$eUrp$Ayj$W0m3 zjQ_>g{CVWkw1WW@2g){aaH>opOI%s8_tMzRd-Fe`UlJxrqbQirPLk)o9A>xVHpsP8 z$Xru;;1_hLR{M)Wob4fN2ZG}oFv&GPzB&k!RT&{w^JO3guMw8)O+Pg-gTr&y+7-?& zXRSLkNET$YvtQ!F5ZzX(*`{9e3N2|py}!Bl7`la6I1volp3Ldws_6Z5Fb)xkk#uin zqqQIy37O3AMrdDWX}+4jpxY!4#u}fIpORMNyNBwP|Kr2_GiAc`r`6eHkHf@@g^2MJ$VvqwEcl4`zHC0zP>L1$<`;F$)SX7rVU&Xcg^sN;3{iTmN& zHxl>P0B22N40V*mU@AhzB*4@MAB`i1$}Vhc+DRTIiChD1M(|+oUm7*nrp+k_W>B`m zy5#9(vy?wQR*_xM=ACpu_D#oyE6#qY+hOd~2iW{V`z)BG#ak_5-)p?^S?#{A)n5R(2I(vga|7oi`!|%AQ6n ze@w9-A?1TS^pd6Acj=~sb^I-;3(cm!rek;Yq&@uOj>bNERkN}&$2QTv?bdz)x3i%2 z9;^f##`0THJGpTmw%}n4B8jNPRnnHA5M7N68RW&?>Ew7Izqiw{+p2R`Y9*fLY|zC* zT;ed>GzFjPGu(3ciN;?FW2B(_$>;HDj*mGaX;PF|BRO0jP=Z^&0Wgj-;1l{|KVeE*w0hvpf>ozByTr@PHqu`D#jp_Kc0{g28=Hl+DwV` z6%dXfQAdC>C5*AFF!2_#vfOg%bV58-4P>ZQYL}0b82;*HecGn#e(c~xn7u1c6QzUK zXaH@96~>LMsr8;$Ane)y4A>0vQa)tv$==hHa?SBt1jYX*5?^E0fM zha}MD-|b1mviS00lFQyqcI!t)ceWe0=pi=fGg$@*h)tRgMO-B-m0q|s3gV(I%-Nbh z2!K(nx?*gg)3?)hCI?&%b|l2&;_i26zl8Pl7_dR<912Mj&Lu<>uG+JD7fR$yD#N@^ zr5gV^pJtF2IMn6Zf;&lIGFfI6#xe#PbVInWC{&#PQn#dLaHh1ifYaz%;&vivS;r5> z$;B=ARQY@1Z}lJ|sqmmpHgUG{?aY?-j41vziPXdy%6=4m;v*CgO0r~Gkg8ri^oRZp z1TdC)9aiWzCIdo4t*4R@wWC4rO_Xg*ti*;^9-qv?aQa5}nf5?Tz@#>uMad8PgAno3 z!8S3Z>Q{*tcg;gtL+kk>vlG9riU%x3{CQptqyq_-Z0qhY5QE?w$olu^>=IUgQV&oa zZYel$6ovIdo$uS!aPPku$c0cyRbNVt4u)&b20b)!FX!GJB?5OzHC3AR`LsisXV%;3 zo?ZCZ+7QbmXyQaRO#&qKFo6o-Edr8XE{-H`Q|KjDN|E_$+2wi5EK|2v?rgnaJT(q% zYnl@Oy&ra_b+*U%v%X*79QR#(8?8yq^tHc&lzK*;N($ijlY(ffJjd#M*2yX0o>Kt5 z$%`WQ5>|Gvu|8QL>-x_3bl9VmL4PH&t(RKz?7RXdVopT;aE!th3b?L*(po@&1H z84?$rL2~rLV~obD(LdYsQwRA<+tRP+`KW1fs^GwQ1$JO zGdu}19nkd1%(ShdFqntmXJno{vb0SBVv;OxY0C1EMjVyu4AqoNIkxFO<0Dh8Cg-sG zZn-3wAl>Ly_l16}A?speWaf^?J@XfEk7G(2i;cn*oPo^K2Jc3B(VVn6k6AfNV38I2 z*iN|%*y?NiU>5H1sHI_2c~^Q{^;-7}aNNVM3Dkdl&P05>R&p@&mMabu*d`job;&FR zWXvxWEUs@Wh$de5R3-o+Q#>`Mq^Bo7O(-c|{Fs0yc9*55RcCMP?B44r@_^5Zz_Fqr9^!gKTOcjH-=w^N0;W#W%&KLmit=8Vv z_2xrgn}a$O85!D)1{B}9P0l;IS2TRjK|E1AN>)Px;vNW!OhJ6|6mZnCfnZmI@+|Wj zUZNX^6v*czrn(g*x^+YFy%0DX1z<2+d9H9ee)D2&(+WF((KE5c)Ky^O3utj7Sf6Z1 zC$RE2rZy6zTlyv-zQTxPKbu)Vs2YK!L7P;<&ba=A zqhg^S;@YYDE*A$7z$-*1)J+&Igw~$vN{9=De5Q!-DKb|Xrmoz`B3poQj3SD-X&v)F zhx7AKA9h9uq+VQs_d_^x#KM`Yh%FQes2VzcE0F()8zvZv`)u>!U=)ZuXYY~3Td#is zq+Rrsu=)ykhIzR_iJeC4_`t*yUq9L|+yr@xR~>;lvV zZ&|kLY$OjGdThypGtm!WTV@uya~{O}RXZ=vAKiS7^^@yTo`n7W%Q4&~yH=){52@XA z0ZtR2GEcKS%7_FCp_P|TvI?C*Q=yT$QdACN;4d5W#NrrdDo`Reu3xZ>`PZkf68)0n zM3&9|G&ox2MRD-$VKPyUp`I50Xpgw^ z&X&B#_e~F{7)Y>>s;k(MrwT?9Lz4;LQhBfN#t)-YZlK>hziZp(jGGLnw`Cl<*yA^P z<=-;?jmsuDKH~|VoGNG+W}@&P5D=)g|L)Q*KY8u>UPgw+l>dOAn5^Cz*zf^d6Z5gS z*`>S+bQtxfZm+U19M|_Ct(G`N|2XCOjANw{;ARbt&I2h2`Pv#y$c>O4TflWY2|H53?ktCaY`pipcueFnoN3#jR<*O)W0dQepeFf+^CKq zdE)rO-iPhNabJyiYZxdtLQst=y?Z>9q3sxHsF<&hbyr30kL9&9AZ*0yeynqjqZ5Un z;=ntsJ@@;vLH=dj7sL|534S2^YwVPkspV{Gz5rb7+a*UwK$;HbN!>j8s#Ff~57v)+ zGI!<8guJ;QrBwhr1wJqz9=)GUazEVj%0Z_#bpVWNt6aeGXdLCtvZ2hsexFZc%pN9* zFt8tAk&XcTi;Yo?p}p%au9KK@8J-AoHh_b@;DsMH)yUtzoW}+mK{9V{;16{CE5gM=rbVa(g`6xL8LW#ux%YT9QvJNG|DD7a z%pSiDjDfrKav&Fv3s$NDoUL8>D<0+B9nAPI<*`>{IGZQq;*vGzSHBl$D4n6PBLnqC0Ih)Ma)>7x(qWJ;PD)nK zFk#EON`>HEJE|S8X`n7qXvv*AKQ@U`D5?{cMf+aqJCA%K#L|^gd_WtRS)RjLX;467 z3P}6M(b2zdxIO9zwSaoISyCbsih-AY{L)YQbdR$;n`|zLVo(J|u}p+& z-)>-uvZZ|>5Q{;SHcS>&rL;_H!B{#zvKwUTop?e8v455S2*_0Q>(QWABoc^r>?AHq zhM)0OWEFo;N4Bs(%1eJzZK3dPC1U1}tt>0X@sO9HqdE0f(hdzNA=@j8hrn?%lkqE7 z!7u$h>aqUd36!9Xt|BpnEI=0Q4gdN`K4#b!>|nS7L`(Ld@svHCz|B|;{Q-21UBEm( z7L9=Rw%w>sssWxwIZGN9G7wAtIC?h*ikUUzxCi|{6>Qbd8HoSZ2=WcN%@ucD=oQ|5 zX*RO}rh2bgCdV+4DI?lwz84rrRRd-SS3U9sH7iGk7Z^~*O%RxJwGdYcG8$rEF(75_ za5;VZUxzEd5#|!&;HRF7+&Lp#0h;(Sl4|$l82mpJ20m|OqPC9#8CL|O8q!8%feBI# zzs5{2ZK9c&yAU}OG#;&!5=%6)m1SN5L*iVQ@)r~={jlw3Lm((3w+M!@MLX@Orv7f2 z!6|?PO(urRmh&H)4Kcb1F(4-1Uatwqg0Gq>Y9gk~6=2AXmAh=hNdu?HOZHx(xX6?s0R?nROiwI*lzZv{Gu}?KTFmfN zSE(C_%0FMF0hp&)m0T_TsSbi9ekqZ}uaeWCPdcGS{OPGMi=nirBdCyRVp;UTZKa8q zJ^6{eQ9&RFmi$Ze=1HrmUGrq;@M$8;z;tT-KX3m(e{#;5GeCOmJJhKEZpm?5EWF(p zz31({0<&lTI==sT1BMrT5i|0R&3m>c8Ki|q#kG(Px%jbH7*eXuV-oS6`S%Bq-!i-C3Dc!_ zGZ?-{Iv>E51g;C`p{;*@)7$lC)d?ybX$)FW%*YBjxy<`4H+lybvl~2 z5{r$Ef0;zxX1Vn4)*A9|OJyc*%btKU(MoyQIYX=E2e=rdi~lr<;ykcp?%Mhzi>C)J z8?WA3*g@F8uLFf&CBggw#@c1Xlm|^Mf0FH|7rrH=t?X+2-CphIDJl(6+ZLYXJmJuf zlCF`z8FM-|Kik;2xMjcl!Tsliwl%r701Pzw3XyF(>@wJCH)b>aJ$u5dOCQY0BYoKH zfeS^s@|Vyz|M+ir*Xg)Bb35{YPJ9NK_?qRldZCgFTz_)02Hp^bS={pqVu6eH(t>Pv z3)hPKKUh1ZVu*U22jR?&Ets|a^~Jfl)Z#Wt`YR(OpC`5s+?TbW2k&pNNU3LNA=E=s zF-(*LiYmk4)MBW&^&}QZW1`yLRxp0r7dq*&F$ZE8MM8AWX}A6b`QdlEu3lE@2>nMH z>c=mwtVx728zAYFL#V!rh$fJobOtN=HIb_m9|W{3i^$M;>ho-s>buB{U||$MVMC!&9%@c&<}yRcDC3V@7t6|*0s@jhz!CdSQ`yVQ~k6&4^@+k3a4C9NYqy9~Yjmfnvw*T@DK8_o0rB8yA7vN?)HP$+% zfZl4oK}xMKtN`J*=R7uyT_lJ=OdkgSDpl})r@f;Wc3}5$0rrJzpmP|d2;1oZ0tS-C zL$k8_Blgvu*gqCH>i&IOOiB%XotaPTo85Yo-ov&85PgqS32ODv)8tdVoyplcY&vS+2N^KGGl_g`!6u4ht_t$?N%0tm->%8y7 z7NfILUkJ^V!!Wy$naZer(v{)T4c?bg;a&kHY0HD2>&rG@A%4y$q^L4z0i4SkTo@QA zB`61q(SQeP7*7Hcd_qFVD11qaAx&8#QfG82wca$y{r2tKrV_2FhgU#b7Q%1U@Gx5E zEXwH9`8P!xxG(fNwp!Ho|LbJRc>f3DJU`)O(mA{JIS zkGwMEI+7PV3Pw^fghWe7Ai+j|dZpfv)F%t)7mU`V+;-*sby|H~`ozN7o(0`kpOI%L zI0S9d@>(5>`_G2Ps=S?9i1p9ey}2Nnid&|aiM$69Q_1c8gQW*@XNa|2n81T6nc#K1 zVW;F*;NlVJTSe{MRaU&e1~E^24*Pwj1@lY3F}+zKcJNdy^&+WvKQ>MM!06FvM;^ zN-~cjk|`>L47&_vEQ$t&qB0MeGL|t(BvXWKC{yM!}P?)$o~`?}{3(6z&j#8DrW7Juc(HRC{ABZe=;o(c9vwdL+I)4r)S zbbjV6<9+Xo6{u?V^n{?7UTyMIh4Xsj_aQHrBW#JtMi*Md|Mw-C;$5Q-f(39;!t4E&CM-q z^OZlX{ulF<4~J!oJ~p%ox!@t?AN+}fDLN+Rg@hi%1c&ovtGD}zK~X1=SxIx;41M7H zrQglGRYEHcjJ&f#FYulz;RQR)BKvAHDjs$SHSQ?qc^fd_LQC?wq*;TpEcBg<&~+3& zczS9}PQ$_M+sgHVV>6<8-xZWBR;y>WIE`jihNoE9T%CM>)oWR6$k@^yu3t~K9C()6 z3j&<6!R**h0k$D;PCu}siSQx!Ku>_crJm~TvoA3Jc@V$^*TrJMaS`c~5I)OV33!YJ z5g@r0wMoU~LmOb>QTY=t^Aj!`?wIoN@fBcq2P(fKIQ+-P_S~eNi?OQ~9GV@T*{i#X zynX@9WdplSbB9JWbx8xITi=KUKCu!;@LFO(^9w-e?Y?^1CeqRmW2*G5UN7UXb~JG^ z5KA!BDABfC;wrNF{Sr~Kk-r3KdBmkP@Y>HbPvo-H!nk}8rKM=uUITY5!2N>Xuua1= zGUlSJV@=Yb#&&D6ZRC%-PohYKi!D%I>Wm>Ml+$025auZS@#9~94Vgf*1=pRC9m7n&_3>E~k-7_q@b$R3x zLr=|CRn8l)vme?vL~U@Sr@Tt$<>Om{)cy)9qSvSFYv$4%vffB9+r?3)zLJq9^ zE}3A2Y~!xf9Fq@^2aywc!kLQe3PkiI9E3wHsSl=JA4rmX{=V`p9-3|TPme#`2;71h zq5Rg;G(6qu#40&H{!@)YuDkKGoj5FZ8W#JUadKx?J=**XxX;!*$!*g$>&Z;OR=`24 zkkrUF2iK@-@zd#n<4kznZfa_p51uz4en;zaQR{KBGPjhW(`+vYzQ|8gqBsi&5n_4T z6SA`pY*-=mZPRqUwqe4W!WM-YgKOXqc1Bg!0{iHg<=l1VsJCho-)}=@oISc)8yOSs z*%&#BUmy8|($1Yk@*E2^erZfBAo)!+;`W98^eWlA=DtAIw`8mC$Y7o=QJMQ}zp(;l zTR%4(oad&ZrjvToqGV??aoJBnnm2+;;Q_?M1*CDFe5G8n?74{F$?>U*Tv%#cp z**lJ7E5YvF>`bTRiRNHdT}>*F*e-r7=dAUC`LCjRbmYvu3$4FFNfD*X68{s6FAK$PYzYO_o!cz*Ib6om3Umuk`+?;}L0oAn zEdzXyUX0uKW+DUxc;ZtdajHTEM#ADYbdAu@aOb259ih8M(AOaJ(?*|!hZ2s z@(x*3^B>z*N=xx}?<&g8JcBz=u}8Ou00kcN7fJJDisPB?rD+3vGr+qcb?YA-0mYvTXNMoaDQg>>k*U#E*iIQnx8yUZ}P-9 zpd`|LWqB{}KFE3bkKegiiDd5V z(pv^ccP(%4S>YI2tj*w7oMT3i%)I~m96(n{)ec*wdM5z6&&~G-FMaiv_oxGM$%mOjK6+?wI zV>O%ao5gQPt2gj=;2SQwsn5Xu{;trI*W>d@3f!Lf?K4fXQj6_cU*IM5j;SSv^|E)T zxjY;h0=Vjf7+r#emaY#@PEPi5BD$0aX@l5m){@U8DdKb*{V-agreSnvCxo15w3%4W zuAlR5CH8cYA7&q*<)|Kd(ZGw(3VEHaj}<1JoS0xXXX)a+ z8?2_jF6~I?D(dH9wutO)JR_Z>rI(erRx4$KAO*TpKy7r?tiDZ zp+R_ol5$w%>%)GjUzQ(gt5O!qUK1lzv;Nvv>+Qd}Hw;_}K5zKgQqQ0!Q`zb)QjL?^`J7{Eq%mg zZX~ooLA2?1^Em1W52EDoVHGmC(RuxKVuMSkP_-Sh5jPIodi|u+r()?RkcM!z=G7Y? zi0_}C#Yw^A5AnC<@cmQHqfa)u&rj#gYZ*w2G+%CyEk1dwM9a{B8mU#mdFPP_9rg?k zv#qOLjutEQh~N0V7#Z*0?>Z6rzDZtiEtM}{d2Ijst$1B)+ zPt%K9wAfFyOgB#i)j!LuYbOaFN1Atd6dt5#EU6MgOG0PI5?mCb-xgWlrN1&aSt5CS zB0(sq&M|Z!PvgWE)u0(ze&mxH0PgxJBrl$bh>0aQ0|b%>@*;3?=KX2<{x)<9Fk-Q!Kx(e~|5*9%6H8z5jrH&-poU zct2z1XrRBZz+k#$+<79ag^ z^-vRQlwN&iaC57 zJd9EQ*6-w?PzcI=TUNHa_AHK4bcW;}6SaB9%Mi&cQ3Ss6^;79U`sbB117;FA={5yS zQC7MPk3OTVC_Ey9%P^F+=f*P zI&**g%dht%95nkXKcE_TsJw=hKP+aF%ip#I>;l`zbtO33RApjfV?`d0ac+5ryG3iX znw;7kS!?2an5ToMJ_VfF?bqhma(k$@z8yqGz=3`oJ=8j4m!;{1knTFeH9Lfzl?*1g z3VXDTAidw)o`FFtmZce9b>CQ*%Z~|qJOa^Hb=bdeg+Rt;y1TXFCt&9ga9W>%wfNP! zp0n2dg9$FPd{M)7tV1&j_5*B=pR1hJY_1(blhg`vhtZ#5m~eF0+>?e9yS@hD8Tj&@ zh~_LlZQe(JcgRj%Eq3F*=yz(3NHah0FwEd?Zhv}x(TBHEPZ#`3Nb}r;% zvHfAD1o5F+|AQaY_wMOmS5Sf6MmGN7kmkv0%|RGSctX~)Be-s(o?6d@2r7J^&>|@_ z`T64)<80?oUCd&o|CQm4qGy0|V`-&tB-wkh-hpS_Fcxon}m%|CBi!ePA^gnY32 zo$XriojTDVn@T)(J#j=Nf0{Zr=N0}tDgBa+z)HUC-`EkUqN>47kn!%DDo!Lx=i00S zgSsZwfuFP)+DQ4=JqAIm)%@&)=w%&$<}m|BZjUQUZNk$?i8T$L6ElUk_3L94BlGR$ z84C<-WR3`RsfChc(QtOF%)^k!Tl!Q21Vt{?r(0hev6x(+r#B?2_u%reCWf3X4cC@C24+@nEn>1JnysU10<}v zn+%Ie#nd#;=ZxL|&io_Ypu|apv78_DXVz0v(IX)|g7HK0^^y`>rM}{5)-e^8Cu28i z&H^?|u1`*}TAZRH^ol7)n7CI(1{yoIFd9j`l`rbKPk z+cW`m;O+DAl;VwMZm5?#x3CFKGRs`sPEPGf*mSLLOz0OC-ox};*&Wtjw85G>?1d0k zYcwPC_jq+1i*r4y3BD?ad*>eYzUYaL@c=%0;MYCOF@C~_8KjJ+Mc43^MizScjrrba zFwJwZz7e|nlSz-Y0yE#zTD2|7@#XKXA;!&dIyHNB^-R@R-W9{j zBOlo4UFBbV^frFDd0BiP;K{(qaj^wn;loF)-&`bfxi1tr^M3db{;i4L zO6b!1gqNSjg_gg3g!F%O3Ugj=DhEZAfyr;x=ZE}VLTskVtBduee5`8CU|n+`VBF!b z_}q(yau!MSdLpWt=OVch_ZSpj_qnOt*DIr(uBjUPl_e%8t#DvVeCJ0ojr)@?H@0}2 zPlfQFc$i$u^WcnfjaEZaRL?W-_55^L}!z1U9w;kA{`pKteiP=vqA~ z%;-{5CI{RRKfbq&2r!2mb`Q^|OAqVWtJph)TpG~bC?~J>#wPg9Zf52_Gv8bN-c4r9 zZt|1;Zz(PE?gUPy+yU*kz59;=W@#M6ntWP^_FC3j?Th8cF%j#pQIcjaFX<=Aq;gC5 z=a&~>q@2+AejQ;Hb)EUVc7o$>M~2naD{nA)N%z_1mZb}wOcx{vx-@il$r8>Gn!H!{ zud8XWIDU8MmSYe12|pRG-q#x&XfrLebX|-Nw9Ve7Q!qs;K-z#o&PkAVi5oiMz&%$z zo!uLsWxRCMz|rQK2S&wPD3zN+iBUR5tZ3Ql3^>uw^`PhUC%*@* z*JJrri^|4RYsHVuFz8h!*(8*pN7x=T`0so}B8LD=%yb z{(AsRnfy$8)Z4djJM0yv?<<~~X$n3j{r2&=cU5~tM#i?=w^RBBwIYYwGA1p3m;^sM z-I8iFCQnS^jmLL7e(pNM?Fj?15LuaLIvmPAXbT;WW$k#oZ+8^_r)ua5W#)t-pBqUf z>Ea@2W5b5j!a?F?<)rV?O_C0e!2OP-c7~{Vq zt&-L{C3>muX6BYBMten6G?KWBZJTCG{5NgVyoQ|TY|eQN4UNE-0cjS#dcwwUXhag3 z4M*Cod!io#iug4IIcv9-F8hFx)fE_&co2w2!+&1C^2rhZotFpy=m-&V)1EHd-V<|d zfs(dE6`$ z&&!rnTfFE`Q(qKi8+yN&{R0joW{=gIa_h$lQ5+SUO3pEIT#>x8l_hWT5bNFxXG~TY zToz&}sadgBKc z0ke?O*K|pI$lkbLVB^NR6kU`9odznye*1c!TOsq>lNpE2!cW&7`3hIu*-_}s+B?C)qSVWL{P^*QlIk2k7-hX| z?gX)MdmLW*$@LPc6(89X!gDWHr=j)14K_$Z(1HpO(fqJrPq`3Gp@d2uxAdm)!p4~i)?&a_g zP75xx;j~l&61fe%a4vn`%aq6M!*0-8xB))gL8L+Y@XS5d?0p-` zIIfyR*qPQpcfOUCq+=Hwk1bvP`Pbo6I9GA3+S_qcQAg+D+CpFEF$m*YB1Et$^6JMP z3-$DGN)Y;S(NfNDdR=u92?I)$BLlv!+D+Yuy?k*gN-xq@E51SAo^x356nc^#>gpN# z3h&}oC>m=3f!Nd~Q6v7;@HU1e?U&(GWC<>YqNvOq=Nk^AF1 zDHhwp(%`+5xIQ_99I$JqJY098llM4h2iOk5gBpO!qAVjGd= zQ)K9=%{1CE=wNL4_U8=qq@wlSedz>vik+Xxn=hYYAM3+wJ*DC$rVgpdz2(RHwXzy? z`*;)fgk~DrXq1S=88YNSov#m7!YWW@-4;U|M*!sRxOnFaXi?)>7eJ%F`*JOdvcJqm zGP+Og|51s%R@N?YfHS$#;nV;q!*^r1ZY{5}HQ%~iT&d<^n{Np<5|W^d!z8(R9&}up zI?RRM7))0;k)UbZG0QIhWd9lwoSAGwiaSYn(yfRnKRcR#&4NkQMgRg9Ag!eRK2&*?r8mTS@5 zmHDo(#C14%sb{ZqR3YdY=AdWNGY@~z0k4J$kEkBUr79q&(yfjTwaN1H&L4LWGyYGq zjwczqi^7h8@4X*s;ab~FA~19YxijR(D}Xoanoc8= zT19g9;xtrf@y$*IkFNxyHaZ0Xaslv1=45MPQo8g6Ip`AM-skyMQS@dVU{8k$q9H7H z_$FCCfIgEqrg`21ncFtFY`4};MnFk9T|uwMkdlg~o72Ts-&!CH3>p&6L`CR{JXO+L zCD$xk$MzGq;Vd~?qOTkOs=6x&80SXwgvgfyKhkHZ-_m)ul9GS;^nnsBn4XAO6Dk@#Pn2KR=GN%YD#O;<+BTQPmw zu{aIpN2$$D^HX(s9ze1)PpU)^Xv${{exEg2EgQ{Z*Y30H57G6X^}92BUnz;t`F&)N zc?`42ScWuNvTl+yt*ck|uZ!7UJDc+mh79r+Sp>iX1tSn6Av~6G<&=^VV=YSO(J6vT zqr7-=)1PEP9hppsuSvzr%X=nOhrsVahzZTM+H#nLwKCPuk z$>g?x>BNTK)#9Uy*FqtS`TMIfh{^K+3m?}kQc4EG?Cw*vYdH6eTa>rNRPNBBPiGkn zi>Um`Il;6$Rfv$}xK63$qij1Sv~4}#0dXu_eN=EO0S2FAJ#g7-YHCA)4FRo`Zp7NY zi9oR|&md7`cpijg1ic3D=OJJY?!cM$%zP1ap~I&+K?2UyeGZvjLR_MVOhx&Z(5a1uakUGms3!`p& zVsKPY)y8+45I&`5(M^_pR#l;MqtB>idJey{?JO{%`1HQX7wR0nAXSdllA0lfW5T~? z2Fca>6;u3C8#k@=@0*-Pw4Dfe`P!j3E_lwK;aaialIw=f;3GEFY-rCo-QDImhQH^k zXm?~y;D9pW#Nte$=ckIV8X8Q{B$}_5;B`5DPoJ9@AP*YPg*3Y)&^4N_KL}ln~5z#|i8BY}6WV*mhfcAyAVYemO`;I9a`(+SBHwvPC@l|g*^aupWj6;5 zRI&+wgUvcGn=gnoc_lF9WBCd~?CWGqho&?q?mHnE?qOwZ#0ClMxd;mR$^~(Mo?~}! zDhKvJLa6kb-{XvdYjkdp5}er&5&)L%o8tiqkDth@+X-Ouj26Sv;y+F^l&xglxf!JD zuXrWV(wDux?Ksq4R8MSEoy$Vq5y*{#>`uUD`70bl;$9Xdt~xq|stQ&=C^&_Mbx--Z z+_L3{irYLqdPcxs^W?E5vn;tsCBmc6{d(BvXpp)vzlVJLUGLxHs_T#4XrF`0(p!zt z6$&Bg*laf4n{}=vw6pM4Z}qT6GgwzqT1j5ad^tc*bZAHD{h-+{`jd> zSnR%plS48-T2-5kgKSN7kLnTMgSSIxI=0HPa&t>0Xz?f5P712-**{dc?nTc$LFWmt z9g(jSTNTWBO-*QqF?gy_&M~P$=Zd&5^AZ>9bKAsNW%kLh;8=;-^ih>8ON652uI&kB zEp){3T7Y)fTT4qGvvwSF-`nf;Ix1rxj8s~PqhL>VD9>_enMJ+?VT}5++6&~v0 zd@6@hC5B$;|PSwGp54l9X=1KpeI=D6Om0k*HwfJ zi_*nB3?oahn|bseDeCGr8<$uy)D_V`7Wzi0Y@V91Ue#aX9G!f_TM49jFa4{`SSc%$ zkIU|)eAC$ey=b|+6#3iVX8?s_;@wcgRLN15l=+4TN0nF0F6&d;=&&JmLZNRWMsJq) zWvQ6z?%!D(Zs_~oR^MV=uu@d}Y0?yWVb7Rr!D&R=+WPewgWZKY4>7QQ$Tm=k0wJTg ztu4bDLbX78JE1clAywj{q@!)l9aNC@y$0P3D}BZkKNnHJXEsV-EFS{I3YmG z5gNKOu{TAafFbkNxRe=}sK>-6%U$q86)F0%2`M<&qD*+4Z5>cxaJ&-~WIfZQdHf=L^pt~a6@Se;5Gu9V#?*-1~kG;HD;*p$OrEPcP zz$sl_ob8MC#fU3zW7;-LcnuP%Bk`Zi`G;o_0M=&j$aeoH`rpBQ15R()0lQ+OtPXHjA| zvj2y@mX*tkC|&Ed%x~@Z@%*Ipd7r!LzD3$}Z-*e-LM|io$wzEuL3>|c#NtyD84bEsP0<8*Hb8(2c-m!JUMKS2ALoa(nsb>W$BR-9*=G%6Mu+7 zZ`AQ087R4e@~E&S4ymM5coZ5LjUN|<@4_OPQzxNeUGNpgY${9!6NklZ5Vh1!-jfbW zX$yoVQJ)$YB z?d9z)L*V&HC@Jc6X!Mg|%qBMHQbCTH&xaA{}WL>qd zD{K(C-Tu0!rIesRvYM)^t0RIzJAciTU+_s%827I3Dt{m<`0kPT{v3=VPM7T?@du?U zr5W391L0LHi~Z%z_b;DZCH9AFBFb!cEL+j(-bHXHS*G~F3`UtQ@p=o|<(b?fbel9o=bK{d`oR2(1J$cCxcG=mDm~T3SzLZ~piS8(i#wrU&P{ z2kbBG+r#n@>5{K0@rBYSx|)_NBMQln=-c>Z`$A#H%pDcM5<@GHm3qB&^brOw08F{7 zg#x_*Iau>^5rWhVLOAfW@#wNyrSLp}^odYLdA7B+`D{LIIW!c`9U1*Nv{Z$(}&&0zVE(9%tPHEJEw~KVtdlEGi`ptIE zzQ}OGSS;C^T;%D(c+K@Y)Ym|2@W|+2P8KN~dslR!jo??(LXy*rL^lz~glM!c!KF9` z<=siY&RwhOlShOvf94L>X2iU-5D6YI4O#a`_t9LP$%6~)iI2yXDSL)eNNAs*Eb-s4 zo9EX*SeRK@JPC^w(>@P<0E*|ZW|A(PRH1E37~T~o3Z0zKSn={v%$IW?9Z}}aCgfQx zMxJSK(uL2@?ch~Yz=qZY`^Vfh3PlEv87dE32uU70&yyzFb3^ zj5Kw1A0;&dkvq&Gi3M2{t^O^e-4AOFhr&DcP$9#^Py9T&Zy3J7A-bXQ>-&cfUd&;* zV@~EsnpncA1!KHjv+2q9NhoFBPINq^vhlId$-G1dorm+2DWc{viUrX1>|}|IOxxX9 z3t+h$nAsLl-bh;KuJ5#1S>F5OGj8r&l!HTu$Fsc|38N32iJ`DJs*IEmPF*OpAy@SX z&))z@-1jp+oIWPpNJFe|&-?yk+ZF!zji$Y5uy{Z9gNBfD=6hdrBMTi2YyBR;o4d9I zBXTb!Sv;^v(|9tC6BoAtr|;qPMe!3iDhDd7Ih$HEOZj+U6NX7SoA8$k%76>E2lg}7Z__I#mkn^R~r&*+ZdiufXF0!=4 z%(peB=29s3Pfu(O5pd+(q zsr0_HO%*zdQ3r-j9XN}~i(8`0KAhAxjYw}FrqrnuG)G;}EG~6p)ABQHReamGm)gLK z{Ec)-`og~Bn*c0K5Qr3_JBxalhKB6&rgaD@wK4XQ9fn~=#@veZ6Ysbwv(c&l@;B<< z_+fqVJmjdL!Sqn=+_Hv@-xN z1a=B-69u%ASSFCg)#yA~u*vw_esH8#=%(^O*VP%fp2wSJyN>uuOd#?ylUQVFhSX&> zta^2y)-73i!!Qnw+NGra<>JbOM6F{j#r1Rf2QM$L_0#7UILy46c5Mdcx*l(uFbGu@ zw`gJU7sNk$G)l@ZzBtqg2}diAl-1zN9iGR>AK&yK`VmXaU>sB=cy~z6?m2Tdeu9AJ zexJ=jk+uvos59cTeq_2>@k|C%f?hSlu<2pN3G*>Lk~Q~%n6-hDupqaJQLL?zH#8s~ zEtml3D{(efQv{UN=*xxuz<3Fh*vB^wk*R8C0QU$;)RBw6ugg#o8C0FtFs*I-$w)RM zA&JwWD?CC;&jMH0yDJxWdcjvi08XjL1fC}*I{J{FE2zEoRtnEToH%JDt!B|7Y%pm&_xwAG}j_l$DtPkZvS(HC4*rVDcmp z3J`Z9Mya6LEn%mZI0y?1^Vg0O(vaY@L>5;t0F-Z$#LaPXK`4^o5_2;(FlJnngJcuU}RNluLmBsB}&( zaENjWMLtEnJRB7Q>2(WG8LZnmzE$@9fY{_ELxs&$GqBsF5hReLwTvO-Hc$IxOr)>j zpfbYI$E=S-P#;a}tVLiL?sjFjo+}^gG_%BIjIbg_-9l zs0pfs6mw0!le6lY9nC#*y>e>jq8x&T6VOanOwi*iXo^kLj0Z{_53u=}uSE>h2e4VF zyb_UYGv;DL*X5&ZqIMj3dFAqPiQ!=k0vy`=Ns_tCyVJWh2RmPa%=zV?yHE3$Z(Lfq zKMvQEaBB3A8J&F1tucLd%&mY2K1HlZ#CW!+Ce{6+>SV65h3j>=9ZXMyg zmo&ihz?_lXH!7|NEzp)vLG<0kfQ;HeFv?5wcH6k@H&woDRC#mwcMzwozXr~ngtXm z)BMwDJTL*SyDY(^eSm@UK!!$xIAjR{CH4KJeFbNP#(*=(J_ComF4E=|G(r;y73;ww zijoI`dm2#(u6e-N%n?oME5ZF9OF(~e`&fTEZt1ho5;+H8{+4MA**ywHF~duSlWn*0 zv3;x{YU7fMHbw(5630ae}cXCXiMJ=!WX;=-JRq{WdX2*FT zp5f%w9I;)|=x$rnccF=USaE@VZ9U4Vj(cJPxop4I^m{M8|L&g>nkrudshf+Z?KAc# zW0%m>j3Xg9Ll1=R$3;0XCJ{E0=)8bCEcTAckYZp=CDB@%~ANzieZE>e@XXgr(}3! z$G(9($XH+@BEnj)rJC9p;~3u{Coli80$x@vu}-JI!z4xeGRX3aO$)jkP~9?v$Rnpt z$bmGoi9E)P1eoK9funv9*#|gr+dE8BZ?Z+D8k8}B&WEasvbS&Vf0^kx3~TfP_$l#jV!0ZRLM*Fqx+*Xx)S!<=eF_dY^l@vr9xRbB|-RbrYFijZ9BScieGuo6p+UjTB&5PYFjW?UOFyl zD|2t#PY%&fL8FOPIqRMb0H9{i~$i@3i(N|HeD0#7L0KZ_UNxYqufu*Bg5 zdPqVe44x<-9YAPUN%|$w&?cH}xmC3#3pir|>MBlR33XC@01N~j^w0-$O2kpOml}Q+ zZGe^OgD+&@;*T%I`nljMWrj%xP4MDg4_-o&TR&4du^%>utB{~5437{*kgjtry4X#X|&?t%!hhg!fd`l|%P?0sdBZ;3Zn|AFv1SI}61>`YF0DT%m2! z?1(|j4O-VPog~lzO1AyGq#dm7p|mSN2T*Xs;poM>ydf-gfai)xzmFT}+-k>nm>CkV zbXLirCKn)^NMkPz_!DNu{F{`ZM-SPBWEBpk=gsox#92;Sp0lWKb|I}Ngc&1;M9}4T zfPvSNtZUQ(hj?%+ZB1W!p9wF;i~cxVz#&$m#Uq_v61bIT9HSpMS4Bu);n;WSXOdSU zfuCE0ZOC@O7@`Y{r_D40u(E;4eev!yZ*GznkU^-9J)t=hBk&bni*QPzRSS^*jYJsi zQ5v{)>%lx|@_#%Yd>5voTp42qA=2?66R=GBXyzv;E}7h<5BnYJNlefqQXs(ffbk8@ zyN78on@c665eA+X3p;JUUDNU`&Fynl#V8Y+_r5Rnzx+X%7*ir#DtQi|si&2!8j=#< z6|vBqL?=eUUu{&<{+!}OQAItTu?ktpA$x`f?4vZC!J`|ZcA9|aqQWQR_wU~y9U<*@ zM9-T76MMQr9fW-%_hrBEW=resQ^)B@4eaMYbKO#AicIuJ8QO^{1r-4Y!}2pa4vtFO zM{#=$^$4W8a8Bf5$>j%WS#CHE$0Hvrnna6|^47H(%e;VGD-lm5qR4VsVt=wvN>^F$ zv>@juzCjBh^7;U>_BtEU+%u-fZHg3wFIhy&kPXnL)PdKBCGzTJs1K>n2)fkO$f&|` zM$nBZ0N$bNi1dr$=#$yT>@Rg&`VqXyIHfzh)}pg9U$ z^MfZAnvdMZNNEvbBKlkpXz(tZ$EL37hnoN*Kpel#C9 z=$0=0X3mPiFA2w6{c)_js$LjZ8eO1GEVfO$He>sSICJtfp-+4V>`Ia}8vObS#|_4^ zr`|7s9Pn1l*r=ctgfQ1F0~JKh)sDju{-e(rF)M<8XW_+!jlIQTi_G;w5&`avE%IPv z(%p0A0~XYS)PwW85$-$uU|DM%PkvLVxGcXYKVoA&4RB=hcD=31}E|Mxzz;t zAIMs48s#6-ta(b%Q?ZUDg2NFJ4ERzP^4M_$poy9Zjt)bs`@HeFzt0pCr?%N;2-z?D zmoIyqlCozuvYNaf?mzMig3S{*L6Q|{gp%kCXteNQ)W@CqefHj45Xbc=Qoz^%)HU>@R0CU!#hHO;J^KJwTHJ5^4zI0Nx;k zoyA|4Bh-PY(TKd|PJtTD>XO<*xJ6{01w@uZsQN)n+KS}sE_$WIdxDMK7cNnh`qc>v?{L}TpkCycs%+|2bcIXljUlH;CKIHbyZ>3r_* zn@RnbDeNj;*C8VRx{Nw3pXiK4a2tF!>ne--sAXyDntn3y=Fdk-uz@tGM2OS;wTV}o zqU$QjnZYv~pj@1UT4EicaR-S4qx<7CPZ%0TPVnKxg%Ofm{uQV=bO2e2lNf#PV=nE6 z*vEv^!U*!G<3SCi+Y1=ky39-6j3mUo$fe0}Dl?fcNhL@K-QIea_D0H^*(}N_7DLxj z0i;BMoggw+pk~#J&sqRrVo&^Tf&?GQTOPH@Me#2CuR}3eg{dKf^*zlMx)z&`EE2y% zdz71aiEN@Z6mfm}FH;j&p8uDAux-`e6fCr_!=tT;_HVks(>$4N+TcwTpsOY)J4mgL z*wsTbG)qQNaZwJ_mc2ATqgOZ?|F0>7?%O(81sWUA(--KdR=x-fPeAf6JWz`v>F>{2#d=2dzyGLDS4BF&q8n!a52TgY0hyl}A5z z*aOqbhng+0cY&@B?^-FB8tqC*skO~GI22Ev3j8;Y8OfBYUiQ}``tzSkufM|Z-#?XF z_b*$b|7$-;$#m6KP*8}^`uozT|4OkbvTNQ#3&>8Awc$jj`L7mIG4x%1z>i<{(d zi{Jk1J~;ZX$n?LFzyFsEKP+SWPm69oMCz?bwF6Oi1(dO?%wm%cv%)a6{!E|(wFn{{zjhw&lhV9_ z57^0gw;;58On=9ih$cke-t0*+WZeI>oDQ6807{asGCR)8DXHCy(Q81RlLx_?CRVx zj=+X=6efF5XscoljTPFy-H8Y@{D?ni`J@+KIV`czN*9m?fHV3x$YEtb-7FxwDs7iI z5ck+g)Ix0NBKGxJqtoZA-eD=kASf_>>QZj1-1S$AlrY-_)p z8J<($kA8xCA@fir$Xz8S$A`O+TCT{^Bv0_4FU@Nq%SQ=gJc!PneWaxBPSj?ojFi3< zrKk&^@dAKqY-yh_lqC|CCCp{SVu6Pe&zqHLdXV(H4G@50C(zb2_RyRYc=Y3RwS-zM zBQ;wFyCe{TqNRbL~e?O_YJg5cKm(3J&P>7KfJA?a~5(%nZp$m4gICdpJZ!nK{=WjH*@5Exe6 zW)29cJJNkoVlC2&7FDyVpMsiTr&2(2ZZK=B-Jt9iB^_48=4BLHjZTNy>abfEu8n3v z=|+Idn_K={3Frw9Qg}u@ z*1O$P0Vno+D3OBQMqx-BvA*|&)*3z*0>P}pywz@l@Eq3b#N;yYRmWjAi`z?SfvaJi z9gFkNMrwe^$M6-i4?$HhmFh8F0Ex9ZoQVC{kzreXj z-nkE#PGFuhfs+WJ$orL80TH5PHDN!8r%|$26cC-IaxKli*~YXNiMP<*RH%zR2opd= z;q*Whw$zEB47I|!;YsktR(JrcBF1RXqod#2q|-NG*h&5tPxb(}5rZ#Y|szTApVLwFECbW0Te4BT3_P6bLmdzl`81%t-z|f6V*xxtUc}5a_&&h zn=BH{N8FJi3lpAFDe7Vg@i4FYQv2si4r|RM=K;n=+*=IWmHWZ-zRGVKO9YoW?ZBr+2?atKGqL9^sZnsDr$iK4!b zx?ZKyV8R1~0#eYPLBCIUZ0wGI0(ryDkfo#aTS9_Y&pzB`B*z%Uh5}?*42U)fkE0cJ z>W01~U>fhOgYa@-ka+22LzXr+cc7VKjX~!`>?laoW-%i3Xyl z89KC0KwuS=L3DrwO@iwF*+Jx+%AO?-J3e9V9Xn~<=DN)yW6sa-@x>2n+(Dukk7^Nf z#J%MX&q9GI3WDWwltmtbZg=Mc%gl3^38r!0WxA2j_wLXXopFqPOBF5>vjNO6iP)gK zmim5i|DU_r;$n;4D*Gec-lUAowe$fL-qkX+bvg|ukA$oUgs(ez)iQ#ZFT zeaT#MhCG|{hGs~WlGViqu(=3`z(AVPF+9eWiWR~sFLdd+5-`_%qH$gOIp)Lx5pLCP zEi?sFt26@EEFB~8_Goy@sEeqwHVl|radKJI*3q~+Rw^wW9ae^YQ$E170?5QTiN=aN zVbYo|sx^%stknd1E>4r28}cXOFFG`RDV!(OC&>I2gdXXF7S3V1qcpGpK1;QK>?Jac zliR6c0;+WuxZs6E5%w42M}wsWT*~s>y;2SAkTn*}6qJ#JURB{T}cZ z;JMREY%zvwpfg(63=5;3XhIsq;`czIB*qS-1byP3Q#(> zG!A(oLoJ5SMPV%gv5EQg-JL?W?VxO~%OXuI>xrU-r-H1ZL7*yodQul&38h0iW>uFH ztT8krC?Fr)#iONf0EfsRM|QXej}86y8b_6oj#5IIckk5gnXG1vOe-;Ukeuy4 zA)_@6MdO*+lDBT3dcfsT*Pas*y#kX&pGFMFQ_>i=GHse@9zzq-8ca1NXwZz!YQ#dX z;1Ut?>^p}3uJu?mpZ^fr51?qsi zNfw|p&MULoOb`pno+d$NA0OhdbzFR`+F>FKm_j}xYRG{Wa+DzgG(Cr?Z^2iGwDlW9 z;M5iBEigI?a(D+XhX-!om6(U$W8WrXT^WBPB5X1$%J)A1ogzfpDGoN2QAEXX~VUE+3ATBer!Spzh!`P z{K(9B9{EOMtU(qLxjymx4(4ZfZA^4@z_K6}2=K7?MCh1!)el>iW+CoiHfAsEz`o@dv!nh?aewKd~z{I~} zmuUFGuRKy0g+#Zo5gv5LEhwNj={E3O*+3p{|ERqr(asR}33>4DT6yrx18QjoH{-)adR0GAJ1Ed?Ks}_1G8c3= zx~gO|E&vv%E9)U`XhicA6y-}&J^*`y7xluR%`?ZNFCE#in-{%`Jok54*2aDZfx7S6 zp4-a8+WbLjQBFqFnstF2NmW!q2cTqnQWyguHTX*=rq^o2M z-P_N7TGo`;^qqpqP5eN60ZCrSt|;)u=4A#b072F7@mmDpc@OF9!#;#NBD0qN?1H-E zojPLfgp8S*=&@iqPSIjG@Km0DU;~kiC^gJrO|68z*jaU>J1PNhoe(CEN(aCgEHs~- zLNmDw)*5_059z8AIfr^|gO&^lE+?(e!!yFfYCeX9O1B0{-IGIubHwOM22^Gyhpx~4WL-F4ZZR)Z-S!VuoPVRK*%&RHK>#^zhPrj zF_LFC^WAmF#ai90KpqSC+(m`5he&3+$1st_9Rz8b)PRYZLFHv|hNUC@P4XxKjhD$? zH#PnGtVH%uuvcZ$p4~sM{4f(RP%Im}CObt?fa3aemnSzHycWt8DCz=#-d9Rl;CDKC zL(9b}g=hU7>C^*;qc2=sxABbS;yo-2j2MJ|x-E~ZmtWSUguR+s=wx_#05!_deA}d} zy0HxDI6Xw_ow4?dr-%yGtPW5*T2E_M6)fI#7c)e z6WAEaTjW_D%Ec%Zx7v6@2fZ>>R#9Ol$1EI2jo#k&88eDgrHSZ@*NJ=q;mQpUGqP^0 z!hI&Vq(oE%`9kBwqR(fpkX5_Ken2~O|wvi%^G(v z1S%*}TT0Q@4KfBj080X*FAH5^*@UX3kd)(YB(t3+-SFS?=I4l{_KDnQQcqWpL!aH} zqu7EV!qIRw^Y=`wW09Uom=lD(9;ew24OhWw9oiaVCCylkgCHJ6C%aAcNm8W}Y352) zp_Z4SivPGMck(ha|44t003t#m$8Zj3V-J!ulNF?_@fm|@0C%q;aZ>Y{hy&>h4Sk}< zH0^Er8SQE5NL5KR6QOH46t!8G7`?3bzB8&MDX&riTdj{l4gDm$gqD?zbCuB=y0&R% zv*9cb)AyHGvkha&i&5+V3b}AO`0c)({Oz4PhrOAYQ=H*zTOsYh&xifngN-v(}mO8 zr~^rMku`rdn5DsR-kdE8m%4rXHrJvY{O)c#ucGMlq}v^Rk_&LzIW`23XNRtFeX(>Uv zcbnWE620y$v5ew6(X$4e? z-++{i&3$|R#E%~ERIgG@R}RS@p;VDQPfZ^P%U6rK@1L3nx5cMjRbAiR3iY@raR}_K zqq&z5a-fpwIF6l@frhDkVhESyg#KH7()eLI=e-kf@c;3(Iq&DL zRBIvyB60-eqUY>J3El-45mY1H$VUV zv7$=qPUy2%^J`}yYB%tkvoxr5s$G9LvxXYAP5<|zwo*#so6l~`?>(TD|LA9 zKy&~(LaK9+)o1-8EIP&07}$YHloy) zOVw>jT)9k6xqMQ@5ssJ`*OG8TpyiY-G8&~XzVdXilGP^@SfS#MXk6fqX^!T9` z6;BJjb*5hPYFpNudKzCJ5jVLAYz`fAKJxIRguYAo2 zcIDQncE0tJZsjh~Mfbg_2?;Xtttq#){UaaW>?HXh)szxw09Qylq9hUZB%N%{ZfLV6 z0gQ1NC#6nR|Joz$YY7HpJU~l##;HM+OBIYEx!zh~7}k%gTOTetw2I!@Jy{|8wO9!cndVtTs|fQ6f5`zGLK+`Q1T9<2JopGM*D z_$WzNNvSHfkA;P0t3L>Mc}@)Ys{K#$mxOrq*`^$IjG}jn3ge{tP)y+WVdAmj^-JR0 zQQj~IV}^%GxiHKi{x1u^Qgo4{v4QuPvX8wmLC_W?9?vxz<^T&75c~$+OsN$#`2|t_ zG@^$lUyd*Cwr&FU1u^U;X2H8s+59EZQXe?3)MlRsc+$v}W#OB-rV+^|IkSlwM095) zZ<8;^JAMNcMFe~brWc8XFCk}~p3JzbGLG)M{OIzZ2-@E-^X72#)+*BLNOoC=J+C5l z%rprS+Q4WDlAw{gZo+#y0cTt*Ubk#g14_GmeAoEPEX~IVv*BH3FW@l(>^RSzIN1Ff z!NS)?HHSiBx|&$yleSaFTxgNB2ulP~jHugMiFXqTK#Zgt@|a&-)A88*c1YtQWnBNh zO6tFryo((^P(4y#O+zUew5slq&}kMKJA!v7?}@P8DVWL`N>vYevR^proks%;Q8a@e zD{dy#FlI3IM^x$bCF(>oHdh5z=bqFasEJV{2X25ZO=t_NA+{^4#5VhI>=$82@lJZM zyxj*jYAQ_^x07aph=)k}Bw--7@IqY|t3Xt+O*J_I<^B^}{`=3RPBD8fuECQaa39<~Tk)nxS^){HLY2Tk(kjv}h?!CbT@d-H zLkJnbORGFs)8GIxCTp%1kg-5otwNCJ<1ZIz@&$^Ck>;Ug;wF|jUP~93MQ3L212xh; zFR2H&RjOJ&97^!W64@;GKIyC;TOv!|=I1*QzqLl<8O22CYvP$-{a}ag+`T6Ra>USsn1HFi8;W^m<-#D-*uOo{H)F%|dcR;}$6-x=6EacS+9D9kTW+FaN_~ad*kv$gAi`h1MEQhQhKp`w`VF z(rlr$Upo4Rbj={+BK_q6Q0HBA|CXVLkM|J+zNbzK&$q`@pM|yg6+7|m<9nA$c?+Sk zw}vM#4y^ylY3tn}_@8kkWu*1b9y#!m)Sr$x)i1Uw=Uz@LZwgacKFWz95>|iw{*y;f zPtT=P+Joy&B=}^7M+f$@;{+x;QM#}2O-+sILR*A8irg>R>|6eRuGD`mj^Lzw4}}`Z z(0oqoULhv5o}@LBs_Mmkes3d66BJAg2@D$ZwFy+?hSqFAARZ*F>w_Sxu$iEFagzcs zX--GjQ%IwhKl~*dCE5uwnnTYuqzs5=hIM;Yg`wDawA7IP_V?#PXo?NLoYg0{=6gNA^5~U9D@PK`mTo zP^&+CXsf9X1Ngv1lxQRQ=+wRUFCmW990sUCUq?Ee$l8k~Xh175d5_PciDOc1L;Eji-5Lm4}%<50Hb6%OC8C0&gceY&8h(Pp6Jyc= z#}}VVUb9}d-pwtsXy+{srZe^$w~wwVOw1|R+!NO3cV$!5#OM90A2^OyU5d^Mx+2l}`Qkua?%3yN`H{WfpX7D^ z_4K4P7%L5*TtEg8*?6Di^56^0LeHZw@&kIX1p58tsw*qkpbl2>@9ph<93OuqN$c@a zqZcv56|yn|9$l(+arOKsud3GM&WBXj)g95%(Mi%;9438F|D3;vhv^GCicY?{wBua` zN|)T%b+skti!T-1`Q>q+wou&@xAQ^bapQGiitl(*JU_XO?+mTf2w+zfQu$5lJVrwf zfs-l%Dr^W$A_=3SNfu&`3gQE(T~@>ah$^1dTPPhiH8cCTQbZZW`yLUIx!DX}Q?nTF zCPwb(nVG!vA!lM<+=?q*pT#YwIBcFhKOIp#!9;mj%pmW`RpIezscZack#O;MJd{h^ zBXqrnB8&F5?=NX#OcaTUQG1}EzV!v2;x^-T4F%*goaow7k0XYnz zCO9mTH7@x57|%Mgv)OTE4Bbh%!cD}?0)5O2cZuuUQ_MzWSgs$sH3U%TGLq^v8)#Az z_9p*0D;7 zCq1r{NZV12dIFZw47Mav6D2jn8>o$wa`y`vlF z_Nd^nuuJ5i5?h^G%FuL!xUGv$o)O2}Dvm?oQfOaYecaeLYUs;fJhFpm2IRd)-S zqv&kd21uh;B^xO*7fNV1G&Zh&V1gRN+_mCcn@K%3i2*IL-0fwACuE7PUX9$vmR9IQ z>Rp&89?2c;wwBP28obIfH3v)bI9p2&DP7sK1XMV_PNKKv0W4y`N>>BO| zso#33*q5d0Qe6=z^Ryq4A)KhjxB;h^dve*5u3x_{RtwtT*ia%|wXC}N`fM4)G_YPm zF9m}q#ug9V!2sV*^G-9t4%E-3_;xY|;(^A&pL1T3KK&%MVc15E+Cj#g`z{-81MDRu z+}k6>jEMc{D!WP6fY*}RDA*0^rNF>)`7;ZJu7&%Lwm~BDG8DQ3J|!-Z$$$TT22B4U zEU}|XrMP)&-jQn~PPr``X~y;V`kl0Npuu7M28G<8X2FjR(TI!O&^c%B+)5N$Y*DF{ zU+)Ms36DO@)+5F^1Os1-RXN!?jAo)@Js%pq8fq zHPw}fXpPz*QG2Xpw1TtRHq5vW<@>kzOmTEwMuvBt<|m;Eb=B)_jwZHkif1o-^4sXj zM?Ql_RO3Xa0nQa?IC(EzI0bduD$?2@^^i`WIGRB%)S*PXEk~$Ib^-*g{ZJj8HuQjT zCHJeet7tzTN9}k8T#(miJJ`2AL2hzi8_;c?BvG~T?P~o`r#VbVrn<%d4dbaFC}RTU ziG)%=1YVyD;?#ij&{H;z@7CV%(4gfpZYa4ssnt>~n{ip?upqu)wr)B4r7AN55@h!l zCFBKHgdUZzDtiPdJ{gI_6Hd4=Q9b{y+xIRQaw1uxiCED z=H@6b8f;Auz8e^LkF24Z+TL0px9##vS7zPRiQPD1oAyY+|pyB;m^P2WVq zob@sH(E~I}TpOL|p~B}oN#gDpuAjPAguO&x}eG&kzQXO`MuRXZt({#cNQzF zH(lqG{c!O^sDsZk7c?A)Ib;dA&%WNJZ)E5AyC`nv=8tb?Y4H`&9~r_VVU3$>A zYWB_7!$PM>elmS5m&QX`(byt`VA9;>AQp&?_xqvOhov~EzoV?peG3u+CNZ&TnzF6% z@cFkXGQRnQ0KSvXpz&YUh^sY#NG2#_t8dlEkNjyNak= zjfMI<7!RF-hX;DwDQAV=UBzjoJDumunWF;*wR%%~d(HPBI{B>R-F=O$_6&(1sVkjc z+7QnP-y$cdsN2V_udnYxaIm12JWH8x)w1TdIZDQ2Y`*e06!fQ&Ba~_PtnY?`)0>_* zZLwoQvRv+S9^%N$G#WL-g`6MEbq&W_dDqbb_pyz^qH)|d`b3;l8Td;|SK>*LfI1Bw zDb-5=c!ZcaI5bpYb%7Gj?zaU6J>8W-4?;tQ=-wI{f(Fc8L*HzQSvoTBnUC6rTHWT9 z?`B!d!ChTlH}?<+EB@rjHCZ{=Uh{@rE*w*Lp>>|4{F9=PFfC)T1Gljp?|i-O<^xi9 z9?j_A7v#b&26o|b#BS}igr6G$^dB222|g7X8Eu5UN<`E~d+_9Y1{mi11qP{=T0t!2 z4X&kjkYhuA#&qOaeRo_JJCy;E$h9}QmH_B$X4DW0^^3fSpSWD#{@b}_38-ux-*H_? zv#5sDONI3ZG45iu=edN1e)L8(RsT?v7!wmirfcQR?eW?XI&!j&4EI4PZX1%*H50AD z3BvbjBpHc$wt!rrnbXI(vT~T~)H;wVVzVY%BRjySKS+_F@tgk6MwK7Em4rijEA_4= zpnvMjD2H9bTto6B;}*)Wu`<;H^-g7w#ejb;kCv!s9!0fwo#R!u4ecgMbnEF zkZk-%GMQ38kHtXTO@L{zpMWKyLqDj6T>GaLA2F$1J#nXC_UP62NR;8o4 z{#)BZkJ=laGFaNG*s$bjqJPb;ZiZ!Wikwzw4-0aE=y8&7#x_u{B@Omlr}s`ylk_o(dCj4%c%ER3b< z;fpDdm^DRb(fj$}7-jXUWl9Bhw+;`r?nEnG9v_AYaeAr5ad1D{-k2g;4V8V3tK%BX z7A29#h$4J<6Y?2IK#A-C@e>SApihVk1Y%ym5z1W~y1^mNepff#0KSG=#(nw@xI;6^ zwD6!u8d&;shdZ^0uT86uo?6OtAPG#P&!byk4X(RttJu;hY+o;bM3b>RdL9J%ZC~;! zzI?F7`iO5BAh|4q%AlR#>-`=o=Wk)K*bfp9|Oe0&FVpREW~8K@Lq91?T(*t&HbT{ylPXUG?NSB7CG7 zW$|iXvfYVgn(-pUVyJ^#u(O{zW@gtcWm=yvxwG!+NbmB$zH6=eo`7=3jj{x;d{>BO z;q?6rG79c-RD%J%%{U|`97t()Z%^hw;f1pdMT#B(V+Gd;tb0*dtv%TSVQQv=+xUlp%3Y z&i~zpylLQgYWqLrqmrj}c|#H-s`(QYxVx+xQDd5~e(MJ8z5^ApZX9&}?(&h$V0*Q%f&1hg~9 zcewtlWzw0rG4d9w$PUaLl7Hq9O00&lflOzuS`ddL08lQHJh<$3r3{UU7GiVSK5aM( zev0v%a`077eqb7%NQ#1xmNI@rgjB952Sj2;Uc#F3QGW|tM0Y*|Pt$`Oh4_GMzufXAw2^MU1ThPyxPI`~6dOV;3)U{PnohhX1Mk7fIEm$Fpr`rN${o&u%Gn|yd_ z_6v~a;vcRO*rThfOXQIHHb1#35oY&f-KMEU>cKe)RNu=Ltq`4N;>@mGs#@C6o$03< zXLj%}aOTB}?!&6^N^WQV7@moovhUG^Mm;gMiD@Hm(4W>m;Wm%Q&w|%s0zc&ETQ^AO zflX8Fh2G7vzMcG%NE%&0PIE>A)#Cj1&vz8U<8Zj*^-}vvg-D*BGinGrF@-gW&^Q_! zs#rf8vi9>Va%2}`@Dc0mcK814!}!7Ji!!2Aa0x=>CdE1%~sm@?%9c}S=Kfrq58cHr-`wnW@l z2h*m-euFxqEZY~kWXfAfXfHR_1+Nzf{lrc*^lMHZ)~?Ag7W zK`l0!0umKQIFznq6<%3uJmM`(HViY zqR#f7ezU9TaG=08Rk*&Csp#cwA;^W~6jncO3EB6kf|{v1bSCOKf&wZ7H(mB-S;A|sLaLs(jfi|)&1BQV7+p>oTvd7jlKw+ng8)%zzc2JL& zfo;~Xe^h>wj*=>AvrwQa>F{|fz%4X*WK)JXdu{ zFlwZo%=XS?OCle^1ejt^Nv)KJcBfDwuV4j_`VJvGk0xkc4E?q?uDj-vp`l?V7VbsJ zL-kHD7_3sVmawaisKS9rZ)~UHyqhUriIk(9XuV&`w*M?w0uk%8h_vJtB;u zbx(+#fN&k^i^oBR*F~d-UKuU+c*EA~TgqZ7a>f}x6HE__tJ2I|Np(=jC>v*ztR?+g zq73QweEzgBewS9obFFgJ9_b=VY=akh-;!}b-@68WlX-$a-A0#*`mPsqkEWt>p#o{b zi?~GzB3_Y`1XAb56o)}5AHq z8zLo`FO5Y}=(k_sH1&IBfWN=+z6O2)1&w7rJ?nL#z|aa13Q` zQs5V~C%6JSLRaM)mBIwdLlha!7;s@UBv0dTYA$kSS?nL0Bpxs*KbzK(lOEM;#P1_kJ7IeLXyc_6^6h0;al*>>0N5#ZUeKi2VlP*AsY0~V-9 z*e#EQrG>R+jJYFx(-vvMBClyEJiDDwh+rE!Slzpm;N{rs;nvYs14sLp5t%nDMXDbvEh-<=?MSXM(7}FsTbL#s$PaHQBMq4xrj*cx|KbzDWNp z7h5p>`L>iZMoBptqht>SqTweKPZ*jbw^?=BO@=a{v1NTY0SwHO(FDxu0RvEBiAli_ zV0o1KA=91mvXuIiqps}b_%OpGN2ux2{ilf~2FKwCXV^4`?=z&ZLiM|_A_f=6g9;LE zBVyrkx)o6Be6#^`PCL&9r2qhy7tndFhUE7u0PkrX9mISIg?c_h%Z(X59E_(>3WWd4 z^IIaSLBJWg(L%L{O-Sdq#bw(IQQLLeC-K#Lv*o*}IT2{&M{iq#Ry>CelA%P112e@1 zoL-`avtC}?g$k)h4$s=HKT-9wDU`RX!ZXLVn~_w0XWnh(T|`7h@3qRufHJ*t&z`Nq ze2gTy%mn`4jcV+-`pF_vqnX@x4PT)N)jaAg(O%S|xeczePLd@#uNFSR5kSnXb9osL z=gWT0PDVHaiGXx4-z%xb`S_D3LbJiaE}Ub%W@s0Dk!x_?e?g68kJJEQNejoRO7(H?QQpeffBxV&ZW#v zafG5%Vpmr{qik#J6bjQ{Ab>9&I02*X`2j5lzWL|tH_GNrE|^6+vERH3mfX!?0V~EA zvy?7p$SnNV5}A9J@A(1D7~yjd-bX3w%}ihN2lxkn3Z4D>)tSybo;ay)@2Wne z3DcZ;y=M`;RXIt!XFadg4t{DW5g&R4`99+}h)UQIkJUYU^FSF6Yy{4od+FzAil)B2 zHcmlGKht$jZ>_({KF#-HA4YPomb#X~<-F&0kj6_hncy_>;P3Y&=gcklIgo|a>(WOP znhyXe6}+jay71A2oZ02#L)V?6GsX0>mWH?$j^Udz@&@E-c`dFl8Lzw@i3(ddtCcv? z<)5E09M_J3v(jnw)N?So62DKKKc};^^DWk&$gyi7QQcturV)oSZ%b}8@)<}Xwm_|# zgNU|2OE1zq2*9Ae!I`meI2Y!~ueYf6GT)I1BV@ey3AJ9c!}hsEgno#FKQ3E~;);ue zU7I5DS;G?0MDH*{_X()c>$*=tUzI&$U3;I?8v;Iha9-z z6!qwQ^zyAZIZ5c;3f&i}u$NqPXh~i1c(2&v7IJ^{LHVJ%js=djRkOEv2YdbRVbywR zAO9^e54w%VpL^U0*l1 zbyzB}O>(SEzzRfUnU6-6$3Fnl8yXO={S8RR3J>Bt0Q}-SO5E0^*k~dCDM5HJe`;+t z=`n=5xxII&aOTbJXS!#Fh*)wokkqm9I*rDsnTjtmuKqGe9^9R%=9p!JrT0TDn))@gmJEsq^RlSs3rd{12$M?pJLzv}Uc@FG~`Gfo}RO|;DPGkyLyDe340oi(nztyfK}x@Kgsp%(qZJu0sK4h-$>*nZjE0$OItcwWjerqgpen(+ai2*OcV9xAk~RH^}Ck8hDTHPuocic+0npotev*) z!33rvC3dAnIKIwLHOa=(rey7dSgFucCo(&+JdS*9wJq=03h4Z%RRWA{b&$(S*V7%O zJVAWuIgy4*0%d(M8(Sn%04Kk$BWJ_26W@*q%V-|1^XHx|0h(-zGnQIhetDW;X`E?E zeiT);Y1!1@BefKl!JUlH^XZE2ynhMp+$`Y0x!?_Ar38&qP5gQ!9XF;L(3#RK&mrv4Z4iz0F)rw4V8u6y?jWKKLNR$(zOeu6q<0TQnKh!c4$WVW$K2t=eEg83@`*+|lTB{DjoF zY`jAJx*>(+Z_D@`h&g3wmBfxmtT$!PEe6EXejsTI%rhr0t}W#rtC#6Y43>$z7;FKj zmnvV_lJcYwKFx?4(n1dU&3C4I-?$EvH6aU2eJ93-rl4y@w74TGApdR^5w7D@iWVKRY}fmRXjEDz_n4$HK9n9qZo4?-*lGZwC-bsDyc*k%faHhS;LzDO zY@readK6r1)gREK2-g}~v#;6&01%S;s#l5xRl+WeUvQi|WvwbhADALP&*k5RK*cTZRc}GM)J(*V>6898l6d-5*kA83u(2#WnjF8l`J_^JBw0~Z zEM3pb{II=?T5&wJVWw5SATDhs`UEv?OW%4$XkTXwg`dZ^2v4Y;kFsdvy~Kdq*2-8} ztme*?%vg2;rP9#qH*KWJxRX{S=14sP{&hOlV6B0I?p+Yb8$%!AXeLl@0cqM0X)CMY z1h0>s8HM+nUrz8%gSSyXZf;OqoH*o^hPo?1ynX+E7g1c6FAr|d-g=*h<7Ulv;;H_d z(lK;Af{JyS5NmA2o8G*4;+N=IqcK4`RoftfHX=F`1wnH5_V%Q#bX{0`0U16tPG3YI z<733~@A5&U)VPgg24$>wRw-^#`JaST^{w|)|9MWwV&*8PH~ase22<#If3yTyv?D)- z17Wvc9y>}aa%CBUYcG>VR}D{F?G^&V6i(SfEUodRqAdRnaq~lnU+)zdGqyITFS3%( zP$!d|vX`<0_1kQ==7d=mnAn@;*Mt$oR0$dN%ka*kclY0qf;!ayoWtV@3LmV^zT-LD1h1uwvRwC2-M)0S5+xm)dfCQnu2mc1sYr(6r^6Gykpj>pN# zLJbWzFqPYs#1g;{7U?iKXJT3E0>ZHVp634St(d^~A3lK8^9Msp|A83zQ9M89M;(%T zH}UUjvU>%yBO)i(@sOG@i40Ys3jHDw{beY6o=#1}TKlQvU{BLw>AB^7d9gZ3z1F#E z@oPs%N7KT-e}5@hio*^XoYB!AMlyJsn%5k6M1CmD$O~~is46D)@8R?aBsgikAryp| z7w;-bFl7N|?FQ__G6GqEmXT;z{HP)j6?M_~+!+nT!Ej@2ZY5bTqVtR3X#CA(+v8En zC{|-Z>v;iV!Tde@|2I0oKYu|+Va8J|tKr}B;Y2_iUQ?Z_Z=5~$S3;&FmQoqKx|yGuyNC8D$;^OxfQ^ zAg=nZ8fVrOr!r&YrY|E{f&ZE(31HbJ?K+ZvXQA|Z8z(Rs{K^?G8Zoh3& z3<)+JBs4A%6BDVo&)e+jXq!~FnsMQ4ffzPt;x`A^^T;Nm?DRfLA$|5?ub$~~H_L1&}QISb@Gq3;JYHOTKYwNihZo9imwigM{W1sqKA zci#e}#0VNep6Ek6?KA{(nmcV7bMJ(}LsUe>zn`d+=+`j3*qZS)tb@~Y8bNCEY==7I z%uq%SjK$~aREDfxevMtGE00_wGoDB4VKoxH&;WJWzSPYd>Rd?$%NfrsQ$N0gU5M92VbEjOuPD9P*L(5BfA)W%vX9ZHQKUnAB7eBAKux~P#kzJs0mfzWO~vSlPslp{Mn4QiB1O)=kIn1xj?hbrk9F^FP>^`KwR0_;_S zetddgAFe8?>E7C*}3%)}4TQ~Q`Bnl`3mOdaEH z_(TzSOQ5~Ld1lEa%UxUMD8x3>m~}BMDc^=u!i+CvHU9FQ*7JPs{{t^nv*$?E`@2;@ zFXh}WSo=z>+zZ-+4Jv6SjD_XIPKFzKv^j)_5xJVkEPQgv@v0!VzMzfr@@=3N&P-s! z2HUpp#PI=>C``PRS>P{?a59}aI|&9MT5A)^{znp#q-ONpB9n0zP?Hf30NjawfAIxC z_eau8q}+Km>rg_}S?Ux>sYc3k>%yHm@~d$DBDYL`>Fj34aQZ%AOF~p3OvV0UiyrHB z#zUiJgo{FDS9Z;Y+UF6OTd1jyaPk5C2v9D%fShn%>E5lcZ;1vgC?e{vZ*U+YVE{9S zC(|3m|3YCJwgdW(7(kGR(-a*_QX>z(`f}&-5^j$%)eayh2NYAgC(5Ld;^YcoThtN- zFyGKGrNR@2iO$zXDM;wP%%hVXC404w-jmptN-jyyygsIz)CM~o80$=loh@l2PDAP# zXqvb0@V(%Co&$+5Uc3;KO-gm;k*}aK-S}$iKRphJ23bs-5&-T*bVf(z08wy7XG4B) zyGo{f46M5(w$7KoLSME=pQ1Gjm=Qf_z*_;U1~v(hP&_ zFqg`4dVR}o{T9D5@>v;Vf{XV!W_2%>3bBgR(aL=e2GAomA4aU~bWv`P`#CiDT1i5= z$I;xQ0>Z4$bZn;tX*OPKF;idM-EL`Ym>k||aDtMVV85;MhNLEVyOGD3escArlV!JT zx|(Kd_r6rgZKlE)b(1(A;#>B-(jLk^B$}8fn{+wyq*kO(IpX>SK7&n%D`E970z9&O zS<4t<-^gnkGU3sLn~#vC;TAi?+v3w~Zb2o5GlA4NpE`eIX&GitJV9qYt>=+I9SbLu z=>7>O?HOOG6a!?2Vj5C@%3V$z5mFITjkh==A|kR8qKly3{Gxg0DB7^>)YjI1@6A}s zs2$_T>Hif@+X^@PhGLiyd_kUAD(65Ynl)rTUKM|1r^N{ubqj!K>AK2Son~pU3T=XWrMD!X-Z3t4M za(dHJH|Ls~8l6~1%0gzWV1iQ_l|o?WE9$_`ADJZ#J0-pAqOe2Tc~d~Ewb?0Ou7#&U z3wzgREym6zcKjw+&UR9gAn{|${==FT;w3Y6+aFBa=kYUhkaR1qNI+)pdV8O_U$|g##wYN03Z~RRJ~B=P%mH|w_l4r zqY>WzJm9OQI5J<%R5xn7YT%6wW3R7v1qugt^I9^ZKN%jd2(^#{CWT{wi|*5EKD>XQ zN?;!ymL#OyhPusVAOiGUZMZZ?G$?DL9W^QAwP$#pAP*|IKc;dxElA|ptvL!&S!WEU z1Zn$E2}(e~mJYyb1}MXd+1f~}>FevCLt1{6B?DrR;SucR>~KKg$G!d~UeNg$LLP7m z^4NA296nnbYha^(%$kQTX$4q|3a3su4-NLG!&<06?4$PH=HBWGj3;Kjgo{rh6=vdH zUP8zlFGGT}i%#bA9;_!F{?ieTJmORNBA^@l~%KpJ~lnqr<8!71Ym=_0Ix6ncE1 z?EYUC?YKwG-4IjWFLNg<7d=N?3Xnd{(M&Y^+Mi7Pe`u`V0fPoBLs9} z-}S{gisU^tC50!v<>^QJh{m@iC5f`4D0J+bCGB9Be292f{7UJJg>5vM5;R!An^4T~ zr4}+R=Y_$oMBtWt$3{idau4}@;KPU)A5F2Rw$MMOV;?I^8EQ<4*(W!WDR=BS>v#^C zU4Knc*KU$1F@-2i`fAXbsbna{`+Z`a-}$03U5q=~Zx1FhL^#2oT0=BfyDeyt>V5vy z)U|x%jS^K`m&%nJ#i_DJ2LcYz$v!$lXny4(e3av*{E~hW{HJ~ue)i0o@0Yvxjp;z? zR0VSU3ZqYK{Z*Ljq5Lx|l#{5TOKVbAXJ#XS$|IibUU{vOkjJaU%rr+b+mg#vKX6(3 zHdrP6I7*3i;6wL5(PWQ#75X55?P-sUr0eP{j%FD`Uby4N8dDu3l-9}hZDc&4`y=9J zBN_iQq)*S2s|8k3-yOEZX~pbuhSX-d2LxR%iVg3gw6I_y1Lt&Fxo0mp7jQ_^X%QiW zxP)|~DBRWehtd*7V}VYPpHzVisxgT_n4*CTXa6sZJ5Z`I@VhYRGu-Z&yL<)6uE&uZ z(}jdORaja?CpirErQsO63L>rgR_0FD(VbQo9RpP5J|lg`vN#hY6vs?-D$n{3&Z}en zufO1Qi*Gko=&nNohtx1$RHU8PMI4WF^Zh3q1iRGflPhX7 z1c5H(G}EG+QX4(BCR$65)Qal&s;jH}3o)!#K>=0&BiD2u=Fo19@Prx=0hVj-Y;E@$ zwrfI@dU9ZYh`L~UOeuB!2kHV3n1tSRFmu8`LR}Pa93f)-Qk(hm#CKE-_mjkAz9lLM zGPQR%Ff^^dF&J{$l2Chn|DWS6NaG~xCox7}2By^ti}-8R><=gmBc}rNg);P3*7t%f z1w9qU7q~l&$TeLCw?YK9IPqwEcjpJ7%t&Efu6?A-NWvEa_QI%*{`Q|zA6pV>io5~o z)M9K>DkXV{rRq{T^V_$v=EebD;t7jy2wDTkB=-vGSyUjkd;uvrt^{V9UQ7oh08~d` zgc{4LH{j`r_>U9_2A~pb&6kW{D!WsL?SbMY6f9>LwTD-UGkdy&$n9&u zut1yiaJzKgUOs zgR=C&IWLiWMuw5-0+iGt79OC*&4es6Rju~x?gX+pN$4@Rqt~PwY8IOeDZ_LSQsx7p z6V|b2JeE-i!GGAEX(&qe41@pC?m7sO=Y>=p%PA_#Q_6(rIl~0D72v!Bp`B_-Kn>E!FxbI@WPhbY#;5aON=M-oeb1`^Q8-bQ}I`LiGE#-xnW@e5#jT~98rNkR`(*R znbL`607$HRD2*b$jJIesgPpPh_3>z~EQnkp<8s(6tw3Lo&v_}o7au^)jwzr+&hMA4 z86H`l+7X$e*HyrxB%D4(4Yq@V&E*lz1}4-jwhQPWHP^Cm1cP@Ylz1wEv|Qd3yf+O9 zNhRqMRTAe6kmRql*NLiwaBFJ$2n}a{E#nrIBeB1}rQwJs5e1mkcPxsPwr1&BN-^I5 z08LvLPpAx?egD;&uDpTSj6YhOK}~CD+(|84$2_g|%muBiC!_ec{23M_R>@4}B4zQV zjHK1nnwUqy$I(GjJW5$~p%oMMmFNptywr7q+A zSBcX8yIAC?$=K8M)i-fkxqD9&1KnZy&f6#Zr`=WSeH$$8qR=1)eG7Nr>UNLx%Uyjt zBZ@~xWk1aEAmlB2bMn(K%zoEmDDnL4pSek=i}LJm8uK2hM-=;xNy`7M6`?-z8Q;_y zJigZOq~w;m9Z``nG0wLd_nl$Jp7d}-Dl@%t(x>R;m{k^gewzO6ETBUEJt&Pc^1VN6 z9v)Y>R$_o@607;uWLoc@uJ{|uD>tDo2|E6_&6uaEGJM?}U)dkLEL^+Wr%!q4IOScS z9-4fk`P=(o$($H7!a=0UDJ_&hu25$j22Pj#1-8kEdH#TdCCT_6zSV!5)Bh|li0)iG z1YrLKG2i@3rBPZyd4MQpmAsM`QqZ*AZlGt^&X(I*hu(dMJ-BN^5h|1O)P5%RcW{0V zhdbkZ^7VRe)Fk+|JM*7oB(rb)h)E}~(xsHSR^3%(!l8m-iVOuOvpkoj?-A6c$$WRz z(tismzd2wIka4}0H?54xIz<#S&QAT+->v65r(2g2CrAaMrY03Ci}@$AP(D_8aPZIP z8~MKxADd)69d)`;X-P9-4$A%@zcIMncQq%h>gbbNBg-plCDPo-(VD4(G-?RGhdP8V zbTFL>Qi!*1)oSWuTy5K?ouh5YvmH8)xSjuyAWuE0om-!qDN6O~#XExUOvN<4KGPtS z0D+r*S8N9%W^wM%GJJ=+Y}?KTP6FNN%qQ8psinkHCU>4H%jXO+?ebpNsi zGUmP65m1Ir2Uh+ioQEw5#Z$|Y5vZh-0>Y>4Z!gADn!HCYPSCIuqRH64C2x5?CF;o~ zpcQx9=ue68|EQ0a4ibqMP-GC2l}-JOhy_fl5)13Kwmu2BTqCT~NTL%|DjJ*I85+f) zT{xL7@>SVHCuxoi3U!BnrotD`d~)}wXGSIUp`gBy5yw6~qrjIkyS;`~xed2q;ZG&@ zHwZw7Hf4ofsbpH4Nnl9gOPYPW#Cmx zDth_!6LF~o^F210K!zT)ek-YoCK-c~WDL0CU&4_RNvoCWj-#gFB+J>GPsF7jls?Co z^)G2nK)_bH%BOcbWgwf9tn9ZV?PSL7tD-|#)(tUZ zH7W+05)LxW!8Z8zQV0x{bNZK9dMsDJE-g(lZ85?bweWHXMpUY#^zHG?C&iU}vMH9C zdMg_TdL8-)9lKh_ysqgR9PUYwTO4_QS)uDaKesVSGv`&8js9mA%Wt%Lv8CEEsb#ozu-Bnx%_?(9+}||!zT9}L(a5J={BW|zQFF(Z zZu|1qaVC(_x6+oV50qutl|LTp%cwaWW;ao18?P2^Q255OusUUU$Q&Go9c?8z{H~a+ z(nP*T16b3kbc4@G$Ubv$^g+MFu_>*{jd%6ieLFaR{Ctc%$JfItdEkqDEEoVEO|J>; zDWQPioo#|ey=z4q*wEem{WFBMO0Gc@p(Pyhswv;8n}7YL@uQ~LOwfPn&dA%~9u4jUlsQrVthX%W~6C^>@=`{PT;PsDxHq5Ncf+hgSLXWKYdwOy@!^?<}{ zAD5$<<=|Ro9{lU)=JAQt@!Y`E#lh{ne>`mcnTfO4ZmvQYGGP9`5`6w9P;#!;#DQGY z2w1|PyS@5VEmg5kw*S%BW$>S^Dd7EO^8m_#O+dnbswzB|4HGUw8}VE)2zbTXeNuD9j52a; z5yM}vXoF~7)A#~yH2l0QftIbqtwW9`+1`%keS(X)`nt=9Pdf6BAGEz9QRj2Yj9$x4 zxrjiyYT?ihHdf@670Yz)IL=L7%5ob0TfvwJZZWni^Bt`-@_!K>KWzJJ+l1VWMx(fc zr+aeGOkKKVTEqmWko86E|XbHQR2G81u>`; zMtM>bujrYHoMxyVc29s`thx6%P&5sogWZkuAf#tGceTlD*Va?1_kVxSv185CmZN1} zRaVW5b5fIIOiJeuNbo;S@_iM{tG&aKr)vG#B@5a6S~Cw7b8@kqnq(%QS6#w8Ec`nU zco=%TIvlAd3&zM;4U{g@zWlyPp-A5Dq{z>ntPFwFrRT;*Ovv5vACGcwY}{upCBX7R3UT}EhZ==TMt_$c!>Mkx@s{ge;PRSTu?>S{1<{695K4$0H_86!0TT#Qj z*T~jnLI`fz^K!<)_s7~B`O-B>+@Lc|ef3%V3j&=AQ-k@h&@#`3X;i;{KxUnvtnkx~ zEjPM>V;}CB2l;~??Ox)ckTeJb{xRDo8^CS}dPmM&C$!7|T=SRlP2p%^6s!Msae{V; zs;tVx{V(V9u@xp*TYqj{5_rt@mG-X(e-YtMXdi4Xcee6|I>UYpA4|q-@$YiWTwSLw z!g$S_{&iHGntBp8Brgaoj62Nx&!)R!^vkWZKd>wA#og6fw%Gdh`E`eP2twLru<0_0 z+J(~|rcA}|{y2OXSgbzRXl#JHKQ(7nam3*Co;Xt_5k}T34^NkC%K?qvbYx2j`fBU~H9(1NIp4)JJ z**@1h-NO(mJ>vam-16-k+1aoN9{@W51+=%?V?~NJ`d65s*7Ip4#xxG6{K0x=CD+$a zJ0&_{^I5!=egNnhulU$!uc}bRHf)W^7A?& zqy`KDkH^?6e*1`j{G5@cpChjXr{l7q@&l#M$5BGxLXDIo@fO0KBRCkY z%pad#;<~}SZ_<8kFb=HHMZT!Em*`{1y}Z1dNIto99uzyGf)RxW`P_LCkDBCy%lQe` zM`O*Zx8=tk)wWF;!2TkFf8K?F{AaZ(z$sRBGV2(=UP)%1udFavL(ZL3{m3J{lWajV z6$?Ou=lj$GcHAz3utjdETq{IHEs)8Z>J4S|$F``-E&&yx(q#sJ1sLcpF-C>174~B% z&NzlbxnqdvFZNn9Ft4wdayo8)Y=QNt3@%9>qfE^jc%3ppZD z6L|ASi{ta~Ti>%Y;F%m^5=;Mh)TsGhZyLY;%=|C+#5qg`%pZTwIK5$2`%?NvrYs6U zf(Lr+ywe^XSMcVx1ne90ORgNw@g2W0;&AqYezvZB80^Za(gUA|6NY_?AJvwR978ZV zDL95?hZj^$?W^@2d9CAUrQ@(<@7a{ytd$B`C(uAIvp)PcjZ3p;*1t`eqQk*@@|%pq zl>aTmD7nNPMZ^V)HWC|+O5;DkV`*bKtV#`rVYfzYP{Cl9r&~#w=9pUr`FWuUryP05 z#&TKoc2&Ki^Rezq)rR%Ml7&rJ=-1w9Pmr0H$}3}Y?!eVsRaL`j56NOTZDihqn z54XZMr(*|B)IZIij;!6uCO;`(uZ^b`u)l=NZ3(i6*) zViaMbMc8bSx!TBQ%J1+} z@bFa%(d6Pg(6jUUx3I^vV; zU3B!M>JqBY%u1Ym#y@^Oalv&uHC|szv3ktLJ0+t&{2Ti&6QuuF z)~jlbXl=FhV#ghhQ>s=v@($j9r~S=4okZq)b-nuYI^X^udS^dAzsCHVULQFJxyzah zAEi4u4R*pDJqE3BV7O(twyUXkWHH`BBQ@b3YqOk`@o}ey#QDBiphKVjV}VW`>fZm? z0@WL;@rtHdUpYMHEqs7;B7C+; zShs9%JB~h2CP>we|LnO)i-(st;a_*-W6_@M+db?V<$+^&+m0da$?`^{_B$fXz+NTa z{g1H2hkpOd_xo2*w{NEkKc5>-r;&1ya;B)kd%lLLHq=|_YU`hi^P6{bAN7-+HsKz) z@Le4BNVp$EJZbm&@s_KL!!|mzkMAj7v;cjn<6zti2X)dW#zPpeszYVH5NuV;$MUVa zJ}vP`**`RLlv&mGm#4S^f{eqPYC2R#O&{Mj!O?np)*DF)=L1*6{QWo3*)ZXMbwb{c zcXz`A_RH`P_8DaLH$tgo!rtqHqVm(pjdMfWgsjSHG{4Wb}g5Dd61|vs}#7h+E{b4{58+;Q#G0xMOsb53E z`j7JlExsAPzkd9}_ix$<|E~S?-`_JbHyQug#^Jxuxv%ibf1h*T8=n76=bZC6Ntp!p z=Ca!rZ2)G>ni9B&mi~TR{`#_m>|^|j9-EpUb1cnnEIBZC>Z`Y{r%LKuH66!yL$&Ey z>U7pVcAwAIV9fk0aL{KkCS@(=Kt`8{yMzz12@N1 zIBczDuM>Yh$EzM=WQxj{pB4aKcv_w9BfU9=!zmT=dMl~c>0ZH(SO6B{eTWNWDi%|L zRNMr3`|5nS zFJ(#MgFJr?+&4dD7*2gd-}(1{1d#pL4pIKAgi`-k+-G0`Lcr1?)L0^0At^p+i4}z? zn7OX1rjBpE7e9^Vq`X`+{=LF2k<9t1bqa%cNZ77>+u+<{(T?hcTIaH<-);D~cXz}G zkr>LjNExSYaHbMKIZ6N(Jps{V9J+PJqn0nnAIyx%+lT5&1zXm<46s)PfIFS%qi39V zN1_XPS=0V`fVz%x^N)LbS!d?BN#EQcJ12#y8)rlZe;!1|+cAi*IB|MpqIXFt9;4V$`}XY%PLjNT7_-4^6l-6jZ_>-{qghv;JUbtS zK*drxslyeWOWiduYytOIvpB|B6PZBG^h@*2dr&g$wDFw0g~Y*^GrA#C91oPST+J;v7CXS!eM7eKz1J0v@m zRe<5xUOFv+DKas5x%*uy^lo=czEBk1ZDfX4nngQo5peae4SM5|+kXEEe@!1Zx1M(w zk~A9Ve6Io9G19E<7rKGelnl!`X}r)AvV=0?PfMR_BkSJ+onSN45e%Yn%n-P0`T~^T zQp~ZA={7vFrZYQ_hNqZu)7}k!{7zU1<8vX(TMGEH1WF_IR;^{t$RX6@_ZpC;mw?3~ zX$=jT+76X5PLD_S;F~zC#5kx^s+!(pzXK(S8xn&Z??Q8K2ez_UA7zBffN1Br6!9wD znvr*-Mnaq7B644vE=!Xj{PG^XoO7)nVgY9uxU5F8vnBxY>^N|w-+RCE zkxuDH;YNYdpU?4^x7xk&2Q9zF zMKJ6buh+3>QmuHnjE1M11RPXuJAdK5syrtAQ_jnq=;86p=48OA=NvzkqyywNIyG_1 zxw2&YgehV!%22EizBXS(|H=n{{a;0TIanF>xS$@dARjciK zj;Y*Pe`bFXrt`^fzW#@yV%`kC_TsD+&+MV_+~qZH zgW!&xC3l{(^o}D^BWas692`s&NSlUjfyCE(Theq(@-pNKuWRd?Rus1}XYjHfwxynbe zdGYD<;Jsa$eM>9vv8isXMg1<@kfn*puNT^L-V7{wJ#AV+;)zGLApMupf&;N*+AWN* zOiV*jba2`%ho4D8)*2^-1&Vjfk@GzU+Ps_SXMUlrJ9bPhBSGXiTr~f8Zmb=>GssxS z|2BHOno-51(n&M;K3-Z=@smoF{?1rv`q-D5gVGiUj#$~8&eN9ja9h{jyF;E}|7t)v zAH_xMoGUmvpZC`e4fP)dv?{AU{B}o*%K@BrkuGKnaKa`N?_*c$QWx>4?wTOAtzbFta1thC4KVYVKf(acU?iMB*mly{yYg(ODG z$^0WkQ`z@4eIB?HF+J;h**UN7K|?u7FneYi@^P&^TDESkeg|?}k6|9h^}0e=w#=$$ z&oT}vWTT!8wJ4cGy`%U|vKI1NngA`AOYMs`xCSHWj?( z6w+8T-Vw7uT@k{QjV&p|4&7ifjLoL(F^Pm-->~y`uz?omUE=e^#BgZ6+o@rOmM;Zs zmB78o@L|b}Lpp=CMIRWO1&B+J_*>)8)x8gNn+x&ahY#k~O!|a*tw1G^Zsvz0@9xJz z6>oexnrOY4SP}gp_LwOQ#x4$%fnf-gFZ(%2rwe2OwH1XB|I(3or$1drPlLVCzZ;?x zk3s*;9WjHX5@>vNuS6d*_j#z5HRS*Or=El3(iRoHtwAHChif)YN?b59+=2rjV~CY( zFUQ`I+{+kiqEl$Bfve#Kgr5#bR@Oe`)@ysop+R zEjn`kNtCcSK5<;g$_UNhlyNS{uxMSL){4Be_egA&VBT;3+o$NjbzGt1KN{5|EFoy1(PLLDmTzvnM&9 zY;O4+T=2YB2B$zB3RphHTQxU;3d7;GS-}>R@JQzn?5CTZs1e$yu^1;+^vPACwY{@m zgg3hL?R=(*OzvK&Ky8uYx*Pbp$hZ|XZ&8&4zQ4c{U-+^j6{?OitF|a-v`qSVO=3d1 z)`{wCVQA#hf_mv`c@9VuRin;NNbo|w%qD!|^=Ctopd+1GC(IC)HFJ3O=w1^P2S20~ z`eeGJM;DOMZrG*(#oPcD&c`U z6{V$?Zf#sAQqP8z)vU$7&Mipb#@yNH@D>b@_!!mTO1n?{L@0Ng00N~xZPNa%)n&c& zGGX*f!Fw}~ogG@NzeZ-w@6PkQNUgtk#__MKYMR)t$#?F&@o^lAtKI>B%iWh-YF)vW zSgE|6C!3l-7vEQyJMzY$f%xs4bY>(S#%w$_$IV;Nq#sMpu$=EB|F(TjP7gHCbgIINM{Upk zyujVOf*~nra;gDt;;FP!9{KB!u{EndABFuj6HJ>0u6@k?bqn3}xt(-=PUA?flZ*yG zYUGLcr3t@~g0KoHRXoaUd2}c%@}$*~f`@lV6ys!N?s_to1=hr^~0-M?ss_LIn3$PZPK~{9; zu0L+v7MiA6?#~O-L}V$xgSD97TZ!ZLoW5w)1lw*C^&6V8CbyHqYLZY~Qaq^Y^8D-I zR729=3jD=@(qSCR8nDBZyliT_G+&}gEKlyh$Rr=)54dA@Ht+Bp5&iv!;sU#hhJ^MmR4tvH-;*0a_~wI3nJWZeCaXxViWCB<`RQ-tr2G^Mlc? z2e({mJo`pQ<#+v(#}WNlmCGDH@BTPADpdG%ex<5wScFKuCb+34$XSg47>liP;+ol< zzPEnCIzLUB{<-b>m+Du|V%O()tou47J^ankIiBXdd;6z+V^GV5=N@y zPFd6Vx%N<+CDMTjta4XD`qCq5?6^q%0GN~$>9k*R1=)6WhxHIZsRJc7X7cL#Q0agio3`MmH9#n+yzv&YRn zsH~=7gIw9M`)>erRFq@pHK7iu0lwO)la^_}M55mmw~Fi4^{Z&ao(!SwS#qht>N)!! zAG_1M_m?5Dq_tN&ZgnUthu`j?#mH@{uj==pM)~52mzsJ}TeDleY7MmqKc`)otogo{ z?@b)IvKkPqFwTk6|J(suN`?nZW-Z}MsiB|cwio==HZE?ESLTM|$VLXK;(vSJ*xNY>z|31ir%4%0c7YcZ=K5 zzNr*tLI+PEc5-?Mj&K~^9#LIJTx+Rp4q1o z;TMRp)I=9KD5QHrEMv;7b8;aHHpu@ydS(ZA$H#7+@3=M1uY-Tv=)&RZ>Kd|l$u9~v zMW_7$@jbP9MFE(Hw!_Ukt#`BE_RG8T9f%GeS|utX6Mj{g%_)k`+H=L{XKIG%pFArx zbuq_vhse!q>QA6ZGmdTaxB|IMD75HGZ}XLc*A%84xa+Ck(IvO#x9(Dy*TyBXwiRwl z9SAt=?K3Ok6|Rso%zd}92!O|3sL>;S-&(1F8;gDmeS&^+YuZ&M}GF|8!J0HuIrAFI>uje_BQ3 z_V+pA1LrQQ*a;m(xh}E2tfa5YZp79jvd*|k57mKpwry>5x;$6pCz%K*ok@}@i0^NB zc61B?$4p?R49ojoY5=c*XiPvjZp1R4{J^ zm5KC&G(lo21s2kZrdXQ@0VrDW=}bYo zoc$oLo~k7M>&Zud204L!chpkJDRY&)?)d$xa6a3}jT*EZNf=`&KrVpIvq_0XTeDZ! z^Na2D-gv?Teo0(-a-TuUt&XUSke-cchA*i&=k%G%$)feWCoM(mkEGA(1tBC8+1%{~6+C3T-?ZRfM zKW|oDmYRc8zgX6`SD1&zeF^OFf{SxkzmY_-;#2dhTwD-%_ny1%_(KJ`URT1giyc?*&k0pF2Gx)FD z+NkipaM8SAv==NYMg5rUZ#QRJT^6sIg{DNutzXPOtS2C}4;HX`53JTTg%liw=f;0p zql=#6Eo1^gC40Dd)!R4L8_rI(RMEDNR#fZ(i56L?1$#r%kL%4^N(0R7;S0UhyL zD2DUAx>F~f#fw4D&d9Tuv$nimb?l?e>cem5QJ>PnU-ACw!%q6Yr) z-0~wJ!VZV6PtvC!N#nqA)$8?YNDRIvOHa6a)8ErjmI>=^(Fnr{56 zFfI-rt_C=S8Yt3U)p4R|EeM{~R*UYY?GJ}YLl|sP7&JNdb$G&8PUQAFt!!qVdhX}z zB?H9J1hCkAA|+T0A6Z@>ctdu>=$F@*CuEC%^^y2jYUPXypQ(MV{0jWCdp65PLbZgA zf=k-lHdYyq_uDG`#T<)OXJY!ItEVpI;%qdPx?Wg5;u+n*kZ@i41`lTMN!N_w7ez^0`65>}5P)ce|{B>J7V3aW1ma~lzVyv7Di5mGL5=r`_$ zg&&_S7*}+6^R(hO>RSM8UYRveZdYm$yDp7eU>BEU>)b{W5pHpD@huM51@^qG_#Lih z9Evym*LaM8xLqoG7e3=;D<0EDz|O?y?!r4S_^Fb_==5yO5!%RO;rn_$?lL4Dd&v~OI%|9oH^=N3W${^TA@uxzT3mt;Qs1R`?Cs|BR7PZTq28j25eFMW%+`=YG!lH0UcGef~(q zsAfwPfS7t;%J5k2iv1`bN_~<2koLO4bnAku!4&nQDUwQSp4{>pfsGd>f}FV82c^%* z99cd`M**4SAG#gy`#beCpbe&tCzcYttFRu>a)HDsG;@wEziSLPerO`0)@Fez{y=>% zU1qJIqBXSsSL|dIpOVKo@Qz<$@Tf!4AbYwy8;t_$F#j}7ic>Jtb!X-T@<;!}8o^Ft z0(q1)Rn>!xdNRlU+D3P6mNWp>Gr7;)aJuX(ZQvZpxK;+JUzfwqH9avGJ-{ltj<@Z} zBrm0{7J(^aIZ6d$N1GCcdek>_($NK7f=_825RO)T3{~|a(A_h*@-penB;I0$aBn$Y zSrK^_h3w?#4rhIS8XQZwn5%giMk7Kg$j(Nu1fM7v!%&~)NrqyAdX;^1pJCdxrEWl< z#&^){<|rgXFWOXdj^q}qEo?2ki|^QV;h3f~T$IOzIgz$Dk|{Oaj@YBS4yd1q5HN6V{AI@^0A zIeQ8@%%p`OIj1QSZUH)b7pcF2bj)X$-zV9=*h>#SHTByeE5`2iPXt>!qP6lYmaAUE zEiew{@W(3=abo&Fdu#2Rp5NPJSc}%jZb5;bPI>&B#b(iDz}sKQZ5L4P<0(vK*x`I|bu-{aQvKa7ZWZa0%z)43$<^G>M_5v+Y`;i6O; znpFA$>p6OXK%Ec!vi$B@M#RAgj(s4XV`m3&yXC#UgVo{%GYd;04s7Z3YZPdL2Zsoz z4BO#2bk+BgD&*(}DCEAHesIO{H&X2`uzb?rkj*^`Wa*pYpIJR4RP4x_hxho)CTYR! zp$2c^D5AJyoo0tKYYaW^s0Y>h=ZmQ_ho=r(CQ5prT?(gH^08~pG9@i4d$goOr%VdJ zg6@W7(*;&o9O&k`Xm}i5Bt2j>hRS`_K=~I`v8R_3f~Ww#uS82<&R07%sE_Sg4pqM^ z4{%dg#l9W*U>%WW;C`oGR(nj(BJtt%OH`2D?&Ce@+&+E6exs+YZt#!wx z<_xQ$s4H6c@o}qNcjN1gZ0NXS?iV#%nX}w}=k4Jfef~NG*n#HMwh#5VH<#NbsepSj ztLgTKlFJ~jFCq&40AXK3O*M$=Z@fuQCr|B5#PNggu?Ng(+rdj0qcLwOd%xFuRo0!< zbussA?3O23EJ-cIJ|E-6{f~yJCIR+6v&>%hzO$*m{dB=3h})uM-LNv|MJ z!ynT7pobSx>EQ+oq%^3dziJ{H2T4EVRlPZ*=xEw^t&+y)FS;t!S6d5fEu!Nk^*}GS zl+&SM=Ccoh?L=p>DJA|XW&plIFmmnT*O1O=?)P`^nr_E$ka$W(eQD@7y&euO@VO%H}gUZ;(lE>luy^$W_@O87c$0 ztxvrAaYRz`97wsA+tjB=01>>*;~G?ba7-3-4B+aF1_8 zv=`^`Yd}_7T*o_QJu(q`W0;$w)?wB2Uf?7e6#F3Es2O}pKDNiEh}eAn6=UNka%s6K zl|^1cEoBdReqQIZt4WN(_yy$MJrZA6C2>#Ni@-P9XGC=q1GM9be=z@F7Fw;jX-9vz zS^MU+hqRpyU`eDQ$qW(owo42=NE!ERzw3^BMaV5z2)?J0=Jdy85X)Sx=6f8cyk^XO zGGuP)m_gjcrI@zkbnIq3yP|8p0G*56Y0xl;YPX{^`)N9 z%RqeCn{2cpdRc1zckw$~P=q&7R$#WjIkT-jFAJca0}S_4md_Eif2uv1W9$Gu-KjA9 zYk*sVQ(UcVo`@;CF41}_M40fZpYfPZKo6N z8p>y{N-L)Zve(4`Lag-me!6o-@HW;6!CQ%eC9_d8-mkrpM|B2kFviNGX7puJcI5&` zZR(Gktjr8MrpoxvM5e{khj{|aR^_@ zK3$L%EnyMJq&h7T*dGZ9u^4SCL)f3IESL&GcZC})(&$;{rC$Aug$hTYRzsc>iM<#X~<|#MVKBD zdZcmm=*!i{H0BTY1pWF2GE?%L%{+{+2Y=6#yL-8zaR%ve?%*VP1QgeaPl7S-BK8K! zA$mIIORSqLAGH`s*|%Gc$OKCh($*;T0Fm|9b`LPThz`eCPr{=8Rp9`|F zxGSkLQZF@i9E04(mN})j$BqQTu5)ev>kJ3Mgk@BxRLDdz*Jb5@w{k@0Lyi?yfvs{e z_PXmv?thSg6@gwHn~AIDS758-5IfU`EaHex0AKss<;?+k2~7*OYwKuxL3n*PRdeEl zNVZmeGD(p)QB?B}O{AdjeYuIvhwhsE8}Y0(%?bR(yu)s6PljdvUO!d+0f;Robw*uk zc=+&71>c?;gj!~ijY-#KjmNDv9X>7&tRJEbvEN#N3VMc=F=~_f|&y9YG z7{B`F&3efl?;&M z0#Q@WxQeSM7avrdc=ZpbhIYZxP#B%(19LHWU_3uwGm^p`3y1`^*YA)xGr)m;guTa$N(hl`Z>3Xnl z4D1HJc<40oEcEaW@%#!;2&;I|<#`7pyV1;(3%u}JJ*{S)Kuq|v3KWCtQ&@bQrhS0q zhx@Az5PKF3<@cV>ST&?}PcU{<_WmcJVlntNk_<|aDXwAs&$pE;r36wDW4R$~o04hX zc3mTt0GI6|Y~HC`wUiX!=^iS*+!>$f%sIiBph6e=|Iy7K3(}tz?4kbL9Y(K# z3z}hUO_EnA?z%6*wFi#o@!5>ejL4uPbSKABYvSi;w_xjcceh{qxkr)b$wAjNoD!3$ z36{*27{_kcp5?;(K?nz_glf_gPV>L4qq|mU-7sV3yKtcujb#ByM6KAfnoY=PDTpFCp&DNNekST&R@Ve;yx`LXG>b(De2`Wdnp7Kw zPQxSkVujM*`8VS%{^){a^qCED1bfRle??PlzezcCZf#sNn0&_VO9}W-yvAmKsd!2l zC2MjD5r*1lFuB}_w8Ul4o>UjWK&QO4h(kt*i_yOzO6&xPTe3d$)GPj!xy8cWU^*Rq z-c*Qlh3pZlpHd7%S>bI(&Q@>E8U`!(iYBtGxj*cO3W=9Z5F0=|ha-65I}3k;l_aaJ zFe@E;6VnqUo(VR|C8mFKb2{0!n4h1-?K_BbSa3f4Z|6NCg3%E5(=Bnc->w|qrR`PU z&q}Aj&-yuAZ3o+jlW{H z-2eM?HkcNA@P}Y@R@zrrGi|e2fWd5)mmbtSyLf2N30EpmbAXFP^00XB2m9to$I_@%k7jmBY%83xX`Nf zG|l3ATkM^}u-AongI>gaY-?Qf>D0xDRbpV5RQUqEmK<$lcpXO=@i)4Sg!CSW@WUJ9 z8NoR$DXAe5+`l&S83Ls~z!@v_BdfUnyAP*o@=uP6U({0i*^lG=Wf=Jx=7jD5?(&VEC1fv1 z-}7@m_Z$9=welGRNvUZ$-sb$ydP{K4)Vf-t`U19dVP1~h5u`O}8$2DCih=~&XV z9V(p>ELoq7arm0p zNOm%0O#L}1qjlNup$2*r++gv{mHW@UYdlt37h@)ybZ1OV`rL#4EvV|)A zTnUMQqn=xm@u<4#t|QX5-fgh?c*QoMgL666%P5ALlhaED!%)cAgtoQ+sfjAj zy%oWr-j&9Gf%u{DB|MoQ!&7>ht*P^~0O-E6beD@>N8pet*5Miki?z zxpf&VJ&jb8^fYM7CF>1YB{VD@%Xmgg$vf)EVl%JH7l{>n)_g#P$!M%{?G zABPnoKw$O1YaYblt@sr&t2w2&cqo z!ylisbp4zsYCYugxr4Z*Dp0#-P=L3Q!Jqe94;qgFsrvq#lg!s`vx?pkR+jyh>em?| z44AKirvJ){c6LMPE;HyXqi9UC0dxi50bMEz@mph*TjzLxZ?}H2* z2_F@>0v!;qZV%N$KR1iAeM~Hg!dV6*E--A}jzMYm@)uevTx_=l^L76YB!-B+9NGrb zTG@QkbtjQ-ma6BzK7v!5L(Wswkgi?g&X8`5$PN?{PGN2lpDac7pL@&Ko&~0zPn7h^ z-ob_<_uCy!EbftTp!j!1ccg|*QHq{8G!Sxc83S}%MQ5qRiCJB?Qh;yhbMz&S4P{s z?Nh6Npx-JN?M<`N&bgygnAWRx*9$egglQKR+dS*YvAD&SBV?VXW=WYGjVs9=|gY2&^*}hG#YC7k1t+ls$@R6 z_KhHeGq%VZpV{61=g7i#nh0wY0Gr4MEV^f&c3|;G30}Rf77wtKgJ6aq|5(I+oxLBQ z+&14hcv^8`faT*8!Pb7Y?JE-6RExIJ_=udW?5vW>KOy9)N&QJdhgT5%N%MQo! zal(FrV#F8ks1A9%MW7lPBj;Cgpz|p{tL;Ug>k*Kqfzh)|V!mnA)pT528O8>Knd!n+ z^uJRqtC{Bz`?_Y`aki^M>(UrQFvgbvm;dPYu>S4-_wh=8b?2x7sr&&Xl31u_gi1}j zu2a%einq}4+BczX>A;wwXy%jRmG(FqD6A`V^y06Ho}S=VgSxC%$yn2n%wVIX-1+L6 zQkVyp`6X(+?@R8BmHw*`9AO=H?4j_5#zD4;c^M7bIAH$Vd9`e`83EQi-7)@-gNDni z3f}oZ>B+wHH<-4rWvt>Cjzp(^ZP3tL>m-83(c?I`;&wmxxNINOmJ_?=L8R*vsM7VWJ~bls^V5x8cT_1Z(=p8bamlvB>! zsc61Rkx?#+nmqAtausrF!`mJlsDGiVqc#e;PlgvYknH`_3b zYzR3ed0Y9Xh_7gM)t4@~oHnm4vhK=bu7evO3fxp1v$sn63K z_gwkw1vjqCP6dNiNi-CTP0!vQRf)%O^Oc4w1kpr_As1Nv2&gKR0ej5LC%^vyv;D;U{n4OPC>{f$}A;PC8C>cX1?pE_lALx z?#m@(Qj1gC-gu(-B;FBiI;mqKD`sw5U~sImF6aNK68wWjzosAMf|uefOuz`HL7wd83cA3_k& zRcDHLPNCp-$_q!Re%;K*3aLjFhC7R1QGN^E+Hy=6&E4(G!JGBz{sFQgTKF}TJ><7x zSZmdr_(OkIFcjRgii9&RtHsNcUkAY zNXMLAy=ZD9X`tFzi%Pt-mLpL_BF&>83}Hc4pUh70nDxa-Tssgg_07V6a^wl*7YWxu z^?mU)C`_SsX^?Cr(g`14L<#!hNjkdVJP&!U(;j_LbccX(GRE1@WnOAHCcZ2QFAs5> zXr|j!%kgyKG)bco-PHpIavTcW5BLA!TT%8tk@Xb>NN!&29m!$qbJyGob>+X_qJO?w zM{=LC3KuR*6!!FKO@V+ z6lADd616BsC3d?(6k7-C_zod)5P&}e638? z@^+yXrPCNp(u49ebyS!!dO6HNuGlfTvuEJ(lURHwN!&|{$kw_#>b_tQVFocBkioGt zMNWe+XZ=>vDZeA6s!XqxUE4Xm6BU1coxYl}LY(r^AnS~*&1RGN6)Ln#&mZfCkmT1Z+L=5c$;jV**Ozb^YPMJ;`m`)w^CAY=f-4Rd=z+34ruucm7^_&p z^EeVigl*f4K1IenVH+dIQ-zv3tH*2_8trX{^zW5GKhr~c>U-?Ax5HE_S%#CWzr1`# z`Dfh^08QDlTP;tJbDWSom!50tQ24?We?MpI`vRP?6n88BXO<`^mr9kvtSu0tL0b@wG7RO8tL{+`ndJ zk?KLZtln#lH^vD6P1Iv0y>$Tw+U9c{{KKFu&t@q91&8q}HSMpDS4QP;jla7zO4??j zieQI!&fYfrnSmA>uW5d5^|Bvn>7(WM@3*s&G|Vh?2tuJ`A#WFO88-PA7dLGU1xR}Q zhkg~H{Tw1EY5l)3KQINNYaqlylmF<4qwxC19f@FeDv5xaxI5a1BJqx^i80qkQ9cGY z=Z3tPmK0W<8G5cq#U}c~uLKy?d#gs?#(CF=~5JU}+eLupKa7rtpy*2YR8m?lQDWHVM$Dbqr zjV%?D+LB43ooSY-TQcr)QeGZjx>8@F6JxVDPP_#phY8F&B@|QG^mgBvnZVJbacJ(` z{Jz&cCHjKbj>4)&J4=J>-*`VQc4(fZ79N(X!D|$sWbQU*lf+-9cU<;D{Cs84+`3a0 z{_*M(2pFEKty&42fFnL|W|t9HqQ?N(oUTh#229=`u2zFE8$?2%<<0Ny+TvW%ombv4 zxoP1L6xg@texYiLb6pnvd*V%e;8sCHlTwcyCf$>VO3n1_k|q*qX9ySJeW(>T$2m32 z54YwIsh?N;776T24%E@8k4;=i%v)bF%U)512neX9D}+Edx{UPBKG}caWY^|wOau;C z(>{(Rpf6*88fF-89vx4gi-l)k9N?zQ<1yPJNpCbfA{VcE5z#=*|`gkD$&8XMyi$SBXWB*%X6cnd)u#w1YTz z;%2nH${o+DBIpt>wCG9%*|yn*!**G2cwy#QbMlb01g8^Uur_25m;583 zUbFbvLoj{WFm80#44q(4?Krmk)h93p5d6#IkO7BKd9@kTX7(JMP>O$kG=W!YdZYF^ zqx}uyk;3;<&1X<|-V!b?pXDw!_PnHlRwGR^R^d_XW$%c%9!;Hdjwh7l}x+ z3)$*=; ziJ7y&7ph;O4ePCR^mp1DY|z9qt02uL!h*@c2=1$Tp-kPQk$j6(-ZSX1oFFGHJGlC8P>XqwH-(mKD5n3Eb;{UY+3JH0GV+BLJWe`%XT z4a?b4G19uODZ_2Xz|xhsc&FxRm(QCjKqP`ax@BIj9c)LC1|)iU3UU6%W)?WEze@R^ z2S(4ZQa5au`ec6RigR4RSEjLKYOGz;ouTb>OUJ#6wMVW3Nq!pvivX6Q+JE-^aPzw( z5iSG$EYfj~bIYFj>}eCJx01+tlHyt?l84+ku#eqd_T>>g8Xb{Xv+>(1idryh&Q3^O zB#D{ph7ZW3|7ijpL)_Bq$2~|0i@SgVTaInpD{AcQ1NER^-B&V$I46HJrCP`>{E#Qt zGH%s8`c;IO2$%7;+u6P>dXPG!TeP7^i`r%hdyP=2w!J_Znc=3n75^oE7R`-_`|e$D zqwR8>8~?-^X?O;&)>KJ@;7XC*MCY`bjD!q#;;*Es8BB5TMbRZPhJIpwDY8@8m-9Wr z4xGt1ncQ`*iTQCH6y4?(-P{`BJOuIqnKwN;G#L+sEQiGh-_*e3-;z zGASNS-=UDlUxpj|b<}K2mg)ANKGtL5RpS^2_)@MoE)p3#E{2V^;c$XXbi(ttxAuO! zSN&hf;RO>Gzx0`XJ2(mL3U3T3pbMT6ac&KIcKtIueE+CdeUC92(cL@1Ahb|?3fO72 zY4ydGbQ?)9WZM`dnPa~IIlN@NiKmc0X%?h^HX~(ShRMEfmH&GX6S?7OyWGYUBiQ!{ zW16vNdHaCXprJwhIlHiabxo4_E0_~7VhzdoJtxils+XnRT?k}6y@&r-`kNG=>5 zy>Ar&+++cbJk&J;aUJo~jblrPGvWB516Ws++6rNw-J3_i@1(CDpU|`0{Z@!BykzO0 zogChhaCW!6`SjSCrIwDP&o{y%CAQc5B}Jj{>yjn2DBmK@62H?~yo1Y9!IJD7VzkXi z&k#&XH>`Ce(ejzN@Jxwi5k5XEcFmxT?dlX=khfOL|lF7YvjDb+ULzPh@GR=Ej<{y2kiR}HWOI` z;m{q>Qc7I`@Z*>Jo3#v55lRQey1_D@^8x<)HYMNESoINEl6pueVkW1ieLo0YZ=06h zm2V%-eKtXv-W{}83A`XuxBfnca_#2EHFV04rZ`xO>FU)2=GXDwt4iJ4E&V<9w%zo= z`$rmNIi%iRW~y4Y?ICv*_t)k*Zf}C}3IQe!a37V*f~-H~>FsHuUmiAfe z8kCHAD%PC1lQ{5AWs`zsjs|o)7NLjC?Hh=+xC^hZDY4#7`eAYpHxhEF>(AhvXwr~I zGNrU*ziNn*_lCq+9|NxJ)A1wKR(8vdmTHZNIPGt?(=`CsNU!!>MHap*M{6_dO0O2|1BC#gwcZpV({7`Fa8r zpW=?l-wq$jzZ@0Pz|W#9KQ(&q!2`>%j}JvIu^6g>R^CBOR98^|?bW;Qtgqt73h=dV z@Kj_u2>}}`9<*GlL*o$Mb`eUMoFEP{F1;E{Xjt+?y8q52Of<9i(?qfWUc}t%>caU- z=$+<9mN1~Wf2cM&78%@>mvo2vtq4EqU^D0a>e?CqwGVjL`7!wU!NgBADMD_jK3yWb zddPO&K*V>x4(yY0X`vbsdAL67lu)OTN4vl(g^_|hv3RwnS@_`VdEQrm-7 zx?ko`;|}a(_9MaFqLA1l%ir^tx5raTUjHnyVMQ(c$)XV3-3SPXN3fi%X^>TQytifz z*&BH37f9=C^NHr-W98|UE`w6~Tm3$Y7FeE+h+88ldZw_hf2X#W0%rMFOC({{Gc1^< zKbe)ssVm`yi=hkL_l=)%qgD+wBMQiibvtmW#)afJ-|xXyIKTt9c@E`CF6WQL1q^66 zuGct0iMSk$Fiv&Ls{YB9`RDtqH?=q2Uk9}$Q@{RCIV57GJ~3Dq0d7_NFY?7kt|Y-dCiTtV!0?(2|XpWL{l zKxL+@tLO%Ni30K0N5YC#9}6ic-Z9Bo*#0mDXET4dnF-66JjR+A=iiKS6~CC2{HdZg zN01f~y_7p5z$q0fEUGpZc+OnxxS+H8Le!F2)XU!>89N>{e>#31GeFU?+?y@c6*Kof zd$!llkz52qZ%=wzevK=@G>iT&_x*)ngIz?DN0&(3(pM$yVnpu^;%IMRU1$YRXbXHR zKnn%pJSs^_ZT`M9z-jg_0?}0NrkWoZJ268jD>!Cr5b0UD{&VhE2dJp6t&+r-t-p3u zh;y0GO49YhgyXD7J)T$j(-`^(uh2Crb3mM@cX8S!yT)UT9CZ%85~^lPNt4#y@CwPj zb2v05@HH8K4sN-=R}^Uu?!7=nA*eOxHRn1lboqZms z(V(8U!yXI}PrtFz^{-@tV_z#;&OPfY_E6X*Mv8|TnLC4P%=am{|2Rji+UBZ*=_gc3 zvBGopv=DwjtB(`lExx>c2{rV4x6isxO>$7%WrqKShPx)Ehn0?wOCy+3lG{M8G`aa4 z$CG4zi7zM^W3UFAhrB4)6c+{9*O6--!4^SeNN$tFXFfMmummF`T*A9j-!KdGLtJR)dgTCReAlefz#vI=;b+c%CBM zp2L4eeM|Rs9f@0RB|%cEnnZD^?nuPJZ_e$eqdP~&)AVCMo96$)KJiY{&Z{zD9Z_gI zz;k3c^J7HUr3Pd7JqG$~GViSX=#*0k6y*T8>X5S;!7{d8is>VSim*`@7Z=Az8WHk* zg^K>-XCLBw17%mh$PzmTF;OnxDBwf?uW!_T8=Y~yS@wAOCVc~Io6Toel$nQ2D^9%e zgMm-6rY^vpG8AOaDmraLjf5c&f;Fd-pW0r*a=DQsxToSbAAgZnXj;O6V2}=;%P3Av zTlekIlLILY^_25Y#pAj=qu4DTPMkP&HH=5$#t~V+J7Mn706Tw8$Yl#(pK+%Qw;U(Gma58!gF^a&B9*q6e^P)ZQl2A)b|4}IV^uSlKctu z7!{^30^(6IJ@t@$kSVK^`#kMpnds?!;}wk)E!#iCBbs^T5Ap;yusaxhcST@K$8pMV zeg6yo|7>#%y(7Be9v>wM)>mt!hlqdFd`C}=072G4Tz;wTLFf6_fAYo;EO^MsIev3g zSfjB1zA6%0>AI}tpj zA28l((vY}S^{z`_@g}DA}`=L|0l1mAwe)^@L z0SvX@ZEK}?FH~fllc~UDMpbQ zx@#M>zt%aD)E->mm%|507DU(W&AXS?LxE))*4oNH_4HgFw2wEhdPO>~EqOL=r(a#X zE830~8FlL?h%2t+Gk@t#85W?N)r$ltFF5Mp&{N(;6uG}-%3^2rn<$9+2w{aaS0nx#nDbjUQR;n@ zI2uQUkOSC%j-rUT(0bK*E7mZpyXtB)!fCB^{4~l2G;BM37rHDZ%D+l>55iZx5L> z4Kt(CPrXWE>%7|6zyAxSv5sQb^gn{z(%;&6ycFgT#3S_Ss~Bq6B~dXRj?&IIg%|@u3;a$XK4xfA)Pp=T#~~<>l+@t z3EEp|lv5h~Z2~T;gdJwSOH=C6QngX|#->EhOw?zY%E2~bk8J&(Udo`H_ug=m4by;b ziphOUVtRfRPxIN-G-d|3=N)Ge^KMlh20&c|)$J;Y&^V*c88lqQNKY!n=-5Gby`bCc zV+-I_x|2zfDpLXG+h`j<_*s3v0IS?M{$x#^C+i~dXWE=_8DTI?=TY;HFf)lhi-*E~ zq={a6MMKSgjK%KQ@RDMx4D~Oc+KK~|;75yzWu3lFbEm>qF%Xgr+FZuOAWz{v&V!8qZ`Pb+;*fveU5Be#?tKG%Pw z`=IfZ%j$&WqjI{yl9d~CbZsq$wr_H z{6cq~lz>dM(7}zEM~1MyTJrSQ`rmgr%mmhFZ%1n%2d?kl5=h`t0vs1@rOf;sZmbGi z>j7xQi7c6-{|lM?f7ib;@cuA-6Cgh*yW}9*-x`qE{3Hg}i{wvfDD5hG*3B5cEW6Jp~@B^f^L+TKHMWHJ171ZM)V`Sp7cw z%vM3AuU|PUHoA~*8qjSqS$P@lCxU~3Qza}<`)2W-Ati{`? z&Y0tS$gr_>4>fA`!O{|@+Ab(~ZExDzeA4Son!$3X7WP|tBB5?8adWO6I!ppXZ9m6{ZAFjkajzQ(h5$WNns#HZo*OFi( z5=MhN=z$>rj|5a46rHdaqM|BZK`Y#nTSZ%6M|b@uPD$4sme( zO;o{(6YGL|96as!Pjl?SEU$BEd;d^>EeStam7|RiCbCy+W7|Kx zLpv^G$;sW!MXUerJvUR!PGEulyT`oRu~pWI)Yt=Ic^ z(kXk(SY4J;*+{3cw%GW4TTYU8Z#aY=ZR=|-nz8pu8eM0}e=Xhoo~WCV5Hw0!??uRnMrD}}0TF+seX&-{ z+00m`n@q%eC#G@R5Pe3wGpAef3X14@+i9GB4LkHLd9hOuptJfWM6FLaw9*KXcF}cN zvE!^pf^m}zVJP&4AP1X?_Wqa5{-G^351-3utJ#o2e^4ve`L3DKarL2AuW+|2U5V4V zaIIf^o5bx7&FcBN=F#ly4ec~yBhYabD9cS|KRZ8{W~Me3mK{>mdxLSWV#7x7N=R0OCS<&*WXl@)ip0kp`3)<#*Xtz z)TI0#mBpVUL*N_FbMO{VuAQhs@3}?Kp-od90RfBUvSHQ}cuVe^ucUk@a^Ke$Y)O~Y zKobe%5H|MFW8(4`?f+4PKDOh4NM5R~UA(In==9mPVOR?>)xSp?23Z_$(ge z0BP-NkzA!?XqghDg$bsiQ&Xp;<$;)Kdv_0VdI~OlWEb%jKb@b!bQ9LY*fM^vO`kz~ zB!Fwr!dFE?c=A`c(-??k0q3#{%nzCuytFa`ywRKwMapBUA=B? z>8^opkFQMWmksV<`T4HpoIl96+<$$!M6G_P`qd&Dz5|8l{v-ztW?=`c3ZU!Xgar)B zEA%2_qXyn`yjC~cr&@CD#OBERRAKqX)dBZo{?-Ond}kJ&-nQ-2^%Y57i_r$XYp;UM}gp#X-h*7o0su4?NcrC^GFa#sIbb?hvZ*n86~ zh@0Qe=sZn<(@GLOwmU(k-dsj`m|hVduW^~7`wGvSDn4vEeqsy#1|$*D3fXhEGP)R1 z?XQ{7w^Q zyNmQwY!yV#R{g|EK_e%4jgZYPIn3fc_BvHaNO?!Np5;9G+LzyF13?)z~7p+*mz7W92nyQ6)H8{uQHPK{s!KAqNT_nr{&9PQi^|VJiVdK zFx*p7fwnO2G;)8+&gvb)o}*!0I*P|)epmi(5)%Z!#dRizY>fc*^Na59Hym&2sj0xQ z?L;O@0t`BCq-{weYVK$m$3*ycO1S?QP9f^Ovy|P8P0#A!;@^{JK;!U;@LSv`CG@U& z010h`ROJolq$=$K+O&46td6Y|n&uiWq=af;35A=k1j6q&lB^f1nXOqHBIOzvxtfeu zp&W#ia0i^#9$I$)p|;mw=cP-j7u8DYv5u?CNhoni3)k?NY$h+MtXqn*5(_N=<*-X* z8xh6B%<-0up`6S2b0xpy(EPy}#>wXcRnO@f)uJuUsoy)(EEa(4h*mV@*&21!9UhS_ z-+Tp9i+tx7YZz`v(J?S_4y@-8i&^>47F*j`2^}ny5=60UtK+fdD8u@ zX}%CD*KvUmq0MOlg3FYUwBX5PjeXYyft^irBM0__zD2BG7=O-jAgx3)z$R`M1IUB! z#isa`3$XjzRo{DFM+&17C57jTZbB*oeQ0PSyyUyi3` zKqeW#hpFq%5BIFTC)%8V(dXiJ0|L(H^CvBOeU=`!Zj~E*fZX(*gs(fjGLCaDmw&dB zQM_$YKivt^k@m%=2h_VFOFQ=XbR$vN%98_KLlSZ57~^ie;)iKHKVbyMRTfjL+hSrT zkCg{5tV$ER;!@u)5b%AT1USi{r_|UBylkTKG(FL79#}&1+tMtl>wEqz zzD(29k@x`IWSK^mnDM-y6ngLjk4W4Ju9ueYw_J^R5_s?*57Q<>$|IqHUx`-HRaW>quNT~@-DCBkts-B466%&k#x zTy2@Z-}d>^21t8}muOrkUa<>ZR;^n^5ZBr=fY2mup#)k}``D@~K_`UQEsutX4_YQ; z)_rKb_1y9JPXS=Z+Ec~Z(z;Bx9?G-e-$vE7eXxctKTtlNq5dL!ntLW73gCu3@2Zq= zpxuayby@dTJ6XhHZ|vA?V05ZH(1aDKx0W^ZJLre|cegu}bjkPTCjYUSx|Qd>vYE% z>bOQ%k&vEx5h_6QQM?8x_r5!V4i;9+`>TeI{*qQ zw1`OpaJEjVO@F$|gsvrV96Y{_1T$VUNle29rnEi6T#b@$gKFLmsw4YN;&t!+#%p(D z&ULK4xeHDPDdzVacgftp>}NDy$@Wkk%Bc_08o4nb{;rW&&i2fx>D;WO*SGIc_yA@$ zB|~H;9U`~1!>T8lN`JS{;tgwuRl+?%sd}$kT*T*XwUIW=O_~WlndY*zzkHoB?j(^5 z=BX|c>?*aiKm@1P)reB1mCap{H__wp!o$Ijk5Ak6yI1OY*CTr8bVa>AM8$i3r*e*Z zd}X8wv^N{ct=|Nz)7IIwfGC%nv3DFfA#T}v62&QA^C@za;o%j@$aI#{Zk8S<%+-3#HJGj0 z-5#D`k{+hLjEGB#UWlC~8HojMVpY6mbIF_@%&3&}(y#K07SN_FU5pfm&NFpl{ zDw1FW!cq}=0ExlE5Y%#lEAfyDx`|VD##GK`B#1La8+o*|T}C?8qq({(^dMz1KiOZ& zU87;kq~V&I=4ZeKxf`1_=FRQ-^H30fsqrLyRhg0J17J$+|5-CdDh@u-+kfT~BVBdL z#`f(Wr8MBEOft377fiX~Hg+^A^?Bb4x3T0Qpi~?jIPoq7ROMHA58nQMV$_3_o2O0d zJdiAP1wH;_Tgb2Tm*U8Hv=xcCdlbv?Av+S&12{}~Tk95p7$1j(YD51P?VXKv*PAeZ zIo{!fS~4!UmyM+vaMEc%9hBjUrkLf_$*|_7>~)ifkb0Gl9IxVuxvBTiZ;CP`$*4cL zS{T^Ud@sG zC0T%TV|XvI7|9D zDZduJCN+PyDZFRaN>>G$4Yf@hK@Bon?aAQ->Uo&>g9Lqg zg6YONILDbYXrF1W%wTu(*_-1$bi4x@SLQ^hlTvo;rh9{)caqF4f-Hqc89T8@HFQ&T z;(K%Wb8XhXW)v?yR}`6BGZ^w6W?OZ4cxP69_7qlZl=L9@hcX|pp5W#F=eiv-{Mg*oTR-IuZf3Pv*T& zDP$i!)f{Ja?iwZ(9<`Dmsjq9Le+BvZd6ZEh8#f$DjGf8dc4UCr8gjqhiobN>%1f(X z2drbU3$d?|ixb3yn}Vv! zoi|6*zRfHC{(TeuKV(AAxgRAw+fbR=@1M&bEaW!Hi1g&pyhIOPJ6j;u%9$m8#P(WgA_T@{@_}_fZC_VgXkCCA*^u2Hyf*91O*S#n-vj~ z?Dg^hA