From 23e9c840bad5c615008fbb9b89c4cc195dcd0866 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 10 Dec 2020 19:18:21 +0800 Subject: [PATCH] index table --- include/eVPack.hrl | 9 +++--- src/eVPack.erl | 71 ++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/include/eVPack.hrl b/include/eVPack.hrl index 79486a5..b984c8c 100644 --- a/include/eVPack.hrl +++ b/include/eVPack.hrl @@ -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选项 diff --git a/src/eVPack.erl b/src/eVPack.erl index 0ada4db..89f86a5 100644 --- a/src/eVPack.erl +++ b/src/eVPack.erl @@ -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), <>], AllSize}; + {[Header, IoData, buildSMIndexTable_8(Offsets, 9), <>], 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