From 5744eb81d964e25894e560cfe4f7a4a8d7bffe02 Mon Sep 17 00:00:00 2001 From: Sandu Liviu Catalin Date: Sun, 29 Jul 2018 19:27:38 +0300 Subject: [PATCH] Implement ArgPop helper to reduce code duplication when forwarding calls from script to native functions. --- include/sqrat/sqratTypes.h | 362 +++++++++++++++++++++++++++++++++++++ 1 file changed, 362 insertions(+) diff --git a/include/sqrat/sqratTypes.h b/include/sqrat/sqratTypes.h index f10ab5fa..9cfabe3b 100644 --- a/include/sqrat/sqratTypes.h +++ b/include/sqrat/sqratTypes.h @@ -1165,6 +1165,368 @@ inline void PushVarR(HSQUIRRELVM vm, T& value) { } } +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Helper used to pop multiple variables from the stack and forward them to a functor. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template struct ArgPop; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Special case for when nothing has to be popped. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template<> +struct ArgPop<> { + ArgPop(HSQUIRRELVM /*vm*/, SQInteger /*idx*/) + { } + template void Exec(F f) { + f(); + } + template R Eval(F f) { + return f(); + } +}; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// Incremental specialization for when types are actually specified. +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +struct ArgPop { + Var V1; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : V1(vm, idx) + { } + template void Exec(F f) { + f(V1.value); + } + template R Eval(F f) { + return f(V1.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + // Implement ours + Var V2; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V2(vm, idx+1) + { } + template void Exec(F f) { + f(V1.value,V2.value); + } + template R Eval(F f) { + return f(V1.value,V2.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + // Implement ours + Var V3; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V3(vm, idx+2) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + // Implement ours + Var V4; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V4(vm, idx+3) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + // Implement ours + Var V5; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V5(vm, idx+4) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + // Implement ours + Var V6; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V6(vm, idx+5) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + // Implement ours + Var V7; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V7(vm, idx+6) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + // Implement ours + Var V8; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V8(vm, idx+7) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + // Implement ours + Var V9; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V9(vm, idx+8) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + using Base::V9; + // Implement ours + Var V10; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V10(vm, idx+9) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + using Base::V9; + using Base::V10; + // Implement ours + Var V11; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V11(vm, idx+10) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + using Base::V9; + using Base::V10; + using Base::V11; + // Implement ours + Var V12; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V12(vm, idx+11) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + using Base::V9; + using Base::V10; + using Base::V11; + using Base::V12; + // Implement ours + Var V13; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V13(vm, idx+12) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value,V13.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value,V13.value); + } +}; + +template +struct ArgPop : public ArgPop { + using Base = ArgPop; + // Import from base classes + using Base::V1; + using Base::V2; + using Base::V3; + using Base::V4; + using Base::V5; + using Base::V6; + using Base::V7; + using Base::V8; + using Base::V9; + using Base::V10; + using Base::V11; + using Base::V12; + using Base::V13; + // Implement ours + Var V14; + ArgPop(HSQUIRRELVM vm, SQInteger idx) + : ArgPop(vm, idx) + , V14(vm, idx+13) + { } + template void Exec(F f) { + f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value,V13.value,V14.value); + } + template R Eval(F f) { + return f(V1.value,V2.value,V3.value,V4.value,V5.value,V6.value,V7.value,V8.value,V9.value,V10.value,V11.value,V12.value,V13.value,V14.value); + } +}; + } #endif