Ver código fonte

index table

master
SisMaker 4 anos atrás
pai
commit
23e9c840ba
2 arquivos alterados com 36 adições e 44 exclusões
  1. +5
    -4
      include/eVPack.hrl
  2. +31
    -40
      src/eVPack.erl

+ 5
- 4
include/eVPack.hrl Ver arquivo

@ -2,15 +2,16 @@
-type vpOpt() :: pos_integer().
-export_type([vpack/0, vpOpt/0]).
-define(VpObjNcNs, 0). %% Key
-define(VpObjNcYs, 1). %% Key
-define(VpObjYc, 2). %%
-define(VpObjNcYs, 0). %% Key
-define(VpObjYc, 1). %%
-define(VpObjNcNs, 2). %% Key object
-define(VpArrNc, 0). %%
-define(VpArrYc, 1). %%
-define(VpObjDef, 0). %% Obj key Obj不压缩
-define(VpArrDef, 0). %% Arr不压缩
-define(VpArrDef, 0). %% Arr不压缩排序
-define(VpAllOpts(Arr, Obj), Obj bsl 1 bor Arr). %% Obj Arr选项
-define(VpObjOpts(VpAllOpts), VpAllOpts bsr 1). %% Obj选项

+ 31
- 40
src/eVPack.erl Ver arquivo

