Browse Source

优化改动

master
SisMaker 4 years ago
parent
commit
d03e7ba008
1 changed files with 56 additions and 54 deletions
  1. +56
    -54
      src/eVPack.erl

+ 56
- 54
src/eVPack.erl View File

@ -12,10 +12,12 @@
, decodePart/1
%% encode
, encodeIo/1
, encodeIol/1
, encodeBin/1
, encodeIo/3
, encodeIol/3
, encodeBin/3
%% other API
, encodeAtom/1
, encodeMap/3
, encodeList/3
@ -31,22 +33,22 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% encode %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec encodeIo(term()) -> {ok, vpack()} | {error, any()}.
encodeIo(Term) ->
-spec encodeIol(term()) -> vpack() | {error, any()}.
encodeIol(Term) ->
{VPack, _Size} = encoder(Term, ?VpArrDef, ?VpObjDef),
VPack.
-spec encodeBin(term()) -> {ok, vpack()} | {error, any()}.
-spec encodeBin(term()) -> vpack() | {error, any()}.
encodeBin(Term) ->
{VPack, _Size} = encoder(Term, ?VpArrDef, ?VpObjDef),
iolist_to_binary(VPack).
-spec encodeIo(term(), vpOpt(), vpOpt()) -> {ok, vpack()} | {error, any()}.
encodeIo(Term, ArrOpt, ObjOpt) ->
-spec encodeIol(term(), vpOpt(), vpOpt()) -> vpack() | {error, any()}.
encodeIol(Term, ArrOpt, ObjOpt) ->
{VPack, _Size} = encoder(Term, ArrOpt, ObjOpt),
VPack.
-spec encodeBin(term(), vpOpt(), vpOpt()) -> {ok, vpack()} | {error, any()}.
-spec encodeBin(term(), vpOpt(), vpOpt()) -> vpack() | {error, any()}.
encodeBin(Term, ArrOpt, ObjOpt) ->
{VPack, _Size} = encoder(Term, ArrOpt, ObjOpt),
iolist_to_binary(VPack).
@ -66,7 +68,7 @@ encoder(List, ArrOpt, ObjOpt) when erlang:is_list(List) ->
encoder({?blob, Blob}, _, _) when erlang:is_binary(Blob) ->
encodeBlob(Blob);
encoder(_Value, _, _) ->
erlang:throw({invalid_type, dataType(_Value), _Value}).
erlang:throw({error, {invalid_type, dataType(_Value), _Value}}).
dataType(Data) when is_list(Data) -> list;
dataType(Data) when is_integer(Data) -> integer;
@ -125,7 +127,7 @@ encodeInteger(-1) ->
encodeInteger(Integer) ->
if
Integer < -9223372036854775808 ->
erlang:throw(too_small_integer);
erlang:throw({error, too_small_integer});
Integer < -36028797018963968 ->
{<<39/integer, Integer:64/integer-little-signed>>, 9};
Integer < -140737488355328 ->
@ -159,7 +161,7 @@ encodeInteger(Integer) ->
Integer < 18446744073709551616 ->
{<<47/integer, Integer:64/integer-little-unsigned>>, 9};
true ->
erlang:throw(too_biger_integer)
erlang:throw({error, too_big_integer})
end.
encodeFloat(Float) ->
@ -173,7 +175,7 @@ encodeString(BinStr) ->
StrSize < 18446744073709551616 ->
{<<191/integer, StrSize:64/integer-little-unsigned, BinStr/binary>>, StrSize + 9};
true ->
erlang:throw(too_max_str)
erlang:throw({error, too_max_str})
end.
encodeBlob(Blob) ->
@ -196,7 +198,7 @@ encodeBlob(Blob) ->
StrSize < 18446744073709551616 ->
{<<199/integer, StrSize:64/integer-little-unsigned, Blob/binary>>, StrSize + 9};
true ->
erlang:throw(too_max_blob)
erlang:throw({error, too_max_blob})
end.
doEncodeMap(Iterator, ArrOpt, ObjOpt, AccList, SumSize) ->
@ -235,7 +237,7 @@ doEncodeMap([OneKeys | Left], Map, ArrOpt, ObjOpt, AccList, Offsets, SumSize) ->
{ValueEn, ValueSize} = encoder(Value, ArrOpt, ObjOpt),
doEncodeMap(Left, Map, ArrOpt, ObjOpt, [ValueEn, KeyEn | AccList], [SumSize | Offsets], SumSize + KeySize + ValueSize);
_ ->
erlang:throw({no_map_value, OneKeys})
erlang:throw({error, {no_map_value, OneKeys}})
end
end.
@ -292,7 +294,7 @@ encodeSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
Header = <<14/integer, AllSize:64/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_8(Offsets, 9), <<Count:64/integer-little-unsigned>>], AllSize};
true ->
erlang:throw(too_much_so_map_size)
erlang:throw({error, too_much_sort_map_size})
end.
encodeUnSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
@ -315,7 +317,7 @@ encodeUnSortMapIndexTable(IoData, Count, Offsets, SumSize) ->
Header = <<18/integer, AllSize:64/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_8(Offsets, 9), <<Count:64/integer-little-unsigned>>], AllSize};
true ->
erlang:throw(too_much_unso_map_size)
erlang:throw({error, too_much_unsort_map_size})
end.
buildIndexTable_1(Offsets, StartSize) ->
@ -366,7 +368,7 @@ encodeCompactData(Type, IoData, SumSize, Count) ->
asKey(Value) when erlang:is_atom(Value) -> erlang:atom_to_binary(Value, utf8);
asKey(Value) when erlang:is_binary(Value) -> Value;
asKey(_Value) -> erlang:error(invalid_key).
asKey(_Value) -> erlang:throw({error, invalid_key}).
doEncodeList([], _ArrOpt, _ObjOpt, AccList, SumSize, Count) ->
{AccList, SumSize, Count};
@ -431,7 +433,7 @@ encodeListWithoutIndexTable(IoData, SumSize) ->
Header = <<5/integer, AllSize:8/integer-little-unsigned-unit:8>>,
{[Header, IoData], AllSize};
true ->
erlang:throw(too_much_wo_list_size)
erlang:throw({error, too_much_wo_list_size})
end.
encodeListWithIndexTable(IoData, Count, Offsets, SumSize) ->
@ -454,7 +456,7 @@ encodeListWithIndexTable(IoData, Count, Offsets, SumSize) ->
Header = <<9/integer, AllSize:64/integer-little-unsigned>>,
{[Header, IoData, buildIndexTable_8(Offsets, 9), <<Count:64/integer-little-unsigned>>], AllSize};
true ->
erlang:throw(too_much_wi_list_size)
erlang:throw({error, too_much_wi_list_size})
end.
@ -479,29 +481,29 @@ decoder(DataBin) ->
<<Type/integer, RestBin/bitstring>> ->
decoder(Type, RestBin);
_ ->
erlang:throw(unexpected_end)
erlang:throw({error, unexpected_end})
end.
decoder(0, RestBin) ->
erlang:throw({unsupported_type, RestBin});
erlang:throw({error, {unsupported_type, RestBin}});
decoder(1, RestBin) ->
{[], RestBin};
decoder(2, RestBin) ->
parseArrayWithoutIndexTable(1, RestBin);
parseArrWithoutIndexTable(1, RestBin);
decoder(3, RestBin) ->
parseArrayWithoutIndexTable(2, RestBin);
parseArrWithoutIndexTable(2, RestBin);
decoder(4, RestBin) ->
parseArrayWithoutIndexTable(4, RestBin);
parseArrWithoutIndexTable(4, RestBin);
decoder(5, RestBin) ->
parseArrayWithoutIndexTable(8, RestBin);
parseArrWithoutIndexTable(8, RestBin);
decoder(6, RestBin) ->
parseArrayWithIndexTable(1, RestBin);
parseArrWithIndexTable(1, RestBin);
decoder(7, RestBin) ->
parseArrayWithIndexTable(2, RestBin);
parseArrWithIndexTable(2, RestBin);
decoder(8, RestBin) ->
parseArrayWithIndexTable(4, RestBin);
parseArrWithIndexTable(4, RestBin);
decoder(9, RestBin) ->
parseArrayWithIndexTable(8, RestBin);
parseArrWithIndexTable(8, RestBin);
decoder(10, RestBin) ->
{#{}, RestBin};
decoder(11, RestBin) ->
@ -521,13 +523,13 @@ decoder(17, RestBin) ->
decoder(18, RestBin) ->
parseObject(8, RestBin);
decoder(19, RestBin) ->
parseCompactArray(RestBin);
parseCompactArr(RestBin);
decoder(20, RestBin) ->
parseCompactObject(RestBin);
parseCompactObj(RestBin);
decoder(21, _RestBin) ->
erlang:throw({unsupported_type, 21});
erlang:throw({error, {unsupported_type, 21}});
decoder(22, _RestBin) ->
erlang:throw({unsupported_type, 22});
erlang:throw({error, {unsupported_type, 22}});
decoder(23, RestBin) ->
{illegal, RestBin};
decoder(24, RestBin) -> {undefined, RestBin};
@ -540,7 +542,7 @@ decoder(28, RestBin) ->
<<TimeMs:64/integer-little-unsigned, LeftBin/bitstring>> = RestBin,
{TimeMs, LeftBin};
decoder(29, _RestBin) ->
erlang:throw({unsupported_type, 29});
erlang:throw({error, {unsupported_type, 29}});
decoder(30, RestBin) ->
{minKey, RestBin};
decoder(31, RestBin) ->
@ -1443,7 +1445,7 @@ decoder(199, RestBin) ->
{BinStr, LeftBin}
end;
decoder(_, _) ->
erlang:throw(unexpected_end).
erlang:throw({error, unexpected_end}).
parseArrayElements(<<>>, AccList) -> lists:reverse(AccList);
@ -1451,7 +1453,7 @@ parseArrayElements(DataBin, AccList) ->
{Elem, Rest} = decoder(DataBin),
parseArrayElements(Rest, [Elem | AccList]).
parseArrayWithIndexTable(1, DataBin) ->
parseArrWithIndexTable(1, DataBin) ->
<<SumSize:8/integer-little-unsigned, Count:8/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = erlang:byte_size(RestBin),
DataLeftBin = skipZeros(RestBin),
@ -1460,7 +1462,7 @@ parseArrayWithIndexTable(1, DataBin) ->
<<ArrData:ArrSize/binary, _Index:Count/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithIndexTable(2, DataBin) ->
parseArrWithIndexTable(2, DataBin) ->
<<SumSize:16/integer-little-unsigned, Count:16/integer-little-unsigned, RestBin/binary>> = DataBin,
IndexSize = 2 * Count,
DataSize = erlang:byte_size(RestBin),
@ -1470,7 +1472,7 @@ parseArrayWithIndexTable(2, DataBin) ->
<<ArrData:ArrSize/binary, _Index:IndexSize/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithIndexTable(4, DataBin) ->
parseArrWithIndexTable(4, DataBin) ->
<<SumSize:32/integer-little-unsigned, Count:32/integer-little-unsigned, RestBin/binary>> = DataBin,
IndexSize = 4 * Count,
DataSize = erlang:byte_size(RestBin),
@ -1480,7 +1482,7 @@ parseArrayWithIndexTable(4, DataBin) ->
<<ArrData:ArrSize/binary, _Index:IndexSize/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithIndexTable(8, DataBin) ->
parseArrWithIndexTable(8, DataBin) ->
<<SumSize:64/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = SumSize - 17,
<<DataBin:DataSize/binary, Count:64/integer-little-unsigned, LeftBin/binary>> = RestBin,
@ -1490,7 +1492,7 @@ parseArrayWithIndexTable(8, DataBin) ->
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin}.
parseArrayWithoutIndexTable(1, DataBin) ->
parseArrWithoutIndexTable(1, DataBin) ->
<<SumSize:8/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = erlang:byte_size(RestBin),
DataLeftBin = skipZeros(RestBin),
@ -1499,7 +1501,7 @@ parseArrayWithoutIndexTable(1, DataBin) ->
<<ArrData:ArrSize/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithoutIndexTable(2, DataBin) ->
parseArrWithoutIndexTable(2, DataBin) ->
<<SumSize:16/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = erlang:byte_size(RestBin),
DataLeftBin = skipZeros(RestBin),
@ -1508,7 +1510,7 @@ parseArrayWithoutIndexTable(2, DataBin) ->
<<ArrData:ArrSize/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithoutIndexTable(4, DataBin) ->
parseArrWithoutIndexTable(4, DataBin) ->
<<SumSize:32/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = erlang:byte_size(RestBin),
DataLeftBin = skipZeros(RestBin),
@ -1517,7 +1519,7 @@ parseArrayWithoutIndexTable(4, DataBin) ->
<<ArrData:ArrSize/binary, LeftBin/binary>> = DataLeftBin,
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin};
parseArrayWithoutIndexTable(8, DataBin) ->
parseArrWithoutIndexTable(8, DataBin) ->
<<SumSize:64/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = erlang:byte_size(RestBin),
DataLeftBin = skipZeros(RestBin),
@ -1527,7 +1529,7 @@ parseArrayWithoutIndexTable(8, DataBin) ->
ArrList = parseArrayElements(ArrData, []),
{ArrList, LeftBin}.
parseCompactArray(DataBin) ->
parseCompactArr(DataBin) ->
{ArrData, _Length, RestBin} = parseCompactHeader(DataBin),
ArrList = parseArrayElements(ArrData, []),
{ArrList, RestBin}.
@ -1539,9 +1541,9 @@ parseCompactHeader(DataBin) ->
{Length, HeaderBin} = parseLength(ArrData, 0, 0, true),
{HeaderBin, Length, LeftBin}.
parseCompactObject(DataBin) ->
parseCompactObj(DataBin) ->
{ObjData, Length, RestBin} = parseCompactHeader(DataBin),
{Obj, <<>>} = parseObjectMembers(Length, #{}, ObjData),
{Obj, <<>>} = parseObjMembers(Length, #{}, ObjData),
{Obj, RestBin}.
parseInt(IntegerSize, DataBin) ->
@ -1567,44 +1569,44 @@ parseLength(DataBin, Len, Pt, Reverse) ->
NewPt = Pt + 7,
case LastV band 128 /= 0 of
false -> {NewLen, LeftBin};
true -> parseLength(LeftBin, NewLen, NewPt, Reverse)
_ -> parseLength(LeftBin, NewLen, NewPt, Reverse)
end.
parseObject(1, DataBin) ->
<<SumSize:8/integer-little-unsigned, Count:8/integer-little-unsigned, ObjBin/binary>> = DataBin,
DataSize = SumSize - 3,
<<ZerosBin:DataSize/binary, LeftBin/binary>> = ObjBin,
{Obj, <<_IndexTable:Count/binary>>} = parseObjectMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, <<_IndexTable:Count/binary>>} = parseObjMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, LeftBin};
parseObject(2, DataBin) ->
<<SumSize:16/integer-little-unsigned, Count:16/integer-little-unsigned, ObjBin/binary>> = DataBin,
DataSize = SumSize - 5,
<<ZerosBin:DataSize/binary, LeftBin/binary>> = ObjBin,
IndexTableSize = Count * 2,
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjectMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, LeftBin};
parseObject(4, DataBin) ->
<<SumSize:32/integer-little-unsigned, Count:32/integer-little-unsigned, ObjBin/binary>> = DataBin,
DataSize = SumSize - 9,
<<ZerosBin:DataSize/binary, LeftBin/binary>> = ObjBin,
IndexTableSize = Count * 4,
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjectMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjMembers(Count, #{}, skipZeros(ZerosBin)),
{Obj, LeftBin};
parseObject(8, DataBin) ->
<<SumSize:64/integer-little-unsigned, RestBin/binary>> = DataBin,
DataSize = SumSize - 17,
<<ObjBin:DataSize/binary, Count:64/integer-little-unsigned, LeftBin/binary>> = RestBin,
IndexTableSize = Count * 8,
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjectMembers(Count, #{}, skipZeros(ObjBin)),
{Obj, <<_IndexTable:IndexTableSize/binary>>} = parseObjMembers(Count, #{}, skipZeros(ObjBin)),
{Obj, LeftBin}.
parseObjectMembers(0, Obj, DataBin) ->
parseObjMembers(0, Obj, DataBin) ->
{Obj, DataBin};
parseObjectMembers(Length, Obj, DataBin) ->
parseObjMembers(Length, Obj, DataBin) ->
{Key, ValueDataBin} = decoder(DataBin),
{Value, LeftBin} = decoder(ValueDataBin),
NewObj = Obj#{Key => Value},
parseObjectMembers(Length - 1, NewObj, LeftBin).
parseObjMembers(Length - 1, NewObj, LeftBin).
skipZeros(<<0/integer, LeftBin/binary>>) ->
skipZeros(LeftBin);

Loading…
Cancel
Save