some work on iterating through collection of models - not working yet

This commit is contained in:
Tomasz Sowa 2021-11-08 00:41:36 +01:00
parent 2f140686d7
commit ac66a6649d
2 changed files with 110 additions and 85 deletions

View File

@ -180,10 +180,11 @@ private:
Var<StreamType> * result;
bool found;
const std::wstring * previous_name;
morm::Model * previous_model;
morm::ModelContainerWrapper * previous_model_container_wrapper;
morm::SpaceWrapper * previous_space_wrapper;
size_t nested_calls;
Var<StreamType> * current_var;
Var<StreamType> * previous_var;
Var<StreamType> * previous_result;
FindHelper(
@ -198,9 +199,9 @@ private:
nested_calls = 0;
input = nullptr;
result = nullptr;
previous_model = nullptr;
previous_model_container_wrapper = nullptr;
previous_space_wrapper = nullptr;
current_var = nullptr;
previous_var = nullptr;
previous_result = nullptr;
}
const std::wstring & current_name()
@ -1813,15 +1814,16 @@ template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::FindVariable(FindHelper & find_helper)
{
find_helper.field_index = 0;
find_helper.previous_result = nullptr;
find_helper.previous_var = nullptr;
find_helper.previous_name = nullptr;
find_helper.previous_model = nullptr;
find_helper.previous_model_container_wrapper = nullptr;
find_helper.previous_space_wrapper = nullptr;
find_helper.nested_calls = 0;
Var<StreamType> * origin_result = find_helper.result;
Var<StreamType> local_result, local_result2;
bool use_first_local_result = true;
//Var<StreamType> local_result, local_result2;
//bool use_first_local_result = true;
std::vector<Var<StreamType>> results;
results.resize(find_helper.fields.size() + 1);
origin_result->clear();
@ -1833,37 +1835,21 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::FindVaria
}
else
{
find_helper.result = use_first_local_result ? &local_result : &local_result2;
find_helper.result->clear();
//find_helper.result = use_first_local_result ? &local_result : &local_result2;
//find_helper.result->clear();
find_helper.result = &results[find_helper.field_index];
}
find_helper.found = false;
EvaluateVariable(find_helper);
find_helper.previous_model = nullptr;
find_helper.previous_model_container_wrapper = nullptr;
find_helper.previous_space_wrapper = nullptr;
if( find_helper.found )
{
if( find_helper.result->type == Var<StreamType>::TYPE_MODEL )
{
find_helper.previous_model = find_helper.result->model;
}
else
if( find_helper.result->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER )
{
find_helper.previous_model_container_wrapper = find_helper.result->model_container_wrapper;
}
else
if( find_helper.result->type == Var<StreamType>::TYPE_SPACE_WRAPPER )
{
find_helper.previous_space_wrapper = find_helper.result->space_wrapper;
}
else
if( find_helper.result->type != Var<StreamType>::TYPE_MODEL &&
find_helper.result->type != Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER &&
find_helper.result->type != Var<StreamType>::TYPE_SPACE_WRAPPER )
{
find_helper.input = find_helper.result;
use_first_local_result = !use_first_local_result;
//use_first_local_result = !use_first_local_result;
}
find_helper.previous_name = &find_helper.current_name();
@ -1885,10 +1871,22 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::FindVaria
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateVariable(FindHelper & find_helper)
{
Var<StreamType> * var = nullptr;
bool was_child_found = false;
find_helper.found = false;
find_helper.current_var = nullptr;
const std::wstring & name = find_helper.current_name();
if( find_helper.previous_name && (find_helper.previous_model || find_helper.previous_model_container_wrapper || find_helper.previous_space_wrapper) )
if( find_helper.previous_var )
{
find_helper.current_var = find_helper.previous_var->find_child(name);
find_helper.found = (find_helper.current_var != nullptr);
was_child_found = (find_helper.current_var != nullptr);
}
if( !find_helper.found && find_helper.previous_name && find_helper.previous_result &&
(find_helper.previous_result->type == Var<StreamType>::TYPE_MODEL ||
find_helper.previous_result->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER ||
find_helper.previous_result->type == Var<StreamType>::TYPE_SPACE_WRAPPER))
{
if( !EvaluateModelField(find_helper) )
return;
@ -1896,33 +1894,34 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateV
if( !find_helper.found )
{
var = FindInScope(name);
find_helper.result->clear();
find_helper.current_var = FindInScope(name);
if( var )
if( find_helper.current_var )
{
if( var->type == Var<StreamType>::TYPE_FUNCTION && var->user_function )
if( find_helper.current_var->type == Var<StreamType>::TYPE_FUNCTION && find_helper.current_var->user_function )
{
EvaluateFunction(var->user_function, find_helper);
EvaluateFunction(find_helper.current_var->user_function, find_helper);
}
else
if( var->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER && var->model_container_wrapper )
if( find_helper.current_var->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER && find_helper.current_var->model_container_wrapper )
{
if( find_helper.is_last_field() && is_generating_for )
{
var->model_container_wrapper->increment_iterator();
var->clear_childs();
find_helper.current_var->model_container_wrapper->increment_iterator();
find_helper.current_var->clear_childs();
}
}
else
if( var->type == Var<StreamType>::TYPE_SPACE_WRAPPER && var->space_wrapper )
if( find_helper.current_var->type == Var<StreamType>::TYPE_SPACE_WRAPPER && find_helper.current_var->space_wrapper )
{
find_helper.found = CallSpace(*var->space_wrapper, find_helper);
find_helper.found = CallSpace(*find_helper.current_var->space_wrapper, find_helper);
}
else
if( var->type == Var<StreamType>::TYPE_DATE && var->date )
if( find_helper.current_var->type == Var<StreamType>::TYPE_DATE && find_helper.current_var->date )
{
if( find_helper.is_last_field() )
PrintDate(*var->date, find_helper);
PrintDate(*find_helper.current_var->date, find_helper);
}
}
}
@ -1933,6 +1932,26 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateV
{
find_helper.result->type = Var<StreamType>::Type::TYPE_STREAM;
}
if( find_helper.previous_var && !was_child_found )
{
// may only model_container_wrapper and space_wrapper here?
if( find_helper.result->type == Var<StreamType>::TYPE_MODEL ||
find_helper.result->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER ||
find_helper.result->type == Var<StreamType>::TYPE_SPACE_WRAPPER ||
find_helper.result->type == Var<StreamType>::TYPE_FUNCTION )
{
find_helper.previous_var->add_child(name, *find_helper.result);
}
}
find_helper.previous_var = find_helper.current_var;
find_helper.previous_result = find_helper.result;
}
else
{
find_helper.previous_var = nullptr;
find_helper.previous_result = nullptr;
}
}
@ -1940,48 +1959,41 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateV
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
bool Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateModelField(FindHelper & find_helper)
{
//var = find_helper.previous_result->find_child(name);
//if( !var )
if( find_helper.previous_result->type == Var<StreamType>::TYPE_MODEL )
{
if( find_helper.previous_model )
//find_helper.result->clear();
find_helper.found = CallModelField(*find_helper.previous_result->model, find_helper);
}
else
if( find_helper.previous_result->type == Var<StreamType>::TYPE_MODEL_CONTAINER_WRAPPER )
{
//find_helper.result->clear();
morm::Model * model = find_helper.previous_result->model_container_wrapper->get_model();
if( model )
{
find_helper.found = CallModelField(*find_helper.previous_model, find_helper);
find_helper.found = CallModelField(*model, find_helper);
}
else
if( find_helper.previous_model_container_wrapper )
{
morm::Model * model = find_helper.previous_model_container_wrapper->get_model();
if( model )
{
find_helper.found = CallModelField(*model, find_helper);
}
else
{
// put some log (no [for] statement)
// CreateMsg(L"model ", name, fields, L" is not initialized, have you forgotten to use [for ...] statement?");
find_helper.found = false;
return false;
}
}
if( find_helper.found )
{
if( find_helper.result->type == Var<StreamType>::TYPE_FUNCTION && find_helper.result->user_function )
{
EvaluateFunction(find_helper.result->user_function, find_helper);
if( !find_helper.found )
return false; // maximum nested calls exceeded
}
// put some log (no [for] statement)
// CreateMsg(L"model ", name, fields, L" is not initialized, have you forgotten to use [for ...] statement?");
find_helper.found = false;
return false;
}
}
if( find_helper.found )
{
if( find_helper.result->type == Var<StreamType>::TYPE_FUNCTION && find_helper.result->user_function )
{
EvaluateFunction(find_helper.result->user_function, find_helper);
if( !find_helper.found )
return false; // maximum nested calls exceeded
}
}
// else
// {
// // child found
//
// }
return true;
}
@ -2675,8 +2687,18 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::MakeTextF
Call(item.function, nullptr, result, empty_stream);
}
if( !result.to_bool() )
break;
if( result.type == Var<StreamType>::Type::TYPE_MODEL_CONTAINER_WRAPPER )
{
result.model_container_wrapper->increment_iterator();
// what about clear_childs() ?
if( !result.model_container_wrapper->is_iterator_correct() )
break;
}
// if( !result.to_bool() )
// break;
if( !item.item_tab.empty() )
MakeText( *item.item_tab[0] ); // should be only one item

View File

@ -393,9 +393,12 @@ bool Var<StreamType>::to_bool() const
case TYPE_FUNCTION:
case TYPE_DATE:
case TYPE_MODEL:
case TYPE_MODEL_CONTAINER_WRAPPER:
case TYPE_SPACE_WRAPPER:
break;
case TYPE_MODEL_CONTAINER_WRAPPER:
return !model_container_wrapper->is_container_empty();
break;
}
return false;