src/qrkit@internal@format_info.erl

-module(qrkit@internal@format_info).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/qrkit/internal/format_info.gleam").
-export([format_bits/2, version_bits/1]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(false).

-file("src/qrkit/internal/format_info.gleam", 41).
?DOC(false).
-spec bit_length(integer()) -> integer().
bit_length(Value) ->
    case Value =:= 0 of
        true ->
            0;

        false ->
            1 + bit_length(erlang:'bsr'(Value, 1))
    end.

-file("src/qrkit/internal/format_info.gleam", 48).
?DOC(false).
-spec power_of_two(integer()) -> integer().
power_of_two(Value) ->
    case Value =< 0 of
        true ->
            1;

        false ->
            2 * power_of_two(Value - 1)
    end.

-file("src/qrkit/internal/format_info.gleam", 27).
?DOC(false).
-spec do_bch_remainder(integer(), integer()) -> integer().
do_bch_remainder(Value, Polynomial) ->
    case bit_length(Value) < bit_length(Polynomial) of
        true ->
            Value;

        false ->
            do_bch_remainder(
                erlang:'bxor'(
                    Value,
                    Polynomial * power_of_two(
                        bit_length(Value) - bit_length(Polynomial)
                    )
                ),
                Polynomial
            )
    end.

-file("src/qrkit/internal/format_info.gleam", 23).
?DOC(false).
-spec bch_remainder(integer(), integer(), integer()) -> integer().
bch_remainder(Value, Polynomial, Shift) ->
    do_bch_remainder(Value * power_of_two(Shift), Polynomial).

-file("src/qrkit/internal/format_info.gleam", 55).
?DOC(false).
-spec int_from_ecc(qrkit@types:error_correction()) -> integer().
int_from_ecc(Ecc) ->
    case Ecc of
        low ->
            1;

        medium ->
            0;

        quartile ->
            3;

        high ->
            2
    end.

-file("src/qrkit/internal/format_info.gleam", 12).
?DOC(false).
-spec format_bits(qrkit@types:error_correction(), integer()) -> integer().
format_bits(Ecc, Mask) ->
    Data = (int_from_ecc(Ecc) * 8) + Mask,
    Remainder = bch_remainder(Data, 2#10100110111, 10),
    erlang:'bxor'((Data * 1024) + Remainder, 2#101010000010010).

-file("src/qrkit/internal/format_info.gleam", 18).
?DOC(false).
-spec version_bits(integer()) -> integer().
version_bits(Version) ->
    Remainder = bch_remainder(Version, 2#1111100100101, 12),
    (Version * 4096) + Remainder.