46 void LoadModule(std::string_view path_name, std::string_view name = {});
79 template <
typename T,
typename ...Args>
80 bool ExcuteFunction(std::string_view name, std::string_view func_decl,
T& ret, Args&&... args)
86 asIScriptContext* ctx = _engine->CreateContext();
89 if (!_set_arg_imp(ctx,
sizeof...(Args), std::forward<Args>(args)...))
91 log_err(
"参数设置失败:{} -> {}", name, func_decl);
95 int r = ctx->Execute();
96 if (r != asEXECUTION_FINISHED)
98 if (r == asEXECUTION_EXCEPTION)
100 log_err(
"脚本出现异常:{}", ctx->GetExceptionString());
105 ret = _get_return<T>(ctx);
114 asIScriptEngine* _engine;
115 std::string _pathRoot;
116 std::string _fileExt;
117 std::string _namePrefix;
118 std::unordered_map<std::string, ModuleInfo> _allModule;
122 bool _set_arg_imp(asIScriptContext* ctx,
size_t num)
127 template <
typename T,
typename ...Args>
128 bool _set_arg_imp(asIScriptContext* ctx,
unsigned num,
T&& param, Args&&... args)
130 asUINT i = num -
sizeof...(Args) - 1;
131 auto p = std::forward<T>(param);
134 if constexpr (std::is_integral<T>::value)
136 if constexpr (
sizeof(
T) == 1)
137 r = ctx->SetArgByte(i, p);
138 else if constexpr (
sizeof(
T) == 2)
139 r = ctx->SetArgWord(i, p);
140 else if constexpr (
sizeof(
T) == 4)
141 r = ctx->SetArgDWord(i, p);
142 else if constexpr (
sizeof(
T) == 8)
143 r = ctx->SetArgQWord(i, p);
147 else if constexpr (std::is_pointer<T>::value)
149 if constexpr (
sizeof(
T) == 4)
150 r = ctx->SetArgDWord(i, p);
151 else if constexpr (
sizeof(
T) == 8)
152 r = ctx->SetArgQWord(i, p);
156 else if constexpr (std::is_floating_point<T>::value)
158 if constexpr (
sizeof(
T) == 4)
159 r = ctx->SetArgFloat(i, p);
160 else if constexpr (
sizeof(
T) == 8)
161 r = ctx->SetArgDouble(i, p);
167 r = ctx->SetArgObject(i, &p);
172 return _set_arg_imp(ctx, num, std::forward<Args>(args)...);
176 template <
typename T>
177 T _get_return(asIScriptContext* ctx)
179 if constexpr (std::is_integral<T>::value)
181 if constexpr (
sizeof(
T) == 1)
182 return ctx->GetReturnByte();
183 else if constexpr (
sizeof(
T) == 2)
184 return ctx->GetReturnWord();
185 else if constexpr (
sizeof(
T) == 4)
186 return ctx->GetReturnDWord();
187 else if constexpr (
sizeof(
T) == 8)
188 return ctx->GetReturnQWord();
192 else if constexpr (std::is_pointer<T>::value)
194 return (
T)ctx->GetReturnObject();
196 else if constexpr (std::is_floating_point<T>::value)
198 if constexpr (
sizeof(
T) == 4)
199 return ctx->GetReturnFloat();
200 else if constexpr (
sizeof(
T) == 8)
201 return ctx->GetReturnDouble();