Packages
mmath
0.1.13
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.2.0-alpha9
0.2.0-alpha8
0.2.0-alpha7
0.2.0-alpha6
0.2.0-alpha5
0.2.0-alpha4
0.2.0-alpha3
0.2.0-alpha2
0.2.0-alpha10
0.2.0-alpha1
0.2.0-alpha
0.1.17-alpha
0.1.16
0.1.15
0.1.14
0.1.13
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
math library for metric sequences and binary arrays.
Current section
Files
Jump to
Current section
Files
src/mmath_bin.erl
-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) ->
<< <<?INT:?TYPE_SIZE, V:?BITS/?INT_TYPE>> || V <- L >>.
to_list(Bin) ->
to_list_int(Bin, 0, []).
to_list_int(<<?INT:?TYPE_SIZE, I:?BITS/?INT_TYPE, R/binary>>, _, Acc) ->
to_list_int(R, I, [I | Acc]);
to_list_int(<<?NONE:?TYPE_SIZE, _:?BITS/?INT_TYPE, R/binary>>, 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, <<Acc/binary, ?NONE:?TYPE_SIZE, 0:?BITS/?INT_TYPE>>);
convert(<<1, I:64/?INT_TYPE, R/binary>>, Acc) ->
convert(R, <<Acc/binary, ?INT:?TYPE_SIZE, I:?BITS/?INT_TYPE>>).
realize(Data) ->
realize(Data, 0, <<>>).
realize(<<0:?TYPE_SIZE, _:?BITS/?INT_TYPE, R/binary>>, Last, Acc) ->
realize(R, Last, <<Acc/binary, Last:64/integer-native>>);
realize(<<?INT:?TYPE_SIZE, I:?BITS/?INT_TYPE, R/binary>>, _Last, Acc) ->
realize(R, I, <<Acc/binary, I:64/integer-native>>);
realize(<<>>, _, Acc) ->
Acc.
derealize(Data) ->
<< <<?INT:?TYPE_SIZE, D:?BITS/?INT_TYPE>> || <<D:64/integer-native>> <= Data>>.