WIP: add a Val struct as an input/output when calling a function
This commit is contained in:
@@ -323,6 +323,8 @@ private:
|
|||||||
|
|
||||||
ExpressionParser * expression_parser;
|
ExpressionParser * expression_parser;
|
||||||
|
|
||||||
|
std::vector<Val> no_parameters;
|
||||||
|
|
||||||
void InitializeTmpStreams();
|
void InitializeTmpStreams();
|
||||||
|
|
||||||
void ResizeStreamStack(std::vector<pt::Stream*> & stream_tab, size_t stream_tab_max_size);
|
void ResizeStreamStack(std::vector<pt::Stream*> & stream_tab, size_t stream_tab_max_size);
|
||||||
@@ -371,7 +373,6 @@ private:
|
|||||||
//void CallFunction(FindHelper & find_helper);
|
//void CallFunction(FindHelper & find_helper);
|
||||||
|
|
||||||
void CallMethod(morm::Model * model, Val::ModelMethod1 method, Env & env);
|
void CallMethod(morm::Model * model, Val::ModelMethod1 method, Env & env);
|
||||||
void CallMethod(morm::Model * model, Val::ModelMethod2 method, Val & res);
|
|
||||||
bool CallMethod(morm::Model * model, Val::ModelMethod3 method);
|
bool CallMethod(morm::Model * model, Val::ModelMethod3 method);
|
||||||
bool CallMethod(morm::Model * model, Val::ModelMethod4 method);
|
bool CallMethod(morm::Model * model, Val::ModelMethod4 method);
|
||||||
|
|
||||||
@@ -407,8 +408,9 @@ private:
|
|||||||
bool FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias);
|
bool FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias);
|
||||||
bool FindLastSpace(FindHelper & find_helper);
|
bool FindLastSpace(FindHelper & find_helper);
|
||||||
|
|
||||||
bool EvaluateFunctions(pt::Stream & out_stream, Val & val, Val & result);
|
bool EvaluateFunctions(pt::Stream & out_stream, Val & val, std::vector<Val> & parameters, Val & result);
|
||||||
bool EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapper);
|
bool EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapper, std::vector<Val> & parameters);
|
||||||
|
bool EvaluateFunctions(FindHelper & find_helper, bool use_parameters, ValWrapper & valwrapper);
|
||||||
|
|
||||||
void CallObject(BaseObj & base_obj,
|
void CallObject(BaseObj & base_obj,
|
||||||
int method_index,
|
int method_index,
|
||||||
@@ -1344,13 +1346,6 @@ void Generator::CallMethod(morm::Model * model, Val::ModelMethod1 method, Env &
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Generator::CallMethod(morm::Model * model, Val::ModelMethod2 method, Val & res)
|
|
||||||
{
|
|
||||||
res.clear();
|
|
||||||
(model->*method)(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Generator::CallMethod(morm::Model * model, Val::ModelMethod3 method)
|
bool Generator::CallMethod(morm::Model * model, Val::ModelMethod3 method)
|
||||||
{
|
{
|
||||||
return (model->*method)();
|
return (model->*method)();
|
||||||
@@ -1983,11 +1978,10 @@ Val * Generator::FindLastModelWrapperEvalueateFunctionsRenameMe(FindHelper & fin
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Generator::EvaluateFunctions(pt::Stream & out_stream, Val & val, Val & result)
|
bool Generator::EvaluateFunctions(pt::Stream & out_stream, Val & val, std::vector<Val> & parameters, Val & result)
|
||||||
{
|
{
|
||||||
size_t max_calls = 2; // change me to something reasnoable
|
size_t max_calls = 2; // change me to something reasnoable
|
||||||
size_t current_call = 1;
|
size_t current_call = 1;
|
||||||
std::vector<Val> no_parameters; // make me some kind of a static
|
|
||||||
Val * current_val = &val;
|
Val * current_val = &val;
|
||||||
result.clear();
|
result.clear();
|
||||||
result.set_output_stream(out_stream);
|
result.set_output_stream(out_stream);
|
||||||
@@ -2002,9 +1996,12 @@ bool Generator::EvaluateFunctions(pt::Stream & out_stream, Val & val, Val & resu
|
|||||||
|
|
||||||
if( current_val->has_function() )
|
if( current_val->has_function() )
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* current_val can point to the 'result' in a second iteration
|
||||||
|
* the result is correclty cleared in Env cctor so we have to copy current_val->pointer now
|
||||||
|
*/
|
||||||
Val::UserFunction function = reinterpret_cast<Val::UserFunction>(current_val->pointer);
|
Val::UserFunction function = reinterpret_cast<Val::UserFunction>(current_val->pointer);
|
||||||
|
Env env(out_stream, parameters, result, *empty_stream, stack_tab[stack_index-1], *stack_tab[stack_index-1].item);
|
||||||
Env env(out_stream, no_parameters, result, *empty_stream, stack_tab[stack_index-1], *stack_tab[stack_index-1].item);
|
|
||||||
CallFunction(function, env);
|
CallFunction(function, env);
|
||||||
}
|
}
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
@@ -2015,22 +2012,22 @@ bool Generator::EvaluateFunctions(pt::Stream & out_stream, Val & val, Val & resu
|
|||||||
|
|
||||||
if( current_val->model_method1 )
|
if( current_val->model_method1 )
|
||||||
{
|
{
|
||||||
Val::ModelMethod1 method = current_val->model_method1; // current_val can point to result so copy the value (Env cctor calls a clear() method on the result)
|
Val::ModelMethod1 method = current_val->model_method1; // current_val can point to the result so copy the value (Env cctor calls a clear() method on the result)
|
||||||
Env env(out_stream, no_parameters, result, *empty_stream, stack_tab[stack_index-1], *stack_tab[stack_index-1].item);
|
Env env(out_stream, parameters, result, *empty_stream, stack_tab[stack_index-1], *stack_tab[stack_index-1].item);
|
||||||
CallMethod(model, method, env);
|
CallMethod(model, method, env);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if( current_val->model_method2 )
|
|
||||||
{
|
|
||||||
Val::ModelMethod2 method = current_val->model_method2;
|
|
||||||
CallMethod(model, method, result);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( current_val->model_method3 )
|
if( current_val->model_method3 )
|
||||||
{
|
{
|
||||||
bool res = CallMethod(model, current_val->model_method3);
|
bool res = CallMethod(model, current_val->model_method3);
|
||||||
result.set(res);
|
result.set(res);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if( current_val->model_method4 )
|
||||||
|
{
|
||||||
|
bool res = CallMethod(model, current_val->model_method4);
|
||||||
|
result.set(res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2042,7 +2039,7 @@ bool Generator::EvaluateFunctions(pt::Stream & out_stream, Val & val, Val & resu
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Generator::EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapper)
|
bool Generator::EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapper, std::vector<Val> & parameters)
|
||||||
{
|
{
|
||||||
if( valwrapper.has_evaluated_val )
|
if( valwrapper.has_evaluated_val )
|
||||||
{
|
{
|
||||||
@@ -2058,7 +2055,7 @@ bool Generator::EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapp
|
|||||||
{
|
{
|
||||||
size_t current_size = out_stream.size();
|
size_t current_size = out_stream.size();
|
||||||
|
|
||||||
if( EvaluateFunctions(out_stream, valwrapper.val, valwrapper.evaluated_val) )
|
if( EvaluateFunctions(out_stream, valwrapper.val, parameters, valwrapper.evaluated_val) )
|
||||||
{
|
{
|
||||||
valwrapper.has_evaluated_val = true;
|
valwrapper.has_evaluated_val = true;
|
||||||
|
|
||||||
@@ -2082,6 +2079,19 @@ bool Generator::EvaluateFunctions(pt::Stream & out_stream, ValWrapper & valwrapp
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Generator::EvaluateFunctions(FindHelper & find_helper, bool use_parameters, ValWrapper & valwrapper)
|
||||||
|
{
|
||||||
|
if( !no_parameters.empty() )
|
||||||
|
{
|
||||||
|
no_parameters.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Val> * parameters = (use_parameters) ? &find_helper.parameters : &no_parameters;
|
||||||
|
|
||||||
|
return EvaluateFunctions(find_helper.out_stream, valwrapper, *parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// RENAMEME
|
// RENAMEME
|
||||||
bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias)
|
bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias)
|
||||||
{
|
{
|
||||||
@@ -2116,7 +2126,9 @@ bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias
|
|||||||
|
|
||||||
if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias )
|
if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias )
|
||||||
{
|
{
|
||||||
if( EvaluateFunctions(find_helper.out_stream, valwrapper) )
|
bool use_parameters = (find_helper.field_index + 1 == find_helper.fields.size());
|
||||||
|
|
||||||
|
if( EvaluateFunctions(find_helper, use_parameters, valwrapper) )
|
||||||
{
|
{
|
||||||
child_valwrapper = find_helper.valwrapper->add_child(field, valwrapper);
|
child_valwrapper = find_helper.valwrapper->add_child(field, valwrapper);
|
||||||
}
|
}
|
||||||
@@ -2330,7 +2342,10 @@ void Generator::EvaluateParameters(FindHelper & find_helper)
|
|||||||
{
|
{
|
||||||
// parameters[i].str = fun_child.name;
|
// parameters[i].str = fun_child.name;
|
||||||
// parameters[i].res = ConvertToBool(fun_child.name);
|
// parameters[i].res = ConvertToBool(fun_child.name);
|
||||||
find_helper.parameters[i] << fun_child.name;
|
|
||||||
|
|
||||||
|
//find_helper.parameters[i] << fun_child.name;
|
||||||
|
find_helper.parameters[i].set_pointer_to(&fun_child.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2449,9 +2464,13 @@ bool Generator::Call(Item::Function & item_fun,
|
|||||||
|
|
||||||
bool is_for_alias = false;
|
bool is_for_alias = false;
|
||||||
|
|
||||||
|
EvaluateParameters(find_helper);
|
||||||
|
|
||||||
if( !is_for_alias || find_helper.field_index < find_helper.fields.size() )
|
if( !is_for_alias || find_helper.field_index < find_helper.fields.size() )
|
||||||
{
|
{
|
||||||
if( EvaluateFunctions(find_helper.out_stream, *find_helper.valwrapper) )
|
bool use_parameters = find_helper.fields.empty();
|
||||||
|
|
||||||
|
if( EvaluateFunctions(find_helper, use_parameters, *find_helper.valwrapper) )
|
||||||
{
|
{
|
||||||
if( find_helper.valwrapper->has_evaluated_val )
|
if( find_helper.valwrapper->has_evaluated_val )
|
||||||
{
|
{
|
||||||
@@ -2470,7 +2489,6 @@ bool Generator::Call(Item::Function & item_fun,
|
|||||||
if( !FindLastSpace(find_helper) )
|
if( !FindLastSpace(find_helper) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
EvaluateParameters(find_helper);
|
|
||||||
bool status = false;
|
bool status = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
33
src/val.cpp
33
src/val.cpp
@@ -91,7 +91,6 @@ void Val::copy(const Val & val)
|
|||||||
if( type == Type::TYPE_MODEL_METHOD )
|
if( type == Type::TYPE_MODEL_METHOD )
|
||||||
{
|
{
|
||||||
model_method1 = val.model_method1;
|
model_method1 = val.model_method1;
|
||||||
model_method2 = val.model_method2;
|
|
||||||
model_method3 = val.model_method3;
|
model_method3 = val.model_method3;
|
||||||
model_method4 = val.model_method4;
|
model_method4 = val.model_method4;
|
||||||
}
|
}
|
||||||
@@ -157,7 +156,6 @@ void Val::initialize_empty()
|
|||||||
type = TYPE_VOID;
|
type = TYPE_VOID;
|
||||||
pointer = nullptr;
|
pointer = nullptr;
|
||||||
model_method1 = nullptr;
|
model_method1 = nullptr;
|
||||||
model_method2 = nullptr;
|
|
||||||
model_method3 = nullptr;
|
model_method3 = nullptr;
|
||||||
model_method4 = nullptr;
|
model_method4 = nullptr;
|
||||||
space_wrapper = nullptr;
|
space_wrapper = nullptr;
|
||||||
@@ -220,7 +218,7 @@ bool Val::has_function()
|
|||||||
|
|
||||||
bool Val::has_method()
|
bool Val::has_method()
|
||||||
{
|
{
|
||||||
return type == Type::TYPE_MODEL_METHOD && pointer && (model_method1 || model_method2 || model_method3);
|
return type == Type::TYPE_MODEL_METHOD && pointer && (model_method1 || model_method3 || model_method4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -458,15 +456,6 @@ void Val::set_pointer_to(morm::Model * model, ModelMethod1 model_method1)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(morm::Model * model, ModelMethod2 model_method2)
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
type = TYPE_MODEL_METHOD;
|
|
||||||
this->pointer = model;
|
|
||||||
this->model_method2 = model_method2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(morm::Model * model, ModelMethod3 model_method3)
|
void Val::set_pointer_to(morm::Model * model, ModelMethod3 model_method3)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
@@ -696,31 +685,41 @@ void Val::set_pointer_to(unsigned long long * val)
|
|||||||
|
|
||||||
void Val::set_pointer_to(float * val)
|
void Val::set_pointer_to(float * val)
|
||||||
{
|
{
|
||||||
// IMPLEMENTME
|
clear();
|
||||||
|
type = TYPE_FLOAT;
|
||||||
|
pointer = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(double * val)
|
void Val::set_pointer_to(double * val)
|
||||||
{
|
{
|
||||||
// IMPLEMENTME
|
clear();
|
||||||
|
type = TYPE_DOUBLE;
|
||||||
|
pointer = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(long double * val)
|
void Val::set_pointer_to(long double * val)
|
||||||
{
|
{
|
||||||
// IMPLEMENTME
|
clear();
|
||||||
|
type = TYPE_LONG_DOUBLE;
|
||||||
|
pointer = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(std::string * val)
|
void Val::set_pointer_to(std::string * val)
|
||||||
{
|
{
|
||||||
// IMPLEMENTME
|
clear();
|
||||||
|
type = TYPE_STRING;
|
||||||
|
pointer = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Val::set_pointer_to(std::wstring * val)
|
void Val::set_pointer_to(std::wstring * val)
|
||||||
{
|
{
|
||||||
// IMPLEMENTME
|
clear();
|
||||||
|
type = TYPE_WSTRING;
|
||||||
|
pointer = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -68,7 +68,6 @@ public:
|
|||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
using ModelMethod1 = void (morm::Model::*)(Env &);
|
using ModelMethod1 = void (morm::Model::*)(Env &);
|
||||||
using ModelMethod2 = void (morm::Model::*)(Val &);
|
|
||||||
using ModelMethod3 = bool (morm::Model::*)();
|
using ModelMethod3 = bool (morm::Model::*)();
|
||||||
using ModelMethod4 = bool (morm::Model::*)() const;
|
using ModelMethod4 = bool (morm::Model::*)() const;
|
||||||
#endif
|
#endif
|
||||||
@@ -99,6 +98,11 @@ public:
|
|||||||
TYPE_UNSIGNED_INT,
|
TYPE_UNSIGNED_INT,
|
||||||
TYPE_UNSIGNED_LONG,
|
TYPE_UNSIGNED_LONG,
|
||||||
TYPE_UNSIGNED_LONG_LONG,
|
TYPE_UNSIGNED_LONG_LONG,
|
||||||
|
TYPE_FLOAT,
|
||||||
|
TYPE_DOUBLE,
|
||||||
|
TYPE_LONG_DOUBLE,
|
||||||
|
TYPE_STRING,
|
||||||
|
TYPE_WSTRING,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -153,7 +157,6 @@ public:
|
|||||||
void set_pointer_to(UserFunction user_function);
|
void set_pointer_to(UserFunction user_function);
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
void set_pointer_to(morm::Model * model, ModelMethod1 model_method1);
|
void set_pointer_to(morm::Model * model, ModelMethod1 model_method1);
|
||||||
void set_pointer_to(morm::Model * model, ModelMethod2 model_method2);
|
|
||||||
void set_pointer_to(morm::Model * model, ModelMethod3 model_method3);
|
void set_pointer_to(morm::Model * model, ModelMethod3 model_method3);
|
||||||
void set_pointer_to(morm::Model * model, ModelMethod4 model_method4);
|
void set_pointer_to(morm::Model * model, ModelMethod4 model_method4);
|
||||||
#endif
|
#endif
|
||||||
@@ -242,7 +245,6 @@ public:
|
|||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
ModelMethod1 model_method1;
|
ModelMethod1 model_method1;
|
||||||
ModelMethod2 model_method2;
|
|
||||||
ModelMethod3 model_method3;
|
ModelMethod3 model_method3;
|
||||||
ModelMethod4 model_method4;
|
ModelMethod4 model_method4;
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user