changed the way how we iterate through Models, instead of ModelWrapper now we have Wrapper which has pointers to: model, model container, space or date
This commit is contained in:
parent
acb42f453c
commit
849b3e9ecc
308
src/generator.h
308
src/generator.h
|
@ -152,7 +152,8 @@ private:
|
||||||
Var * variable;
|
Var * variable;
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
morm::ModelWrapper * model_wrapper;
|
morm::Wrapper * wrapper;
|
||||||
|
size_t field_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FindHelper()
|
FindHelper()
|
||||||
|
@ -165,32 +166,13 @@ private:
|
||||||
item_block = nullptr;
|
item_block = nullptr;
|
||||||
variable = nullptr;
|
variable = nullptr;
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
|
||||||
model_wrapper = nullptr;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
wrapper = nullptr;
|
||||||
struct CallModelHelper
|
|
||||||
{
|
|
||||||
size_t field_index;
|
|
||||||
morm::ModelWrapper * model_wrapper;
|
|
||||||
morm::Model * model;
|
|
||||||
|
|
||||||
|
|
||||||
CallModelHelper()
|
|
||||||
{
|
|
||||||
field_index = 0;
|
field_index = 0;
|
||||||
model_wrapper = nullptr;
|
#endif
|
||||||
model = nullptr;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
struct BlockStack
|
struct BlockStack
|
||||||
{
|
{
|
||||||
|
@ -331,23 +313,26 @@ private:
|
||||||
|
|
||||||
void CallObject(BaseObj<StreamType> & base_obj, int method_index, FunInfo<StreamType> & info);
|
void CallObject(BaseObj<StreamType> & base_obj, int method_index, FunInfo<StreamType> & info);
|
||||||
|
|
||||||
|
void PrintDate(pt::Date * date, std::vector<Var> parameters, StreamType & out_stream);
|
||||||
|
bool PrintDatePart(pt::Date * date, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream);
|
||||||
|
|
||||||
void CallSpaceObjectForLastField(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space);
|
void CallSpaceObjectForLastField(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space);
|
||||||
|
|
||||||
pt::Space * CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector<std::wstring> & fields, size_t field_index, pt::Space * space);
|
pt::Space * CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector<std::wstring> & fields, size_t field_index, pt::Space * space);
|
||||||
|
|
||||||
void CallSpaceTableForLastField(morm::ModelWrapper & model_wrapper, std::vector<Var> & parameters, StreamType & out_stream,
|
void CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector<Var> & parameters, StreamType & out_stream,
|
||||||
pt::Space * space, size_t model_wrapper_space_table_index);
|
pt::Space * space, size_t model_wrapper_space_table_index);
|
||||||
|
|
||||||
pt::Space * CallSpaceTableForMiddleField(morm::ModelWrapper & model_wrapper, std::wstring & root_space_name, std::vector<std::wstring> & fields,
|
pt::Space * CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector<std::wstring> & fields,
|
||||||
size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index);
|
size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index);
|
||||||
|
|
||||||
void CallSpace(morm::ModelWrapper & model_wrapper, pt::Space & root_space, FindHelper & find_helper, std::vector<std::wstring> & fields,
|
void CallSpace(FindHelper & find_helper, std::vector<std::wstring> & fields, std::vector<Var> & parameters, StreamType & out_stream);
|
||||||
size_t root_field_index, std::vector<Var> & parameters, StreamType & out_stream);
|
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
bool CallModel(morm::Model & model, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream);
|
bool CallModelField(morm::Model & model, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream);
|
||||||
CallModelHelper FindLastModelWrapper(morm::ModelWrapper & models_base, std::vector<std::wstring> & fields);
|
void CallModel(morm::Model & model, FindHelper & find_helper, std::vector<std::wstring> & fields, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream);
|
||||||
void CallModelWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream);
|
void FindLastModelWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields);
|
||||||
|
void CallWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void CallObject(BaseObj<StreamType> & base_obj,
|
void CallObject(BaseObj<StreamType> & base_obj,
|
||||||
|
@ -386,6 +371,7 @@ private:
|
||||||
bool IsCurrentParam(std::vector<Var> & parameters);
|
bool IsCurrentParam(std::vector<Var> & parameters);
|
||||||
|
|
||||||
void DumpSpaceIfNeeded(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space);
|
void DumpSpaceIfNeeded(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space);
|
||||||
|
void DumpModelIfNeeded(morm::Model & model, std::vector<Var> & parameters, StreamType & out_stream);
|
||||||
|
|
||||||
|
|
||||||
void CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream);
|
void CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream);
|
||||||
|
@ -1031,11 +1017,11 @@ bool Generator<StreamType>::FindInModels(FindHelper & find_helper)
|
||||||
{
|
{
|
||||||
if( pmodels )
|
if( pmodels )
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * m = pmodels->Find(*find_helper.fun_name);
|
morm::Wrapper * m = pmodels->Find(*find_helper.fun_name);
|
||||||
|
|
||||||
if( m )
|
if( m )
|
||||||
{
|
{
|
||||||
find_helper.model_wrapper = m;
|
find_helper.wrapper = m;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1278,6 +1264,71 @@ void Generator<StreamType>::DumpSpaceIfNeeded(std::vector<Var> & parameters, Str
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
void Generator<StreamType>::DumpModelIfNeeded(morm::Model & model, std::vector<Var> & parameters, StreamType & out_stream)
|
||||||
|
{
|
||||||
|
bool dump_space = ShouldMakeSpaceDump(parameters);
|
||||||
|
bool dump_json = ShouldMakeJsonDump(parameters);
|
||||||
|
|
||||||
|
if( dump_space || dump_json )
|
||||||
|
{
|
||||||
|
//bool pretty = IsPrettyPrint(parameters);
|
||||||
|
|
||||||
|
if( dump_space )
|
||||||
|
{
|
||||||
|
// not implemented yet
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( dump_json )
|
||||||
|
{
|
||||||
|
// IMPLEMENT ME
|
||||||
|
// depends on the model_connector (flat connector)
|
||||||
|
// need to be made in a different way
|
||||||
|
pt::TextStream temp_str;
|
||||||
|
model.to_text(temp_str, false, false);
|
||||||
|
out_stream << temp_str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
void Generator<StreamType>::PrintDate(pt::Date * date, std::vector<Var> parameters, StreamType & out_stream)
|
||||||
|
{
|
||||||
|
// IMPROVEME
|
||||||
|
// check for different formats depending on parameters
|
||||||
|
|
||||||
|
date->Serialize(out_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
bool Generator<StreamType>::PrintDatePart(pt::Date * date, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream)
|
||||||
|
{
|
||||||
|
if( field == L"year" )
|
||||||
|
out_stream << date->year;
|
||||||
|
else
|
||||||
|
if( field == L"month" )
|
||||||
|
out_stream << date->month;
|
||||||
|
else
|
||||||
|
if( field == L"day" )
|
||||||
|
out_stream << date->day;
|
||||||
|
else
|
||||||
|
if( field == L"hour" )
|
||||||
|
out_stream << date->hour;
|
||||||
|
else
|
||||||
|
if( field == L"min" )
|
||||||
|
out_stream << date->min;
|
||||||
|
else
|
||||||
|
if( field == L"sec" )
|
||||||
|
out_stream << date->sec;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
void Generator<StreamType>::CallSpaceObjectForLastField(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space)
|
void Generator<StreamType>::CallSpaceObjectForLastField(std::vector<Var> & parameters, StreamType & out_stream, pt::Space * space)
|
||||||
|
@ -1304,7 +1355,7 @@ pt::Space * Generator<StreamType>::CallSpaceObjectForMiddleField(std::wstring &
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
void Generator<StreamType>::CallSpaceTableForLastField(morm::ModelWrapper & model_wrapper, std::vector<Var> & parameters, StreamType & out_stream,
|
void Generator<StreamType>::CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector<Var> & parameters, StreamType & out_stream,
|
||||||
pt::Space * space, size_t model_wrapper_space_table_index)
|
pt::Space * space, size_t model_wrapper_space_table_index)
|
||||||
{
|
{
|
||||||
pt::Space::TableType * table = space->get_table();
|
pt::Space::TableType * table = space->get_table();
|
||||||
|
@ -1312,8 +1363,8 @@ void Generator<StreamType>::CallSpaceTableForLastField(morm::ModelWrapper & mode
|
||||||
if( stack_tab[stack_index-1].is_for )
|
if( stack_tab[stack_index-1].is_for )
|
||||||
{
|
{
|
||||||
// we are in [for...]statement, increment iterator and check the range
|
// we are in [for...]statement, increment iterator and check the range
|
||||||
model_wrapper.increment_iterator(model_wrapper_space_table_index, table->size());
|
space_wrapper.increment_iterator(model_wrapper_space_table_index, table->size());
|
||||||
size_t iterator_value = model_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
size_t iterator_value = space_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
||||||
last_res = (iterator_value < table->size());
|
last_res = (iterator_value < table->size());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1326,7 +1377,7 @@ void Generator<StreamType>::CallSpaceTableForLastField(morm::ModelWrapper & mode
|
||||||
|
|
||||||
if( IsCurrentParam(parameters) )
|
if( IsCurrentParam(parameters) )
|
||||||
{
|
{
|
||||||
size_t iterator_value = model_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
size_t iterator_value = space_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
||||||
|
|
||||||
if( iterator_value < table->size() )
|
if( iterator_value < table->size() )
|
||||||
{
|
{
|
||||||
|
@ -1337,13 +1388,13 @@ void Generator<StreamType>::CallSpaceTableForLastField(morm::ModelWrapper & mode
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
pt::Space * Generator<StreamType>::CallSpaceTableForMiddleField(morm::ModelWrapper & model_wrapper, std::wstring & root_space_name, std::vector<std::wstring> & fields,
|
pt::Space * Generator<StreamType>::CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector<std::wstring> & fields,
|
||||||
size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index)
|
size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index)
|
||||||
{
|
{
|
||||||
pt::Space::TableType * table = space->get_table();
|
pt::Space::TableType * table = space->get_table();
|
||||||
|
|
||||||
// check the current iterator, if it is correct then select the item from the table
|
// check the current iterator, if it is correct then select the item from the table
|
||||||
size_t iterator_value = model_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
size_t iterator_value = space_wrapper.get_space_iterator_value(model_wrapper_space_table_index);
|
||||||
|
|
||||||
if( iterator_value < table->size() )
|
if( iterator_value < table->size() )
|
||||||
{
|
{
|
||||||
|
@ -1359,14 +1410,13 @@ pt::Space * Generator<StreamType>::CallSpaceTableForMiddleField(morm::ModelWrapp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
void Generator<StreamType>::CallSpace(morm::ModelWrapper & model_wrapper, pt::Space & root_space, FindHelper & find_helper, std::vector<std::wstring> & fields,
|
void Generator<StreamType>::CallSpace(FindHelper & find_helper, std::vector<std::wstring> & fields, std::vector<Var> & parameters, StreamType & out_stream)
|
||||||
size_t root_field_index, std::vector<Var> & parameters, StreamType & out_stream)
|
|
||||||
{
|
{
|
||||||
pt::Space * space = &root_space;
|
morm::SpaceWrapper * space_wrapper = find_helper.wrapper->space_wrapper;
|
||||||
|
pt::Space * space = space_wrapper->get_space();
|
||||||
last_res = false;
|
last_res = false;
|
||||||
size_t field_index = root_field_index;
|
size_t field_index = find_helper.field_index;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
@ -1395,18 +1445,18 @@ void Generator<StreamType>::CallSpace(morm::ModelWrapper & model_wrapper, pt::Sp
|
||||||
else
|
else
|
||||||
if( space->is_table() )
|
if( space->is_table() )
|
||||||
{
|
{
|
||||||
size_t model_wrapper_space_table_index = field_index - root_field_index;
|
size_t model_wrapper_space_table_index = field_index - find_helper.field_index;
|
||||||
|
|
||||||
if( model_wrapper_space_table_index < model_wrapper.space_indices_table_size() )
|
if( model_wrapper_space_table_index < space_wrapper->space_indices_table_size() )
|
||||||
{
|
{
|
||||||
if( is_last_field )
|
if( is_last_field )
|
||||||
{
|
{
|
||||||
CallSpaceTableForLastField(model_wrapper, parameters, out_stream, space, model_wrapper_space_table_index);
|
CallSpaceTableForLastField(*space_wrapper, parameters, out_stream, space, model_wrapper_space_table_index);
|
||||||
field_index += 1;
|
field_index += 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
space = CallSpaceTableForMiddleField(model_wrapper, *find_helper.fun_name, fields, field_index, space, model_wrapper_space_table_index);
|
space = CallSpaceTableForMiddleField(*space_wrapper, *find_helper.fun_name, fields, field_index, space, model_wrapper_space_table_index);
|
||||||
// don't increment field_index
|
// don't increment field_index
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1437,7 +1487,7 @@ void Generator<StreamType>::CallSpace(morm::ModelWrapper & model_wrapper, pt::Sp
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
bool Generator<StreamType>::CallModel(morm::Model & model, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream)
|
bool Generator<StreamType>::CallModelField(morm::Model & model, const std::wstring & field, std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* if 'field' is a POD type then 'str' will be used in get_raw_value()
|
* if 'field' is a POD type then 'str' will be used in get_raw_value()
|
||||||
|
@ -1471,124 +1521,152 @@ bool Generator<StreamType>::CallModel(morm::Model & model, const std::wstring &
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class StreamType>
|
||||||
|
void Generator<StreamType>::CallModel(morm::Model & model, FindHelper & find_helper, std::vector<std::wstring> & fields,
|
||||||
|
std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream)
|
||||||
|
{
|
||||||
|
if( find_helper.field_index == fields.size() )
|
||||||
|
{
|
||||||
|
// all fields items are models or models containers
|
||||||
|
DumpModelIfNeeded(model, parameters, out_stream);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( find_helper.field_index + 1 == fields.size() )
|
||||||
|
{
|
||||||
|
// last field is not a model nor a models container
|
||||||
|
if( !CallModelField(model, fields[find_helper.field_index], parameters, out_stream, in_stream) )
|
||||||
|
{
|
||||||
|
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", unknown property ", fields[find_helper.field_index].c_str(), L" of a model object");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", ", fields[find_helper.field_index].c_str(), L" is not a model nor a model container nor a space");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
typename Generator<StreamType>::CallModelHelper Generator<StreamType>::FindLastModelWrapper(morm::ModelWrapper & models_base, std::vector<std::wstring> & fields)
|
void Generator<StreamType>::FindLastModelWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields)
|
||||||
{
|
{
|
||||||
CallModelHelper helper;
|
for(find_helper.field_index = 0 ; find_helper.field_index < fields.size() && find_helper.wrapper->has_model_object() ; ++find_helper.field_index)
|
||||||
helper.field_index = 0;
|
|
||||||
helper.model_wrapper = &models_base;
|
|
||||||
helper.model = nullptr;
|
|
||||||
|
|
||||||
for(; helper.field_index < fields.size() && !helper.model_wrapper->get_space() ; ++helper.field_index)
|
|
||||||
{
|
{
|
||||||
std::wstring & field = fields[helper.field_index];
|
std::wstring & field = fields[find_helper.field_index];
|
||||||
morm::ModelWrapper * child_model_wrapper = helper.model_wrapper->find_child(field);
|
morm::Wrapper * child_wrapper = find_helper.wrapper->find_child(field);
|
||||||
|
|
||||||
if( !child_model_wrapper )
|
if( !child_wrapper )
|
||||||
{
|
{
|
||||||
helper.model = helper.model_wrapper->get_model();
|
morm::Model * model = nullptr;
|
||||||
|
|
||||||
|
if( find_helper.wrapper->model )
|
||||||
|
{
|
||||||
|
model = find_helper.wrapper->model;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( find_helper.wrapper->model_container_wrapper )
|
||||||
|
{
|
||||||
|
model = find_helper.wrapper->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
|
// this can return null for lists/vectors in a case when the iterator is not pointing to a valid item
|
||||||
|
}
|
||||||
|
|
||||||
if( helper.model )
|
if( model )
|
||||||
{
|
{
|
||||||
child_model_wrapper = helper.model->get_model_wrapper(nullptr, field.c_str(), false);
|
morm::Wrapper new_wrapper = model->get_wrapper(nullptr, field.c_str());
|
||||||
|
|
||||||
if( child_model_wrapper )
|
if( new_wrapper.has_object() )
|
||||||
{
|
{
|
||||||
helper.model_wrapper->add_child(field, child_model_wrapper);
|
child_wrapper = find_helper.wrapper->add_child(field, new_wrapper);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !child_model_wrapper )
|
if( !child_wrapper )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
helper.model_wrapper = child_model_wrapper;
|
find_helper.wrapper = child_wrapper;
|
||||||
helper.model = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return helper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class StreamType>
|
template<class StreamType>
|
||||||
void Generator<StreamType>::CallModelWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields,
|
void Generator<StreamType>::CallWrapper(FindHelper & find_helper, std::vector<std::wstring> & fields,
|
||||||
std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream)
|
std::vector<Var> parameters, StreamType & out_stream, const StreamType & in_stream)
|
||||||
{
|
{
|
||||||
last_res = false;
|
last_res = false;
|
||||||
CallModelHelper helper = FindLastModelWrapper(*find_helper.model_wrapper, fields);
|
FindLastModelWrapper(find_helper, fields);
|
||||||
|
|
||||||
// if:
|
// if:
|
||||||
// helper.field_index == fields.size() - all fields items are models or models containers
|
// helper.field_index == fields.size() - all fields items are either models, models containers, space or a date
|
||||||
// helper.field_index == fields.size()-1 - last field is not a model nor a models container
|
// helper.field_index == fields.size()-1 - only the last field is not known
|
||||||
// helper.field_index < fields.size()-1 - incorrect
|
// helper.field_index < fields.size()-1 - there are more not known fields
|
||||||
|
|
||||||
//morm::Model * model = helper.model_wrapper->get_model();
|
bool all_fields_known = (find_helper.field_index == fields.size());
|
||||||
pt::Space * space = helper.model_wrapper->get_space();
|
bool last_field_not_known = (find_helper.field_index + 1 == fields.size());
|
||||||
|
|
||||||
if( helper.field_index + 1 < fields.size() )
|
if( find_helper.wrapper->space_wrapper )
|
||||||
{
|
{
|
||||||
if( space )
|
CallSpace(find_helper, fields, parameters, out_stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( find_helper.wrapper->date )
|
||||||
{
|
{
|
||||||
CallSpace(*helper.model_wrapper, *space, find_helper, fields, helper.field_index, parameters, out_stream);
|
if( all_fields_known )
|
||||||
|
{
|
||||||
|
PrintDate(find_helper.wrapper->date, parameters, out_stream);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
if( last_field_not_known )
|
||||||
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", ", fields[helper.field_index].c_str(), L" is not a model nor a model container nor a space");
|
|
||||||
last_res = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if( helper.field_index + 1 == fields.size() )
|
|
||||||
{
|
{
|
||||||
// last field is not a model nor a models container
|
// last field is not a model nor a models container
|
||||||
|
if( !PrintDatePart(find_helper.wrapper->date, fields[find_helper.field_index], parameters, out_stream) )
|
||||||
|
{
|
||||||
|
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", unknown property ", fields[find_helper.field_index].c_str(), L" of date object");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", ", fields[find_helper.field_index].c_str(), L" is not a model nor a model container nor a space");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( helper.model )
|
if( find_helper.wrapper->model )
|
||||||
{
|
{
|
||||||
if( !CallModel(*helper.model, fields[helper.field_index], parameters, out_stream, in_stream) )
|
CallModel(*find_helper.wrapper->model, find_helper, fields, parameters, out_stream, in_stream);
|
||||||
{
|
|
||||||
CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", unknown ", fields[helper.field_index].c_str());
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
if( space )
|
|
||||||
{
|
|
||||||
CallSpace(*helper.model_wrapper, *space, find_helper, fields, helper.field_index, parameters, out_stream);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
last_res = false;
|
|
||||||
CreateMsg(L"model ", *find_helper.fun_name, fields, L" is not initialized, have you forgotten to use [for ...] statement?"); // a different msg if we are using Space?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// all fields items are models or models containers or last one is Space
|
|
||||||
// this is usualy in [for...] or [if ...] statements
|
|
||||||
|
|
||||||
if( space )
|
if( find_helper.wrapper->model_container_wrapper )
|
||||||
{
|
{
|
||||||
CallSpace(*helper.model_wrapper, *space, find_helper, fields, helper.field_index, parameters, out_stream);
|
morm::Model * model = find_helper.wrapper->model_container_wrapper->get_model();
|
||||||
|
|
||||||
|
if( model )
|
||||||
|
{
|
||||||
|
CallModel(*model, find_helper, fields, parameters, out_stream, in_stream);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if( last_field_not_known )
|
||||||
|
{
|
||||||
|
CreateMsg(L"model ", *find_helper.fun_name, fields, L" is not initialized, have you forgotten to use [for ...] statement?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( all_fields_known )
|
||||||
{
|
{
|
||||||
if( stack_tab[stack_index-1].is_for )
|
if( stack_tab[stack_index-1].is_for )
|
||||||
{
|
{
|
||||||
// helper.model_wrapper is always set
|
find_helper.wrapper->model_container_wrapper->increment_iterator();
|
||||||
helper.model_wrapper->increment_iterator();
|
find_helper.wrapper->clear_childs();
|
||||||
helper.model_wrapper->clear_childs();
|
last_res = find_helper.wrapper->model_container_wrapper->is_iterator_correct();
|
||||||
last_res = helper.model_wrapper->is_iterator_correct();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
last_res = !helper.model_wrapper->is_container_empty();
|
last_res = !find_helper.wrapper->model_container_wrapper->is_container_empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
// add support for "dump" parameter
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -1714,8 +1792,8 @@ std::vector<Var> parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
if( find_helper.model_wrapper )
|
if( find_helper.wrapper )
|
||||||
CallModelWrapper(find_helper, item_fun.fields, parameters, out_stream, in_stream);
|
CallWrapper(find_helper, item_fun.fields, parameters, out_stream, in_stream);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if( find_helper.base_obj )
|
if( find_helper.base_obj )
|
||||||
|
|
|
@ -59,15 +59,6 @@ Models::~Models()
|
||||||
|
|
||||||
void Models::Clear()
|
void Models::Clear()
|
||||||
{
|
{
|
||||||
for(auto & map_item : models_map)
|
|
||||||
{
|
|
||||||
if( map_item.second->should_be_auto_removed() )
|
|
||||||
{
|
|
||||||
delete map_item.second;
|
|
||||||
map_item.second = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
models_map.clear();
|
models_map.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,40 +66,59 @@ void Models::Clear()
|
||||||
|
|
||||||
void Models::Add(const std::wstring & name, morm::Model & model)
|
void Models::Add(const std::wstring & name, morm::Model & model)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperModel(&model);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model = &model;
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Models::Add(const std::wstring & name, morm::Model * model)
|
void Models::Add(const std::wstring & name, morm::Model * model)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperModel(model);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model = model;
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Models::Add(const std::wstring & name, pt::Space & space)
|
void Models::Add(const std::wstring & name, pt::Space & space)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperSpace(&space);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.space_wrapper = new morm::SpaceWrapper(&space);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Models::Add(const std::wstring & name, pt::Space * space)
|
void Models::Add(const std::wstring & name, pt::Space * space)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperSpace(space);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.space_wrapper = new morm::SpaceWrapper(space);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Models::Add(const std::wstring & name, pt::Date & date)
|
||||||
|
{
|
||||||
|
morm::Wrapper wrapper;
|
||||||
|
wrapper.date = &date;
|
||||||
|
models_map[name] = wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
morm::ModelWrapper * Models::Find(const std::wstring & name)
|
|
||||||
|
void Models::Add(const std::wstring & name, pt::Date * date)
|
||||||
|
{
|
||||||
|
morm::Wrapper wrapper;
|
||||||
|
wrapper.date = date;
|
||||||
|
models_map[name] = wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
morm::Wrapper * Models::Find(const std::wstring & name)
|
||||||
{
|
{
|
||||||
auto iterator = models_map.find(name);
|
auto iterator = models_map.find(name);
|
||||||
|
|
||||||
if( iterator != models_map.end() )
|
if( iterator != models_map.end() )
|
||||||
{
|
{
|
||||||
return iterator->second;
|
return &iterator->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
49
src/models.h
49
src/models.h
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
#ifdef EZC_HAS_MORM_LIBRARY
|
#ifdef EZC_HAS_MORM_LIBRARY
|
||||||
|
|
||||||
#include "modelwrapper.h"
|
#include "wrapper.h"
|
||||||
#include "funinfo.h"
|
#include "funinfo.h"
|
||||||
#include "space/space.h"
|
#include "space/space.h"
|
||||||
|
|
||||||
|
@ -62,69 +62,80 @@ public:
|
||||||
void Add(const std::wstring & name, pt::Space & space);
|
void Add(const std::wstring & name, pt::Space & space);
|
||||||
void Add(const std::wstring & name, pt::Space * space);
|
void Add(const std::wstring & name, pt::Space * space);
|
||||||
|
|
||||||
|
void Add(const std::wstring & name, pt::Date & space);
|
||||||
|
void Add(const std::wstring & name, pt::Date * space);
|
||||||
|
|
||||||
template<typename VectorType>
|
template<typename VectorType>
|
||||||
void Add(const std::wstring & name, std::vector<VectorType> & container)
|
void Add(const std::wstring & name, std::vector<VectorType> & container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVector<VectorType>(&container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperVector<VectorType>(&container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename VectorType>
|
template<typename VectorType>
|
||||||
void Add(const std::wstring & name, std::vector<VectorType> * container)
|
void Add(const std::wstring & name, std::vector<VectorType> * container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVector<VectorType>(container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperVector<VectorType>(container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename VectorType>
|
template<typename VectorType>
|
||||||
void Add(const std::wstring & name, std::vector<VectorType*> & container)
|
void Add(const std::wstring & name, std::vector<VectorType*> & container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVectorPointer<VectorType>(&container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperVectorPointer<VectorType>(&container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename VectorType>
|
template<typename VectorType>
|
||||||
void Add(const std::wstring & name, std::vector<VectorType*> * container)
|
void Add(const std::wstring & name, std::vector<VectorType*> * container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVectorPointer<VectorType>(container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperVectorPointer<VectorType>(container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListType>
|
template<typename ListType>
|
||||||
void Add(const std::wstring & name, std::list<ListType> & container)
|
void Add(const std::wstring & name, std::list<ListType> & container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperList<ListType>(&container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperList<ListType>(&container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListType>
|
template<typename ListType>
|
||||||
void Add(const std::wstring & name, std::list<ListType> * container)
|
void Add(const std::wstring & name, std::list<ListType> * container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperList<ListType>(container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperList<ListType>(container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListType>
|
template<typename ListType>
|
||||||
void Add(const std::wstring & name, std::list<ListType*> & container)
|
void Add(const std::wstring & name, std::list<ListType*> & container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperListPointer<ListType>(&container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperListPointer<ListType>(&container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListType>
|
template<typename ListType>
|
||||||
void Add(const std::wstring & name, std::list<ListType*> * container)
|
void Add(const std::wstring & name, std::list<ListType*> * container)
|
||||||
{
|
{
|
||||||
morm::ModelWrapper * model_wrapper = new morm::ModelWrapperListPointer<ListType>(container);
|
morm::Wrapper wrapper;
|
||||||
models_map[name] = model_wrapper;
|
wrapper.model_container_wrapper = new morm::ModelWrapperListPointer<ListType>(container);
|
||||||
|
models_map[name] = wrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
morm::ModelWrapper * Find(const std::wstring & name);
|
morm::Wrapper * Find(const std::wstring & name);
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
std::map<std::wstring, morm::ModelWrapper*> models_map;
|
std::map<std::wstring, morm::Wrapper> models_map;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue