-module(mmath_bin). -include("mmath.hrl"). -export([convert/1, from_list/1, to_list/1, empty/1, length/1, realize/1, derealize/1]). -define(APPNAME, mmath). -define(LIBNAME, bin_nif). -on_load(load_nif/0). load_nif() -> SoName = case code:priv_dir(?APPNAME) of {error, bad_name} -> case filelib:is_dir(filename:join(["..", priv])) of true -> filename:join(["..", priv, ?LIBNAME]); _ -> filename:join([priv, ?LIBNAME]) end; Dir -> filename:join(Dir, ?LIBNAME) end, erlang:load_nif(SoName, 0). from_list([]) -> <<>>; from_list([_V0 | _] = L) when is_integer(_V0) -> << <> || V <- L >>. to_list(Bin) -> to_list_int(Bin, 0, []). to_list_int(<>, _, Acc) -> to_list_int(R, I, [I | Acc]); to_list_int(<>, Last, Acc) -> to_list_int(R, Last, [Last | Acc]); to_list_int(<<>>, _, Acc) -> lists:reverse(Acc). length(B) -> trunc(byte_size(B)/?DATA_SIZE). empty(Length) -> <<0:((?TYPE_SIZE + ?BITS)*Length)/?INT_TYPE>>. convert(Data) -> convert(Data, <<>>). convert(<<>>, Acc) -> Acc; convert(<<0, _:64/?INT_TYPE, R/binary>>, Acc) -> convert(R, <>); convert(<<1, I:64/?INT_TYPE, R/binary>>, Acc) -> convert(R, <>). realize(Data) -> realize(Data, 0, <<>>). realize(<<0:?TYPE_SIZE, _:?BITS/?INT_TYPE, R/binary>>, Last, Acc) -> realize(R, Last, <>); realize(<>, _Last, Acc) -> realize(R, I, <>); realize(<<>>, _, Acc) -> Acc. derealize(Data) -> << <> || <> <= Data>>.