WIP: add a Val struct as an input/output when calling a function
This commit is contained in:
149
src/generator.h
149
src/generator.h
@@ -396,15 +396,14 @@ private:
|
|||||||
bool CallSpace(FindHelper & find_helper);
|
bool CallSpace(FindHelper & find_helper);
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
bool CallModelField(FindHelper & find_helper, morm::Model & model);
|
//bool CallModelField(FindHelper & find_helper, morm::Model & model);
|
||||||
bool CallModel(FindHelper & find_helper, morm::Model & model);
|
bool CallModel(FindHelper & find_helper, morm::Model & model);
|
||||||
bool FindLastModelWrapper(FindHelper & find_helper);
|
bool FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias);
|
||||||
bool CallModel(FindHelper & find_helper);
|
bool CallModel(FindHelper & find_helper);
|
||||||
bool CallModelContainerWrapper(FindHelper & find_helper);
|
bool CallModelContainerWrapper(FindHelper & find_helper);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool EvaluateFunctionOrMethod(pt::Stream & out_stream, Val & val, Val & result);
|
bool EvaluateFunctionOrMethod(pt::Stream & out_stream, Val & val, Val & result);
|
||||||
bool ReduceFields(FindHelper & find_helper);
|
|
||||||
|
|
||||||
void CallObject(BaseObj & base_obj,
|
void CallObject(BaseObj & base_obj,
|
||||||
int method_index,
|
int method_index,
|
||||||
@@ -421,7 +420,7 @@ private:
|
|||||||
// const pt::Stream & in_stream);
|
// const pt::Stream & in_stream);
|
||||||
|
|
||||||
void EvaluateParameters(FindHelper & find_helper);
|
void EvaluateParameters(FindHelper & find_helper);
|
||||||
bool Evaluate(FindHelper & find_helper);
|
//bool Evaluate(FindHelper & find_helper);
|
||||||
bool CallValue(FindHelper & find_helper);
|
bool CallValue(FindHelper & find_helper);
|
||||||
void CleanupParameters(std::vector<Val> & parameters);
|
void CleanupParameters(std::vector<Val> & parameters);
|
||||||
|
|
||||||
@@ -1591,7 +1590,7 @@ pt::Space * Generator::CallSpaceObject(FindHelper & find_helper, pt::Space * spa
|
|||||||
|
|
||||||
void Generator::CallSpaceTableForLastField(FindHelper & find_helper, pt::Space * space)
|
void Generator::CallSpaceTableForLastField(FindHelper & find_helper, pt::Space * space)
|
||||||
{
|
{
|
||||||
pt::Space::TableType * table = space->get_table();
|
//pt::Space::TableType * table = space->get_table();
|
||||||
|
|
||||||
if( is_generating_for )
|
if( is_generating_for )
|
||||||
{
|
{
|
||||||
@@ -1787,6 +1786,7 @@ bool Generator::CallSpace(FindHelper & find_helper)
|
|||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
bool Generator::CallModelField(FindHelper & find_helper, morm::Model & model)
|
bool Generator::CallModelField(FindHelper & find_helper, morm::Model & model)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
@@ -1818,7 +1818,7 @@ bool Generator::CallModelField(FindHelper & find_helper, morm::Model & model)
|
|||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
bool Generator::CallModel(FindHelper & find_helper, morm::Model & model)
|
bool Generator::CallModel(FindHelper & find_helper, morm::Model & model)
|
||||||
@@ -1839,6 +1839,7 @@ bool Generator::CallModel(FindHelper & find_helper, morm::Model & model)
|
|||||||
if( find_helper.field_index + 1 == find_helper.fields.size() )
|
if( find_helper.field_index + 1 == find_helper.fields.size() )
|
||||||
{
|
{
|
||||||
// last field is not a model nor a models container
|
// last field is not a model nor a models container
|
||||||
|
/*
|
||||||
if( !CallModelField(find_helper, model) )
|
if( !CallModelField(find_helper, model) )
|
||||||
{
|
{
|
||||||
if( !IsTestingFunctionExistence() )
|
if( !IsTestingFunctionExistence() )
|
||||||
@@ -1849,6 +1850,7 @@ bool Generator::CallModel(FindHelper & find_helper, morm::Model & model)
|
|||||||
|
|
||||||
found = false;
|
found = false;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1864,7 +1866,7 @@ bool Generator::CallModel(FindHelper & find_helper, morm::Model & model)
|
|||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
Val * Generator::FindLastModelWrapperEvaluateMiddleFunction(FindHelper & find_helper)
|
Val * Generator::FindLastModelWrapperEvaluateMiddleFunction(FindHelper & find_helper)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1937,6 +1939,8 @@ Val * Generator::FindLastModelWrapperEvalueateFunctionsRenameMe(FindHelper & fin
|
|||||||
|
|
||||||
return child_val;
|
return child_val;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool Generator::EvaluateFunctionOrMethod(pt::Stream & out_stream, Val & val, Val & result)
|
bool Generator::EvaluateFunctionOrMethod(pt::Stream & out_stream, Val & val, Val & result)
|
||||||
@@ -1998,56 +2002,100 @@ bool Generator::EvaluateFunctionOrMethod(pt::Stream & out_stream, Val & val, Val
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// may we should return a bool value?
|
// RENAMEME
|
||||||
bool Generator::FindLastModelWrapper(FindHelper & find_helper)
|
bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias)
|
||||||
{
|
{
|
||||||
find_helper.field_index = 0;
|
find_helper.field_index = 0;
|
||||||
Val res(&find_helper.out_stream);
|
Val res(&find_helper.out_stream);
|
||||||
|
|
||||||
if( !EvaluateFunctionOrMethod(find_helper.out_stream, *find_helper.currentval, res) )
|
while( find_helper.field_index < find_helper.fields.size() && find_helper.currentval->has_model_object() )
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
while( find_helper.field_index < find_helper.fields.size() &&
|
|
||||||
(find_helper.currentval->has_function() || find_helper.currentval->has_method() || find_helper.currentval->has_model_object()) )
|
|
||||||
{
|
{
|
||||||
std::wstring & field = find_helper.fields[find_helper.field_index];
|
std::wstring & field = find_helper.fields[find_helper.field_index];
|
||||||
Val * child_val = find_helper.currentval->find_child(field);
|
Val * child_val = find_helper.currentval->find_child(field);
|
||||||
|
|
||||||
if( !child_val )
|
if( !child_val )
|
||||||
{
|
{
|
||||||
Val val(&find_helper.out_stream);
|
morm::Model * model = nullptr;
|
||||||
|
|
||||||
//if( find_helper.currentval->has_function() || find_helper.currentval->has_method() )
|
if( find_helper.currentval->pointer )
|
||||||
|
|
||||||
|
|
||||||
if( find_helper.currentval->has_function() )
|
|
||||||
{
|
{
|
||||||
child_val = FindLastModelWrapperEvaluateMiddleFunction(find_helper);
|
if( find_helper.currentval->type == Val::TYPE_MODEL )
|
||||||
}
|
|
||||||
else
|
|
||||||
if( find_helper.currentval->has_model_object() )
|
|
||||||
{
|
|
||||||
child_val = FindLastModelWrapperEvalueateMiddleModel(find_helper, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( find_helper.field_index + 1 < find_helper.fields.size() )
|
|
||||||
{
|
|
||||||
if( child_val && child_val->has_function() )
|
|
||||||
{
|
{
|
||||||
child_val = FindLastModelWrapperEvalueateFunctionsRenameMe(find_helper, child_val);
|
model = reinterpret_cast<morm::Model*>(find_helper.currentval->pointer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( find_helper.currentval->type == Val::TYPE_MODEL_CONTAINER_WRAPPER )
|
||||||
|
{
|
||||||
|
morm::ModelContainerWrapper * model_container_wrapper = reinterpret_cast<morm::ModelContainerWrapper*>(find_helper.currentval->pointer);
|
||||||
|
model = model_container_wrapper->get_model();
|
||||||
|
// this can return null for lists/vectors in a case when the iterator is not pointing to a valid item
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( find_helper.currentval->has_function() || find_helper.currentval->has_method() )
|
||||||
|
{
|
||||||
|
if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias )
|
||||||
|
{
|
||||||
|
if( EvaluateFunctionOrMethod(find_helper.out_stream, *find_helper.currentval, res) )
|
||||||
|
{
|
||||||
|
find_helper.currentval = &res;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// put some error?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// IMPLEMENT me for alias
|
||||||
|
find_helper.result = *find_helper.currentval;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( model )
|
||||||
|
{
|
||||||
|
Val val = model->get_ezc_val(nullptr, field.c_str());
|
||||||
|
|
||||||
|
if( val.has_function() || val.has_method() )
|
||||||
|
{
|
||||||
|
if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias )
|
||||||
|
{
|
||||||
|
if( EvaluateFunctionOrMethod(find_helper.out_stream, val, res) )
|
||||||
|
{
|
||||||
|
child_val = find_helper.currentval->add_child(field, res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// put some error?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// IMPLEMENT me for alias
|
||||||
|
find_helper.result = val;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( val.has_object() )
|
||||||
|
{
|
||||||
|
child_val = find_helper.currentval->add_child(field, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !child_val )
|
if( !child_val )
|
||||||
break;
|
break; //may return false;
|
||||||
|
|
||||||
find_helper.currentval = child_val;
|
find_helper.currentval = child_val;
|
||||||
find_helper.currentval->set_output_stream(find_helper.out_stream);
|
find_helper.currentval->set_output_stream(find_helper.out_stream);
|
||||||
find_helper.field_index += 1;
|
find_helper.field_index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2107,19 +2155,6 @@ bool Generator::CallModelContainerWrapper(FindHelper & find_helper)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// give me a better name
|
|
||||||
bool Generator::ReduceFields(FindHelper & find_helper)
|
|
||||||
{
|
|
||||||
bool reduced = true;
|
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
|
||||||
reduced = FindLastModelWrapper(find_helper);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return reduced;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Generator::CallObject(BaseObj & base_obj,
|
void Generator::CallObject(BaseObj & base_obj,
|
||||||
int method_index,
|
int method_index,
|
||||||
std::vector<Val> & parameters,
|
std::vector<Val> & parameters,
|
||||||
@@ -2237,16 +2272,16 @@ void Generator::EvaluateParameters(FindHelper & find_helper)
|
|||||||
|
|
||||||
// i cos takiego bedzie wykorzystane przy aliasach
|
// i cos takiego bedzie wykorzystane przy aliasach
|
||||||
// tylko tam evaluujemy od pierwszego parametru dopiero
|
// tylko tam evaluujemy od pierwszego parametru dopiero
|
||||||
bool Generator::Evaluate(FindHelper & find_helper)
|
// bool Generator::Evaluate(FindHelper & find_helper)
|
||||||
{
|
// {
|
||||||
if( !Find(find_helper) )
|
// if( !Find(find_helper) )
|
||||||
return false;
|
// return false;
|
||||||
|
|
||||||
EvaluateParameters(find_helper);
|
// EvaluateParameters(find_helper);
|
||||||
ReduceFields(find_helper);
|
// FindLastModelWrapper(find_helper);
|
||||||
|
|
||||||
return true;
|
// return true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
bool Generator::CallValue(FindHelper & find_helper)
|
bool Generator::CallValue(FindHelper & find_helper)
|
||||||
@@ -2291,7 +2326,7 @@ bool Generator::CallValue(FindHelper & find_helper)
|
|||||||
// if( find_helper.currentval->has_pod_type() )
|
// if( find_helper.currentval->has_pod_type() )
|
||||||
// return CallPodType(find_helper);
|
// return CallPodType(find_helper);
|
||||||
|
|
||||||
if( find_helper.currentval->type == Val::TYPE_SPACE_LOCAL )
|
if( find_helper.currentval->type == Val::TYPE_SPACE_LOCAL || find_helper.currentval->type == Val::TYPE_INT )
|
||||||
{
|
{
|
||||||
find_helper.result = *find_helper.currentval; // IMPROVEME this makes a copy
|
find_helper.result = *find_helper.currentval; // IMPROVEME this makes a copy
|
||||||
return true;
|
return true;
|
||||||
@@ -2341,7 +2376,7 @@ bool Generator::Call(Item::Function & item_fun,
|
|||||||
|
|
||||||
out_stream.escape_input(true);
|
out_stream.escape_input(true);
|
||||||
|
|
||||||
if( !ReduceFields(find_helper) )
|
if( !FindLastModelWrapper(find_helper, false) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
EvaluateParameters(find_helper);
|
EvaluateParameters(find_helper);
|
||||||
|
49
src/val.cpp
49
src/val.cpp
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2024, Tomasz Sowa
|
* Copyright (c) 2024-2025, Tomasz Sowa
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@@ -239,6 +239,8 @@ bool Val::has_function()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
|
||||||
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_method2 || model_method3);
|
||||||
@@ -250,6 +252,8 @@ bool Val::has_model_object()
|
|||||||
return (type == Type::TYPE_MODEL || type == Type::TYPE_MODEL_CONTAINER_WRAPPER) && pointer;
|
return (type == Type::TYPE_MODEL || type == Type::TYPE_MODEL_CONTAINER_WRAPPER) && pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool Val::has_pod_type()
|
bool Val::has_pod_type()
|
||||||
{
|
{
|
||||||
@@ -266,6 +270,12 @@ bool Val::has_pod_type()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// bool Val::has_space_object()
|
||||||
|
// {
|
||||||
|
// return (type == Type::TYPE_SPACE && pointer) || (type == Type::TYPE_SPACE_LOCAL && space_local.is_object());
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
bool Val::to_bool() const
|
bool Val::to_bool() const
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
@@ -980,9 +990,46 @@ void Val::serialize_to(pt::Stream & str)
|
|||||||
|
|
||||||
case TYPE_VOID:
|
case TYPE_VOID:
|
||||||
case TYPE_FUNCTION:
|
case TYPE_FUNCTION:
|
||||||
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
case TYPE_MODEL_METHOD:
|
||||||
|
#endif
|
||||||
case TYPE_OUTPUT_STREAM:
|
case TYPE_OUTPUT_STREAM:
|
||||||
case TYPE_ITEM_BLOCK:
|
case TYPE_ITEM_BLOCK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TYPE_CHAR:
|
||||||
|
serialize_pod_type_to<char>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_WCHAR:
|
||||||
|
serialize_pod_type_to<wchar_t>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_SHORT:
|
||||||
|
serialize_pod_type_to<short int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_INT:
|
||||||
|
serialize_pod_type_to<int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_LONG:
|
||||||
|
serialize_pod_type_to<long int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_LONG_LONG:
|
||||||
|
serialize_pod_type_to<long long int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_UNSIGNED_CHAR:
|
||||||
|
serialize_pod_type_to<unsigned char>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_UNSIGNED_SHORT:
|
||||||
|
serialize_pod_type_to<unsigned short int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_UNSIGNED_INT:
|
||||||
|
serialize_pod_type_to<unsigned int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_UNSIGNED_LONG:
|
||||||
|
serialize_pod_type_to<unsigned long int>(str);
|
||||||
|
break;
|
||||||
|
case TYPE_UNSIGNED_LONG_LONG:
|
||||||
|
serialize_pod_type_to<unsigned long long int>(str);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
src/val.h
16
src/val.h
@@ -79,10 +79,12 @@ public:
|
|||||||
TYPE_SPACE_LOCAL,
|
TYPE_SPACE_LOCAL,
|
||||||
TYPE_STREAM,
|
TYPE_STREAM,
|
||||||
TYPE_FUNCTION,
|
TYPE_FUNCTION,
|
||||||
TYPE_MODEL_METHOD,
|
|
||||||
TYPE_DATE,
|
TYPE_DATE,
|
||||||
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
TYPE_MODEL,
|
TYPE_MODEL,
|
||||||
TYPE_MODEL_CONTAINER_WRAPPER,
|
TYPE_MODEL_CONTAINER_WRAPPER,
|
||||||
|
TYPE_MODEL_METHOD,
|
||||||
|
#endif
|
||||||
TYPE_SPACE,
|
TYPE_SPACE,
|
||||||
TYPE_OUTPUT_STREAM,
|
TYPE_OUTPUT_STREAM,
|
||||||
TYPE_ITEM_BLOCK,
|
TYPE_ITEM_BLOCK,
|
||||||
@@ -115,9 +117,14 @@ public:
|
|||||||
|
|
||||||
bool has_object();
|
bool has_object();
|
||||||
bool has_function();
|
bool has_function();
|
||||||
|
|
||||||
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
bool has_method();
|
bool has_method();
|
||||||
bool has_model_object();
|
bool has_model_object();
|
||||||
|
#endif
|
||||||
|
|
||||||
bool has_pod_type();
|
bool has_pod_type();
|
||||||
|
//bool has_space_object();
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
void clear_childs();
|
void clear_childs();
|
||||||
@@ -306,6 +313,13 @@ private:
|
|||||||
void serialize_model_container_wrapper_to(pt::Stream & str);
|
void serialize_model_container_wrapper_to(pt::Stream & str);
|
||||||
void serialize_space_to(pt::Stream & str);
|
void serialize_space_to(pt::Stream & str);
|
||||||
|
|
||||||
|
template<typename PODType>
|
||||||
|
void serialize_pod_type_to(pt::Stream & str)
|
||||||
|
{
|
||||||
|
PODType * val = reinterpret_cast<PODType*>(pointer);
|
||||||
|
str << *val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* old
|
* old
|
||||||
|
Reference in New Issue
Block a user