Skip to content

Int

Description

Arbitrary-precision unsigned integer value. Int stores the magnitude as a little-endian bit-vector with no sign bit.

Fields

Name Description
bits Backing bit storage for the integer magnitude. Treat as internal representation.

Usage example (from documentation)

  Int value = IntFrom(42);

Usage example (Cross-references)

Usage examples (Cross-references)
    #endif
    #if FEATURE_INT
    #    include <Misra/Std/Container/Int.h>
    #endif
    #if FEATURE_FLOAT
    
    #if FEATURE_INT
    bool _write_Int(Str *o, FmtInfo *fmt_info, Int *value) {
        if (!o || !fmt_info || !value) {
            LOG_FATAL("Invalid arguments");
    
            if (!buffer) {
                LOG_ERROR("Failed to allocate buffer for Int character formatting");
                return false;
            }
    
    #if FEATURE_INT
    Zstr _read_Int(Zstr i, FmtInfo *fmt_info, Int *value) {
        if (!i || !value) {
            LOG_FATAL("Invalid arguments");
    
        if (fmt_info && (fmt_info->flags & FMT_FLAG_CHAR)) {
            LOG_ERROR("Character-format reads are not supported for Int");
            return i;
        }
    
        if (!StrIterRemainingLength(&si)) {
            LOG_ERROR("Failed to parse Int: empty input");
            return StrIterDataAt(&si, StrIterIndex(&si));
        }
    
        if (radix == 16 && p0 == '0' && (p1 == 'x' || p1 == 'X')) {
            LOG_ERROR("Int hex reads expect plain hex digits without a 0x prefix");
            return start;
        }
        }
        if (radix == 2 && p0 == '0' && (p1 == 'b' || p1 == 'B')) {
            LOG_ERROR("Int binary reads expect plain binary digits without a 0b prefix");
            return start;
        }
        }
        if (radix == 8 && p0 == '0' && (p1 == 'o' || p1 == 'O')) {
            LOG_ERROR("Int octal reads expect plain octal digits without a 0o prefix");
            return start;
        }
    
        if (StrIterIndex(&si) == StrIterIndex(&digits_saved)) {
            LOG_ERROR("Failed to parse Int");
            return start;
        }
        char trailing = 0;
        if (StrIterPeek(&si, &trailing) && trailing == '_') {
            LOG_ERROR("Int reads do not accept digit separators");
            return start;
        }
    
        Str  temp   = StrInitFromCstr(start, StrIterIndex(&si) - StrIterIndex(&saved), IntAllocator(value));
        Int  parsed = IntInit(IntAllocator(value));
        bool ok     = IntTryFromStrRadix(&parsed, StrBegin(&temp), radix);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float/Private.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    static bool float_try_from_u64_value(Float *out, u64 value, Allocator *alloc);
    static bool float_try_from_i64_value(Float *out, i64 value, Allocator *alloc);
    static bool float_try_from_int_value(Float *out, const Int *value);
    static bool float_try_from_f32_value(Float *out, float value, Allocator *alloc);
    static bool float_try_from_f64_value(Float *out, double value, Allocator *alloc);
    static bool float_try_from_f32_value(Float *out, float value, Allocator *alloc);
    static bool float_try_from_f64_value(Float *out, double value, Allocator *alloc);
    static bool float_pow10(Int *out, u64 power, Allocator *alloc);
    static bool float_scale_to_exponent(Float *value, i64 target_exponent);
    static bool float_try_abs_compare(int *out, const Float *lhs, const Float *rhs);
        } else if (binexp < 0) {
            u64 n    = (u64)(-(i64)binexp);
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            u64 n    = (u64)(-(i64)binexp);
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            if (!int_try_from_u64(&five, 5u, alloc) || !IntPow(&pow5, &five, n) ||
            Int five = IntInit(alloc);
            Int pow5 = IntInit(alloc);
            Int sig  = IntInit(alloc);
            if (!int_try_from_u64(&five, 5u, alloc) || !IntPow(&pow5, &five, n) ||
                !int_mul(&sig, &out->significand, &pow5)) {
    }
    
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    static bool float_pow10(Int *out, u64 power, Allocator *alloc) {
        Int base;
        Int result;
    
        if (!out) {
        {
            u64 places = (u64)(value->exponent - target_exponent);
            Int factor = IntInit(FloatAllocator(value));
            Int scaled = IntInit(FloatAllocator(value));
            u64 places = (u64)(value->exponent - target_exponent);
            Int factor = IntInit(FloatAllocator(value));
            Int scaled = IntInit(FloatAllocator(value));
    
            if (!float_pow10(&factor, places, FloatAllocator(value)) || !int_mul(&scaled, &value->significand, &factor)) {
    
        while (int_mod_u64(&value->significand, 10) == 0) {
            Int quotient = IntInit(FloatAllocator(value));
    
            (void)int_div_u64_rem(&quotient, &value->significand, 10);
    }
    
    static bool float_try_from_int_value(Float *out, const Int *value) {
        if (!out || !value) {
            LOG_FATAL("Invalid arguments");
    }
    
    Float float_from_int(const Int *value, Allocator *alloc) {
        Float result;
    }
    
    bool FloatToInt(Int *result, const Float *value) {
        ValidateInt(result);
        ValidateFloat(value);
        ValidateFloat(value);
    
        Int temp = IntInit(IntAllocator(result));
    
        if (FloatIsNegative(value)) {
    
        if (value->exponent >= 0) {
            Int factor = IntInit(FloatAllocator(value));
    
            if (!IntTryClone(&temp, &value->significand) ||
        {
            u64  places = (u64)(-value->exponent);
            Int  factor = IntInit(FloatAllocator(value));
            bool ok     = false;
    }
    
    int float_compare_int_with_error(const Float *lhs, const Int *rhs, bool *error) {
        Float rhs_value = FloatInit(FloatAllocator(lhs));
        int   cmp       = 0;
    }
    
    int float_compare_int(const Float *lhs, const Int *rhs) {
        return float_compare_int_with_error(lhs, rhs, NULL);
    }
    }
    
    bool float_add_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    }
    
    bool float_sub_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    }
    
    bool float_mul_int(Float *result, const Float *a, const Int *b) {
        Float rhs = FloatInit(FloatAllocator(result));
    bool float_div(Float *result, const Float *a, const Float *b, u64 precision) {
        Float temp   = FloatInit(FloatAllocator(result));
        Int   scale  = IntInit(FloatAllocator(result));
        Int   scaled = IntInit(FloatAllocator(result));
        Float temp   = FloatInit(FloatAllocator(result));
        Int   scale  = IntInit(FloatAllocator(result));
        Int   scaled = IntInit(FloatAllocator(result));
    
        ValidateFloat(result);
    }
    
    bool float_div_int(Float *result, const Float *a, const Int *b, u64 precision) {
        Float rhs = FloatInit(FloatAllocator(result));
        bool  ok  = false;
    /// Arbitrary-precision unsigned integer implementation built on top of BitVec.
    
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int/Private.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int/Private.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Log.h>
    typedef struct {
        bool negative;
        Int  magnitude;
    } SignedInt;
    #define INT_BITS(value) (&(value)->bits)
    
    static void int_normalize(Int *value);
    static bool int_validate_radix(u8 radix);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static void int_normalize(Int *value);
    static bool int_validate_radix(u8 radix);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_init_with_capacity(Int *out, u64 capacity, Allocator *alloc);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_validate_radix(u8 radix);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_init_with_capacity(Int *out, u64 capacity, Allocator *alloc);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static bool int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores);
    static bool int_try_init_with_capacity(Int *out, u64 capacity, Allocator *alloc);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static u64  int_u64_bits(u64 value);
    static bool int_try_init_with_capacity(Int *out, u64 capacity, Allocator *alloc);
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc);
    static bool int_try_clone_value(Int *out, const Int *value);
    static u64  int_u64_bits(u64 value);
    static u64  int_u64_bits(u64 value);
    
    static Int int_wrap(BitVec bits) {
        Int value;
    
    static Int int_wrap(BitVec bits) {
        Int value;
    
        value.bits = bits;
    }
    
    static bool int_try_init_with_capacity(Int *out, u64 capacity, Allocator *alloc) {
        if (!out) {
            LOG_FATAL("Invalid arguments");
    }
    
    bool int_try_from_u64(Int *out, u64 value, Allocator *alloc) {
        u64 bits = int_u64_bits(value);
    }
    
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_ERROR("Int cannot represent negative values");
    static bool int_try_from_i64_with_allocator(Int *out, i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_ERROR("Int cannot represent negative values");
            return false;
        }
    }
    
    static u64 int_significant_bits(const Int *value) {
        ValidateInt(value);
    }
    
    static void int_replace(Int *dst, Int *src) {
        IntDeinit(dst);
        *dst = *src;
    }
    
    static void int_swap(Int *a, Int *b) {
        Int tmp = *a;
        *a      = *b;
    
    static void int_swap(Int *a, Int *b) {
        Int tmp = *a;
        *a      = *b;
        *b      = tmp;
    }
    
    static bool sint_mul_unsigned(SignedInt *result, SignedInt *a, Int *b) {
        SignedInt temp = sint_init(IntAllocator(&result->magnitude));
    }
    
    static void int_normalize(Int *value) {
        ValidateInt(value);
        BitVecResize(INT_BITS(value), int_significant_bits(value));
    }
    
    static bool int_is_odd(const Int *value) {
        ValidateInt(value);
        return BitVecLen(INT_BITS(value)) > 0 && BitVecGet(INT_BITS(value), 0);
    }
    
    static bool int_is_one(const Int *value) {
        ValidateInt(value);
        return IntBitLength(value) == 1 && BitVecGet(INT_BITS(value), 0);
    }
    
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
    
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    static bool int_mul_u64_in_place(Int *value, u64 factor) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    
        if (!int_try_clone_value(&lhs, value)) {
    }
    
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
    
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    static bool int_add_u64_in_place(Int *value, u64 addend) {
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
        Int lhs;
        Int rhs;
        Int result = IntInit(IntAllocator(value));
    
        if (!int_try_clone_value(&lhs, value)) {
    
    static bool
        int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores) {
        Int  result;
        bool saw_digit = false;
    static bool
        int_try_from_str_radix_impl(Int *out, Zstr digits, u64 length, u64 start, u8 radix, bool allow_underscores) {
        Int  result;
        bool saw_digit = false;
            digit = int_radix_digit(digits[i]);
            if (digit < 0 || digit >= radix) {
                LOG_ERROR("Invalid digit for radix in Int conversion");
                IntDeinit(&result);
                return false;
    }
    
    u64 IntBitLength(const Int *value) {
        return int_significant_bits(value);
    }
    }
    
    u64 IntByteLength(const Int *value) {
        u64 bits = IntBitLength(value);
        return bits == 0 ? 0 : CEIL_DIV(bits, 8u);
    }
    
    bool IntTryLog2(const Int *value, u64 *out) {
        if (!value || !out) {
            LOG_FATAL("Invalid arguments");
    }
    
    u64 IntLog2WithError(const Int *value, bool *error) {
        u64  out = 0;
        bool ok  = IntTryLog2(value, &out);
    }
    
    u64 IntTrailingZeroCount(const Int *value) {
        ValidateInt(value);
    }
    
    bool IntIsZero(const Int *value) {
        return IntBitLength(value) == 0;
    }
    }
    
    bool IntIsOne(const Int *value) {
        return int_is_one(value);
    }
    }
    
    bool IntIsEven(const Int *value) {
        ValidateInt(value);
        return !int_is_odd(value);
    }
    
    bool IntIsOdd(const Int *value) {
        return int_is_odd(value);
    }
    }
    
    bool IntFitsU64(const Int *value) {
        ValidateInt(value);
        return IntBitLength(value) <= 64;
    }
    
    bool IntIsPowerOfTwo(const Int *value) {
        ValidateInt(value);
    }
    
    static bool int_try_clone_value(Int *out, const Int *value) {
        if (!out || !value) {
            LOG_FATAL("Invalid arguments");
    }
    
    bool IntTryClone(Int *out, const Int *value) {
        return int_try_clone_value(out, value);
    }
    }
    
    Int IntClone(const Int *value) {
        Int clone;
    
    Int IntClone(const Int *value) {
        Int clone;
    
        ValidateInt(value);
    }
    
    Int int_from_u64(u64 value, Allocator *alloc) {
        Int result = IntInit(alloc);
    
    Int int_from_u64(u64 value, Allocator *alloc) {
        Int result = IntInit(alloc);
    
        (void)int_try_from_u64(&result, value, alloc);
    }
    
    Int int_from_i64(i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_FATAL("Int cannot represent negative values");
    Int int_from_i64(i64 value, Allocator *alloc) {
        if (value < 0) {
            LOG_FATAL("Int cannot represent negative values");
        }
    }
    
    bool IntTryToU64(const Int *value, u64 *out) {
        if (!value || !out) {
            LOG_FATAL("Invalid arguments");
    
        if (!IntFitsU64(value)) {
            LOG_ERROR("Int value exceeds u64 range");
            return false;
        }
    }
    
    u64 IntToU64WithError(const Int *value, bool *error) {
        u64  out = 0;
        bool ok  = IntTryToU64(value, &out);
    }
    
    Int int_from_bytes_le(const u8 *bytes, u64 len, Allocator *alloc) {
        if (!bytes && len != 0) {
            LOG_FATAL("bytes is NULL");
        }
    
        Int result = IntInit(alloc);
    
        if (len == 0) {
    }
    
    u64 IntToBytesLE(const Int *value, u8 *bytes, u64 max_len) {
        ValidateInt(value);
    }
    
    Int int_from_bytes_be(const u8 *bytes, u64 len, Allocator *alloc) {
        if (!bytes && len != 0) {
            LOG_FATAL("bytes is NULL");
        }
    
        Int result = IntInit(alloc);
    
        for (u64 i = 0; i < len; i++) {
    }
    
    u64 IntToBytesBE(const Int *value, u8 *bytes, u64 max_len) {
        ValidateInt(value);
    }
    
    bool int_try_from_str_zstr(Int *out, Zstr decimal) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_str_str(Int *out, const Str *decimal) {
        u64 start = 0;
    }
    
    Int int_from_str_zstr(Zstr decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_zstr(Zstr decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_zstr(&out, decimal);
    }
    
    Int int_from_str_str(const Str *decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_str(const Str *decimal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_str(&out, decimal);
    }
    
    bool int_try_to_str(Str *out, const Int *value, Allocator *alloc) {
        return int_try_to_str_radix(out, value, 10, false, alloc);
    }
    }
    
    Str int_to_str(const Int *value, Allocator *alloc) {
        Str result;
    }
    
    bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix) {
        u64 start = 0;
    }
    
    Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_radix_zstr(&out, digits, radix);
    }
    
    Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_str_radix_str(&out, digits, radix);
    }
    
    bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Int current;
        Str result;
    
    bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Int current;
        Str result;
    
        while (!IntIsZero(&current)) {
            Int quotient = IntInit(alloc);
            u64 digit    = 0;
    }
    
    Str int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc) {
        Str result;
    }
    
    bool int_try_from_binary_zstr(Int *out, Zstr binary) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_binary_str(Int *out, const Str *binary) {
        u64 start = 0;
    }
    
    Int int_from_binary_zstr(Zstr binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_binary_zstr(Zstr binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_binary_zstr(&out, binary);
    }
    
    Int int_from_binary_str(const Str *binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_binary_str(const Str *binary, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_binary_str(&out, binary);
    }
    
    Str IntToBinary(const Int *value) {
        return IntToStrRadix(value, 2, false);
    }
    }
    
    bool int_try_from_oct_str_zstr(Int *out, Zstr octal) {
        u64 start = 0;
        u64 len   = 0;
    }
    
    bool int_try_from_oct_str_str(Int *out, const Str *octal) {
        u64 start = 0;
    }
    
    Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_oct_str_zstr(&out, octal);
    }
    
    Int int_from_oct_str_str(const Str *octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_oct_str_str(const Str *octal, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_oct_str_str(&out, octal);
    }
    
    Str IntToOctStr(const Int *value) {
        return IntToStrRadix(value, 8, false);
    }
    }
    
    bool int_try_from_hex_str_zstr(Int *out, Zstr hex) {
        u64 len = 0;
    }
    
    bool int_try_from_hex_str_str(Int *out, const Str *hex) {
        if (!out || !hex) {
            LOG_FATAL("Invalid arguments");
    }
    
    Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_hex_str_zstr(&out, hex);
    }
    
    Int int_from_hex_str_str(const Str *hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
    Int int_from_hex_str_str(const Str *hex, Allocator *alloc) {
        Int out = IntInit(alloc);
    
        (void)int_try_from_hex_str_str(&out, hex);
    }
    
    Str IntToHexStr(const Int *value) {
        return IntToStrRadix(value, 16, false);
    }
    // design, so there's no sign byte to mix in.
    u64 int_hash(const void *data, u32 size) {
        const Int *value = (const Int *)data;
        u64        hash  = 1469598103934665603ULL;
    
    i32 int_compare(const void *lhs, const void *rhs) {
        const Int *a = (const Int *)lhs;
        const Int *b = (const Int *)rhs;
    i32 int_compare(const void *lhs, const void *rhs) {
        const Int *a = (const Int *)lhs;
        const Int *b = (const Int *)rhs;
    
        ValidateInt(a);
    }
    
    int int_compare_u64(const Int *lhs, u64 rhs) {
        ValidateInt(lhs);
    }
    
    int int_compare_i64(const Int *lhs, i64 rhs) {
        ValidateInt(lhs);
    }
    
    bool IntShiftLeft(Int *value, u64 positions) {
        ValidateInt(value);
    }
    
    bool IntShiftRight(Int *value, u64 positions) {
        ValidateInt(value);
    }
    
    bool int_add(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
        u64  b_bits   = IntBitLength(b);
        u64  max_bits = MAX2(a_bits, b_bits);
        Int  temp;
        bool carry = false;
    }
    
    bool int_add_u64(Int *result, const Int *value, u64 addend) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int temp;
    
        if (!int_try_clone_value(&temp, value)) {
    }
    
    bool int_add_i64(Int *result, const Int *value, i64 addend) {
        u64 magnitude = int_i64_magnitude(addend);
    }
    
    bool int_sub(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
        u64  a_bits = IntBitLength(a);
        u64  b_bits = IntBitLength(b);
        Int  temp;
        bool borrow = false;
    }
    
    bool int_sub_u64(Int *result, const Int *value, u64 subtrahend) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int  rhs;
        bool ok = false;
    }
    
    bool int_sub_i64(Int *result, const Int *value, i64 subtrahend) {
        u64 magnitude = int_i64_magnitude(subtrahend);
    }
    
    bool int_mul(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
    
        u64 b_bits = IntBitLength(b);
        Int acc    = IntInit(IntAllocator(result));
    
        if (IntIsZero(a) || IntIsZero(b)) {
            }
    
            Int partial;
            Int next = IntInit(IntAllocator(result));
    
            Int partial;
            Int next = IntInit(IntAllocator(result));
    
            if (!int_try_clone_value(&partial, a)) {
    }
    
    bool int_mul_u64(Int *result, const Int *value, u64 factor) {
        ValidateInt(result);
        ValidateInt(value);
        ValidateInt(value);
    
        Int temp;
    
        if (!int_try_clone_value(&temp, value)) {
    }
    
    bool int_mul_i64(Int *result, const Int *value, i64 factor) {
        if (factor < 0) {
            LOG_FATAL("Int cannot be multiplied by a negative scalar");
    bool int_mul_i64(Int *result, const Int *value, i64 factor) {
        if (factor < 0) {
            LOG_FATAL("Int cannot be multiplied by a negative scalar");
        }
    }
    
    bool IntSquare(Int *result, const Int *value) {
        return int_mul(result, value, value);
    }
    }
    
    bool int_pow(Int *result, const Int *base, const Int *exponent) {
        ValidateInt(result);
        ValidateInt(base);
    
        if (!IntFitsU64(exponent)) {
            LOG_ERROR("Int exponent exceeds u64 range");
            return false;
        }
    }
    
    bool int_pow_u64(Int *result, const Int *base, u64 exponent) {
        ValidateInt(result);
        ValidateInt(base);
        ValidateInt(base);
    
        Int acc;
        Int current;
    
        Int acc;
        Int current;
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result))) {
        while (exponent > 0) {
            if (exponent & 1u) {
                Int next = IntInit(IntAllocator(result));
    
                if (!int_mul(&next, &acc, &current)) {
            exponent >>= 1u;
            if (exponent > 0) {
                Int next = IntInit(IntAllocator(result));
    
                if (!IntSquare(&next, &current)) {
    }
    
    bool int_pow_i64(Int *result, const Int *base, i64 exponent) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
    bool int_pow_i64(Int *result, const Int *base, i64 exponent) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
        }
    }
    
    bool int_div_mod(Int *quotient, Int *remainder, const Int *dividend, const Int *divisor) {
        ValidateInt(quotient);
        ValidateInt(remainder);
        }
    
        Int  normalized_dividend = IntInit(IntAllocator(quotient));
        Int  normalized_divisor  = IntInit(IntAllocator(quotient));
        Int  q                   = IntInit(IntAllocator(quotient));
    
        Int  normalized_dividend = IntInit(IntAllocator(quotient));
        Int  normalized_divisor  = IntInit(IntAllocator(quotient));
        Int  q                   = IntInit(IntAllocator(quotient));
        Int  r                   = IntInit(IntAllocator(remainder));
        Int  normalized_dividend = IntInit(IntAllocator(quotient));
        Int  normalized_divisor  = IntInit(IntAllocator(quotient));
        Int  q                   = IntInit(IntAllocator(quotient));
        Int  r                   = IntInit(IntAllocator(remainder));
        bool ok                  = false;
        Int  normalized_divisor  = IntInit(IntAllocator(quotient));
        Int  q                   = IntInit(IntAllocator(quotient));
        Int  r                   = IntInit(IntAllocator(remainder));
        bool ok                  = false;
            for (u64 shift = dividend_bits - divisor_bits + 1; shift > 0; shift--) {
                u64 bit     = shift - 1;
                Int shifted = IntInit(IntAllocator(quotient));
    
                if (!int_try_clone_value(&shifted, &normalized_divisor) || !IntShiftLeft(&shifted, bit)) {
    
                if (IntGE(&r, &shifted)) {
                    Int next = IntInit(IntAllocator(quotient));
    
                    if (!int_sub(&next, &r, &shifted)) {
    }
    
    bool int_div(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
    bool int_div(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    bool int_div(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!int_div_mod(&quotient, &remainder, dividend, divisor)) {
    }
    
    bool int_div_exact(Int *result, const Int *dividend, const Int *divisor) {
        ValidateInt(result);
        ValidateInt(dividend);
        }
    
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!int_div_mod(&quotient, &remainder, dividend, divisor)) {
    }
    
    bool int_div_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_exact_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_exact_u64(Int *result, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_exact_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_exact_i64(Int *result, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_mod_u64(Int *quotient, Int *remainder, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_mod_u64(Int *quotient, Int *remainder, const Int *dividend, u64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_u64(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    bool int_div_mod_i64(Int *quotient, Int *remainder, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
    bool int_div_mod_i64(Int *quotient, Int *remainder, const Int *dividend, i64 divisor) {
        Int divisor_value = IntInit(IntAllocator(dividend));
    
        if (!int_try_from_i64_with_allocator(&divisor_value, divisor, IntAllocator(dividend))) {
    }
    
    u64 int_div_u64_rem(Int *quotient, const Int *dividend, u64 divisor) {
        ValidateInt(quotient);
        ValidateInt(dividend);
        }
    
        Int divisor_value = IntInit(IntAllocator(dividend));
        Int remainder     = IntInit(IntAllocator(quotient));
        u64 rem           = 0;
    
        Int divisor_value = IntInit(IntAllocator(dividend));
        Int remainder     = IntInit(IntAllocator(quotient));
        u64 rem           = 0;
    }
    
    bool int_mod(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
    bool int_mod(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    bool int_mod(Int *result, const Int *dividend, const Int *divisor) {
        Int quotient  = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!int_div_mod(&quotient, &remainder, dividend, divisor)) {
    }
    
    bool int_mod_u64_into(Int *result, const Int *dividend, u64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
    bool int_mod_u64_into(Int *result, const Int *dividend, u64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
        bool ok = int_div_mod_u64(&quotient, result, dividend, divisor);
    }
    
    bool int_mod_i64_into(Int *result, const Int *dividend, i64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
    bool int_mod_i64_into(Int *result, const Int *dividend, i64 divisor) {
        Int quotient = IntInit(IntAllocator(result));
    
        bool ok = int_div_mod_i64(&quotient, result, dividend, divisor);
    }
    
    u64 int_mod_u64(const Int *value, u64 modulus) {
        ValidateInt(value);
        }
    
        Int quotient = IntInit(IntAllocator(value));
        u64 rem      = int_div_u64_rem(&quotient, value, modulus);
    }
    
    bool IntGCD(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
        ValidateInt(b);
    
        Int x = IntInit(IntAllocator(a));
        Int y = IntInit(IntAllocator(b));
    
        Int x = IntInit(IntAllocator(a));
        Int y = IntInit(IntAllocator(b));
    
        if (!int_try_clone_value(&x, a) || !int_try_clone_value(&y, b)) {
    
        while (!IntIsZero(&y)) {
            Int r = IntInit(IntAllocator(result));
    
            if (!int_mod(&r, &x, &y)) {
    }
    
    bool IntLCM(Int *result, const Int *a, const Int *b) {
        ValidateInt(result);
        ValidateInt(a);
    
        if (IntIsZero(a) || IntIsZero(b)) {
            Int zero = IntInit(IntAllocator(result));
            int_replace(result, &zero);
            return true;
        }
    
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
    
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
        Int gcd      = IntInit(IntAllocator(result));
        Int quotient = IntInit(IntAllocator(result));
        Int lcm      = IntInit(IntAllocator(result));
    
        if (!IntGCD(&gcd, a, b) || !int_div(&quotient, a, &gcd) || !int_mul(&lcm, &quotient, b)) {
    }
    
    bool IntRootRem(Int *root, Int *remainder, const Int *value, u64 degree) {
        ValidateInt(root);
        ValidateInt(remainder);
    
        if (IntIsZero(value)) {
            Int zero_root = IntInit(IntAllocator(root));
            Int zero_rem  = IntInit(IntAllocator(remainder));
        if (IntIsZero(value)) {
            Int zero_root = IntInit(IntAllocator(root));
            Int zero_rem  = IntInit(IntAllocator(remainder));
    
            int_replace(root, &zero_root);
        }
        if (degree == 1) {
            Int exact_root = IntInit(IntAllocator(root));
            Int zero_rem   = IntInit(IntAllocator(remainder));
        if (degree == 1) {
            Int exact_root = IntInit(IntAllocator(root));
            Int zero_rem   = IntInit(IntAllocator(remainder));
    
            if (!IntTryClone(&exact_root, value)) {
        u64 bits       = IntBitLength(value);
        u64 high_shift = bits / degree;
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        u64 high_shift = bits / degree;
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
        Int low        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
        Int high       = IntInit(IntAllocator(root));
        Int best       = IntInit(IntAllocator(root));
        Int one        = IntInit(IntAllocator(root));
    
        if ((bits % degree) != 0) {
    
        while (IntLE(&low, &high)) {
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
        while (IntLE(&low, &high)) {
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
            int cmp     = 0;
            Int sum     = IntInit(IntAllocator(root));
            Int mid     = IntInit(IntAllocator(root));
            Int mid_pow = IntInit(IntAllocator(root));
            int cmp     = 0;
    
            if (cmp <= 0) {
                Int next = IntInit(IntAllocator(root));
    
                IntDeinit(&best);
                low = next;
            } else {
                Int next = IntInit(IntAllocator(root));
    
                if (IntEQ(&mid, &one) || IntIsZero(&mid)) {
    
        {
            Int power = IntInit(IntAllocator(root));
            Int rem   = IntInit(IntAllocator(remainder));
        {
            Int power = IntInit(IntAllocator(root));
            Int rem   = IntInit(IntAllocator(remainder));
    
            if (!int_pow_u64(&power, &best, degree) || !int_sub(&rem, value, &power)) {
    }
    
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    bool IntRoot(Int *result, const Int *value, u64 degree) {
        Int root      = IntInit(IntAllocator(result));
        Int remainder = IntInit(IntAllocator(result));
    
        if (!IntRootRem(&root, &remainder, value, degree)) {
    }
    
    bool IntSqrtRem(Int *root, Int *remainder, const Int *value) {
        return IntRootRem(root, remainder, value, 2);
    }
    }
    
    bool IntSqrt(Int *result, const Int *value) {
        return IntRoot(result, value, 2);
    }
    }
    
    bool IntIsPerfectSquare(const Int *value) {
        ValidateInt(value);
        ValidateInt(value);
    
        Int  root      = IntInit(IntAllocator(value));
        Int  remainder = IntInit(IntAllocator(value));
        bool result    = false;
    
        Int  root      = IntInit(IntAllocator(value));
        Int  remainder = IntInit(IntAllocator(value));
        bool result    = false;
    }
    
    bool IntIsPerfectPower(const Int *value) {
        ValidateInt(value);
    
        for (u64 degree = 2; degree <= max_degree; degree++) {
            Int  root      = IntInit(IntAllocator(value));
            Int  remainder = IntInit(IntAllocator(value));
            bool exact     = false;
        for (u64 degree = 2; degree <= max_degree; degree++) {
            Int  root      = IntInit(IntAllocator(value));
            Int  remainder = IntInit(IntAllocator(value));
            bool exact     = false;
    }
    
    bool IntTryJacobi(int *out, const Int *a, const Int *n) {
        ValidateInt(a);
        ValidateInt(n);
        }
    
        Int aa     = IntInit(IntAllocator(a));
        Int nn     = IntInit(IntAllocator(n));
        int result = 1;
    
        Int aa     = IntInit(IntAllocator(a));
        Int nn     = IntInit(IntAllocator(n));
        int result = 1;
    }
    
    int IntJacobiWithError(const Int *a, const Int *n, bool *error) {
        int  out = 0;
        bool ok  = IntTryJacobi(&out, a, n);
    }
    
    bool IntModAdd(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int ar  = IntInit(IntAllocator(result));
        Int br  = IntInit(IntAllocator(result));
        Int sum = IntInit(IntAllocator(result));
    
        Int ar  = IntInit(IntAllocator(result));
        Int br  = IntInit(IntAllocator(result));
        Int sum = IntInit(IntAllocator(result));
        Int ar  = IntInit(IntAllocator(result));
        Int br  = IntInit(IntAllocator(result));
        Int sum = IntInit(IntAllocator(result));
    
        if (!int_mod(&ar, a, modulus) || !int_mod(&br, b, modulus) || !int_add(&sum, &ar, &br) ||
    }
    
    bool IntModSub(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int ar = IntInit(IntAllocator(result));
        Int br = IntInit(IntAllocator(result));
    
        Int ar = IntInit(IntAllocator(result));
        Int br = IntInit(IntAllocator(result));
    
        if (!int_mod(&ar, a, modulus) || !int_mod(&br, b, modulus)) {
            }
        } else {
            Int diff = IntInit(IntAllocator(result));
    
            if (!int_sub(&diff, &br, &ar)) {
            }
            if (IntIsZero(&diff)) {
                Int zero = IntInit(IntAllocator(result));
                int_replace(result, &zero);
            } else {
    }
    
    bool IntModMul(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int ar   = IntInit(IntAllocator(result));
        Int br   = IntInit(IntAllocator(result));
        Int prod = IntInit(IntAllocator(result));
    
        Int ar   = IntInit(IntAllocator(result));
        Int br   = IntInit(IntAllocator(result));
        Int prod = IntInit(IntAllocator(result));
        Int ar   = IntInit(IntAllocator(result));
        Int br   = IntInit(IntAllocator(result));
        Int prod = IntInit(IntAllocator(result));
    
        if (!int_mod(&ar, a, modulus) || !int_mod(&br, b, modulus) || !int_mul(&prod, &ar, &br) ||
    }
    
    bool IntModDiv(Int *result, const Int *a, const Int *b, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(a);
        }
    
        Int  inverse = IntInit(IntAllocator(result));
        Int  value   = IntInit(IntAllocator(result));
        bool ok      = false;
    
        Int  inverse = IntInit(IntAllocator(result));
        Int  value   = IntInit(IntAllocator(result));
        bool ok      = false;
    }
    
    bool IntSquareMod(Int *result, const Int *value, const Int *modulus) {
        return IntModMul(result, value, value, modulus);
    }
    }
    
    bool int_pow_u64_mod(Int *result, const Int *base, u64 exponent, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(base);
        }
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result))) {
        while (exponent > 0) {
            if (exponent & 1u) {
                Int next = IntInit(IntAllocator(result));
    
                if (!IntModMul(&next, &acc, &base_mod, modulus)) {
            exponent >>= 1u;
            if (exponent > 0) {
                Int next = IntInit(IntAllocator(result));
    
                if (!IntModMul(&next, &base_mod, &base_mod, modulus)) {
    }
    
    bool int_pow_mod(Int *result, const Int *base, const Int *exponent, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(base);
        }
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
    
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
        Int acc      = IntInit(IntAllocator(result));
        Int base_mod = IntInit(IntAllocator(result));
        Int exp      = IntInit(IntAllocator(exponent));
    
        if (!int_try_from_u64(&acc, 1, IntAllocator(result)) || !IntTryClone(&exp, exponent) ||
        while (!IntIsZero(&exp)) {
            if (int_is_odd(&exp)) {
                Int next = IntInit(IntAllocator(result));
    
                if (!IntModMul(&next, &acc, &base_mod, modulus)) {
            }
            if (!IntIsZero(&exp)) {
                Int next = IntInit(IntAllocator(result));
    
                if (!IntModMul(&next, &base_mod, &base_mod, modulus)) {
    }
    
    bool int_pow_i64_mod(Int *result, const Int *base, i64 exponent, const Int *modulus) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
    bool int_pow_i64_mod(Int *result, const Int *base, i64 exponent, const Int *modulus) {
        if (exponent < 0) {
            LOG_FATAL("Int exponent cannot be negative");
        }
    }
    
    bool IntModInv(Int *result, const Int *value, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(value);
        }
    
        Int       reduced = IntInit(IntAllocator(result));
        SignedInt t       = sint_init(IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        SignedInt t       = sint_init(IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        SignedInt new_t   = sint_from_u64(1, IntAllocator(result));
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        bool      ok      = false;
        Int       r       = IntInit(IntAllocator(modulus));
        Int       new_r   = IntInit(IntAllocator(result));
        Int       one     = int_from_u64(1, IntAllocator(result));
        bool      ok      = false;
    
        while (!IntIsZero(&new_r)) {
            Int       q       = IntInit(IntAllocator(result));
            Int       rem     = IntInit(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
        while (!IntIsZero(&new_r)) {
            Int       q       = IntInit(IntAllocator(result));
            Int       rem     = IntInit(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
            SignedInt next_t  = sint_init(IntAllocator(result));
            SignedInt q_new_t = sint_init(IntAllocator(result));
            SignedInt next_t  = sint_init(IntAllocator(result));
            Int       next_r  = IntInit(IntAllocator(result));
    
            if (!int_div_mod(&q, &rem, &r, &new_r) || !sint_mul_unsigned(&q_new_t, &new_t, &q) ||
    
        if (IntEQ(&r, &one)) {
            Int positive = IntInit(IntAllocator(result));
            Int mag_mod  = IntInit(IntAllocator(result));
        if (IntEQ(&r, &one)) {
            Int positive = IntInit(IntAllocator(result));
            Int mag_mod  = IntInit(IntAllocator(result));
    
            if (!int_mod(&mag_mod, &t.magnitude, modulus)) {
    }
    
    bool IntModSqrt(Int *result, const Int *value, const Int *modulus) {
        ValidateInt(result);
        ValidateInt(value);
        }
    
        Int  a  = IntInit(IntAllocator(result));
        bool ok = false;
    
        if (IntIsZero(&a)) {
            Int zero = IntInit(IntAllocator(result));
            int_replace(result, &zero);
            IntDeinit(&a);
        }
        if (int_mod_u64(modulus, 4) == 3) {
            Int exponent = IntInit(IntAllocator(modulus));
            Int root     = IntInit(IntAllocator(result));
        if (int_mod_u64(modulus, 4) == 3) {
            Int exponent = IntInit(IntAllocator(modulus));
            Int root     = IntInit(IntAllocator(result));
    
            if (!IntTryClone(&exponent, modulus) || !int_add_u64(&exponent, &exponent, 1) || !IntShiftRight(&exponent, 2) ||
    
        {
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
        {
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int q        = IntInit(IntAllocator(modulus));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int z        = IntInit(IntAllocator(modulus));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            Int c        = IntInit(IntAllocator(result));
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            u64 m        = 0;
            Int t        = IntInit(IntAllocator(result));
            Int r        = IntInit(IntAllocator(result));
            Int exponent = IntInit(IntAllocator(result));
            u64 m        = 0;
    
            while (int_compare_u64(&t, 1) != 0) {
                Int t_power = IntInit(IntAllocator(&t));
                u64 i       = 0;
    
                for (i = 1; i < m; i++) {
                    Int next = IntInit(IntAllocator(result));
    
                    if (!IntSquareMod(&next, &t_power, modulus)) {
    
                {
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
                {
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
                    Int b    = IntInit(IntAllocator(&c));
                    Int b_sq = IntInit(IntAllocator(result));
                    Int next = IntInit(IntAllocator(result));
    
                    if (!IntTryClone(&b, &c)) {
    
                    for (u64 j = 0; j + i + 1 < m; j++) {
                        Int square = IntInit(IntAllocator(result));
    
                        if (!IntSquareMod(&square, &b, modulus)) {
    }
    
    bool IntIsProbablePrimeWithError(const Int *value, bool *error) {
        static const u64 bases[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
    
        {
            Int  d           = IntInit(IntAllocator(value));
            Int  n_minus_one = IntInit(IntAllocator(value));
            u64  s           = 0;
        {
            Int  d           = IntInit(IntAllocator(value));
            Int  n_minus_one = IntInit(IntAllocator(value));
            u64  s           = 0;
            bool probable    = true;
    
            for (u64 i = 0; i < (u64)(sizeof(bases) / sizeof(bases[0])); i++) {
                Int base = IntInit(IntAllocator(value));
                Int x    = IntInit(IntAllocator(value));
            for (u64 i = 0; i < (u64)(sizeof(bases) / sizeof(bases[0])); i++) {
                Int base = IntInit(IntAllocator(value));
                Int x    = IntInit(IntAllocator(value));
    
                if (!int_try_from_u64(&base, bases[i], IntAllocator(value))) {
    
                    for (u64 r = 1; r < s; r++) {
                        Int next = IntInit(IntAllocator(value));
    
                        if (!IntSquareMod(&next, &x, value)) {
    }
    
    bool IntNextPrime(Int *result, const Int *value) {
        bool error = false;
    
        if (int_compare_u64(value, 1) <= 0) {
            Int two = IntInit(IntAllocator(result));
    
            if (!int_try_from_u64(&two, 2, IntAllocator(result))) {
        }
    
        Int candidate = IntInit(IntAllocator(result));
    
        if (!IntTryClone(&candidate, value)) {
        }
        if (int_compare_u64(&candidate, 2) <= 0) {
            Int two = IntInit(IntAllocator(result));
    
            if (!int_try_from_u64(&two, 2, IntAllocator(result))) {
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Types.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("00101000", &alloc.base);
    
        bool result = IntBitLength(&value) == 6;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("0001001000110100", &alloc.base);
    
        bool result = IntByteLength(&value) == 2;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero     = IntInit(&alloc.base);
        Int non_zero = IntFrom(1, &alloc.base);
    
        Int zero     = IntInit(&alloc.base);
        Int non_zero = IntFrom(1, &alloc.base);
    
        bool result = IntIsZero(&zero);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int one = IntFrom(1, &alloc.base);
        Int two = IntFrom(2, &alloc.base);
    
        Int one = IntFrom(1, &alloc.base);
        Int two = IntFrom(2, &alloc.base);
    
        bool result = IntIsOne(&one);
    
    bool test_int_parity(void) {
        WriteFmt("Testing Int parity helpers\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int even = IntFrom(42, &alloc.base);
        Int odd  = IntFrom(43, &alloc.base);
    
        Int even = IntFrom(42, &alloc.base);
        Int odd  = IntFrom(43, &alloc.base);
    
        bool result = IntIsEven(&even);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int small = IntFrom(UINT64_MAX, &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        Int small = IntFrom(UINT64_MAX, &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        IntShiftLeft(&big, 64);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(1025, &alloc.base);
        bool error = true;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("1010000", &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        Int value = IntFromBinary("1010000", &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        bool result = IntTrailingZeroCount(&value) == 4;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
    
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
        Int one   = IntFrom(1, &alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
        Int power = IntFrom(1, &alloc.base);
        Int other = IntFrom(24, &alloc.base);
        Int zero  = IntInit(&alloc.base);
    
        IntShiftLeft(&power, 20);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntInit(&alloc.base);
        bool error = false;
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Access tests\n\n");
    
        TestFunction tests[] = {
    
        int total_tests = sizeof(tests) / sizeof(tests[0]);
        return run_test_suite(tests, total_tests, NULL, 0, "Int.Access");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Std/Memory.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(13, ALLOCATOR_OF(&alloc));
        Str text  = IntToBinary(&value);
    
    bool test_int_bytes_le_round_trip(void) {
        WriteFmt("Testing Int little-endian byte conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        u8  bytes[] = {0x34, 0x12, 0xEF, 0xCD};
        u8  out[4]  = {0};
        Int value   = IntFromBytesLE(bytes, sizeof(bytes), ALLOCATOR_OF(&alloc));
        u64 written = IntToBytesLE(&value, out, sizeof(out));
        Str text    = IntToHexStr(&value);
    
    bool test_int_bytes_be_round_trip(void) {
        WriteFmt("Testing Int big-endian byte conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        u8  bytes[] = {0x12, 0x34, 0x56, 0x78};
        u8  out[4]  = {0};
        Int value   = IntFromBytesBE(bytes, sizeof(bytes), ALLOCATOR_OF(&alloc));
        u64 written = IntToBytesBE(&value, out, sizeof(out));
        Str text    = IntToHexStr(&value);
    
    bool test_int_binary_round_trip(void) {
        WriteFmt("Testing Int binary round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("001011", ALLOCATOR_OF(&alloc));
        Str text  = IntToBinary(&value);
    
    bool test_int_decimal_round_trip(void) {
        WriteFmt("Testing Int decimal round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Zstr digits = "123456789012345678901234567890";
        Int  value  = IntFromStr(digits, ALLOCATOR_OF(&alloc));
        Str  text   = IntToStr(&value);
    
    bool test_int_radix_round_trip(void) {
        WriteFmt("Testing Int radix conversion round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStrRadix("zz", 36, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 36, false);
    
    bool test_int_upper_hex_radix(void) {
        WriteFmt("Testing Int uppercase radix conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(0xBEEF, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 16, true);
        alloc.base.retry_limit = 4;
    
        Int value = IntFrom(0xBEEF, ALLOCATOR_OF(&alloc));
    
        ok = int_try_to_str_radix(&text, &value, 16, true, ALLOCATOR_OF(&alloc));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int lhs = IntFromBinary("0001011", ALLOCATOR_OF(&alloc));
        Int rhs = IntFrom(11, ALLOCATOR_OF(&alloc));
    
        Int lhs = IntFromBinary("0001011", ALLOCATOR_OF(&alloc));
        Int rhs = IntFrom(11, ALLOCATOR_OF(&alloc));
    
        bool result = IntCompare(&lhs, &rhs) == 0;
    
    bool test_int_zero_binary(void) {
        WriteFmt("Testing Int zero binary conversion\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  zero  = IntFromBinary("0", ALLOCATOR_OF(&alloc));
        Str  text  = IntToBinary(&zero);
        bool error = true;
    
    bool test_int_binary_prefix_and_separators(void) {
        WriteFmt("Testing Int binary prefix and separators\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("0b1010_0011", ALLOCATOR_OF(&alloc));
    
        bool result = IntToU64(&value) == 163;
    
    bool test_int_octal_round_trip(void) {
        WriteFmt("Testing Int octal round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromOctStr("0o7_55", ALLOCATOR_OF(&alloc));
        Str text  = IntToOctStr(&value);
    
    bool test_int_hex_round_trip(void) {
        WriteFmt("Testing Int hex round trip\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Zstr hex   = "deadbeefcafebabe1234";
        Int  value = IntFromHexStr(hex, ALLOCATOR_OF(&alloc));
        Str  text  = IntToHexStr(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromBinary("10a1", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, "10a1");
    
        Int  parsed = IntFromBinary("10a1", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, "10a1");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStr("12x3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, "12x3");
    
        Int  parsed = IntFromStr("12x3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, "12x3");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromHexStr("12g3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, "12g3");
    
        Int  parsed = IntFromHexStr("12g3", ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, "12g3");
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStrRadix("102", 2, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "102", 2);
    
        Int  parsed = IntFromStrRadix("102", 2, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "102", 2);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStrRadix("10", 1, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "10", 1);
    
        Int  parsed = IntFromStrRadix("10", 1, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, "10", 1);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value = IntFrom(1, ALLOCATOR_OF(&alloc));
        u64  out   = 0;
        bool error = false;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(255, ALLOCATOR_OF(&alloc));
        Str text  = IntToStrRadix(&value, 37, false);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromBinary((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, (Zstr)NULL);
    
        Int  parsed = IntFromBinary((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromBinary(&value, (Zstr)NULL);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, (Zstr)NULL);
    
        Int  parsed = IntFromStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStr(&value, (Zstr)NULL);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromStrRadix((Zstr)NULL, 10, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, (Zstr)NULL, 10);
    
        Int  parsed = IntFromStrRadix((Zstr)NULL, 10, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromStrRadix(&value, (Zstr)NULL, 10);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromOctStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromOctStr(&value, (Zstr)NULL);
    
        Int  parsed = IntFromOctStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromOctStr(&value, (Zstr)NULL);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  parsed = IntFromHexStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, (Zstr)NULL);
    
        Int  parsed = IntFromHexStr((Zstr)NULL, ALLOCATOR_OF(&alloc));
        Int  value  = IntInit(ALLOCATOR_OF(&alloc));
        bool result = !IntTryFromHexStr(&value, (Zstr)NULL);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, ALLOCATOR_OF(&alloc));
        IntToBytesLE(&value, NULL, 1);
        DefaultAllocatorDeinit(&alloc);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(1, ALLOCATOR_OF(&alloc));
        u8  byte  = 0;
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Convert tests\n\n");
    
        TestFunction tests[] = {
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
    
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Convert");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Log.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntInit(&alloc.base);
    
        bool result = IntIsZero(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("101101", &alloc.base);
    
        IntClear(&value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int original = IntFromBinary("1011", &alloc.base);
        Int clone    = IntClone(&original);
    
        Int original = IntFromBinary("1011", &alloc.base);
        Int clone    = IntClone(&original);
    
        bool result = IntEQ(&clone, &original);
        alloc.base.retry_limit = 5;
    
        Int original = IntInit(&alloc);
    
        BitVecPush(&original.bits, true);
        BitVecPush(&original.bits, true);
    
        Int clone = IntClone(&original);
    
        bool result =
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Type tests\n\n");
    
        TestFunction tests[] = {
    
        int total_tests = sizeof(tests) / sizeof(tests[0]);
        return run_test_suite(tests, total_tests, NULL, 0, "Int.Type");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Map.h>
    #include <Misra/Std/Log.h>
        Float value = FloatFromStr("12.5", &alloc.base);
        Float same  = FloatFromStr("12.5", &alloc.base);
        Int   whole = IntFrom(12, &alloc.base);
        Int   next  = IntFrom(13, &alloc.base);
        Float same  = FloatFromStr("12.5", &alloc.base);
        Int   whole = IntFrom(12, &alloc.base);
        Int   next  = IntFrom(13, &alloc.base);
    
        bool result = (FloatCompare(&value, &same) == 0);
    #include <Misra/Std/Container/Str.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Io.h>
    
    bool test_int_reading(void) {
        WriteFmt("Testing Int reading\n");
    
        DefaultAllocator alloc      = DefaultAllocatorInit();
        bool success = true;
    
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
    
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
        Int dec = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
        Int hex = IntInit(alloc_base);
        Int bin = IntInit(alloc_base);
        Int oct = IntInit(alloc_base);
    
        Str dec_text = StrInit(&alloc);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    
    bool test_float_from_int_container(void) {
        WriteFmt("Testing FloatFrom with Int container\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int   integer = IntFromStr("12345678901234567890", ALLOCATOR_OF(&alloc));
        Float value   = float_from_int(&integer, ALLOCATOR_OF(&alloc));
        Str   text    = FloatToStr(&value);
    
        Float value        = FloatFromStr("1234500e-2", ALLOCATOR_OF(&alloc));
        Int   result_value = IntInit(ALLOCATOR_OF(&alloc));
        Str   text         = StrInit(ALLOCATOR_OF(&alloc));
    
        Float value        = FloatFromStr("123.45", ALLOCATOR_OF(&alloc));
        Int   result_value = IntFrom(99, ALLOCATOR_OF(&alloc));
    
        bool result = !FloatToInt(&result_value, &value);
    
        Float value        = FloatFromStr("-42", ALLOCATOR_OF(&alloc));
        Int   result_value = IntFrom(99, ALLOCATOR_OF(&alloc));
    
        bool result = !FloatToInt(&result_value, &value);
    #include <Misra/Std/Container/Str.h>
    #include <Misra/Std/Container/BitVec.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Io.h>
    
    bool test_int_formatting(void) {
        WriteFmt("Testing Int formatting\n");
    
        DefaultAllocator alloc      = DefaultAllocatorInit();
        bool success = true;
    
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
    
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
        Int big_dec = IntFromStr("123456789012345678901234567890", alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
        Int hex_val = IntFromHexStr("deadbeefcafebabe1234", alloc_base);
        Int bin_val = IntFromBinary("10100011", alloc_base);
        Int oct_val = IntFrom(493, alloc_base);
    
        StrAppendFmt(&output, "{}", big_dec);
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Float.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
        Float a            = FloatFromStr("1.25", &alloc.base);
        Float b            = FloatFromStr("0.75", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("5.5", &alloc.base);
        Float b            = FloatFromStr("0.5", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("1.5", &alloc.base);
        Float b            = FloatFromStr("2", &alloc.base);
        Int   whole        = IntFrom(2, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
        Float a            = FloatFromStr("7.5", &alloc.base);
        Float b            = FloatFromStr("2.5", &alloc.base);
        Int   whole        = IntFrom(3, &alloc.base);
        Float result_value = FloatInit(&alloc.base);
        Str   text         = StrInit(&alloc.base);
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Container/Map.h>
    #include <Misra/Std/Log.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        bool result = IntCompare(&a, &b) < 0;
    
    bool test_int_compare_wrappers(void) {
        WriteFmt("Testing Int compare wrappers\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
        Int a = IntFrom(41, &alloc.base);
        Int b = IntFrom(42, &alloc.base);
        Int c = IntFromBinary("000101010", &alloc.base);
    
        bool result = IntLT(&a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
        Int value = IntFrom(42, &alloc.base);
        Int same  = IntFromBinary("00101010", &alloc.base);
        Int big   = IntFrom(1, &alloc.base);
    
        IntShiftLeft(&big, 80);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
    
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
        Int a = IntFrom(42u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
        Int b = IntFromBinary("101010", &alloc.base);
        Int c = IntFrom(0u, &alloc.base);
        Int d = IntFrom(0u, &alloc.base);
    
        bool result = (int_hash(&a, 0) == int_hash(&b, 0));
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
    
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        Int zero  = IntFrom(0u, &alloc.base);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int one   = IntFrom(1u, &alloc.base);
        Int small = IntFrom(42u, &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int decimal = IntFromStr("12345678901234567890", &alloc.base);
        Int large = IntFrom(1u, &alloc.base);
        IntShiftLeft(&large, 80);
        Int decimal = IntFromStr("12345678901234567890", &alloc.base);
    
        u64 h_zero    = int_hash(&zero, 0);
    // GenericHash / GenericCompare-shaped helpers wire in directly.
    bool test_int_hash_as_map_key(void) {
        WriteFmt("Testing int_hash as Map<Int,u64> key\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Map(Int, u64) counts = MapInit(int_hash, int_compare, &alloc);
    
        Int k1 = IntFrom(100u, &alloc.base);
        Map(Int, u64) counts = MapInit(int_hash, int_compare, &alloc);
    
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
    
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
        Int k1 = IntFrom(100u, &alloc.base);
        Int k2 = IntFrom(200u, &alloc.base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        Int  probe   = IntFrom(100u, &alloc.base);
        u64 *got     = MapGetFirstPtr(&counts, probe);
        Int  missing = IntFrom(999u, &alloc.base);
        Int  probe   = IntFrom(100u, &alloc.base);
        u64 *got     = MapGetFirstPtr(&counts, probe);
        Int  missing = IntFrom(999u, &alloc.base);
        u64 *gone    = MapGetFirstPtr(&counts, missing);
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Compare tests\n\n");
    
        TestFunction tests[] = {
    
        int total_tests = sizeof(tests) / sizeof(tests[0]);
        return run_test_suite(tests, total_tests, NULL, 0, "Int.Compare");
    }
    #include <Misra/Std/Allocator/Default.h>
    #include <Misra/Std/Zstr.h>
    #include <Misra/Std/Container/Int.h>
    #include <Misra/Std/Log.h>
    #include <Misra/Types.h>
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
    
        IntShiftLeft(&value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromBinary("110000", &alloc.base);
    
        IntShiftRight(&value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        Int a            = IntFrom(255, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int huge         = IntFromStr("123456789012345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(256, &alloc.base);
        Int b            = IntFrom(1, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        bool result = IntSub(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int base         = IntFrom(40, &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Int rhs          = IntFrom(2, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int preserved    = IntFrom(99, &alloc.base);
        Int huge         = IntFromStr("12345678901234567890", &alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(3, &alloc.base);
        Int b            = IntFrom(5, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntSub(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMul(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
    
        Int value        = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(0, &alloc.base);
        Int b            = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMul(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(12345, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSquare(&result_value, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int exponent     = IntFrom(20, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str qtext     = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntDiv(&result_value, &dividend, 10u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
    
        Int dividend     = IntFromStr("12345678901234567890", &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Str text         = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int dividend     = IntFrom(10, &alloc.base);
        Int divisor      = IntFrom(3, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntDivExact(&result_value, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str text      = StrInit(&alloc.base);
        Int dividend  = IntFromStr("12345678901234567890", &alloc.base);
        Int quotient  = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Str text      = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int dividend     = IntFrom(126, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntMod(&result_value, &dividend, 10u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFromStr("12345678901234567890", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFromStr("12345678901234567890", &alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntMod(&remainder, &value, 97u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(48, &alloc.base);
        Int b            = IntFrom(18, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntGCD(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(21, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntLCM(&result_value, &a, &b);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(4096, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntRoot(&result_value, &value, 4);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntRootRem(&root, &remainder, &value, 3);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(200, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(200, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSqrt(&result_value, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
        Int value     = IntFrom(200, &alloc.base);
        Int root      = IntInit(&alloc.base);
        Int remainder = IntInit(&alloc.base);
    
        IntSqrtRem(&root, &remainder, &value);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int square     = IntFrom(144, &alloc.base);
        Int non_square = IntFrom(145, &alloc.base);
    
        Int square     = IntFrom(144, &alloc.base);
        Int non_square = IntFrom(145, &alloc.base);
    
        bool result = IntIsPerfectSquare(&square);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
    
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
        Int power     = IntFrom(81, &alloc.base);
        Int non_power = IntFrom(82, &alloc.base);
        Int one       = IntFrom(1, &alloc.base);
    
        bool result = IntIsPerfectPower(&power);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
    
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
        Int a = IntFrom(5, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
        Int p = IntFrom(7, &alloc.base);
        Int b = IntFrom(9, &alloc.base);
        Int n = IntFrom(21, &alloc.base);
    
        bool result = IntJacobi(&a, &p) == -1;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int value        = IntFrom(12345, &alloc.base);
        Int mod          = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntSquareMod(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(100, &alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(250, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModAdd(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(5, &alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(9, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModSub(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
    
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(123, &alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int b            = IntFrom(456, &alloc.base);
        Int m            = IntFrom(97, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntModMul(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int m            = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
    
        bool result = IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(7, &alloc.base);
        Int mod          = IntFrom(13, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, 20u, &mod);
    
    bool test_int_pow_mod_integer_exponent(void) {
        WriteFmt("Testing IntPowMod Int-exponent dispatch\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
    
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(4, &alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int exp          = IntFrom(13, &alloc.base);
        Int mod          = IntFrom(497, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, &exp, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int value        = IntFrom(3, &alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
        Int mod          = IntFrom(11, &alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int check        = IntInit(&alloc.base);
    
        bool result = IntModInv(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
    
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int value = IntFrom(10, &alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
        Int mod   = IntFrom(13, &alloc.base);
        Int root  = IntInit(&alloc.base);
        Int check = IntInit(&alloc.base);
    
        bool result = IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
        Int value = IntFrom(3, &alloc.base);
        Int mod   = IntFrom(7, &alloc.base);
        Int root  = IntFrom(99, &alloc.base);
    
        bool result = !IntModSqrt(&root, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int prime     = IntFromStr("1000000007", &alloc.base);
        Int composite = IntFrom(561, &alloc.base);
    
        Int prime     = IntFromStr("1000000007", &alloc.base);
        Int composite = IntFrom(561, &alloc.base);
    
        bool result = IntIsProbablePrime(&prime);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value = IntFromStr("1000000000", &alloc.base);
        Int next  = IntInit(&alloc.base);
        Str text  = StrInit(&alloc.base);
    
        Int value = IntFromStr("1000000000", &alloc.base);
        Int next  = IntInit(&alloc.base);
        Str text  = StrInit(&alloc.base);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int value        = IntFrom(6, &alloc.base);
        Int mod          = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModInv(&result_value, &value, &mod);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
    
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(1, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int b            = IntFrom(6, &alloc.base);
        Int m            = IntFrom(15, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        Int a = IntFrom(1, &alloc.base);
        Int b = IntFrom(2, &alloc.base);
    
        IntAdd(NULL, &a, &b);
    
    bool test_int_div_by_zero(void) {
        WriteFmt("Testing Int division by zero handling\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
    
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int dividend  = IntFrom(1, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
        Int divisor   = IntInit(&alloc.base);
        Int quotient  = IntFrom(99, &alloc.base);
        Int remainder = IntFrom(77, &alloc.base);
    
        bool result = !IntDivMod(&quotient, &remainder, &dividend, &divisor);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
    
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
        bool result    = !IntRootRem(&root, &remainder, &value, 0);
        Int  value     = IntFrom(16, &alloc.base);
        Int  root      = IntFrom(99, &alloc.base);
        Int  remainder = IntFrom(77, &alloc.base);
        bool result    = !IntRootRem(&root, &remainder, &value, 0);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        Int dividend = IntFrom(10, &alloc.base);
        Int quotient = IntFrom(99, &alloc.base);
    
        IntDiv(&quotient, &dividend, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int value        = IntFrom(10, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        Int value        = IntFrom(10, &alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        IntMod(&result_value, &value, 0u);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
    
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int a            = IntFrom(10, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int b            = IntFrom(3, &alloc.base);
        Int m            = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntModDiv(&result_value, &a, &b, &m);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int  a      = IntFrom(3, &alloc.base);
        Int  n      = IntFrom(8, &alloc.base);
        int  symbol = 99;
    
        Int  a      = IntFrom(3, &alloc.base);
        Int  n      = IntFrom(8, &alloc.base);
        int  symbol = 99;
        bool error  = false;
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
        Int base         = IntFrom(2, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntInit(&alloc.base);
    
        IntPowMod(&result_value, &base, 8u, &mod);
    
    bool test_int_pow_mod_integer_zero_modulus(void) {
        WriteFmt("Testing IntPowMod Int-exponent zero modulus handling\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
    
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int base         = IntFrom(2, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
        Int exp          = IntFrom(8, &alloc.base);
        Int mod          = IntInit(&alloc.base);
        Int result_value = IntFrom(99, &alloc.base);
    
        bool result = !IntPowMod(&result_value, &base, &exp, &mod);
    
    int main(void) {
        WriteFmt("[INFO] Starting Int.Math tests\n\n");
    
        TestFunction tests[] = {
        int total_deadend_tests = sizeof(deadend_tests) / sizeof(deadend_tests[0]);
    
        return run_test_suite(tests, total_tests, deadend_tests, total_deadend_tests, "Int.Math");
    }
    #if FEATURE_INT
    #    define IOFMT_INT_CASE_(x, addr)                                                                                   \
    Int:                                                                                                                   \
            TO_TYPE_SPECIFIC_IO(Int, addr),
    #else
    #    define IOFMT_INT_CASE_(x, addr)                                                                                   \
    Int:                                                                                                                   \
            TO_TYPE_SPECIFIC_IO(Int, addr),
    #else
    #    define IOFMT_INT_CASE_(x, addr)
    #endif
    #if FEATURE_INT
    bool _write_Int(Str *o, FmtInfo *fmt_info, Int *value);
    #endif
    #endif
    #if FEATURE_INT
    Zstr _read_Int(Zstr i, FmtInfo *fmt_info, Int *value);
    #endif
    #endif
    #if FEATURE_INT
    #    include <Misra/Std/Container/Int.h>
    #endif
    #if FEATURE_FLOAT
    #define MISRA_STD_CONTAINER_INT_H
    
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Type.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Init.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Access.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Memory.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    #include "Int/Convert.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    #include "Int/Private.h"
    #include "Int/Compare.h"
    #include "Int/Math.h"
    
    #endif // MISRA_STD_CONTAINER_INT_H
    
    #include "Type.h"
    #include <Misra/Std/Container/Int/Init.h>
    
    ///
    #define MISRA_STD_CONTAINER_FLOAT_ACCESS_H
    
    #include <Misra/Std/Container/Int/Access.h>
    
    #include "Type.h"
    ///
    #    define FloatFrom(value, allocator_ptr)                                                                                                                                                                                                                                                                                                                                                                            \
            _Generic((value), Int *: float_from_int, unsigned char: float_from_u64, unsigned short: float_from_u64, unsigned int: float_from_u64, unsigned long: float_from_u64, unsigned long long: float_from_u64, signed char: float_from_i64, signed short: float_from_i64, signed int: float_from_i64, signed long: float_from_i64, signed long long: float_from_i64, float: float_from_f32, double: float_from_f64)( \
                (value),                                                                                                                                                                                                                                                                                                                                                                                                   \
                ALLOCATOR_OF(allocator_ptr)                                                                                                                                                                                                                                                                                                                                                                                \
        /// TAGS: Float, Convert, Int, Truncate
        ///
        bool FloatToInt(Int *result, const Float *value);
    
        ///
                (b),                                                                                                       \
                Float *: float_add,                                                                                        \
                Int *: float_add_int,                                                                                      \
                unsigned char: float_add_u64,                                                                              \
                unsigned short: float_add_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_sub,                                                                                        \
                Int *: float_sub_int,                                                                                      \
                unsigned char: float_sub_u64,                                                                              \
                unsigned short: float_sub_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_mul,                                                                                        \
                Int *: float_mul_int,                                                                                      \
                unsigned char: float_mul_u64,                                                                              \
                unsigned short: float_mul_u64,                                                                             \
                (b),                                                                                                       \
                Float *: float_div,                                                                                        \
                Int *: float_div_int,                                                                                      \
                unsigned char: float_div_u64,                                                                              \
                unsigned short: float_div_u64,                                                                             \
    #define MISRA_STD_CONTAINER_FLOAT_TYPE_H
    
    #include <Misra/Std/Container/Int/Type.h>
    
    ///
    typedef struct {
        bool negative;
        Int  significand;
        i64  exponent;
    } Float;
                (rhs),                                                                                                     \
                Float *: float_compare,                                                                                    \
                Int *: float_compare_int,                                                                                  \
                unsigned char: float_compare_u64,                                                                          \
                unsigned short: float_compare_u64,                                                                         \
                (rhs),                                                                                                     \
                Float *: float_compare_with_error,                                                                         \
                Int *: float_compare_int_with_error,                                                                       \
                unsigned char: float_compare_u64_with_error,                                                               \
                unsigned short: float_compare_u64_with_error,                                                              \
    ///
    #define IntInit(...)             OVERLOAD(IntInit, __VA_ARGS__)
    #define IntInit_0()              ((Int) {.bits = BitVecInit_1(MisraScope)})
    #define IntInit_1(allocator_ptr) ((Int) {.bits = BitVecInit_1(allocator_ptr)})
    #define IntInit(...)             OVERLOAD(IntInit, __VA_ARGS__)
    #define IntInit_0()              ((Int) {.bits = BitVecInit_1(MisraScope)})
    #define IntInit_1(allocator_ptr) ((Int) {.bits = BitVecInit_1(allocator_ptr)})
    
    ///
    /// TAGS: Int, Deinit, Memory
    ///
    static inline void IntDeinit(Int *value) {
        ValidateInt(value);
        BitVecDeinit(&value->bits);
    /// TAGS: Int, Clear, Zero, Reset
    ///
    static inline void IntClear(Int *value) {
        ValidateInt(value);
        BitVecClear(&value->bits);
        /// TAGS: Int, Access, BitLength
        ///
        u64 IntBitLength(const Int *value);
    
        ///
        /// TAGS: Int, Access, ByteLength
        ///
        u64 IntByteLength(const Int *value);
    
        ///
        /// TAGS: Int, Math, Log2, Access
        ///
        bool IntTryLog2(const Int *value, u64 *out);
    
        ///
        /// TAGS: Int, Math, Log2, Access
        ///
        u64 IntLog2WithError(const Int *value, bool *error);
    
        ///
        /// TAGS: Int, Access, TrailingZeros
        ///
        u64 IntTrailingZeroCount(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsZero
        ///
        bool IntIsZero(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsOne
        ///
        bool IntIsOne(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsEven
        ///
        bool IntIsEven(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, IsOdd
        ///
        bool IntIsOdd(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, FitsU64
        ///
        bool IntFitsU64(const Int *value);
    
        ///
        /// TAGS: Int, Access, Predicate, PowerOfTwo
        ///
        bool IntIsPowerOfTwo(const Int *value);
    
    #ifdef __cplusplus
    #endif
    
    static inline u64 int_log2_no_error(const Int *value) {
        return IntLog2WithError(value, NULL);
    }
        /// TAGS: Int, Convert, U64
        ///
        bool IntTryToU64(const Int *value, u64 *out);
    
        ///
        /// TAGS: Int, Convert, U64
        ///
        u64 IntToU64WithError(const Int *value, bool *error);
    
        ///
        /// TAGS: Int, Convert, Bytes, LE
        ///
        Int int_from_bytes_le(const u8 *bytes, u64 len, Allocator *alloc);
    #define IntFromBytesLE(...)                 OVERLOAD(IntFromBytesLE, __VA_ARGS__)
    #define IntFromBytesLE_2(bytes, len)        int_from_bytes_le((bytes), (len), MisraScope)
        /// TAGS: Int, Convert, Bytes, LE
        ///
        u64 IntToBytesLE(const Int *value, u8 *bytes, u64 max_len);
    
        ///
        /// TAGS: Int, Convert, Bytes, BE
        ///
        Int int_from_bytes_be(const u8 *bytes, u64 len, Allocator *alloc);
    #define IntFromBytesBE(...)                 OVERLOAD(IntFromBytesBE, __VA_ARGS__)
    #define IntFromBytesBE_2(bytes, len)        int_from_bytes_be((bytes), (len), MisraScope)
        /// TAGS: Int, Convert, Bytes, BE
        ///
        u64 IntToBytesBE(const Int *value, u8 *bytes, u64 max_len);
    
        ///
        /// TAGS: Int, Convert, Parse, Radix
        ///
        bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix);
        bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix);
    #define IntTryFromStrRadix(out, digits, radix)                                                                                     \
        ///
        bool int_try_from_str_radix_zstr(Int *out, Zstr digits, u8 radix);
        bool int_try_from_str_radix_str(Int *out, const Str *digits, u8 radix);
    #define IntTryFromStrRadix(out, digits, radix)                                                                                     \
        _Generic((digits), Str *: int_try_from_str_radix_str, Zstr: int_try_from_str_radix_zstr, char *: int_try_from_str_radix_zstr)( \
        /// TAGS: Int, Convert, Radix, String
        ///
        Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc);
        Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc);
    #define IntFromStrRadix(...) OVERLOAD(IntFromStrRadix, __VA_ARGS__)
        ///
        Int int_from_str_radix_zstr(Zstr digits, u8 radix, Allocator *alloc);
        Int int_from_str_radix_str(const Str *digits, u8 radix, Allocator *alloc);
    #define IntFromStrRadix(...) OVERLOAD(IntFromStrRadix, __VA_ARGS__)
    #define IntFromStrRadix_2(digits, radix)                                                                               \
        /// TAGS: Int, Convert, String, Radix, Allocator
        ///
        bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        Str  int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        ///
        bool int_try_to_str_radix(Str *out, const Int *value, u8 radix, bool uppercase, Allocator *alloc);
        Str  int_to_str_radix(const Int *value, u8 radix, bool uppercase, Allocator *alloc);
    
        ///
        /// TAGS: Int, Convert, Parse, Decimal
        ///
        bool int_try_from_str_zstr(Int *out, Zstr decimal);
        bool int_try_from_str_str(Int *out, const Str *decimal);
    #define IntTryFromStr(out, decimal)                                                                                    \
        ///
        bool int_try_from_str_zstr(Int *out, Zstr decimal);
        bool int_try_from_str_str(Int *out, const Str *decimal);
    #define IntTryFromStr(out, decimal)                                                                                    \
        _Generic((decimal), Str *: int_try_from_str_str, Zstr: int_try_from_str_zstr, char *: int_try_from_str_zstr)(      \
        /// TAGS: Int, Convert, String
        ///
        Int int_from_str_zstr(Zstr decimal, Allocator *alloc);
        Int int_from_str_str(const Str *decimal, Allocator *alloc);
    #define IntFromStr(...) OVERLOAD(IntFromStr, __VA_ARGS__)
        ///
        Int int_from_str_zstr(Zstr decimal, Allocator *alloc);
        Int int_from_str_str(const Str *decimal, Allocator *alloc);
    #define IntFromStr(...) OVERLOAD(IntFromStr, __VA_ARGS__)
    #define IntFromStr_1(decimal)                                                                                          \
        /// TAGS: Int, Convert, String, Decimal, Allocator
        ///
        bool int_try_to_str(Str *out, const Int *value, Allocator *alloc);
        Str  int_to_str(const Int *value, Allocator *alloc);
        ///
        bool int_try_to_str(Str *out, const Int *value, Allocator *alloc);
        Str  int_to_str(const Int *value, Allocator *alloc);
    
        ///
        /// TAGS: Int, Convert, Parse, Binary
        ///
        bool int_try_from_binary_zstr(Int *out, Zstr binary);
        bool int_try_from_binary_str(Int *out, const Str *binary);
    #define IntTryFromBinary(out, binary)                                                                                     \
        ///
        bool int_try_from_binary_zstr(Int *out, Zstr binary);
        bool int_try_from_binary_str(Int *out, const Str *binary);
    #define IntTryFromBinary(out, binary)                                                                                     \
        _Generic((binary), Str *: int_try_from_binary_str, Zstr: int_try_from_binary_zstr, char *: int_try_from_binary_zstr)( \
        /// TAGS: Int, Convert, Binary
        ///
        Int int_from_binary_zstr(Zstr binary, Allocator *alloc);
        Int int_from_binary_str(const Str *binary, Allocator *alloc);
    #define IntFromBinary(...) OVERLOAD(IntFromBinary, __VA_ARGS__)
        ///
        Int int_from_binary_zstr(Zstr binary, Allocator *alloc);
        Int int_from_binary_str(const Str *binary, Allocator *alloc);
    #define IntFromBinary(...) OVERLOAD(IntFromBinary, __VA_ARGS__)
    #define IntFromBinary_1(binary)                                                                                        \
        /// TAGS: Int, Convert, Binary
        ///
        Str IntToBinary(const Int *value);
    
        ///
        /// TAGS: Int, Convert, Parse, Octal
        ///
        bool int_try_from_oct_str_zstr(Int *out, Zstr octal);
        bool int_try_from_oct_str_str(Int *out, const Str *octal);
    #define IntTryFromOctStr(out, octal)                                                                                        \
        ///
        bool int_try_from_oct_str_zstr(Int *out, Zstr octal);
        bool int_try_from_oct_str_str(Int *out, const Str *octal);
    #define IntTryFromOctStr(out, octal)                                                                                        \
        _Generic((octal), Str *: int_try_from_oct_str_str, Zstr: int_try_from_oct_str_zstr, char *: int_try_from_oct_str_zstr)( \
        /// TAGS: Int, Convert, Oct
        ///
        Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc);
        Int int_from_oct_str_str(const Str *octal, Allocator *alloc);
    #define IntFromOctStr(...) OVERLOAD(IntFromOctStr, __VA_ARGS__)
        ///
        Int int_from_oct_str_zstr(Zstr octal, Allocator *alloc);
        Int int_from_oct_str_str(const Str *octal, Allocator *alloc);
    #define IntFromOctStr(...) OVERLOAD(IntFromOctStr, __VA_ARGS__)
    #define IntFromOctStr_1(octal)                                                                                         \
        /// TAGS: Int, Convert, Oct
        ///
        Str IntToOctStr(const Int *value);
    
        ///
        /// TAGS: Int, Convert, Parse, Hex
        ///
        bool int_try_from_hex_str_zstr(Int *out, Zstr hex);
        bool int_try_from_hex_str_str(Int *out, const Str *hex);
    #define IntTryFromHexStr(out, hex)                                                                                        \
        ///
        bool int_try_from_hex_str_zstr(Int *out, Zstr hex);
        bool int_try_from_hex_str_str(Int *out, const Str *hex);
    #define IntTryFromHexStr(out, hex)                                                                                        \
        _Generic((hex), Str *: int_try_from_hex_str_str, Zstr: int_try_from_hex_str_zstr, char *: int_try_from_hex_str_zstr)( \
        /// TAGS: Int, Convert, Hex
        ///
        Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc);
        Int int_from_hex_str_str(const Str *hex, Allocator *alloc);
    #define IntFromHexStr(...) OVERLOAD(IntFromHexStr, __VA_ARGS__)
        ///
        Int int_from_hex_str_zstr(Zstr hex, Allocator *alloc);
        Int int_from_hex_str_str(const Str *hex, Allocator *alloc);
    #define IntFromHexStr(...) OVERLOAD(IntFromHexStr, __VA_ARGS__)
    #define IntFromHexStr_1(hex)                                                                                           \
        /// TAGS: Int, Convert, Hex
        ///
        Str IntToHexStr(const Int *value);
    
    #ifdef __cplusplus
    #endif
    
    static inline u64 int_to_u64_no_error(const Int *value) {
        return IntToU64WithError(value, NULL);
    }
        /// TAGS: Int, Math, ShiftLeft, Bits
        ///
        bool IntShiftLeft(Int *value, u64 positions);
        ///
        /// Shift an integer right by the given number of bit positions.
        /// TAGS: Int, Math, ShiftRight, Bits
        ///
        bool IntShiftRight(Int *value, u64 positions);
        ///
        /// Add two integers.
        /// TAGS: Int, Math, Add
        ///
        bool int_add(Int *result, const Int *a, const Int *b);
        ///
        /// Subtract one integer from another.
        /// TAGS: Int, Math, Subtract
        ///
        bool int_sub(Int *result, const Int *a, const Int *b);
        ///
        /// Multiply two integers.
        /// TAGS: Int, Math, Multiply
        ///
        bool int_mul(Int *result, const Int *a, const Int *b);
        ///
        /// Square an integer.
        /// TAGS: Int, Math, Square
        ///
        bool IntSquare(Int *result, const Int *value);
        ///
        /// Raise an integer to an arbitrary-precision power.
        /// TAGS: Int, Math, Power, Exponentiation
        ///
        bool int_pow(Int *result, const Int *base, const Int *exponent);
        ///
        /// Divide one integer by another using floor division.
        /// TAGS: Int, Math, Divide, Quotient
        ///
        bool int_div(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Divide one integer by another only when the division is exact.
        /// TAGS: Int, Math, DivideExact
        ///
        bool int_div_exact(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Compute `dividend mod divisor`.
        /// TAGS: Int, Math, Modulo
        ///
        bool int_mod(Int *result, const Int *dividend, const Int *divisor);
        ///
        /// Compute quotient and remainder in one call.
        /// TAGS: Int, Math, Divide, Modulo
        ///
        bool int_div_mod(Int *quotient, Int *remainder, const Int *dividend, const Int *divisor);
        ///
        /// Compute the greatest common divisor of two integers.
        /// TAGS: Int, Math, GCD, NumberTheory
        ///
        bool IntGCD(Int *result, const Int *a, const Int *b);
        ///
        /// Compute the least common multiple of two integers.
        /// TAGS: Int, Math, LCM, NumberTheory
        ///
        bool IntLCM(Int *result, const Int *a, const Int *b);
        ///
        /// Compute the integer `degree`-th root of a value (floor).
        /// TAGS: Int, Math, Root, NumberTheory
        ///
        bool IntRoot(Int *result, const Int *value, u64 degree);
        ///
        /// Compute an integer root and the leftover remainder.
        /// TAGS: Int, Math, Root, Remainder
        ///
        bool IntRootRem(Int *root, Int *remainder, const Int *value, u64 degree);
        ///
        /// Compute the integer square root (floor).
        /// TAGS: Int, Math, Sqrt
        ///
        bool IntSqrt(Int *result, const Int *value);
        ///
        /// Compute the integer square root and remainder.
        /// TAGS: Int, Math, Sqrt, Remainder
        ///
        bool IntSqrtRem(Int *root, Int *remainder, const Int *value);
        ///
        /// Test whether a value is a perfect square.
        /// TAGS: Int, Math, PerfectSquare, Predicate
        ///
        bool IntIsPerfectSquare(const Int *value);
        ///
        /// Test whether a value is a perfect power.
        /// TAGS: Int, Math, PerfectPower, Predicate
        ///
        bool IntIsPerfectPower(const Int *value);
        ///
        /// Compute the Jacobi symbol `(a/n)`.
        /// TAGS: Int, Math, Jacobi, NumberTheory
        ///
        bool IntTryJacobi(int *out, const Int *a, const Int *n);
    
        ///
        /// TAGS: Int, Math, Jacobi, NumberTheory
        ///
        int IntJacobiWithError(const Int *a, const Int *n, bool *error);
        ///
        /// Compute `(value^2) mod modulus`.
        /// TAGS: Int, Math, Modular, Square
        ///
        bool IntSquareMod(Int *result, const Int *value, const Int *modulus);
        ///
        /// Compute `(a + b) mod modulus`.
        /// TAGS: Int, Math, Modular, Add
        ///
        bool IntModAdd(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(a - b) mod modulus`.
        /// TAGS: Int, Math, Modular, Subtract
        ///
        bool IntModSub(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(a * b) mod modulus`.
        /// TAGS: Int, Math, Modular, Multiply
        ///
        bool IntModMul(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute modular division `a / b (mod modulus)`.
        /// TAGS: Int, Math, Modular, Divide
        ///
        bool IntModDiv(Int *result, const Int *a, const Int *b, const Int *modulus);
        ///
        /// Compute `(base^exponent) mod modulus`.
        /// TAGS: Int, Math, Modular, Power
        ///
        bool int_pow_mod(Int *result, const Int *base, const Int *exponent, const Int *modulus);
        ///
        /// Compute the multiplicative inverse of a value modulo `modulus`.
        /// TAGS: Int, Math, Modular, Inverse
        ///
        bool IntModInv(Int *result, const Int *value, const Int *modulus);
        ///
        /// Compute a modular square root.
        /// TAGS: Int, Math, Modular, Sqrt
        ///
        bool IntModSqrt(Int *result, const Int *value, const Int *modulus);
        ///
        /// Perform a probabilistic primality test.
        /// TAGS: Int, Math, Prime, Predicate
        ///
        bool IntIsProbablePrimeWithError(const Int *value, bool *error);
        ///
        /// Find the next probable prime greater than or equal to a value.
        /// TAGS: Int, Math, Prime, Search
        ///
        bool IntNextPrime(Int *result, const Int *value);
    
        static inline bool int_is_probable_prime_no_error(const Int *value) {
        bool IntNextPrime(Int *result, const Int *value);
    
        static inline bool int_is_probable_prime_no_error(const Int *value) {
            return IntIsProbablePrimeWithError(value, NULL);
        }
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_add,                                                                              \
                unsigned char: int_add_u64,                                                                              \
                unsigned short: int_add_u64,                                                                              \
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_sub,                                                                              \
                unsigned char: int_sub_u64,                                                                              \
                unsigned short: int_sub_u64,                                                                              \
            _Generic(                                                                                                      \
                (b),                                                                                                    \
                Int *: int_mul,                                                                              \
                unsigned char: int_mul_u64,                                                                              \
                unsigned short: int_mul_u64,                                                                              \
            _Generic(                                                                                                      \
                (exponent),                                                                                                    \
                Int *: int_pow,                                                                              \
                unsigned char: int_pow_u64,                                                                              \
                unsigned short: int_pow_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_div,                                                                              \
                unsigned char: int_div_u64,                                                                              \
                unsigned short: int_div_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_div_exact,                                                                              \
                unsigned char: int_div_exact_u64,                                                                              \
                unsigned short: int_div_exact_u64,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                    \
                Int *: int_mod,                                                                              \
                unsigned char: int_mod_u64_into,                                                                              \
                unsigned short: int_mod_u64_into,                                                                              \
            _Generic(                                                                                                      \
                (divisor),                                                                                                 \
                Int *: int_div_mod,                                                                                        \
                unsigned char: int_div_mod_u64,                                                                            \
                unsigned short: int_div_mod_u64,                                                                           \
            _Generic(                                                                                                      \
                (exponent),                                                                                                \
                Int *: int_pow_mod,                                                                                        \
                unsigned char: int_pow_u64_mod,                                                                            \
                unsigned short: int_pow_u64_mod,                                                                           \
    #endif
    
        static inline int int_jacobi_no_error(const Int *a, const Int *n) {
            return IntJacobiWithError(a, n, NULL);
        }
        /// TAGS: Int, Memory, Clone, Copy
        ///
        bool IntTryClone(Int *out, const Int *value);
    
        ///
        /// TAGS: Int, Memory, Clone, Copy
        ///
        Int IntClone(const Int *value);
    
    #ifdef __cplusplus
    typedef struct {
        BitVec bits;
    } Int;
    
    ///
    /// TAGS: Int, Validate, Safety, Debug
    ///
    static inline void ValidateInt(const Int *value) {
        ValidateBitVec(value ? &value->bits : NULL);
    }
            _Generic(                                                                                                      \
                (rhs),                                                                                                     \
                Int *: int_compare,                                                                                        \
                unsigned char: int_compare_u64,                                                                            \
                unsigned short: int_compare_u64,                                                                           \
Last updated on