refactor(replay): Introduce bitwise_concat function

This commit is contained in:
ieQu1 2023-01-01 14:42:04 +01:00 committed by Andrew Mayorov
parent ff145ecc43
commit f5e2d2f66d
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
1 changed files with 17 additions and 12 deletions

View File

@ -106,6 +106,8 @@
-export_type([db/0, iterator/0]).
-compile({inline, [ones/1, bitwise_concat/3]}).
%%================================================================================
%% Type declarations
%%================================================================================
@ -343,41 +345,44 @@ hash(Input, Bits) ->
compute_bitstring(Topic, Timestamp, [{timestamp, Offset, Size} | Rest], Acc) ->
I = (Timestamp bsr Offset) band ones(Size),
compute_bitstring(Topic, Timestamp, Rest, (Acc bsl Size) + I);
compute_bitstring(Topic, Timestamp, Rest, bitwise_concat(Acc, I, Size));
compute_bitstring([], Timestamp, [{hash, level, Size} | Rest], Acc) ->
I = hash(<<"/">>, Size),
compute_bitstring([], Timestamp, Rest, (Acc bsl Size) + I);
compute_bitstring([], Timestamp, Rest, bitwise_concat(Acc, I, Size));
compute_bitstring([Level | Tail], Timestamp, [{hash, level, Size} | Rest], Acc) ->
I = hash(Level, Size),
compute_bitstring(Tail, Timestamp, Rest, (Acc bsl Size) + I);
compute_bitstring(Tail, Timestamp, Rest, bitwise_concat(Acc, I, Size));
compute_bitstring(Tail, Timestamp, [{hash, levels, Size} | Rest], Acc) ->
I = hash(Tail, Size),
compute_bitstring(Tail, Timestamp, Rest, (Acc bsl Size) + I);
compute_bitstring(Tail, Timestamp, Rest, bitwise_concat(Acc, I, Size));
compute_bitstring(_, _, [], Acc) ->
Acc.
compute_hash_bitmask(Filter, [{timestamp, _, Size} | Rest], Acc) ->
compute_hash_bitmask(Filter, Rest, (Acc bsl Size) + 0);
compute_hash_bitmask(Filter, Rest, bitwise_concat(Acc, 0, Size));
compute_hash_bitmask(['#'], [{hash, _, Size} | Rest], Acc) ->
compute_hash_bitmask(['#'], Rest, (Acc bsl Size) + 0);
compute_hash_bitmask(['#'], Rest, bitwise_concat(Acc, 0, Size));
compute_hash_bitmask(['+' | Tail], [{hash, _, Size} | Rest], Acc) ->
compute_hash_bitmask(Tail, Rest, (Acc bsl Size) + 0);
compute_hash_bitmask(Tail, Rest, bitwise_concat(Acc, 0, Size));
compute_hash_bitmask([], [{hash, level, Size} | Rest], Acc) ->
compute_hash_bitmask([], Rest, (Acc bsl Size) + ones(Size));
compute_hash_bitmask([], Rest, bitwise_concat(Acc, ones(Size), Size));
compute_hash_bitmask([_ | Tail], [{hash, level, Size} | Rest], Acc) ->
compute_hash_bitmask(Tail, Rest, (Acc bsl Size) + ones(Size));
compute_hash_bitmask(Tail, Rest, bitwise_concat(Acc, ones(Size), Size));
compute_hash_bitmask(_, [{hash, levels, Size} | Rest], Acc) ->
compute_hash_bitmask([], Rest, (Acc bsl Size) + ones(Size));
compute_hash_bitmask([], Rest, bitwise_concat(Acc, ones(Size), Size));
compute_hash_bitmask(_, [], Acc) ->
Acc.
compute_time_bitmask([{timestamp, _, Size} | Rest], Acc) ->
compute_time_bitmask(Rest, (Acc bsl Size) + ones(Size));
compute_time_bitmask(Rest, bitwise_concat(Acc, ones(Size), Size));
compute_time_bitmask([{hash, _, Size} | Rest], Acc) ->
compute_time_bitmask(Rest, (Acc bsl Size) + 0);
compute_time_bitmask(Rest, bitwise_concat(Acc, 0, Size));
compute_time_bitmask([], Acc) ->
Acc.
bitwise_concat(Acc, Item, ItemSize) ->
(Acc bsl ItemSize) bor Item.
ones(Bits) ->
1 bsl Bits - 1.