DoxigAlpha

toInt

Convert self to Int.

Returns an error if self cannot be narrowed into the requested type without truncation.

Function parameters

Parameters

#
Int:type

Used to indicate either limit of a 2s-complement integer.

Types

#
TwosCompIntLimit
Used to indicate either limit of a 2s-complement integer.
Mutable
A arbitrary-precision big integer, with a fixed set of mutable limbs.
Const
A arbitrary-precision big integer, with a fixed set of immutable limbs.
Managed
An arbitrary-precision big integer along with an allocator which manages the memory.

Returns the number of limbs needed to store `scalar`, which must be a

Functions

#
calcLimbLen
Returns the number of limbs needed to store `scalar`, which must be a
calcSetStringLimbCount
Assumes `string_len` doesn't account for minus signs if the number is negative.
calcNonZeroTwosCompLimbCount
Compute the number of limbs required to store a 2s-complement number of `bit_count` bits.
calcTwosCompLimbCount
Compute the number of limbs required to store a 2s-complement number of `bit_count` bits.
addMulLimbWithCarry
a + b * c + *carry, sets carry to the overflow bits
llcmp
Returns -1, 0, 1 if |a| < |b|, |a| == |b| or |a| > |b| respectively for limbs.

Source

Implementation

#
pub fn toInt(self: Const, comptime Int: type) ConvertError!Int {
    switch (@typeInfo(Int)) {
        .int => |info| {
            // Make sure -0 is handled correctly.
            if (self.eqlZero()) return 0;

            const Unsigned = std.meta.Int(.unsigned, info.bits);

            if (!self.fitsInTwosComp(info.signedness, info.bits)) {
                return error.TargetTooSmall;
            }

            var r: Unsigned = 0;

            if (@sizeOf(Unsigned) <= @sizeOf(Limb)) {
                r = @intCast(self.limbs[0]);
            } else {
                for (self.limbs[0..self.limbs.len], 0..) |_, ri| {
                    const limb = self.limbs[self.limbs.len - ri - 1];
                    r <<= limb_bits;
                    r |= limb;
                }
            }

            if (info.signedness == .unsigned) {
                return if (self.positive) @intCast(r) else error.NegativeIntoUnsigned;
            } else {
                if (self.positive) {
                    return @intCast(r);
                } else {
                    if (math.cast(Int, r)) |ok| {
                        return -ok;
                    } else {
                        return minInt(Int);
                    }
                }
            }
        },
        else => @compileError("expected int type, found '" ++ @typeName(Int) ++ "'"),
    }
}