@ -25,10 +25,6 @@
, encodeFloat/1
, encodeString/1
, encodeInteger/1
, buildIndexTable_1/2
, buildIndexTable_2/2
, buildIndexTable_4/2
, buildIndexTable_8/2
]).
@ -222,35 +218,26 @@ doEncodeMap(Iterator, ArrOpt, ObjOpt, AccList, Offsets, SumSize) ->
{AccList, Offsets, SumSize}
end.
doEncodeMap([], _Map, _ArrOpt, _ObjOpt, AccList, Offsets, SumSize) ->
{AccList, Offsets, SumSize};
doEncodeMap([OneKeys | Left], Map, ArrOpt, ObjOpt, AccList, Offsets, SumSize) ->
case Map of
#{OneKeys := Value} ->
{KeyEn, KeySize} = encodeString(OneKeys),
doEncodeSortMap(Iterator, ArrOpt, ObjOpt, AccList, Offsets, SumSize) ->
case maps:next(Iterator) of
{Key, Value, NextIter} ->
KeyStr = asKey(Key),
{KeyEn, KeySize} = encodeString(KeyStr),
{ValueEn, ValueSize} = encoder(Value, ArrOpt, ObjOpt),
doEncodeMap(Left, Map, ArrOpt, ObjOpt, [ValueEn, KeyEn | AccList], [SumSize | Offsets], SumSize + KeySize + ValueSize);
_ ->
AtomKey = binary_to_atom(OneKeys, utf8),
case Map of
#{AtomKey := Value} ->
{KeyEn, KeySize} = encodeString(OneKeys),
{ValueEn, ValueSize} = encoder(Value, ArrOpt, ObjOpt),
doEncodeMap(Left, Map, ArrOpt, ObjOpt, [ValueEn, KeyEn | AccList], [SumSize | Offsets], SumSize + KeySize + ValueSize);
_ ->
erlang:throw({error, {no_map_value, OneKeys}})
end
doEncodeSortMap(NextIter, ArrOpt, ObjOpt, [ValueEn, KeyEn | AccList], [{KeyStr, SumSize} | Offsets], SumSize + KeySize + ValueSize);
none ->
{AccList, Offsets, SumSize}
end.
encodeMap(?VpObjNcNs, Map, ArrOpt) ->
encodeMap(?VpObjNcYs, Map, ArrOpt) ->
MapSize = erlang:map_size(Map),
case MapSize == 0 of
true ->
{<<10/integer>>, 1};
_ ->
{AccList, Offsets, SumSize} = doEncodeMap(maps:iterator(Map), ArrOpt, ?VpObjNcNs, [], [], 0),
{AccList, Offsets, SumSize} = doEncodeSortMap(maps:iterator(Map), ArrOpt, ?VpObjNcYs, [], [], 0),
IoData = lists:reverse(AccList),
encodeUnSortMapIndexTable(IoData, MapSize, Offsets, SumSize)
encodeSortMapIndexTable(IoData, MapSize, Offsets, SumSize)
end;
encodeMap(?VpObjYc, Map, ArrOpt) ->
MapSize = erlang:map_size(Map),
@ -262,17 +249,15 @@ encodeMap(?VpObjYc, Map, ArrOpt) ->
IoData = lists:reverse(AccList),
encodeCompactData(<<20/integer>>, IoData, SumSize, MapSize)
end;
encodeMap(?VpObjNcYs, Map, ArrOpt) ->
encodeMap(?VpObjNcNs, Map, ArrOpt) ->
MapSize = erlang:map_size(Map),
case MapSize == 0 of
true ->
{<<10/integer>>, 1};
_ ->
Keys = maps:keys(Map),
StrKeys = [asKey(OneKey) || OneKey <- Keys],
{AccList, Offsets, SumSize} = doEncodeMap(lists:sort(StrKeys), Map, ArrOpt, ?VpObjNcYs, [], [], 0),
{AccList, Offsets, SumSize} = doEncodeMap(maps:iterator(Map), ArrOpt, ?VpObjNcNs, [], [], 0),
IoData = lists:reverse(AccList),
encodeSortMapIndexTable(IoData, MapSize, Offsets, SumSize)
encodeUnSortMapIndexTable(IoData, MapSize, Offsets, SumSize)
end.
encodeSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
@ -281,19 +266,19 @@ encodeSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
TemSize < 253 ->
AllSize = TemSize + 3,
Header = <<11/integer, AllSize:8/integer-unsigned, Count:8/integer-unsigned>>,
{[Header, IoData, buildIndexTable_1(Offsets, 3)], AllSize};
{[Header, IoData, buildSMIndexTable_1(Offsets, 3)], AllSize};
TemSize + Count < 65531 ->
AllSize = TemSize + Count + 5,
Header = <<12/integer, AllSize:16/integer-little-unsigned, Count:16/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_2(Offsets, 5)], AllSize};
{[Header, IoData, buildSMIndexTable_2(Offsets, 5)], AllSize};
TemSize + Count * 3 < 4294967287 ->
AllSize = TemSize + Count * 3 + 9,
Header = <<13/integer, AllSize:32/integer-little-unsigned, Count:32/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_4(Offsets, 9)], AllSize};
{[Header, IoData, buildSMIndexTable_4(Offsets, 9)], AllSize};
TemSize + Count * 7 < 18446744073709551599 ->
AllSize = TemSize + Count * 7 + 17,
Header = <<14/integer, AllSize:64/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_8(Offsets, 9), <<Count:64/integer-little-unsigned>>], AllSize};
{[Header, IoData, buildSMIndexTable_8(Offsets, 9), <<Count:64/integer-little-unsigned>>], AllSize};
true ->
erlang:throw({error, too_much_sort_map_size})
end.
@ -322,16 +307,22 @@ encodeUnSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
end.
buildIndexTable_1(Offsets, StartSize) ->
<<<<(OneOff + StartSize):1/integer-little-unsigned-unit:8>> || OneOff <- Offsets>>.
<<<<(OneOff + StartSize):1/integer-little-unsigned-unit:8>> || OneOff <- lists:reverse(Offsets)>>.
buildIndexTable_2(Offsets, StartSize) ->
<<<<(OneOff + StartSize):2/integer-little-unsigned-unit:8>> || OneOff <- Offsets>>.
<<<<(OneOff + StartSize):2/integer-little-unsigned-unit:8>> || OneOff <- lists:reverse(Offsets)>>.
buildIndexTable_4(Offsets, StartSize) ->
<<<<(OneOff + StartSize):4/integer-little-unsigned-unit:8>> || OneOff <- Offsets>>.
<<<<(OneOff + StartSize):4/integer-little-unsigned-unit:8>> || OneOff <- lists:reverse(Offsets)>>.
buildIndexTable_8(Offsets, StartSize) ->
<<<<(OneOff + StartSize):8/integer-little-unsigned-unit:8>> || OneOff <- Offsets>>.
<<<<(OneOff + StartSize):8/integer-little-unsigned-unit:8>> || OneOff <- lists:reverse(Offsets)>>.
buildSMIndexTable_1(Offsets, StartSize) ->
<<<<(OneOff + StartSize):1/integer-little-unsigned-unit:8>> || {_, OneOff} <- lists:sort(Offsets)>>.
buildSMIndexTable_2(Offsets, StartSize) ->
<<<<(OneOff + StartSize):2/integer-little-unsigned-unit:8>> || {_, OneOff} <- lists:sort(Offsets)>>.
buildSMIndexTable_4(Offsets, StartSize) ->
<<<<(OneOff + StartSize):4/integer-little-unsigned-unit:8>> || {_, OneOff} <- lists:sort(Offsets)>>.
buildSMIndexTable_8(Offsets, StartSize) ->
<<<<(OneOff + StartSize):8/integer-little-unsigned-unit:8>> || {_, OneOff} <- lists:sort(Offsets)>>.
compactIntegerList(Integer, AccList) ->
case Integer < 128 of

Carregando…
Cancelar
Salvar