erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

561 рядки
20 KiB

-module(utTpfm).
-compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]).
-record(cycleData, {
module = test
, isEnter = false
, hibernateAfter = infinity
, isHibernate = false
, lastStatus = init_status
, lastState = #{11 => 555, 44 => 434}
, postponed = [1, 3, "dffd", "fdf"]
, timers = #{etime => {aaa, fdfd}}
}).
tt1(N) ->
tt1(N, #cycleData{}, [123421, 434, 34], {12222, 343, "fdfd"}, fff, "ArgD").
tt1(0, CycleData, ArgA, ArgB, ArgC, ArgD) ->
ok;
tt1(N, #cycleData{lastState = LastState, isEnter = IsEnter, hibernateAfter = HibernateAfter, module = Module} = CycleData, ArgA, ArgB, ArgC, ArgD) ->
I1 = is_atom(LastState),
I2 = is_atom(IsEnter),
I3 = is_atom(HibernateAfter),
I4 = is_atom(Module),
_Ret = I1 andalso I2 andalso I3 andalso I4 andalso true,
tt1(N - 1, CycleData, ArgA, ArgB, ArgC, ArgD).
tt2(N) ->
tt2(N, #cycleData{}, [123421, 434, 34], {12222, 343, "fdfd"}, fff, "ArgD").
tt2(0, CycleData, ArgA, ArgB, ArgC, ArgD) ->
ok;
tt2(N, CycleData, ArgA, ArgB, ArgC, ArgD) ->
LastState = element(#cycleData.lastState, CycleData),
IsEnter = element(#cycleData.isEnter, CycleData),
HibernateAfter = element(#cycleData.hibernateAfter, CycleData),
Module = element(#cycleData.module, CycleData),
I1 = is_atom(LastState),
I2 = is_atom(IsEnter),
I3 = is_atom(HibernateAfter),
I4 = is_atom(Module),
_Ret = I1 andalso I2 andalso I3 andalso I4 andalso true,
tt2(N - 1, CycleData, ArgA, ArgB, ArgC, ArgD).
tt3(N) ->
tt3(N, #cycleData{}, [123421, 434, 34], {12222, 343, "fdfd"}, fff, "ArgD").
tt3(0, CycleData, ArgA, ArgB, ArgC, ArgD) ->
ok;
tt3(N, CycleData, ArgA, ArgB, ArgC, ArgD) ->
NewCycleData = CycleData#cycleData{module = tttt, lastState = #{11 => 22, 22 => 33}, isEnter = false},
tt3(N - 1, NewCycleData, ArgA, ArgB, ArgC, ArgD).
tt4(N) ->
tt4(N, #cycleData{}, [123421, 434, 34], {12222, 343, "fdfd"}, fff, "ArgD").
tt4(0, CycleData, ArgA, ArgB, ArgC, ArgD) ->
ok;
tt4(N, CycleData, ArgA, ArgB, ArgC, ArgD) ->
New1 = setelement(#cycleData.module, CycleData, tttt),
New2 = setelement(#cycleData.lastState, New1, #{11 => 22, 22 => 33}),
New3 = setelement(#cycleData.isEnter, New2, false),
tt4(N - 1, New3, ArgA, ArgB, ArgC, ArgD).
tt5(N) ->
tt5(N, #cycleData{}, [123421, 434, 34]).
tt5(0, CycleData, AA) ->
ok;
tt5(N, CycleData, AA) ->
tt5(N - 1, CycleData, AA).
tt6(N) ->
tt6(N, test, false, infinity, false, init_status, #{11 => 555, 44 => 434}, [1, 3, "dffd", "fdf"], #{etime => {aaa, fdfd}}, [123421, 434, 34]).
tt6(0, A1, B, C, D, E, F, G, H, AA) ->
ok;
tt6(N, A1, B, C, D, E, F, G, H, AA) ->
tt6(N - 1, A1, B, C, D, E, F, G, H, AA).
tt7(0) ->
ok;
tt7(N) ->
tt7(N - 1).
tt8(N) ->
tt8(N, #cycleData{}).
tt8(0, CycleData) ->
ok;
tt8(N, #cycleData{module = Module, lastState = Lasst, postponed = Postponed} = AA) ->
A = setelement(#cycleData.module, AA, ttt),
B = setelement(#cycleData.isEnter, A, trye),
%% B = setelement(#cycleData.lastState, A, #{22 => 555, 55 => 434}),
%% C = setelement(#cycleData.postponed, B, [1,3,"fdf", "dffd"]),
tt8(N - 1, B).
tt88(N) ->
tt88(N, #cycleData{}).
tt88(0, CycleData) ->
ok;
tt88(N, #cycleData{module = Module, lastState = Lasst, postponed = Postponed} = AA) ->
%%C = setelement(#cycleData.postponed, AA, [1,3,"fdf", "dffd"]),
%%B = setelement(#cycleData.lastState, C, #{22 => 555, 55 => 434}),
B = setelement(#cycleData.isEnter, AA, trye),
A = setelement(#cycleData.module, B, ttt),
tt88(N - 1, A).
tt888(N) ->
tt888(N, #cycleData{}).
tt888(0, CycleData) ->
ok;
tt888(N, #cycleData{module = Module, lastState = Lasst, postponed = Postponed} = AA) ->
A = AA#cycleData{isEnter = trye, module = ttt},
tt888(N - 1, A).
tt9(N) ->
Data = #cycleData{},
put(a, Data#cycleData.module),
put(b, Data#cycleData.isEnter),
put(c, Data#cycleData.hibernateAfter),
put(d, Data#cycleData.isHibernate),
put(e, Data#cycleData.lastStatus),
put(f, Data#cycleData.lastState),
put(g, Data#cycleData.postponed),
tt10(N).
tt10(0) ->
ok;
tt10(N) ->
A = get(a),
put(a, ttt),
B = get(f),
put(f, #{22 => 555, 55 => 434}),
C = get(g),
put(g, [1, 3, "fdf", "dffd"]),
_Ret = A orelse B orelse C orelse true,
tt10(N - 1).
c6(N) ->
cc6(N, 0).
cc6(0, F) ->
F;
cc6(N, _F) ->
F = N + 0.0,
cc6(N - 1, F).
c7(N) ->
cc7(N, 0).
cc7(0, F) ->
F;
cc7(N, _F) ->
F = float(N),
cc7(N - 1, F).
s1(0, Fun) ->
ok;
s1(N, Fun) ->
?MODULE:Fun(),
s1(N - 1, Fun).
st1() ->
size(<<"fdfdfdd:fdffd:\rn\n:fdfd fd df df dfddfdf">>).
st2() ->
byte_size(<<"fdfdfdd:fdffd:\rn\n:fdfd fd df df dfddfdf">>).
st3() ->
iolist_size(<<"fdfdfdd:fdffd:\rn\n:fdfd fd df df d:fddfdf">>).
st4() ->
size(<<"fdfdfdd:fdffd:\rn\n:fdfd fd df df dfddfdf">>).
gm(0, Fun) ->
ok;
gm(N, Fun) ->
[?MODULE:Fun(M) || M <- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
gm(N - 1, Fun).
%% 这个更快
getMonth(1) ->
<<"Jan">>;
getMonth(2) ->
<<"Feb">>;
getMonth(3) ->
<<"Mar">>;
getMonth(4) ->
<<"Apr">>;
getMonth(5) ->
<<"May">>;
getMonth(6) ->
<<"Jun">>;
getMonth(7) ->
<<"Jul">>;
getMonth(8) ->
<<"Aug">>;
getMonth(9) ->
<<"Sep">>;
getMonth(10) ->
<<"Oct">>;
getMonth(11) ->
<<"Nov">>;
getMonth(12) ->
<<"Dec">>.
getMonth2(Month) ->
element(Month, {<<"Jan">>, <<"Feb">>, <<"Mar">>, <<"Apr">>, <<"May">>, <<"Jun">>, <<"Jul">>, <<"Aug">>, <<"Sep">>, <<"Oct">>, <<"Nov">>, <<"Dec">>}).
-define(Month, #{1 => <<"Jan">>, 2 => <<"Feb">>, 3 => <<"Mar">>, 4 => <<"Apr">>, 5 => <<"May">>, 6 => <<"Jun">>, 7 => <<"Jul">>, 8 => <<"Aug">>, 9 => <<"Sep">>, 10 => <<"Oct">>, 11 => <<"Nov">>, 12 => <<"Dec">>}).
getMonth3(Month) ->
case ?Month of
#{Month := MonthStr} ->
MonthStr;
_ ->
<<"">>
end.
-define(List, [1, 2, 3234235, <<"fdsfasf">>, <<"fdsfasf111111111111111111111111">>, [3434, 43, 434], tryrer, {rqwrer, 342144}, #{23424 => "fdsfsdafsaf"}, {432143, "fdsaf", 76767}]).
ht(0, _Fun) ->
ok;
ht(N, Fun) ->
[?MODULE:Fun(Term) || Term <- ?List],
ht(N - 1, Fun).
hash1(Term) ->
erlang:phash(Term, 256).
hash2(Term) ->
erlang:phash2(Term, 256).
hashn1(Term) ->
nifHashb:hash1(Term, 256).
hashn2(Term) ->
nifHashb:hash2(Term, 256).
hashn3(Term) ->
nifHashb:hash3(Term, 256).
ht1(0, _Fun, Term) ->
ok;
ht1(N, Fun, Term) ->
?MODULE:Fun(Term),
ht1(N - 1, Fun, Term).
hash3(Term) ->
erlang:phash(Term, 256).
hash4(Term) ->
erlang:phash2(Term, 256).
ttT(0, Fun) ->
?MODULE:Fun(0);
ttT(N, Fun) ->
?MODULE:Fun(N),
ttT(N - 1, Fun).
nifT(N) ->
[nifArray:test(Term) || Term <- ?List].
nifT1(N) ->
[nifArray:test1(Term) || Term <- ?List].
cb(N, Len, Fun) ->
Bin = utGenTerm:genBinary(Len),
cddo(N, Bin, Fun).
cddo(0, Bin, Fun) ->
nifHashb:Fun(Bin, Bin);
cddo(N, Bin, Fun) ->
nifHashb:Fun(Bin, Bin),
cddo(N - 1, Bin, Fun).
cc1(0, A1, A2, _V) ->
A1 / A2;
cc1(N, A1, A2, _V) ->
V = A1 / A2,
cc1(N - 1, A1, A2, V).
cc2(0, A1, A2, _V) ->
A1 div A2;
cc2(N, A1, A2, _V) ->
V = A1 div A2,
cc2(N - 1, A1, A2, V).
call1(N, Y) ->
KVList = [{{value, test, Index, Index+1}, {value, test, Index, Index+2}} || Index <- lists:seq(1, Y)],
utKvsToBeam:load(ttttt, KVList),
T = erlang:system_time(microsecond),
A = ?MODULE,
Fun = get,
call1(N, Y, T, A, Fun, 0).
call1(0, A1, A2, _A, _Fun, _V) ->
Key = rand:uniform(A1),
V = ttttt:get({value, test, Key, Key}),
{erlang:system_time(microsecond) - A2, V};
call1(N, A1, A2, A, Fun, _V) ->
Key = rand:uniform(A1),
V = ttttt:get({value, test, Key, Key}),
call1(N - 1, A1, A2, A, Fun, V).
get1({value, test, 1500, 1500}) ->
{value, test, 1500, 1500}.
call2(N, Y) ->
A = utFunCallCase,
Fun = get1,
T = erlang:system_time(microsecond),
call2(N, Y, T, A, Fun, 0).
call2(0, _A1, A2, A, Fun, _V) ->
V = ?MODULE:Fun({value, test, 1500, 1500}),
{erlang:system_time(microsecond) - A2, V};
call2(N, A1, A2, A, Fun, _Key) ->
Key = rand:uniform(A1),
_V = ?MODULE:Fun({value, test, 1500, 1500}),
call2(N - 1, A1, A2, A, Fun, Key).
call3(N, Y) ->
A = ?MODULE,
Fun = get1,
T = erlang:system_time(microsecond),
call3(N, Y, T, A, Fun, 0).
call3(0, _A1, A2, A, Fun, _K) ->
_V = erlang:apply(A, Fun, [{value, test, 1500, 1500}]),
{erlang:system_time(microsecond) - A2, _K};
call3(N, A1, A2, A, Fun, _key) ->
Key = rand:uniform(A1),
_V = erlang:apply(A, Fun, [{value, test, 1500, 1500}]),
call3(N - 1, A1, A2, A, Fun, Key).
call4(N, Y) ->
A = ?MODULE,
Fun = get1,
T = erlang:system_time(microsecond),
call4(N, Y, T, A, Fun, 0).
call4(0, _A1, A2, A, Fun, _K) ->
erlang:apply(A, Fun, [{value, test, 1500, 1500}]),
{erlang:system_time(microsecond) - A2, _K};
call4(N, A1, A2, A, Fun, _key) ->
Key = rand:uniform(A1),
Args = [{value, test, 1500, 1500}],
erlang:apply(A, Fun, Args),
call4(N - 1, A1, A2, A, Fun, Key).
-define(AcList, [{eTimeout, 11, 22}, {u_eTimeout, 22}, {sTimeout, 111, 222, 333}, c_eTimeout, c_sTimeout, {nextEvent, 222, fdfd}, {doAfter, args}]).
ht11(0, _Fun) ->
ok;
ht11(N, Fun) ->
?MODULE:Fun(?AcList, 1, ttt, [], true, fasle, false, [], []),
ht11(N - 1, Fun).
%% 下面两中写法 并无差别
doPAL([], _CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents) ->
{CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents};
doPAL([OneAction | LeftActions], CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents) ->
case OneAction of
{reply, From, Reply} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents);
{eTimeout, _Time, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{sTimeout, _Time, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{gTimeout, _Name}, _Time, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{eTimeout, _Time, _TimeoutMsg, _Options} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{sTimeout, _Time, _TimeoutMsg, _Options} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{gTimeout, _Name}, _Time, _TimeoutMsg, _Options} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{u_eTimeout, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{u_sTimeout, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{u_gTimeout, _Name}, _TimeoutMsg} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
%case OneAction of
c_eTimeout ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
c_sTimeout ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{c_gTimeout, _Name} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{isHibernate, NewIsHibernate} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, NewIsHibernate, DoAfter, Timeouts, NextEvents);
{isPostpone, NewIsPostpone} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, NewIsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents);
{doAfter, Args} ->
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, {true, Args}, Timeouts, NextEvents);
{nextEvent, Type, Content} ->
%% 处理next_event动作
doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, [{Type, Content} | NextEvents])
%_ ->
%case OneAction of
% c_eTimeout when CallbackForm == 1 ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
% c_sTimeout when CallbackForm == 1 ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
% {c_gTimeout, _Name} when CallbackForm == 1 ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
% {isHibernate, NewIsHibernate} ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, NewIsHibernate, DoAfter, Timeouts, NextEvents);
% {isPostpone, NewIsPostpone} when (not NewIsPostpone orelse CallbackForm == 1) ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, NewIsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents);
% {doAfter, Args} when CallbackForm == 1 ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, {true, Args}, Timeouts, NextEvents);
% {nextEvent, Type, Content} when CallbackForm == 1 orelse CallbackForm == 2 ->
% %% 处理next_event动作
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, [{Type, Content} | NextEvents]);
% _ActRet ->
% doPAL(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents)
%end
end.
doPAL2([], _CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents) ->
{CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents};
doPAL2([OneAction | LeftActions], CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents) ->
case OneAction of
{reply, From, Reply} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents);
{eTimeout, _Time, _TimeoutMsg} when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{sTimeout, _Time, _TimeoutMsg} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{gTimeout, _Name}, _Time, _TimeoutMsg} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{c_gTimeout, _Name} when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{eTimeout, _Time, _TimeoutMsg, _Options} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{sTimeout, _Time, _TimeoutMsg, _Options} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{gTimeout, _Name}, _Time, _TimeoutMsg, _Options} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{u_eTimeout, _TimeoutMsg} when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{u_sTimeout, _TimeoutMsg} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{{u_gTimeout, _Name}, _TimeoutMsg} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
c_eTimeout when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
c_sTimeout when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{c_gTimeout, _Name} when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, [OneAction | Timeouts], NextEvents);
{isHibernate, NewIsHibernate} ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, NewIsHibernate, DoAfter, Timeouts, NextEvents);
{isPostpone, NewIsPostpone} when (not NewIsPostpone orelse CallbackForm == 1) ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, NewIsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents);
{doAfter, Args} when CallbackForm == 1 ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, {true, Args}, Timeouts, NextEvents);
{nextEvent, Type, Content} when CallbackForm == 1 orelse CallbackForm == 2 ->
%% 处理next_event动作
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, [{Type, Content} | NextEvents]);
_ActRet ->
doPAL2(LeftActions, CallbackForm, CycleData, Debug, IsPostpone, IsHibernate, DoAfter, Timeouts, NextEvents)
end.
lr(0) ->
ok;
lr(N) ->
lists:reverse([]),
lr(N - 1).
tsList(0, _, SceneId, LineId, ExtraArgs) ->
ok;
tsList(N, _, SceneId, LineId, ExtraArgs) ->
tsList(N - 1, [SceneId, LineId, ExtraArgs], SceneId, LineId, ExtraArgs).
tsTuple(0, _, SceneId, LineId, ExtraArgs) ->
ok;
tsTuple(N, _, SceneId, LineId, ExtraArgs) ->
tsList(N - 1, {SceneId, LineId, ExtraArgs}, SceneId, LineId, ExtraArgs).
bslT(0, A, B, _) ->
A * 1000000 + B;
bslT(N, A, B, _) ->
bslT(N -1, A, B, A * 1000000 + B).
xxxT(0, A, B, _) ->
A bsl 20 + B;
xxxT(N, A, B, _) ->
xxxT(N -1, A, B, A bsl 20 + B).
tttT(0, A, B, _) ->
{A, B};
tttT(N, A, B, _) ->
tttT(N -1, A, B, {A, B}).
listLoopIn(X) ->
X.
listLoop1(List) ->
[listLoopIn(One) || One <- List],
ok.
listLoop2([]) ->
ok;
listLoop2([One | List]) ->
listLoopIn(One),
listLoop2(List).
listLoop3(List) ->
lists:foreach(fun(X) -> listLoopIn(X) end, List).
bits(0, _Fun) ->
ok;
bits(N, Fun) ->
[?MODULE:Fun(BitSize) || BitSize <- [3, 7, 16, 31, 55, 63, 64]],
bits(N - 1, Fun).
%% 生成一个指定大小且全为1的bitstring
bits_1(BitSize) when BitSize < 8 -> <<Bits:BitSize/bits, _/bits>> = <<16#FF>>, Bits;
bits_1(BitSize) when BitSize =:= 8 -> <<255>>;
bits_1(BitSize) when BitSize < 16 -> Tail = bits_1(BitSize - 8), <<255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 16 -> <<255, 255>>;
bits_1(BitSize) when BitSize < 24 -> Tail = bits_1(BitSize - 16), <<255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 24 -> <<255, 255, 255>>;
bits_1(BitSize) when BitSize < 32 -> Tail = bits_1(BitSize - 24), <<255, 255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 32 -> <<255, 255, 255, 255>>;
bits_1(BitSize) when BitSize < 40 -> Tail = bits_1(BitSize - 32), <<255, 255, 255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 40 -> <<255, 255, 255, 255, 255>>;
bits_1(BitSize) when BitSize < 48 -> Tail = bits_1(BitSize - 40), <<255, 255, 255, 255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 48 -> <<255, 255, 255, 255, 255, 255>>;
bits_1(BitSize) when BitSize < 56 -> Tail = bits_1(BitSize - 48), <<255, 255, 255, 255, 255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 56 -> <<255, 255, 255, 255, 255, 255, 255>>;
bits_1(BitSize) when BitSize < 64 -> Tail = bits_1(BitSize - 56), <<255, 255, 255, 255, 255, 255, 255, Tail/bits>>;
bits_1(BitSize) when BitSize =:= 64 -> <<255, 255, 255, 255, 255, 255, 255, 255>>.
bits_2(BitSize) ->
<<((1 bsl BitSize) - 1):BitSize>>.
testHex(0, Mod, Fun, Args, _) ->
Mod:Fun(Args);
testHex(N, Mod, Fun, Args, _) ->
testHex(N - 1, Mod, Fun, Args, Mod:Fun(Args)).
tTuple(0, _) ->
ok;
tTuple(N, {tag, OldN}) ->
tTuple(N -1, {tag, OldN}).
tPd(0, _) ->
ok;
tPd(N, _) ->
erlang:put(pdVpSize, 0),
tPd(N -1, erlang:get(pdVpSize)).