diff --git a/README.md b/README.md index 4cec7c9..d5045ae 100644 --- a/README.md +++ b/README.md @@ -112,4 +112,175 @@ Build ### 关于消息接收转发解码和发送 erlang通常会将接收到的消息由网关进程转发给其他工作进程, 建议先匹配消息id, 然后转发二进制消息到工作进程,然后由工作进程解码再处理 同时广播消息可先编码成二进制之后再广播, 避免重复编码 + +### 简单性能测评 + 主要和gpb做简单对比测试 + gpb测试相关文件在test/gpb目录下 + 测试协议: + gpb: + message test { + required string aa = 1; + } + + message phoneNumber { + required test number = 1; + required int32 type = 2; + } + + message person { + required string name = 1; + required int32 integer = 2; + optional string email = 3; + repeated phoneNumber phone = 4; + } + + message addressBook { + repeated person person1 = 1; + repeated person others = 2; + } + + message tint32 { + required int32 int1 = 1; + required int32 int2 = 2; + required int32 int3 = 3; + required int32 int4 = 4; + required int32 int5 = 5; + required int32 int6 = 6; + required int32 int7 = 7; + required int32 int8 = 8; + required int32 int9 = 9; + required int32 int10 = 10; + } + genProto用的协议: + + test { + string aa; + } + + phoneNumber{ + test number; + int32 type; + } + + person{ + string name; + int32 id; + string email; + list[phoneNumber] phone; + } + + addressBook { + list[person] person; + list[person] other; + } + + tint32{ + int32 int1; + int32 int2; + int32 int3; + int32 int4; + int32 int5; + int32 int6; + int32 int7; + int32 int8; + int32 int9; + int32 int10; + } + 测试运行三次 每次100万次循环 + tint32 gpb-------->> + tint32 encode: + > timer:tc(mytest, encode_int32, [1000000]). + {9625000,ok} + > timer:tc(mytest, encode_int32, [1000000]). + {9000000,ok} + > timer:tc(mytest, encode_int32, [1000000]). + {9969000,ok} + + tin32 decode: + > timer:tc(mytest, decode_int32, [1000000]). + {6217994,ok} + > timer:tc(mytest, decode_int32, [1000000]). + {6187993,ok} + > timer:tc(mytest, decode_int32, [1000000]). + {6265994,ok} + + size: + > BTInt32 = mytest:decode_int32(1). + <<8,1,16,255,255,255,255,255,255,255,255,255,1,24,128,1, + 32,128,255,255,255,255,255,255,255,255,1,40,128,...>> + 31> byte_size(BTInt32). + 74 + tint32 genProto ------->> + tint32 encode: + > timer:tc(test, encode_int32, [1000000]). + {328999,ok} + > timer:tc(test, encode_int32, [1000000]). + {328000,ok} + > timer:tc(test, encode_int32, [1000000]). + {344000,ok} + + tint32 decode: + > timer:tc(test, decode_int32, [1000000]). + {328000,ok} + > timer:tc(test, decode_int32, [1000000]). + {328000,ok} + > timer:tc(test, decode_int32, [1000000]). + {329000,ok} + + size: + > BTInt32 = test:decode_int32(1). + <<0,11,0,0,0,1,255,255,255,255,0,0,0,128,255,255,255,128, + 0,1,0,0,255,255,0,0,125,43,117,...>> + > byte_size(BTInt32). + 42 + =============================================================================== + =============================================================================== + addressBook gpb-------->> + addressBook encode: + > timer:tc(mytest, encode_addressBook, [1000000]). + {9108990,ok} + > timer:tc(mytest, encode_addressBook, [1000000]). + {8999991,ok} + > timer:tc(mytest, encode_addressBook, [1000000]). + {9031991,ok} + + addressBook decode: + > timer:tc(mytest, decode_addressBook, [1000000]). + {5702995,ok} + > timer:tc(mytest, decode_addressBook, [1000000]). + {5764994,ok} + > timer:tc(mytest, decode_addressBook, [1000000]). + {5718995,ok} + size: + > BAddr = mytest:decode_addressBook(1). + <<10,43,10,5,65,108,105,99,101,16,144,78,34,15,10,11,10,9, + 49,50,51,52,53,54,55,56,57,16,1,...>> + > byte_size(BAddr). + 75 + addressBook genProto -------->> + addressBook encode: + > timer:tc(test, encode_addressBook, [1000000]). + {4186995,ok} + > timer:tc(test, encode_addressBook, [1000000]). + {4202996,ok} + > timer:tc(test, encode_addressBook, [1000000]). + {4202996,ok} + addressBook decode: + > timer:tc(test, decode_addressBook, [1000000]). + {2749997,ok} + > timer:tc(test, decode_addressBook, [1000000]). + {2812997,ok} + > timer:tc(test, decode_addressBook, [1000000]). + {2812997,ok} + size: + BAddr = test:decode_addressBook(1). + <<0,4,0,2,0,5,65,108,105,99,101,0,0,39,16,0,0,0,2,1,0,9, + 49,50,51,52,53,54,55,...>> + 67> byte_size(BAddr). + 83 + + + + + \ No newline at end of file diff --git a/proto/0_test.mpdf b/proto/0_test.mpdf index e2dbeed..114bb3d 100644 --- a/proto/0_test.mpdf +++ b/proto/0_test.mpdf @@ -57,6 +57,14 @@ tuint16{ tint32{ int32 int1; int32 int2; + int32 int3; + int32 int4; + int32 int5; + int32 int6; + int32 int7; + int32 int8; + int32 int9; + int32 int10; } tuint32{ diff --git a/src/protoGen.erl b/src/protoGen.erl index 2956b5a..d511958 100644 --- a/src/protoGen.erl +++ b/src/protoGen.erl @@ -250,12 +250,13 @@ genEncodeRec({MsgName, MsgId, FieldList}, IsForBin) -> {Index - 1, ", V" ++ integer_to_list(Index) ++ StrAcc} end, {_, TemStr} = lists:foldr(FunHead, {FieldLen, "}) ->\n\t"}, FieldList), - case IsForBin of - true -> - HeadStr = "encode({" ++ MsgName ++ TemStr; - _ -> - HeadStr = "encodeRec({" ++ MsgName ++ TemStr - end, + HeadStr = + case IsForBin of + true -> + "encode({" ++ MsgName ++ TemStr; + _ -> + "encodeRec({" ++ MsgName ++ TemStr + end, FunBody = fun({FieldType, _FieldName}, {Index, PStrAcc}) -> @@ -684,7 +685,7 @@ convertDir(ProtoDir, HrlDir, ErlDir) -> MessageId1 > MessageId2 end, SProtoList), FunSpell = - fun({MsgName, MsgId, FieldList} = MsgInfo, {MsgHrlAcc, MsgIdAcc, MsgEncodeAcc, MsgDecodeAcc}) -> + fun({MsgName, _MsgId, FieldList} = MsgInfo, {MsgHrlAcc, _MsgIdAcc, MsgEncodeAcc, MsgDecodeAcc}) -> %% gen hrl str Len = erlang:length(FieldList), {_, Len, LastFieldStr} = lists:foldr(fun genMsgHrl/2, {Len, Len, ""}, FieldList), diff --git a/test/gpb/gpb.hrl b/test/gpb/gpb.hrl new file mode 100644 index 0000000..a7856ed --- /dev/null +++ b/test/gpb/gpb.hrl @@ -0,0 +1,117 @@ +-ifndef(gpb_hrl). +-define(gpb_hrl, true). + +-type gpb_scalar() :: + int32 | int64 | uint32 | uint64 | sint32 | sint64 + | fixed32 | fixed64 | sfixed32 | sfixed64 + | bool + | float | double + | string + | bytes. + +-type gpb_map_key() :: % "any scalar type except floating point types and bytes" + int32 | int64 | uint32 | uint64 | sint32 | sint64 + | fixed32 | fixed64 | sfixed32 | sfixed64 + | bool + | string. + +%% It is not possible to have maps in maps directly, +%% so this type is any gpb_field_type() except {map,K,V}. +-type gpb_map_value() :: + gpb_scalar() + | {enum,atom()} + | {msg,atom()}. + +-type gpb_field_type() :: %% Erlang type Comment + int32 | int64 % integer() variable-length encoded + | uint32 | uint64 % integer() variable-length encoded + | sint32 | sint64 % integer() variable-length zig-zag encoded + | fixed32 | fixed64 % integer() always 4 | 8 bytes on wire + | sfixed32 | sfixed64 % integer() always 4 | 8 bytes on wire + | bool % true | false + | float | double % float() + | string % string() UTF-8 encoded + % | binary() iff option `strings_as_binaries' + | bytes % binary() + | {enum,atom()} % atom() the enum literal is the atom + | {msg,atom()} % record() the message name is record name + % | map() iff option `maps' + | {group,atom()} % record() name is _ + % | map() iff option `maps' + | {map,gpb_map_key(),gpb_map_value()}. % [{K,V}] | map() + +%% An intermediary type temporarily used internally within gpb during parsing, +%% neither returned from gpb, nor accepted as input go gpb. +-type gpb_internal_intermediary_ref() :: + {ref, term()} | + {msg, list()} | + {group, list()} | + {enum, list()}. + +-type gpb_internal_intermediary_map_ref() :: + {map, gpb_map_key(), gpb_map_value() | gpb_internal_intermediary_ref()}. + +%% The following two definitions (`gpb_field' and `gpb_rpc') are to +%% avoid clashes with other code, since the `field' and `rpc' are +%% really too general names, they should have been prefixed. +%% +%% Unfortunately, they are already part of the API, so they can't +%% be changed without breaking backwards compatibility. +%% (They appear as parameters or return values for functions in `gpb' +%% in generated code.) +%% +%% In case a clash, it is possible to redefine the name locally. +%% The recommendation is to redefine them with prefix, ie to `gpb_field' +%% and `gpb_rpc', since this is what they will change to in some future. +%% +-ifdef(gpb_field_record_name). +-define(gpb_field, ?gpb_field_record_name). +-else. +-define(gpb_field, field). %% odd definition is due to backwards compatibility +-endif. + +-ifdef(gpb_rpc_record_name). +-define(gpb_rpc, ?gpb_rpc_record_name). +-else. +-define(gpb_rpc, rpc). %% odd definition is due to backwards compatibility +-endif. + +-record(?gpb_field, % NB: record name is (currently) `field' (not `gpb_field')! + {name :: atom() + | undefined, % temporarily in some phases + fnum :: integer() + | undefined, % temporarily in some phases + rnum :: pos_integer() % field number in the record + | undefined, % temporarily, during parsing + type :: gpb_field_type() | + gpb_internal_intermediary_ref() | + gpb_internal_intermediary_map_ref() + | undefined, % temporarily in some phases + occurrence :: 'required' | 'optional' | 'repeated' + | undefined, % temporarily in some phases + opts = [] :: [term()] + }). + +-record(gpb_oneof, + {name :: atom() + | undefined, % temporarily in some phases + rnum :: pos_integer() % field number in the record + | undefined, % temporarily, during parsing + fields :: [#?gpb_field{}] % all fields have the same rnum + | undefined % temporarily in some phases + }). + +-record(?gpb_rpc, % NB: record name is (currently) `rpc' (not `gpb_rpc')! + {name :: atom() + | undefined, % temporarily in some phases + input, + output, + input_stream :: boolean() + | undefined, % temporarily in some phases + output_stream :: boolean() + | undefined, % temporarily in some phases + opts :: [term()] + | undefined % temporarily in some phases + }). + +-endif. diff --git a/test/gpb/mytest.erl b/test/gpb/mytest.erl new file mode 100644 index 0000000..ea1d885 --- /dev/null +++ b/test/gpb/mytest.erl @@ -0,0 +1,2016 @@ +%% -*- coding: utf-8 -*- +%% @private +%% Automatically generated, do not edit +%% Generated by gpb_compile version 4.8.0 +-module(mytest). + +-export([encode_msg/1, encode_msg/2, encode_msg/3]). +-export([decode_msg/2, decode_msg/3]). +-export([merge_msgs/2, merge_msgs/3, merge_msgs/4]). +-export([verify_msg/1, verify_msg/2, verify_msg/3]). +-export([get_msg_defs/0]). +-export([get_msg_names/0]). +-export([get_group_names/0]). +-export([get_msg_or_group_names/0]). +-export([get_enum_names/0]). +-export([find_msg_def/1, fetch_msg_def/1]). +-export([find_enum_def/1, fetch_enum_def/1]). +-export([enum_symbol_by_value/2, enum_value_by_symbol/2]). +-export([get_service_names/0]). +-export([get_service_def/1]). +-export([get_rpc_names/1]). +-export([find_rpc_def/2, fetch_rpc_def/2]). +-export([fqbin_to_service_name/1]). +-export([service_name_to_fqbin/1]). +-export([fqbins_to_service_and_rpc_name/2]). +-export([service_and_rpc_name_to_fqbins/2]). +-export([fqbin_to_msg_name/1]). +-export([msg_name_to_fqbin/1]). +-export([fqbin_to_enum_name/1]). +-export([enum_name_to_fqbin/1]). +-export([get_package_name/0]). +-export([uses_packages/0]). +-export([source_basename/0]). +-export([get_all_source_basenames/0]). +-export([get_all_proto_names/0]). +-export([get_msg_containment/1]). +-export([get_pkg_containment/1]). +-export([get_service_containment/1]). +-export([get_rpc_containment/1]). +-export([get_enum_containment/1]). +-export([get_proto_by_msg_name_as_fqbin/1]). +-export([get_proto_by_service_name_as_fqbin/1]). +-export([get_proto_by_enum_name_as_fqbin/1]). +-export([get_protos_by_pkg_name_as_fqbin/1]). +-export([gpb_version_as_string/0, gpb_version_as_list/0]). + +-include("mytest.hrl"). +-include("gpb.hrl"). + +%% enumerated types + +-export_type([]). + +%% message types +-type test() :: #test{}. + +-type phoneNumber() :: #phoneNumber{}. + +-type person() :: #person{}. + +-type addressBook() :: #addressBook{}. + +-type tint32() :: #tint32{}. + +-export_type(['test'/0, 'phoneNumber'/0, 'person'/0, 'addressBook'/0, 'tint32'/0]). + +-compile(export_all). + +encode_int32(N) -> + TT = #tint32{int1 = 1, int2 = -1, int3 = 128, int4 = -128, int5 = 65536, + int6 = -65536, int7 = 2100000000, int8 = -2100000000, int9 = 678665, int10 = -678665}, + tt1(N, TT). + +tt1(0, TT) -> + ok; +tt1(N, TT) -> + encode_msg(TT), + tt1(N - 1, TT). + +decode_int32(N) -> + TT = #tint32{int1 = 1, int2 = -1, int3 = 128, int4 = -128, int5 = 65536, + int6 = -65536, int7 = 2100000000, int8 = -2100000000, int9 = 678665, int10 = -678665}, + Bin = encode_msg(TT), + tt2(N, Bin). + +tt2(0, Bin) -> + Bin; +tt2(N, Bin) -> + decode_msg(Bin, tint32), + tt2(N - 1, Bin). + +encode_addressBook(N) -> + Add = #addressBook{ + person1 = [ + #person{ + name = "Alice", + integer = 10000, + phone = [ + #phoneNumber{number = #test{aa = "123456789"}, type = 1}, + #phoneNumber{number = #test{aa = "87654321"}, type = 2} + ] + }, + #person{ + name = "Bob", + integer = 20000, + phone = [ + #phoneNumber{number = #test{aa = "01234567890"}, type = 3} + ] + } + ] + }, + tt3(N, Add). + +tt3(0, Add) -> + ok; +tt3(N, Add) -> + encode_msg(Add), + tt3(N - 1, Add). + + +decode_addressBook(N) -> + AddressBook = #addressBook{ + person1 = [ + #person{ + name = "Alice", + integer = 10000, + phone = [ + #phoneNumber{number = #test{aa = "123456789"}, type = 1}, + #phoneNumber{number = #test{aa = "87654321"}, type = 2} + ] + }, + #person{ + name = "Bob", + integer = 20000, + phone = [ + #phoneNumber{number = #test{aa = "01234567890"}, type = 3} + ] + } + ] + }, + Bin = encode_msg(AddressBook), + tt4(N, Bin). +tt4(0, Bin) -> + Bin; +tt4(N, Bin) -> + decode_msg(Bin, addressBook), + tt4(N - 1, Bin). + + +-spec encode_msg(#test{} | #phoneNumber{} | #person{} | #addressBook{} | #tint32{}) -> binary(). +encode_msg(Msg) when tuple_size(Msg) >= 1 -> + encode_msg(Msg, element(1, Msg), []). + +-spec encode_msg(#test{} | #phoneNumber{} | #person{} | #addressBook{} | #tint32{}, atom() | list()) -> binary(). +encode_msg(Msg, MsgName) when is_atom(MsgName) -> + encode_msg(Msg, MsgName, []); +encode_msg(Msg, Opts) + when tuple_size(Msg) >= 1, is_list(Opts) -> + encode_msg(Msg, element(1, Msg), Opts). + +-spec encode_msg(#test{} | #phoneNumber{} | #person{} | #addressBook{} | #tint32{}, atom(), list()) -> binary(). +encode_msg(Msg, MsgName, Opts) -> + case proplists:get_bool(verify, Opts) of + true -> verify_msg(Msg, MsgName, Opts); + false -> ok + end, + TrUserData = proplists:get_value(user_data, Opts), + case MsgName of + test -> + encode_msg_test(id(Msg, TrUserData), TrUserData); + phoneNumber -> + encode_msg_phoneNumber(id(Msg, TrUserData), TrUserData); + person -> + encode_msg_person(id(Msg, TrUserData), TrUserData); + addressBook -> + encode_msg_addressBook(id(Msg, TrUserData), TrUserData); + tint32 -> + encode_msg_tint32(id(Msg, TrUserData), TrUserData) + end. + + +encode_msg_test(Msg, TrUserData) -> + encode_msg_test(Msg, <<>>, TrUserData). + + +encode_msg_test(#test{aa = F1}, Bin, TrUserData) -> + begin + TrF1 = id(F1, TrUserData), + e_type_string(TrF1, <>, TrUserData) + end. + +encode_msg_phoneNumber(Msg, TrUserData) -> + encode_msg_phoneNumber(Msg, <<>>, TrUserData). + + +encode_msg_phoneNumber(#phoneNumber{number = F1, + type = F2}, + Bin, TrUserData) -> + B1 = begin + TrF1 = id(F1, TrUserData), + e_mfield_phoneNumber_number(TrF1, <>, + TrUserData) + end, + begin + TrF2 = id(F2, TrUserData), + e_type_int32(TrF2, <>, TrUserData) + end. + +encode_msg_person(Msg, TrUserData) -> + encode_msg_person(Msg, <<>>, TrUserData). + + +encode_msg_person(#person{name = F1, integer = F2, + email = F3, phone = F4}, + Bin, TrUserData) -> + B1 = begin + TrF1 = id(F1, TrUserData), + e_type_string(TrF1, <>, TrUserData) + end, + B2 = begin + TrF2 = id(F2, TrUserData), + e_type_int32(TrF2, <>, TrUserData) + end, + B3 = if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + e_type_string(TrF3, <>, TrUserData) + end + end, + begin + TrF4 = id(F4, TrUserData), + if TrF4 == [] -> B3; + true -> e_field_person_phone(TrF4, B3, TrUserData) + end + end. + +encode_msg_addressBook(Msg, TrUserData) -> + encode_msg_addressBook(Msg, <<>>, TrUserData). + + +encode_msg_addressBook(#addressBook{person1 = F1, + others = F2}, + Bin, TrUserData) -> + B1 = begin + TrF1 = id(F1, TrUserData), + if TrF1 == [] -> Bin; + true -> + e_field_addressBook_person1(TrF1, Bin, TrUserData) + end + end, + begin + TrF2 = id(F2, TrUserData), + if TrF2 == [] -> B1; + true -> e_field_addressBook_others(TrF2, B1, TrUserData) + end + end. + +encode_msg_tint32(Msg, TrUserData) -> + encode_msg_tint32(Msg, <<>>, TrUserData). + + +encode_msg_tint32(#tint32{int1 = F1, int2 = F2, + int3 = F3, int4 = F4, int5 = F5, int6 = F6, int7 = F7, + int8 = F8, int9 = F9, int10 = F10}, + Bin, TrUserData) -> + B1 = begin + TrF1 = id(F1, TrUserData), + e_type_int32(TrF1, <>, TrUserData) + end, + B2 = begin + TrF2 = id(F2, TrUserData), + e_type_int32(TrF2, <>, TrUserData) + end, + B3 = begin + TrF3 = id(F3, TrUserData), + e_type_int32(TrF3, <>, TrUserData) + end, + B4 = begin + TrF4 = id(F4, TrUserData), + e_type_int32(TrF4, <>, TrUserData) + end, + B5 = begin + TrF5 = id(F5, TrUserData), + e_type_int32(TrF5, <>, TrUserData) + end, + B6 = begin + TrF6 = id(F6, TrUserData), + e_type_int32(TrF6, <>, TrUserData) + end, + B7 = begin + TrF7 = id(F7, TrUserData), + e_type_int32(TrF7, <>, TrUserData) + end, + B8 = begin + TrF8 = id(F8, TrUserData), + e_type_int32(TrF8, <>, TrUserData) + end, + B9 = begin + TrF9 = id(F9, TrUserData), + e_type_int32(TrF9, <>, TrUserData) + end, + begin + TrF10 = id(F10, TrUserData), + e_type_int32(TrF10, <>, TrUserData) + end. + +e_mfield_phoneNumber_number(Msg, Bin, TrUserData) -> + SubBin = encode_msg_test(Msg, <<>>, TrUserData), + Bin2 = e_varint(byte_size(SubBin), Bin), + <>. + +e_mfield_person_phone(Msg, Bin, TrUserData) -> + SubBin = encode_msg_phoneNumber(Msg, <<>>, TrUserData), + Bin2 = e_varint(byte_size(SubBin), Bin), + <>. + +e_field_person_phone([Elem | Rest], Bin, TrUserData) -> + Bin2 = <>, + Bin3 = e_mfield_person_phone(id(Elem, TrUserData), Bin2, + TrUserData), + e_field_person_phone(Rest, Bin3, TrUserData); +e_field_person_phone([], Bin, _TrUserData) -> Bin. + +e_mfield_addressBook_person1(Msg, Bin, TrUserData) -> + SubBin = encode_msg_person(Msg, <<>>, TrUserData), + Bin2 = e_varint(byte_size(SubBin), Bin), + <>. + +e_field_addressBook_person1([Elem | Rest], Bin, + TrUserData) -> + Bin2 = <>, + Bin3 = e_mfield_addressBook_person1(id(Elem, + TrUserData), + Bin2, TrUserData), + e_field_addressBook_person1(Rest, Bin3, TrUserData); +e_field_addressBook_person1([], Bin, _TrUserData) -> + Bin. + +e_mfield_addressBook_others(Msg, Bin, TrUserData) -> + SubBin = encode_msg_person(Msg, <<>>, TrUserData), + Bin2 = e_varint(byte_size(SubBin), Bin), + <>. + +e_field_addressBook_others([Elem | Rest], Bin, + TrUserData) -> + Bin2 = <>, + Bin3 = e_mfield_addressBook_others(id(Elem, TrUserData), + Bin2, TrUserData), + e_field_addressBook_others(Rest, Bin3, TrUserData); +e_field_addressBook_others([], Bin, _TrUserData) -> Bin. + +-compile({nowarn_unused_function,e_type_sint/3}). +e_type_sint(Value, Bin, _TrUserData) when Value >= 0 -> + e_varint(Value * 2, Bin); +e_type_sint(Value, Bin, _TrUserData) -> + e_varint(Value * -2 - 1, Bin). + +-compile({nowarn_unused_function,e_type_int32/3}). +e_type_int32(Value, Bin, _TrUserData) + when 0 =< Value, Value =< 127 -> + <>; +e_type_int32(Value, Bin, _TrUserData) -> + <> = <>, + e_varint(N, Bin). + +-compile({nowarn_unused_function,e_type_int64/3}). +e_type_int64(Value, Bin, _TrUserData) + when 0 =< Value, Value =< 127 -> + <>; +e_type_int64(Value, Bin, _TrUserData) -> + <> = <>, + e_varint(N, Bin). + +-compile({nowarn_unused_function,e_type_bool/3}). +e_type_bool(true, Bin, _TrUserData) -> + <>; +e_type_bool(false, Bin, _TrUserData) -> + <>; +e_type_bool(1, Bin, _TrUserData) -> <>; +e_type_bool(0, Bin, _TrUserData) -> <>. + +-compile({nowarn_unused_function,e_type_string/3}). +e_type_string(S, Bin, _TrUserData) -> + Utf8 = unicode:characters_to_binary(S), + Bin2 = e_varint(byte_size(Utf8), Bin), + <>. + +-compile({nowarn_unused_function,e_type_bytes/3}). +e_type_bytes(Bytes, Bin, _TrUserData) + when is_binary(Bytes) -> + Bin2 = e_varint(byte_size(Bytes), Bin), + <>; +e_type_bytes(Bytes, Bin, _TrUserData) + when is_list(Bytes) -> + BytesBin = iolist_to_binary(Bytes), + Bin2 = e_varint(byte_size(BytesBin), Bin), + <>. + +-compile({nowarn_unused_function,e_type_fixed32/3}). +e_type_fixed32(Value, Bin, _TrUserData) -> + <>. + +-compile({nowarn_unused_function,e_type_sfixed32/3}). +e_type_sfixed32(Value, Bin, _TrUserData) -> + <>. + +-compile({nowarn_unused_function,e_type_fixed64/3}). +e_type_fixed64(Value, Bin, _TrUserData) -> + <>. + +-compile({nowarn_unused_function,e_type_sfixed64/3}). +e_type_sfixed64(Value, Bin, _TrUserData) -> + <>. + +-compile({nowarn_unused_function,e_type_float/3}). +e_type_float(V, Bin, _) when is_number(V) -> + <>; +e_type_float(infinity, Bin, _) -> + <>; +e_type_float('-infinity', Bin, _) -> + <>; +e_type_float(nan, Bin, _) -> + <>. + +-compile({nowarn_unused_function,e_type_double/3}). +e_type_double(V, Bin, _) when is_number(V) -> + <>; +e_type_double(infinity, Bin, _) -> + <>; +e_type_double('-infinity', Bin, _) -> + <>; +e_type_double(nan, Bin, _) -> + <>. + +-compile({nowarn_unused_function,e_varint/3}). +e_varint(N, Bin, _TrUserData) -> e_varint(N, Bin). + +-compile({nowarn_unused_function,e_varint/2}). +e_varint(N, Bin) when N =< 127 -> <>; +e_varint(N, Bin) -> + Bin2 = <>, + e_varint(N bsr 7, Bin2). + + +decode_msg(Bin, MsgName) when is_binary(Bin) -> + decode_msg(Bin, MsgName, []). + +decode_msg(Bin, MsgName, Opts) when is_binary(Bin) -> + TrUserData = proplists:get_value(user_data, Opts), + decode_msg_1_catch(Bin, MsgName, TrUserData). + +-ifdef('OTP_RELEASE'). +decode_msg_1_catch(Bin, MsgName, TrUserData) -> + try decode_msg_2_doit(MsgName, Bin, TrUserData) + catch Class:Reason:StackTrace -> error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}}) + end. +-else. +decode_msg_1_catch(Bin, MsgName, TrUserData) -> + try decode_msg_2_doit(MsgName, Bin, TrUserData) + catch Class:Reason -> + StackTrace = erlang:get_stacktrace(), + error({gpb_error,{decoding_failure, {Bin, MsgName, {Class, Reason, StackTrace}}}}) + end. +-endif. + +decode_msg_2_doit(test, Bin, TrUserData) -> + id(decode_msg_test(Bin, TrUserData), TrUserData); +decode_msg_2_doit(phoneNumber, Bin, TrUserData) -> + id(decode_msg_phoneNumber(Bin, TrUserData), TrUserData); +decode_msg_2_doit(person, Bin, TrUserData) -> + id(decode_msg_person(Bin, TrUserData), TrUserData); +decode_msg_2_doit(addressBook, Bin, TrUserData) -> + id(decode_msg_addressBook(Bin, TrUserData), TrUserData); +decode_msg_2_doit(tint32, Bin, TrUserData) -> + id(decode_msg_tint32(Bin, TrUserData), TrUserData). + + + +decode_msg_test(Bin, TrUserData) -> + dfp_read_field_def_test(Bin, 0, 0, + id(undefined, TrUserData), TrUserData). + +dfp_read_field_def_test(<<10, Rest/binary>>, Z1, Z2, + F@_1, TrUserData) -> + d_field_test_aa(Rest, Z1, Z2, F@_1, TrUserData); +dfp_read_field_def_test(<<>>, 0, 0, F@_1, _) -> + #test{aa = F@_1}; +dfp_read_field_def_test(Other, Z1, Z2, F@_1, + TrUserData) -> + dg_read_field_def_test(Other, Z1, Z2, F@_1, TrUserData). + +dg_read_field_def_test(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, TrUserData) + when N < 32 - 7 -> + dg_read_field_def_test(Rest, N + 7, X bsl N + Acc, F@_1, + TrUserData); +dg_read_field_def_test(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 10 -> d_field_test_aa(Rest, 0, 0, F@_1, TrUserData); + _ -> + case Key band 7 of + 0 -> skip_varint_test(Rest, 0, 0, F@_1, TrUserData); + 1 -> skip_64_test(Rest, 0, 0, F@_1, TrUserData); + 2 -> + skip_length_delimited_test(Rest, 0, 0, F@_1, + TrUserData); + 3 -> + skip_group_test(Rest, Key bsr 3, 0, F@_1, TrUserData); + 5 -> skip_32_test(Rest, 0, 0, F@_1, TrUserData) + end + end; +dg_read_field_def_test(<<>>, 0, 0, F@_1, _) -> + #test{aa = F@_1}. + +d_field_test_aa(<<1:1, X:7, Rest/binary>>, N, Acc, F@_1, + TrUserData) + when N < 57 -> + d_field_test_aa(Rest, N + 7, X bsl N + Acc, F@_1, + TrUserData); +d_field_test_aa(<<0:1, X:7, Rest/binary>>, N, Acc, _, + TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(unicode:characters_to_list(Utf8, unicode), + TrUserData), + Rest2} + end, + dfp_read_field_def_test(RestF, 0, 0, NewFValue, + TrUserData). + +skip_varint_test(<<1:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, TrUserData) -> + skip_varint_test(Rest, Z1, Z2, F@_1, TrUserData); +skip_varint_test(<<0:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, TrUserData) -> + dfp_read_field_def_test(Rest, Z1, Z2, F@_1, TrUserData). + +skip_length_delimited_test(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, TrUserData) + when N < 57 -> + skip_length_delimited_test(Rest, N + 7, X bsl N + Acc, + F@_1, TrUserData); +skip_length_delimited_test(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_test(Rest2, 0, 0, F@_1, TrUserData). + +skip_group_test(Bin, FNum, Z2, F@_1, TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_test(Rest, 0, Z2, F@_1, TrUserData). + +skip_32_test(<<_:32, Rest/binary>>, Z1, Z2, F@_1, + TrUserData) -> + dfp_read_field_def_test(Rest, Z1, Z2, F@_1, TrUserData). + +skip_64_test(<<_:64, Rest/binary>>, Z1, Z2, F@_1, + TrUserData) -> + dfp_read_field_def_test(Rest, Z1, Z2, F@_1, TrUserData). + +decode_msg_phoneNumber(Bin, TrUserData) -> + dfp_read_field_def_phoneNumber(Bin, 0, 0, + id(undefined, TrUserData), + id(undefined, TrUserData), TrUserData). + +dfp_read_field_def_phoneNumber(<<10, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + d_field_phoneNumber_number(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +dfp_read_field_def_phoneNumber(<<16, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + d_field_phoneNumber_type(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +dfp_read_field_def_phoneNumber(<<>>, 0, 0, F@_1, F@_2, + _) -> + #phoneNumber{number = F@_1, type = F@_2}; +dfp_read_field_def_phoneNumber(Other, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dg_read_field_def_phoneNumber(Other, Z1, Z2, F@_1, F@_2, + TrUserData). + +dg_read_field_def_phoneNumber(<<1:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) + when N < 32 - 7 -> + dg_read_field_def_phoneNumber(Rest, N + 7, + X bsl N + Acc, F@_1, F@_2, TrUserData); +dg_read_field_def_phoneNumber(<<0:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 10 -> + d_field_phoneNumber_number(Rest, 0, 0, F@_1, F@_2, + TrUserData); + 16 -> + d_field_phoneNumber_type(Rest, 0, 0, F@_1, F@_2, + TrUserData); + _ -> + case Key band 7 of + 0 -> + skip_varint_phoneNumber(Rest, 0, 0, F@_1, F@_2, + TrUserData); + 1 -> + skip_64_phoneNumber(Rest, 0, 0, F@_1, F@_2, TrUserData); + 2 -> + skip_length_delimited_phoneNumber(Rest, 0, 0, F@_1, + F@_2, TrUserData); + 3 -> + skip_group_phoneNumber(Rest, Key bsr 3, 0, F@_1, F@_2, + TrUserData); + 5 -> + skip_32_phoneNumber(Rest, 0, 0, F@_1, F@_2, TrUserData) + end + end; +dg_read_field_def_phoneNumber(<<>>, 0, 0, F@_1, F@_2, + _) -> + #phoneNumber{number = F@_1, type = F@_2}. + +d_field_phoneNumber_number(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + d_field_phoneNumber_number(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, TrUserData); +d_field_phoneNumber_number(<<0:1, X:7, Rest/binary>>, N, + Acc, Prev, F@_2, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(decode_msg_test(Bs, TrUserData), TrUserData), + Rest2} + end, + dfp_read_field_def_phoneNumber(RestF, 0, 0, + if Prev == undefined -> NewFValue; + true -> + merge_msg_test(Prev, NewFValue, + TrUserData) + end, + F@_2, TrUserData). + +d_field_phoneNumber_type(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + d_field_phoneNumber_type(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, TrUserData); +d_field_phoneNumber_type(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, _, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_phoneNumber(RestF, 0, 0, F@_1, + NewFValue, TrUserData). + +skip_varint_phoneNumber(<<1:1, _:7, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + skip_varint_phoneNumber(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +skip_varint_phoneNumber(<<0:1, _:7, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + dfp_read_field_def_phoneNumber(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +skip_length_delimited_phoneNumber(<<1:1, X:7, + Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + skip_length_delimited_phoneNumber(Rest, N + 7, + X bsl N + Acc, F@_1, F@_2, TrUserData); +skip_length_delimited_phoneNumber(<<0:1, X:7, + Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_phoneNumber(Rest2, 0, 0, F@_1, F@_2, + TrUserData). + +skip_group_phoneNumber(Bin, FNum, Z2, F@_1, F@_2, + TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_phoneNumber(Rest, 0, Z2, F@_1, F@_2, + TrUserData). + +skip_32_phoneNumber(<<_:32, Rest/binary>>, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dfp_read_field_def_phoneNumber(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +skip_64_phoneNumber(<<_:64, Rest/binary>>, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dfp_read_field_def_phoneNumber(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +decode_msg_person(Bin, TrUserData) -> + dfp_read_field_def_person(Bin, 0, 0, + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), id([], TrUserData), + TrUserData). + +dfp_read_field_def_person(<<10, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + d_field_person_name(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, TrUserData); +dfp_read_field_def_person(<<16, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + d_field_person_integer(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, TrUserData); +dfp_read_field_def_person(<<26, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + d_field_person_email(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, TrUserData); +dfp_read_field_def_person(<<34, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + d_field_person_phone(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, TrUserData); +dfp_read_field_def_person(<<>>, 0, 0, F@_1, F@_2, F@_3, + R1, TrUserData) -> + #person{name = F@_1, integer = F@_2, email = F@_3, + phone = lists_reverse(R1, TrUserData)}; +dfp_read_field_def_person(Other, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, TrUserData) -> + dg_read_field_def_person(Other, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, TrUserData). + +dg_read_field_def_person(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 32 - 7 -> + dg_read_field_def_person(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, F@_3, F@_4, TrUserData); +dg_read_field_def_person(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, F@_3, F@_4, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 10 -> + d_field_person_name(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData); + 16 -> + d_field_person_integer(Rest, 0, 0, F@_1, F@_2, F@_3, + F@_4, TrUserData); + 26 -> + d_field_person_email(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData); + 34 -> + d_field_person_phone(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData); + _ -> + case Key band 7 of + 0 -> + skip_varint_person(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData); + 1 -> + skip_64_person(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData); + 2 -> + skip_length_delimited_person(Rest, 0, 0, F@_1, F@_2, + F@_3, F@_4, TrUserData); + 3 -> + skip_group_person(Rest, Key bsr 3, 0, F@_1, F@_2, F@_3, + F@_4, TrUserData); + 5 -> + skip_32_person(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + TrUserData) + end + end; +dg_read_field_def_person(<<>>, 0, 0, F@_1, F@_2, F@_3, + R1, TrUserData) -> + #person{name = F@_1, integer = F@_2, email = F@_3, + phone = lists_reverse(R1, TrUserData)}. + +d_field_person_name(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 57 -> + d_field_person_name(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, TrUserData); +d_field_person_name(<<0:1, X:7, Rest/binary>>, N, Acc, + _, F@_2, F@_3, F@_4, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(unicode:characters_to_list(Utf8, unicode), + TrUserData), + Rest2} + end, + dfp_read_field_def_person(RestF, 0, 0, NewFValue, F@_2, + F@_3, F@_4, TrUserData). + +d_field_person_integer(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 57 -> + d_field_person_integer(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, TrUserData); +d_field_person_integer(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, _, F@_3, F@_4, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_person(RestF, 0, 0, F@_1, NewFValue, + F@_3, F@_4, TrUserData). + +d_field_person_email(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 57 -> + d_field_person_email(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, TrUserData); +d_field_person_email(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, _, F@_4, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(unicode:characters_to_list(Utf8, unicode), + TrUserData), + Rest2} + end, + dfp_read_field_def_person(RestF, 0, 0, F@_1, F@_2, + NewFValue, F@_4, TrUserData). + +d_field_person_phone(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 57 -> + d_field_person_phone(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, TrUserData); +d_field_person_phone(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, Prev, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(decode_msg_phoneNumber(Bs, TrUserData), + TrUserData), + Rest2} + end, + dfp_read_field_def_person(RestF, 0, 0, F@_1, F@_2, F@_3, + cons(NewFValue, Prev, TrUserData), TrUserData). + +skip_varint_person(<<1:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + skip_varint_person(Rest, Z1, Z2, F@_1, F@_2, F@_3, F@_4, + TrUserData); +skip_varint_person(<<0:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, TrUserData) -> + dfp_read_field_def_person(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, TrUserData). + +skip_length_delimited_person(<<1:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, F@_3, F@_4, TrUserData) + when N < 57 -> + skip_length_delimited_person(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, F@_3, F@_4, TrUserData); +skip_length_delimited_person(<<0:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, F@_3, F@_4, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_person(Rest2, 0, 0, F@_1, F@_2, F@_3, + F@_4, TrUserData). + +skip_group_person(Bin, FNum, Z2, F@_1, F@_2, F@_3, F@_4, + TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_person(Rest, 0, Z2, F@_1, F@_2, F@_3, + F@_4, TrUserData). + +skip_32_person(<<_:32, Rest/binary>>, Z1, Z2, F@_1, + F@_2, F@_3, F@_4, TrUserData) -> + dfp_read_field_def_person(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, TrUserData). + +skip_64_person(<<_:64, Rest/binary>>, Z1, Z2, F@_1, + F@_2, F@_3, F@_4, TrUserData) -> + dfp_read_field_def_person(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, TrUserData). + +decode_msg_addressBook(Bin, TrUserData) -> + dfp_read_field_def_addressBook(Bin, 0, 0, + id([], TrUserData), id([], TrUserData), + TrUserData). + +dfp_read_field_def_addressBook(<<10, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + d_field_addressBook_person1(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +dfp_read_field_def_addressBook(<<18, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + d_field_addressBook_others(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +dfp_read_field_def_addressBook(<<>>, 0, 0, R1, R2, + TrUserData) -> + #addressBook{person1 = lists_reverse(R1, TrUserData), + others = lists_reverse(R2, TrUserData)}; +dfp_read_field_def_addressBook(Other, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dg_read_field_def_addressBook(Other, Z1, Z2, F@_1, F@_2, + TrUserData). + +dg_read_field_def_addressBook(<<1:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) + when N < 32 - 7 -> + dg_read_field_def_addressBook(Rest, N + 7, + X bsl N + Acc, F@_1, F@_2, TrUserData); +dg_read_field_def_addressBook(<<0:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 10 -> + d_field_addressBook_person1(Rest, 0, 0, F@_1, F@_2, + TrUserData); + 18 -> + d_field_addressBook_others(Rest, 0, 0, F@_1, F@_2, + TrUserData); + _ -> + case Key band 7 of + 0 -> + skip_varint_addressBook(Rest, 0, 0, F@_1, F@_2, + TrUserData); + 1 -> + skip_64_addressBook(Rest, 0, 0, F@_1, F@_2, TrUserData); + 2 -> + skip_length_delimited_addressBook(Rest, 0, 0, F@_1, + F@_2, TrUserData); + 3 -> + skip_group_addressBook(Rest, Key bsr 3, 0, F@_1, F@_2, + TrUserData); + 5 -> + skip_32_addressBook(Rest, 0, 0, F@_1, F@_2, TrUserData) + end + end; +dg_read_field_def_addressBook(<<>>, 0, 0, R1, R2, + TrUserData) -> + #addressBook{person1 = lists_reverse(R1, TrUserData), + others = lists_reverse(R2, TrUserData)}. + +d_field_addressBook_person1(<<1:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + d_field_addressBook_person1(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, TrUserData); +d_field_addressBook_person1(<<0:1, X:7, Rest/binary>>, + N, Acc, Prev, F@_2, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(decode_msg_person(Bs, TrUserData), TrUserData), + Rest2} + end, + dfp_read_field_def_addressBook(RestF, 0, 0, + cons(NewFValue, Prev, TrUserData), F@_2, + TrUserData). + +d_field_addressBook_others(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + d_field_addressBook_others(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, TrUserData); +d_field_addressBook_others(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, Prev, TrUserData) -> + {NewFValue, RestF} = begin + Len = X bsl N + Acc, + <> = Rest, + {id(decode_msg_person(Bs, TrUserData), TrUserData), + Rest2} + end, + dfp_read_field_def_addressBook(RestF, 0, 0, F@_1, + cons(NewFValue, Prev, TrUserData), + TrUserData). + +skip_varint_addressBook(<<1:1, _:7, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + skip_varint_addressBook(Rest, Z1, Z2, F@_1, F@_2, + TrUserData); +skip_varint_addressBook(<<0:1, _:7, Rest/binary>>, Z1, + Z2, F@_1, F@_2, TrUserData) -> + dfp_read_field_def_addressBook(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +skip_length_delimited_addressBook(<<1:1, X:7, + Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) + when N < 57 -> + skip_length_delimited_addressBook(Rest, N + 7, + X bsl N + Acc, F@_1, F@_2, TrUserData); +skip_length_delimited_addressBook(<<0:1, X:7, + Rest/binary>>, + N, Acc, F@_1, F@_2, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_addressBook(Rest2, 0, 0, F@_1, F@_2, + TrUserData). + +skip_group_addressBook(Bin, FNum, Z2, F@_1, F@_2, + TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_addressBook(Rest, 0, Z2, F@_1, F@_2, + TrUserData). + +skip_32_addressBook(<<_:32, Rest/binary>>, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dfp_read_field_def_addressBook(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +skip_64_addressBook(<<_:64, Rest/binary>>, Z1, Z2, F@_1, + F@_2, TrUserData) -> + dfp_read_field_def_addressBook(Rest, Z1, Z2, F@_1, F@_2, + TrUserData). + +decode_msg_tint32(Bin, TrUserData) -> + dfp_read_field_def_tint32(Bin, 0, 0, + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), + id(undefined, TrUserData), TrUserData). + +dfp_read_field_def_tint32(<<8, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int1(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<16, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int2(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<24, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int3(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<32, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int4(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<40, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int5(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<48, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int6(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<56, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int7(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<64, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int8(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<72, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int9(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<80, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + d_field_tint32_int10(Rest, Z1, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +dfp_read_field_def_tint32(<<>>, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, _) -> + #tint32{int1 = F@_1, int2 = F@_2, int3 = F@_3, + int4 = F@_4, int5 = F@_5, int6 = F@_6, int7 = F@_7, + int8 = F@_8, int9 = F@_9, int10 = F@_10}; +dfp_read_field_def_tint32(Other, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData) -> + dg_read_field_def_tint32(Other, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +dg_read_field_def_tint32(<<1:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, + F@_9, F@_10, TrUserData) + when N < 32 - 7 -> + dg_read_field_def_tint32(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, + F@_9, F@_10, TrUserData); +dg_read_field_def_tint32(<<0:1, X:7, Rest/binary>>, N, + Acc, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, + F@_9, F@_10, TrUserData) -> + Key = X bsl N + Acc, + case Key of + 8 -> + d_field_tint32_int1(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 16 -> + d_field_tint32_int2(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 24 -> + d_field_tint32_int3(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 32 -> + d_field_tint32_int4(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 40 -> + d_field_tint32_int5(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 48 -> + d_field_tint32_int6(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 56 -> + d_field_tint32_int7(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 64 -> + d_field_tint32_int8(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 72 -> + d_field_tint32_int9(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 80 -> + d_field_tint32_int10(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + _ -> + case Key band 7 of + 0 -> + skip_varint_tint32(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); + 1 -> + skip_64_tint32(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, + F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); + 2 -> + skip_length_delimited_tint32(Rest, 0, 0, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, + F@_9, F@_10, TrUserData); + 3 -> + skip_group_tint32(Rest, Key bsr 3, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); + 5 -> + skip_32_tint32(Rest, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, + F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData) + end + end; +dg_read_field_def_tint32(<<>>, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, _) -> + #tint32{int1 = F@_1, int2 = F@_2, int3 = F@_3, + int4 = F@_4, int5 = F@_5, int6 = F@_6, int7 = F@_7, + int8 = F@_8, int9 = F@_9, int10 = F@_10}. + +d_field_tint32_int1(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int1(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int1(<<0:1, X:7, Rest/binary>>, N, Acc, + _, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, NewFValue, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int2(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int2(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int2(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, _, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, NewFValue, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int3(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int3(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int3(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, _, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, + NewFValue, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData). + +d_field_tint32_int4(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int4(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int4(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, _, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + NewFValue, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int5(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int5(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int5(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, _, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, NewFValue, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int6(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int6(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int6(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, _, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, NewFValue, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int7(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int7(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int7(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, _, F@_8, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, NewFValue, F@_8, F@_9, F@_10, + TrUserData). + +d_field_tint32_int8(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int8(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int8(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, _, F@_9, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, NewFValue, F@_9, F@_10, + TrUserData). + +d_field_tint32_int9(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int9(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int9(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, _, + F@_10, TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, NewFValue, F@_10, + TrUserData). + +d_field_tint32_int10(<<1:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) + when N < 57 -> + d_field_tint32_int10(Rest, N + 7, X bsl N + Acc, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData); +d_field_tint32_int10(<<0:1, X:7, Rest/binary>>, N, Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, _, + TrUserData) -> + {NewFValue, RestF} = {begin + <> = <<(X bsl N + + Acc):32/unsigned-native>>, + id(Res, TrUserData) + end, + Rest}, + dfp_read_field_def_tint32(RestF, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, NewFValue, + TrUserData). + +skip_varint_tint32(<<1:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + skip_varint_tint32(Rest, Z1, Z2, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData); +skip_varint_tint32(<<0:1, _:7, Rest/binary>>, Z1, Z2, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, + F@_10, TrUserData) -> + dfp_read_field_def_tint32(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +skip_length_delimited_tint32(<<1:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, + F@_8, F@_9, F@_10, TrUserData) + when N < 57 -> + skip_length_delimited_tint32(Rest, N + 7, X bsl N + Acc, + F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, + F@_9, F@_10, TrUserData); +skip_length_delimited_tint32(<<0:1, X:7, Rest/binary>>, + N, Acc, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, + F@_8, F@_9, F@_10, TrUserData) -> + Length = X bsl N + Acc, + <<_:Length/binary, Rest2/binary>> = Rest, + dfp_read_field_def_tint32(Rest2, 0, 0, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +skip_group_tint32(Bin, FNum, Z2, F@_1, F@_2, F@_3, F@_4, + F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, TrUserData) -> + {_, Rest} = read_group(Bin, FNum), + dfp_read_field_def_tint32(Rest, 0, Z2, F@_1, F@_2, F@_3, + F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +skip_32_tint32(<<_:32, Rest/binary>>, Z1, Z2, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData) -> + dfp_read_field_def_tint32(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +skip_64_tint32(<<_:64, Rest/binary>>, Z1, Z2, F@_1, + F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData) -> + dfp_read_field_def_tint32(Rest, Z1, Z2, F@_1, F@_2, + F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, F@_10, + TrUserData). + +read_group(Bin, FieldNum) -> + {NumBytes, EndTagLen} = read_gr_b(Bin, 0, 0, 0, 0, FieldNum), + <> = Bin, + {Group, Rest}. + +%% Like skipping over fields, but record the total length, +%% Each field is <(FieldNum bsl 3) bor FieldType> ++ +%% Record the length because varints may be non-optimally encoded. +%% +%% Groups can be nested, but assume the same FieldNum cannot be nested +%% because group field numbers are shared with the rest of the fields +%% numbers. Thus we can search just for an group-end with the same +%% field number. +%% +%% (The only time the same group field number could occur would +%% be in a nested sub message, but then it would be inside a +%% length-delimited entry, which we skip-read by length.) +read_gr_b(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen, FieldNum) + when N < (32-7) -> + read_gr_b(Tl, N+7, X bsl N + Acc, NumBytes, TagLen+1, FieldNum); +read_gr_b(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, TagLen, + FieldNum) -> + Key = X bsl N + Acc, + TagLen1 = TagLen + 1, + case {Key bsr 3, Key band 7} of + {FieldNum, 4} -> % 4 = group_end + {NumBytes, TagLen1}; + {_, 0} -> % 0 = varint + read_gr_vi(Tl, 0, NumBytes + TagLen1, FieldNum); + {_, 1} -> % 1 = bits64 + <<_:64, Tl2/binary>> = Tl, + read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 8, 0, FieldNum); + {_, 2} -> % 2 = length_delimited + read_gr_ld(Tl, 0, 0, NumBytes + TagLen1, FieldNum); + {_, 3} -> % 3 = group_start + read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum); + {_, 4} -> % 4 = group_end + read_gr_b(Tl, 0, 0, NumBytes + TagLen1, 0, FieldNum); + {_, 5} -> % 5 = bits32 + <<_:32, Tl2/binary>> = Tl, + read_gr_b(Tl2, 0, 0, NumBytes + TagLen1 + 4, 0, FieldNum) + end. + +read_gr_vi(<<1:1, _:7, Tl/binary>>, N, NumBytes, FieldNum) + when N < (64-7) -> + read_gr_vi(Tl, N+7, NumBytes+1, FieldNum); +read_gr_vi(<<0:1, _:7, Tl/binary>>, _, NumBytes, FieldNum) -> + read_gr_b(Tl, 0, 0, NumBytes+1, 0, FieldNum). + +read_gr_ld(<<1:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum) + when N < (64-7) -> + read_gr_ld(Tl, N+7, X bsl N + Acc, NumBytes+1, FieldNum); +read_gr_ld(<<0:1, X:7, Tl/binary>>, N, Acc, NumBytes, FieldNum) -> + Len = X bsl N + Acc, + NumBytes1 = NumBytes + 1, + <<_:Len/binary, Tl2/binary>> = Tl, + read_gr_b(Tl2, 0, 0, NumBytes1 + Len, 0, FieldNum). + +merge_msgs(Prev, New) + when element(1, Prev) =:= element(1, New) -> + merge_msgs(Prev, New, element(1, Prev), []). + +merge_msgs(Prev, New, MsgName) when is_atom(MsgName) -> + merge_msgs(Prev, New, MsgName, []); +merge_msgs(Prev, New, Opts) + when element(1, Prev) =:= element(1, New), + is_list(Opts) -> + merge_msgs(Prev, New, element(1, Prev), Opts). + +merge_msgs(Prev, New, MsgName, Opts) -> + TrUserData = proplists:get_value(user_data, Opts), + case MsgName of + test -> merge_msg_test(Prev, New, TrUserData); + phoneNumber -> + merge_msg_phoneNumber(Prev, New, TrUserData); + person -> merge_msg_person(Prev, New, TrUserData); + addressBook -> + merge_msg_addressBook(Prev, New, TrUserData); + tint32 -> merge_msg_tint32(Prev, New, TrUserData) + end. + +-compile({nowarn_unused_function,merge_msg_test/3}). +merge_msg_test(#test{}, #test{aa = NFaa}, _) -> + #test{aa = NFaa}. + +-compile({nowarn_unused_function,merge_msg_phoneNumber/3}). +merge_msg_phoneNumber(#phoneNumber{number = PFnumber}, + #phoneNumber{number = NFnumber, type = NFtype}, + TrUserData) -> + #phoneNumber{number = + merge_msg_test(PFnumber, NFnumber, TrUserData), + type = NFtype}. + +-compile({nowarn_unused_function,merge_msg_person/3}). +merge_msg_person(#person{email = PFemail, + phone = PFphone}, + #person{name = NFname, integer = NFinteger, + email = NFemail, phone = NFphone}, + TrUserData) -> + #person{name = NFname, integer = NFinteger, + email = + if NFemail =:= undefined -> PFemail; + true -> NFemail + end, + phone = + if PFphone /= undefined, NFphone /= undefined -> + 'erlang_++'(PFphone, NFphone, TrUserData); + PFphone == undefined -> NFphone; + NFphone == undefined -> PFphone + end}. + +-compile({nowarn_unused_function,merge_msg_addressBook/3}). +merge_msg_addressBook(#addressBook{person1 = PFperson1, + others = PFothers}, + #addressBook{person1 = NFperson1, others = NFothers}, + TrUserData) -> + #addressBook{person1 = + if PFperson1 /= undefined, NFperson1 /= undefined -> + 'erlang_++'(PFperson1, NFperson1, TrUserData); + PFperson1 == undefined -> NFperson1; + NFperson1 == undefined -> PFperson1 + end, + others = + if PFothers /= undefined, NFothers /= undefined -> + 'erlang_++'(PFothers, NFothers, TrUserData); + PFothers == undefined -> NFothers; + NFothers == undefined -> PFothers + end}. + +-compile({nowarn_unused_function,merge_msg_tint32/3}). +merge_msg_tint32(#tint32{}, + #tint32{int1 = NFint1, int2 = NFint2, int3 = NFint3, + int4 = NFint4, int5 = NFint5, int6 = NFint6, + int7 = NFint7, int8 = NFint8, int9 = NFint9, + int10 = NFint10}, + _) -> + #tint32{int1 = NFint1, int2 = NFint2, int3 = NFint3, + int4 = NFint4, int5 = NFint5, int6 = NFint6, + int7 = NFint7, int8 = NFint8, int9 = NFint9, + int10 = NFint10}. + + +verify_msg(Msg) when tuple_size(Msg) >= 1 -> + verify_msg(Msg, element(1, Msg), []); +verify_msg(X) -> + mk_type_error(not_a_known_message, X, []). + +verify_msg(Msg, MsgName) when is_atom(MsgName) -> + verify_msg(Msg, MsgName, []); +verify_msg(Msg, Opts) when tuple_size(Msg) >= 1 -> + verify_msg(Msg, element(1, Msg), Opts); +verify_msg(X, _Opts) -> + mk_type_error(not_a_known_message, X, []). + +verify_msg(Msg, MsgName, Opts) -> + TrUserData = proplists:get_value(user_data, Opts), + case MsgName of + test -> v_msg_test(Msg, [MsgName], TrUserData); + phoneNumber -> + v_msg_phoneNumber(Msg, [MsgName], TrUserData); + person -> v_msg_person(Msg, [MsgName], TrUserData); + addressBook -> + v_msg_addressBook(Msg, [MsgName], TrUserData); + tint32 -> v_msg_tint32(Msg, [MsgName], TrUserData); + _ -> mk_type_error(not_a_known_message, Msg, []) + end. + + +-compile({nowarn_unused_function,v_msg_test/3}). +-dialyzer({nowarn_function,v_msg_test/3}). +v_msg_test(#test{aa = F1}, Path, TrUserData) -> + v_type_string(F1, [aa | Path], TrUserData), ok; +v_msg_test(X, Path, _TrUserData) -> + mk_type_error({expected_msg, test}, X, Path). + +-compile({nowarn_unused_function,v_msg_phoneNumber/3}). +-dialyzer({nowarn_function,v_msg_phoneNumber/3}). +v_msg_phoneNumber(#phoneNumber{number = F1, type = F2}, + Path, TrUserData) -> + v_msg_test(F1, [number | Path], TrUserData), + v_type_int32(F2, [type | Path], TrUserData), + ok; +v_msg_phoneNumber(X, Path, _TrUserData) -> + mk_type_error({expected_msg, phoneNumber}, X, Path). + +-compile({nowarn_unused_function,v_msg_person/3}). +-dialyzer({nowarn_function,v_msg_person/3}). +v_msg_person(#person{name = F1, integer = F2, + email = F3, phone = F4}, + Path, TrUserData) -> + v_type_string(F1, [name | Path], TrUserData), + v_type_int32(F2, [integer | Path], TrUserData), + if F3 == undefined -> ok; + true -> v_type_string(F3, [email | Path], TrUserData) + end, + if is_list(F4) -> + _ = [v_msg_phoneNumber(Elem, [phone | Path], TrUserData) + || Elem <- F4], + ok; + true -> + mk_type_error({invalid_list_of, {msg, phoneNumber}}, F4, + [phone | Path]) + end, + ok; +v_msg_person(X, Path, _TrUserData) -> + mk_type_error({expected_msg, person}, X, Path). + +-compile({nowarn_unused_function,v_msg_addressBook/3}). +-dialyzer({nowarn_function,v_msg_addressBook/3}). +v_msg_addressBook(#addressBook{person1 = F1, + others = F2}, + Path, TrUserData) -> + if is_list(F1) -> + _ = [v_msg_person(Elem, [person1 | Path], TrUserData) + || Elem <- F1], + ok; + true -> + mk_type_error({invalid_list_of, {msg, person}}, F1, + [person1 | Path]) + end, + if is_list(F2) -> + _ = [v_msg_person(Elem, [others | Path], TrUserData) + || Elem <- F2], + ok; + true -> + mk_type_error({invalid_list_of, {msg, person}}, F2, + [others | Path]) + end, + ok; +v_msg_addressBook(X, Path, _TrUserData) -> + mk_type_error({expected_msg, addressBook}, X, Path). + +-compile({nowarn_unused_function,v_msg_tint32/3}). +-dialyzer({nowarn_function,v_msg_tint32/3}). +v_msg_tint32(#tint32{int1 = F1, int2 = F2, int3 = F3, + int4 = F4, int5 = F5, int6 = F6, int7 = F7, int8 = F8, + int9 = F9, int10 = F10}, + Path, TrUserData) -> + v_type_int32(F1, [int1 | Path], TrUserData), + v_type_int32(F2, [int2 | Path], TrUserData), + v_type_int32(F3, [int3 | Path], TrUserData), + v_type_int32(F4, [int4 | Path], TrUserData), + v_type_int32(F5, [int5 | Path], TrUserData), + v_type_int32(F6, [int6 | Path], TrUserData), + v_type_int32(F7, [int7 | Path], TrUserData), + v_type_int32(F8, [int8 | Path], TrUserData), + v_type_int32(F9, [int9 | Path], TrUserData), + v_type_int32(F10, [int10 | Path], TrUserData), + ok; +v_msg_tint32(X, Path, _TrUserData) -> + mk_type_error({expected_msg, tint32}, X, Path). + +-compile({nowarn_unused_function,v_type_int32/3}). +-dialyzer({nowarn_function,v_type_int32/3}). +v_type_int32(N, _Path, _TrUserData) + when -2147483648 =< N, N =< 2147483647 -> + ok; +v_type_int32(N, Path, _TrUserData) when is_integer(N) -> + mk_type_error({value_out_of_range, int32, signed, 32}, + N, Path); +v_type_int32(X, Path, _TrUserData) -> + mk_type_error({bad_integer, int32, signed, 32}, X, + Path). + +-compile({nowarn_unused_function,v_type_string/3}). +-dialyzer({nowarn_function,v_type_string/3}). +v_type_string(S, Path, _TrUserData) + when is_list(S); is_binary(S) -> + try unicode:characters_to_binary(S) of + B when is_binary(B) -> ok; + {error, _, _} -> + mk_type_error(bad_unicode_string, S, Path) + catch + error:badarg -> + mk_type_error(bad_unicode_string, S, Path) + end; +v_type_string(X, Path, _TrUserData) -> + mk_type_error(bad_unicode_string, X, Path). + +-compile({nowarn_unused_function,mk_type_error/3}). +-spec mk_type_error(_, _, list()) -> no_return(). +mk_type_error(Error, ValueSeen, Path) -> + Path2 = prettify_path(Path), + erlang:error({gpb_type_error, + {Error, [{value, ValueSeen}, {path, Path2}]}}). + + +-compile({nowarn_unused_function,prettify_path/1}). +-dialyzer({nowarn_function,prettify_path/1}). +prettify_path([]) -> top_level; +prettify_path(PathR) -> + list_to_atom(lists:append(lists:join(".", + lists:map(fun atom_to_list/1, + lists:reverse(PathR))))). + + +-compile({nowarn_unused_function,id/2}). +-compile({inline,id/2}). +id(X, _TrUserData) -> X. + +-compile({nowarn_unused_function,v_ok/3}). +-compile({inline,v_ok/3}). +v_ok(_Value, _Path, _TrUserData) -> ok. + +-compile({nowarn_unused_function,m_overwrite/3}). +-compile({inline,m_overwrite/3}). +m_overwrite(_Prev, New, _TrUserData) -> New. + +-compile({nowarn_unused_function,cons/3}). +-compile({inline,cons/3}). +cons(Elem, Acc, _TrUserData) -> [Elem | Acc]. + +-compile({nowarn_unused_function,lists_reverse/2}). +-compile({inline,lists_reverse/2}). +'lists_reverse'(L, _TrUserData) -> lists:reverse(L). +-compile({nowarn_unused_function,'erlang_++'/3}). +-compile({inline,'erlang_++'/3}). +'erlang_++'(A, B, _TrUserData) -> A ++ B. + +get_msg_defs() -> + [{{msg, test}, + [#field{name = aa, fnum = 1, rnum = 2, type = string, + occurrence = required, opts = []}]}, + {{msg, phoneNumber}, + [#field{name = number, fnum = 1, rnum = 2, + type = {msg, test}, occurrence = required, opts = []}, + #field{name = type, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}]}, + {{msg, person}, + [#field{name = name, fnum = 1, rnum = 2, type = string, + occurrence = required, opts = []}, + #field{name = integer, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}, + #field{name = email, fnum = 3, rnum = 4, type = string, + occurrence = optional, opts = []}, + #field{name = phone, fnum = 4, rnum = 5, + type = {msg, phoneNumber}, occurrence = repeated, + opts = []}]}, + {{msg, addressBook}, + [#field{name = person1, fnum = 1, rnum = 2, + type = {msg, person}, occurrence = repeated, opts = []}, + #field{name = others, fnum = 2, rnum = 3, + type = {msg, person}, occurrence = repeated, + opts = []}]}, + {{msg, tint32}, + [#field{name = int1, fnum = 1, rnum = 2, type = int32, + occurrence = required, opts = []}, + #field{name = int2, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}, + #field{name = int3, fnum = 3, rnum = 4, type = int32, + occurrence = required, opts = []}, + #field{name = int4, fnum = 4, rnum = 5, type = int32, + occurrence = required, opts = []}, + #field{name = int5, fnum = 5, rnum = 6, type = int32, + occurrence = required, opts = []}, + #field{name = int6, fnum = 6, rnum = 7, type = int32, + occurrence = required, opts = []}, + #field{name = int7, fnum = 7, rnum = 8, type = int32, + occurrence = required, opts = []}, + #field{name = int8, fnum = 8, rnum = 9, type = int32, + occurrence = required, opts = []}, + #field{name = int9, fnum = 9, rnum = 10, type = int32, + occurrence = required, opts = []}, + #field{name = int10, fnum = 10, rnum = 11, type = int32, + occurrence = required, opts = []}]}]. + + +get_msg_names() -> + [test, phoneNumber, person, addressBook, tint32]. + + +get_group_names() -> []. + + +get_msg_or_group_names() -> + [test, phoneNumber, person, addressBook, tint32]. + + +get_enum_names() -> []. + + +fetch_msg_def(MsgName) -> + case find_msg_def(MsgName) of + Fs when is_list(Fs) -> Fs; + error -> erlang:error({no_such_msg, MsgName}) + end. + + +-spec fetch_enum_def(_) -> no_return(). +fetch_enum_def(EnumName) -> + erlang:error({no_such_enum, EnumName}). + + +find_msg_def(test) -> + [#field{name = aa, fnum = 1, rnum = 2, type = string, + occurrence = required, opts = []}]; +find_msg_def(phoneNumber) -> + [#field{name = number, fnum = 1, rnum = 2, + type = {msg, test}, occurrence = required, opts = []}, + #field{name = type, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}]; +find_msg_def(person) -> + [#field{name = name, fnum = 1, rnum = 2, type = string, + occurrence = required, opts = []}, + #field{name = integer, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}, + #field{name = email, fnum = 3, rnum = 4, type = string, + occurrence = optional, opts = []}, + #field{name = phone, fnum = 4, rnum = 5, + type = {msg, phoneNumber}, occurrence = repeated, + opts = []}]; +find_msg_def(addressBook) -> + [#field{name = person1, fnum = 1, rnum = 2, + type = {msg, person}, occurrence = repeated, opts = []}, + #field{name = others, fnum = 2, rnum = 3, + type = {msg, person}, occurrence = repeated, + opts = []}]; +find_msg_def(tint32) -> + [#field{name = int1, fnum = 1, rnum = 2, type = int32, + occurrence = required, opts = []}, + #field{name = int2, fnum = 2, rnum = 3, type = int32, + occurrence = required, opts = []}, + #field{name = int3, fnum = 3, rnum = 4, type = int32, + occurrence = required, opts = []}, + #field{name = int4, fnum = 4, rnum = 5, type = int32, + occurrence = required, opts = []}, + #field{name = int5, fnum = 5, rnum = 6, type = int32, + occurrence = required, opts = []}, + #field{name = int6, fnum = 6, rnum = 7, type = int32, + occurrence = required, opts = []}, + #field{name = int7, fnum = 7, rnum = 8, type = int32, + occurrence = required, opts = []}, + #field{name = int8, fnum = 8, rnum = 9, type = int32, + occurrence = required, opts = []}, + #field{name = int9, fnum = 9, rnum = 10, type = int32, + occurrence = required, opts = []}, + #field{name = int10, fnum = 10, rnum = 11, type = int32, + occurrence = required, opts = []}]; +find_msg_def(_) -> error. + + +find_enum_def(_) -> error. + + +-spec enum_symbol_by_value(_, _) -> no_return(). +enum_symbol_by_value(E, V) -> + erlang:error({no_enum_defs, E, V}). + + +-spec enum_value_by_symbol(_, _) -> no_return(). +enum_value_by_symbol(E, V) -> + erlang:error({no_enum_defs, E, V}). + + + +get_service_names() -> []. + + +get_service_def(_) -> error. + + +get_rpc_names(_) -> error. + + +find_rpc_def(_, _) -> error. + + + +-spec fetch_rpc_def(_, _) -> no_return(). +fetch_rpc_def(ServiceName, RpcName) -> + erlang:error({no_such_rpc, ServiceName, RpcName}). + + +%% Convert a a fully qualified (ie with package name) service name +%% as a binary to a service name as an atom. +-spec fqbin_to_service_name(_) -> no_return(). +fqbin_to_service_name(X) -> + error({gpb_error, {badservice, X}}). + + +%% Convert a service name as an atom to a fully qualified +%% (ie with package name) name as a binary. +-spec service_name_to_fqbin(_) -> no_return(). +service_name_to_fqbin(X) -> + error({gpb_error, {badservice, X}}). + + +%% Convert a a fully qualified (ie with package name) service name +%% and an rpc name, both as binaries to a service name and an rpc +%% name, as atoms. +-spec fqbins_to_service_and_rpc_name(_, _) -> no_return(). +fqbins_to_service_and_rpc_name(S, R) -> + error({gpb_error, {badservice_or_rpc, {S, R}}}). + + +%% Convert a service name and an rpc name, both as atoms, +%% to a fully qualified (ie with package name) service name and +%% an rpc name as binaries. +-spec service_and_rpc_name_to_fqbins(_, _) -> no_return(). +service_and_rpc_name_to_fqbins(S, R) -> + error({gpb_error, {badservice_or_rpc, {S, R}}}). + + +fqbin_to_msg_name(<<"test">>) -> test; +fqbin_to_msg_name(<<"phoneNumber">>) -> phoneNumber; +fqbin_to_msg_name(<<"person">>) -> person; +fqbin_to_msg_name(<<"addressBook">>) -> addressBook; +fqbin_to_msg_name(<<"tint32">>) -> tint32; +fqbin_to_msg_name(E) -> error({gpb_error, {badmsg, E}}). + + +msg_name_to_fqbin(test) -> <<"test">>; +msg_name_to_fqbin(phoneNumber) -> <<"phoneNumber">>; +msg_name_to_fqbin(person) -> <<"person">>; +msg_name_to_fqbin(addressBook) -> <<"addressBook">>; +msg_name_to_fqbin(tint32) -> <<"tint32">>; +msg_name_to_fqbin(E) -> error({gpb_error, {badmsg, E}}). + + +-spec fqbin_to_enum_name(_) -> no_return(). +fqbin_to_enum_name(E) -> + error({gpb_error, {badenum, E}}). + + +-spec enum_name_to_fqbin(_) -> no_return(). +enum_name_to_fqbin(E) -> + error({gpb_error, {badenum, E}}). + + +get_package_name() -> undefined. + + +%% Whether or not the message names +%% are prepended with package name or not. +uses_packages() -> false. + + +source_basename() -> "mytest.proto". + + +%% Retrieve all proto file names, also imported ones. +%% The order is top-down. The first element is always the main +%% source file. The files are returned with extension, +%% see get_all_proto_names/0 for a version that returns +%% the basenames sans extension +get_all_source_basenames() -> ["mytest.proto"]. + + +%% Retrieve all proto file names, also imported ones. +%% The order is top-down. The first element is always the main +%% source file. The files are returned sans .proto extension, +%% to make it easier to use them with the various get_xyz_containment +%% functions. +get_all_proto_names() -> ["mytest"]. + + +get_msg_containment("mytest") -> + [addressBook, person, phoneNumber, test, tint32]; +get_msg_containment(P) -> + error({gpb_error, {badproto, P}}). + + +get_pkg_containment("mytest") -> undefined; +get_pkg_containment(P) -> + error({gpb_error, {badproto, P}}). + + +get_service_containment("mytest") -> []; +get_service_containment(P) -> + error({gpb_error, {badproto, P}}). + + +get_rpc_containment("mytest") -> []; +get_rpc_containment(P) -> + error({gpb_error, {badproto, P}}). + + +get_enum_containment("mytest") -> []; +get_enum_containment(P) -> + error({gpb_error, {badproto, P}}). + + +get_proto_by_msg_name_as_fqbin(<<"tint32">>) -> "mytest"; +get_proto_by_msg_name_as_fqbin(<<"phoneNumber">>) -> "mytest"; +get_proto_by_msg_name_as_fqbin(<<"test">>) -> "mytest"; +get_proto_by_msg_name_as_fqbin(<<"addressBook">>) -> "mytest"; +get_proto_by_msg_name_as_fqbin(<<"person">>) -> "mytest"; +get_proto_by_msg_name_as_fqbin(E) -> + error({gpb_error, {badmsg, E}}). + + +-spec get_proto_by_service_name_as_fqbin(_) -> no_return(). +get_proto_by_service_name_as_fqbin(E) -> + error({gpb_error, {badservice, E}}). + + +-spec get_proto_by_enum_name_as_fqbin(_) -> no_return(). +get_proto_by_enum_name_as_fqbin(E) -> + error({gpb_error, {badenum, E}}). + + +-spec get_protos_by_pkg_name_as_fqbin(_) -> no_return(). +get_protos_by_pkg_name_as_fqbin(E) -> + error({gpb_error, {badpkg, E}}). + + + +gpb_version_as_string() -> + "4.8.0". + +gpb_version_as_list() -> + [4,8,0]. diff --git a/test/gpb/mytest.hrl b/test/gpb/mytest.hrl new file mode 100644 index 0000000..cbe90a8 --- /dev/null +++ b/test/gpb/mytest.hrl @@ -0,0 +1,59 @@ +%% -*- coding: utf-8 -*- +%% Automatically generated, do not edit +%% Generated by gpb_compile version 4.8.0 + +-ifndef(mytest). +-define(mytest, true). + +-define(mytest_gpb_version, "4.8.0"). + +-ifndef('TEST_PB_H'). +-define('TEST_PB_H', true). +-record(test, + {aa :: iodata() % = 1 + }). +-endif. + +-ifndef('PHONENUMBER_PB_H'). +-define('PHONENUMBER_PB_H', true). +-record(phoneNumber, + {number :: mytest:test(), % = 1 + type :: integer() % = 2, 32 bits + }). +-endif. + +-ifndef('PERSON_PB_H'). +-define('PERSON_PB_H', true). +-record(person, + {name :: iodata(), % = 1 + integer :: integer(), % = 2, 32 bits + email :: iodata() | undefined, % = 3 + phone = [] :: [mytest:phoneNumber()] | undefined % = 4 + }). +-endif. + +-ifndef('ADDRESSBOOK_PB_H'). +-define('ADDRESSBOOK_PB_H', true). +-record(addressBook, + {person1 = [] :: [mytest:person()] | undefined, % = 1 + others = [] :: [mytest:person()] | undefined % = 2 + }). +-endif. + +-ifndef('TINT32_PB_H'). +-define('TINT32_PB_H', true). +-record(tint32, + {int1 :: integer(), % = 1, 32 bits + int2 :: integer(), % = 2, 32 bits + int3 :: integer(), % = 3, 32 bits + int4 :: integer(), % = 4, 32 bits + int5 :: integer(), % = 5, 32 bits + int6 :: integer(), % = 6, 32 bits + int7 :: integer(), % = 7, 32 bits + int8 :: integer(), % = 8, 32 bits + int9 :: integer(), % = 9, 32 bits + int10 :: integer() % = 10, 32 bits + }). +-endif. + +-endif. diff --git a/test/gpb/mytest.proto b/test/gpb/mytest.proto new file mode 100644 index 0000000..d7e1e58 --- /dev/null +++ b/test/gpb/mytest.proto @@ -0,0 +1,33 @@ +message test { + required string aa = 1; + } + +message phoneNumber { + required test number = 1; + required int32 type = 2; +} + +message person { + required string name = 1; + required int32 integer = 2; + optional string email = 3; + repeated phoneNumber phone = 4; +} + +message addressBook { + repeated person person1 = 1; + repeated person others = 2; +} + +message tint32 { + required int32 int1 = 1; + required int32 int2 = 2; + required int32 int3 = 3; + required int32 int4 = 4; + required int32 int5 = 5; + required int32 int6 = 6; + required int32 int7 = 7; + required int32 int8 = 8; + required int32 int9 = 9; + required int32 int10 = 10; +} \ No newline at end of file diff --git a/test/protoMsg.erl b/test/protoMsg.erl index 87293f0..02076c8 100644 --- a/test/protoMsg.erl +++ b/test/protoMsg.erl @@ -208,44 +208,6 @@ deRecordList(N, MsgId, MsgBin, RetList) -> {Tuple, LeftBin} = decodeRec(MsgId, MsgBin), deRecordList(N - 1, MsgId, LeftBin, [Tuple | RetList]). -getMsgId(test)-> 1; -getMsgId(phoneNumber)-> 2; -getMsgId(person)-> 3; -getMsgId(addressBook)-> 4; -getMsgId(union)-> 5; -getMsgId(tbool)-> 6; -getMsgId(tint8)-> 7; -getMsgId(tuint8)-> 8; -getMsgId(tint16)-> 9; -getMsgId(tuint16)-> 10; -getMsgId(tint32)-> 11; -getMsgId(tuint32)-> 12; -getMsgId(tint64)-> 13; -getMsgId(tuint64)-> 14; -getMsgId(tinteger)-> 15; -getMsgId(tnumber)-> 16; -getMsgId(tfloat)-> 17; -getMsgId(tdouble)-> 18; -getMsgId(tstring)-> 19; -getMsgId(tlistbool)-> 20; -getMsgId(tlistint8)-> 21; -getMsgId(tlistuint8)-> 22; -getMsgId(tlistint16)-> 23; -getMsgId(tlistuint16)-> 24; -getMsgId(tlistint32)-> 25; -getMsgId(tlistuint32)-> 26; -getMsgId(tlistint64)-> 27; -getMsgId(tlistuint64)-> 28; -getMsgId(tlistinteger)-> 29; -getMsgId(tlistnumber)-> 30; -getMsgId(tlistfloat)-> 31; -getMsgId(tlistdouble)-> 32; -getMsgId(tliststring)-> 33; -getMsgId(tlistunion)-> 34; -getMsgId(allType)-> 35; -getMsgId(person1)-> 1001; -getMsgId(_) -> 0. - encodeRec({test, V1}) -> [?string(V1)]; encodeRec({phoneNumber, V1, V2}) -> @@ -277,8 +239,8 @@ encode({tint16, V1, V2}) -> [<<9:16/big-unsigned>>, ?int16(V1), ?int16(V2)]; encode({tuint16, V1, V2}) -> [<<10:16/big-unsigned>>, ?uint16(V1), ?uint16(V2)]; -encode({tint32, V1, V2}) -> - [<<11:16/big-unsigned>>, ?int32(V1), ?int32(V2)]; +encode({tint32, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10}) -> + [<<11:16/big-unsigned>>, ?int32(V1), ?int32(V2), ?int32(V3), ?int32(V4), ?int32(V5), ?int32(V6), ?int32(V7), ?int32(V8), ?int32(V9), ?int32(V10)]; encode({tuint32, V1, V2}) -> [<<12:16/big-unsigned>>, ?uint32(V1), ?uint32(V2)]; encode({tint64, V1, V2}) -> @@ -417,8 +379,8 @@ decodeBin(10, LeftBin0) -> <> = LeftBin0, {tuint16, V1, V2}; decodeBin(11, LeftBin0) -> - <> = LeftBin0, - {tint32, V1, V2}; + <> = LeftBin0, + {tint32, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10}; decodeBin(12, LeftBin0) -> <> = LeftBin0, {tuint32, V1, V2}; diff --git a/test/protoMsg.hrl b/test/protoMsg.hrl index 2d543dd..ab53cd6 100644 --- a/test/protoMsg.hrl +++ b/test/protoMsg.hrl @@ -61,6 +61,14 @@ -record(tint32 ,{ int1 = 0 :: int32() , int2 = 0 :: int32() + , int3 = 0 :: int32() + , int4 = 0 :: int32() + , int5 = 0 :: int32() + , int6 = 0 :: int32() + , int7 = 0 :: int32() + , int8 = 0 :: int32() + , int9 = 0 :: int32() + , int10 = 0 :: int32() }). -record(tuint32 ,{ int1 = 0 :: uint32() diff --git a/test/test.erl b/test/test.erl index 1216d78..71cd58d 100644 --- a/test/test.erl +++ b/test/test.erl @@ -3,6 +3,86 @@ -include("protoMsg.hrl"). -compile(export_all). +encode_int32(N) -> + TT = #tint32{int1 = 1, int2 = -1, int3 = 128, int4 = -128, int5 = 65536, + int6 = -65536, int7 = 2100000000, int8 = -2100000000, int9 = 678665, int10 = -678665}, + tt1(N, TT). + +tt1(0, TT) -> + ok; +tt1(N, TT) -> + protoMsg:encode(TT), + tt1(N - 1, TT). + +decode_int32(N) -> + TT = #tint32{int1 = 1, int2 = -1, int3 = 128, int4 = -128, int5 = 65536, + int6 = -65536, int7 = 2100000000, int8 = -2100000000, int9 = 678665, int10 = -678665}, + Bin = protoMsg:encode(TT), + tt2(N, iolist_to_binary(Bin)). + +tt2(0, Bin) -> + Bin; +tt2(N, Bin) -> + protoMsg:decode(Bin), + tt2(N - 1, Bin). + +encode_addressBook(N) -> + Add = #addressBook{ + person = [ + #person{ + name = "Alice", + id = 10000, + phone = [ + #phoneNumber{number = #test{aa = "123456789"}, type = 1}, + #phoneNumber{number = #test{aa = "87654321"}, type = 2} + ] + }, + #person{ + name = "Bob", + id = 20000, + phone = [ + #phoneNumber{number = #test{aa = "01234567890"}, type = 3} + ] + } + ] + }, + tt3(N, Add). + +tt3(0, Add) -> + ok; +tt3(N, Add) -> + protoMsg:encode(Add), + tt3(N - 1, Add). + + +decode_addressBook(N) -> + AddressBook = #addressBook{ + person = [ + #person{ + name = "Alice", + id = 10000, + phone = [ + #phoneNumber{number = #test{aa = "123456789"}, type = 1}, + #phoneNumber{number = #test{aa = "87654321"}, type = 2} + ] + }, + #person{ + name = "Bob", + id = 20000, + phone = [ + #phoneNumber{number = #test{aa = "01234567890"}, type = 3} + ] + } + ] + }, + Bin = protoMsg:encode(AddressBook), + tt4(N, iolist_to_binary(Bin)). +tt4(0, Bin) -> + Bin; +tt4(N, Bin) -> + protoMsg:decode(Bin), + tt4(N - 1, Bin). + test1() -> protoMsg:decode(iolist_to_binary(protoMsg:encode(#tbool{bool = true}))). @@ -19,6 +99,8 @@ test32() -> test41() -> protoMsg:decode(iolist_to_binary(protoMsg:encode(#tint32{int1 = 12343434, int2 = -34434322}))). + + test42() -> protoMsg:decode(iolist_to_binary(protoMsg:encode(#tuint32{int1 = 432444343, int2 = 432443433}))). @@ -29,12 +111,13 @@ test52() -> tt6(N) -> Bin = iolist_to_binary(protoMsg:encode(#tinteger{int1 = -1, int2 = 1, int3 = 128, int4 = -128, int5 = -3244232, int6 = 432423432, int7 = -43434343434434, int8 = 432424242434})), - test6(N, Bin). + <<_MsgId:16/big, MsgBin/binary>> = Bin, + test6(N, MsgBin). test6(0, Bin) -> io:format("IMY******111 ~p~n", [protoMsg:decode(Bin)]); test6(N, Bin) -> - protoMsg:decode(Bin), + protoMsg:decodeBin(15, Bin), test6(N - 1, Bin). tt66(N) -> @@ -48,9 +131,10 @@ test66(0, Bin) -> io:format("IMY******111 ~p~n", [A]); test66(N, Bin) -> <<_MsgId:16/big, MsgBin/binary>> = Bin, - <> = MsgBin, - MsgRec = {tinteger, Int1, Int2, Int3, Int4, Int5, Int6, Int7, Int8}, - {MsgRec,LeftBin}, + %% <> = MsgBin, + %% {tinteger, Int1, Int2, Int3, Int4, Int5, Int6, Int7, Int8}, + <> = MsgBin, + {tinteger, V1, V2, V3, V4, V5, V6, V7, V8}, test66(N - 1, Bin). tt67(N) -> @@ -335,8 +419,8 @@ tet([YY | T]) -> ok, tet(T). -tt1(0) -> - AddressBook = #addressBook{ +ttt11(N) -> + Add = #addressBook{ person = [ #person{ name = "Alice", @@ -355,31 +439,15 @@ tt1(0) -> } ] }, - Bin = protoMsg:encode(AddressBook); -tt1(N) -> - tt1(), - tt1(N - 1). + ttt11(N, Add). -tt1() -> - AddressBook = #addressBook{ - person = [ - #person{ - name = "Alice", - id = 10000, - phone = [ - #phoneNumber{number = #test{aa = "123456789"}, type = 1}, - #phoneNumber{number = #test{aa = "87654321"}, type = 2} - ] - }, - #person{ - name = "Bob", - id = 20000, - phone = [ - #phoneNumber{number = #test{aa = "01234567890"}, type = 3} - ] - } - ] - }, +ttt11(0, Add) -> + ok; +ttt11(N, Add) -> + protoMsg:encode(Add), + ttt11(N - 1, Add). + +%%tt1(Add) -> %"others" => [ % #{ % "name" => "Carol", @@ -391,7 +459,7 @@ tt1() -> %] %AddressBook = #person{name = "1232134", id = 11111,email = "aaa" ,phone = [#phoneNumber{}] }, %AddressBook = #phoneNumber{number =#test{aa = "dffsaf"},type = 12 }, - Bin = protoMsg:encode(AddressBook). + %%protoMsg:encode(Add). %ok = file:write_file("fff.bin", Bin), %print_bin(Bin), %Bin = protoCode:encode(AddressBook),