diff --git a/src/generator.h b/src/generator.h index cecbad6..2cf3cdd 100644 --- a/src/generator.h +++ b/src/generator.h @@ -152,7 +152,8 @@ private: Var * variable; #ifdef EZC_HAS_MORM_LIBRARY - morm::ModelWrapper * model_wrapper; + morm::Wrapper * wrapper; + size_t field_index; #endif FindHelper() @@ -165,32 +166,13 @@ private: item_block = nullptr; variable = nullptr; - #ifdef EZC_HAS_MORM_LIBRARY - model_wrapper = nullptr; - #endif - } - }; - - #ifdef EZC_HAS_MORM_LIBRARY - - struct CallModelHelper - { - size_t field_index; - morm::ModelWrapper * model_wrapper; - morm::Model * model; - - - CallModelHelper() - { + wrapper = nullptr; field_index = 0; - model_wrapper = nullptr; - model = nullptr; +#endif } }; -#endif - struct BlockStack { @@ -331,23 +313,26 @@ private: void CallObject(BaseObj & base_obj, int method_index, FunInfo & info); + void PrintDate(pt::Date * date, std::vector parameters, StreamType & out_stream); + bool PrintDatePart(pt::Date * date, const std::wstring & field, std::vector parameters, StreamType & out_stream); + void CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space); pt::Space * CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space); - void CallSpaceTableForLastField(morm::ModelWrapper & model_wrapper, std::vector & parameters, StreamType & out_stream, + void CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector & parameters, StreamType & out_stream, pt::Space * space, size_t model_wrapper_space_table_index); - pt::Space * CallSpaceTableForMiddleField(morm::ModelWrapper & model_wrapper, std::wstring & root_space_name, std::vector & fields, + pt::Space * CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector & fields, 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 & fields, - size_t root_field_index, std::vector & parameters, StreamType & out_stream); + void CallSpace(FindHelper & find_helper, std::vector & fields, std::vector & parameters, StreamType & out_stream); #ifdef EZC_HAS_MORM_LIBRARY - bool CallModel(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); - CallModelHelper FindLastModelWrapper(morm::ModelWrapper & models_base, std::vector & fields); - void CallModelWrapper(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); + bool CallModelField(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); + void CallModel(morm::Model & model, FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); + void FindLastModelWrapper(FindHelper & find_helper, std::vector & fields); + void CallWrapper(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); #endif void CallObject(BaseObj & base_obj, @@ -386,6 +371,7 @@ private: bool IsCurrentParam(std::vector & parameters); void DumpSpaceIfNeeded(std::vector & parameters, StreamType & out_stream, pt::Space * space); + void DumpModelIfNeeded(morm::Model & model, std::vector & parameters, StreamType & out_stream); void CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream); @@ -1031,11 +1017,11 @@ bool Generator::FindInModels(FindHelper & find_helper) { if( pmodels ) { - morm::ModelWrapper * m = pmodels->Find(*find_helper.fun_name); + morm::Wrapper * m = pmodels->Find(*find_helper.fun_name); if( m ) { - find_helper.model_wrapper = m; + find_helper.wrapper = m; return true; } } @@ -1278,6 +1264,71 @@ void Generator::DumpSpaceIfNeeded(std::vector & parameters, Str } +template +void Generator::DumpModelIfNeeded(morm::Model & model, std::vector & 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 +void Generator::PrintDate(pt::Date * date, std::vector parameters, StreamType & out_stream) +{ + // IMPROVEME + // check for different formats depending on parameters + + date->Serialize(out_stream); +} + + +template +bool Generator::PrintDatePart(pt::Date * date, const std::wstring & field, std::vector 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 void Generator::CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space) @@ -1304,7 +1355,7 @@ pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & template -void Generator::CallSpaceTableForLastField(morm::ModelWrapper & model_wrapper, std::vector & parameters, StreamType & out_stream, +void Generator::CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector & parameters, StreamType & out_stream, pt::Space * space, size_t model_wrapper_space_table_index) { pt::Space::TableType * table = space->get_table(); @@ -1312,8 +1363,8 @@ void Generator::CallSpaceTableForLastField(morm::ModelWrapper & mode if( stack_tab[stack_index-1].is_for ) { // we are in [for...]statement, increment iterator and check the range - model_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); + space_wrapper.increment_iterator(model_wrapper_space_table_index, table->size()); + size_t iterator_value = space_wrapper.get_space_iterator_value(model_wrapper_space_table_index); last_res = (iterator_value < table->size()); } else @@ -1326,7 +1377,7 @@ void Generator::CallSpaceTableForLastField(morm::ModelWrapper & mode 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() ) { @@ -1337,13 +1388,13 @@ void Generator::CallSpaceTableForLastField(morm::ModelWrapper & mode } template -pt::Space * Generator::CallSpaceTableForMiddleField(morm::ModelWrapper & model_wrapper, std::wstring & root_space_name, std::vector & fields, +pt::Space * Generator::CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index) { pt::Space::TableType * table = space->get_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() ) { @@ -1359,14 +1410,13 @@ pt::Space * Generator::CallSpaceTableForMiddleField(morm::ModelWrapp } - template -void Generator::CallSpace(morm::ModelWrapper & model_wrapper, pt::Space & root_space, FindHelper & find_helper, std::vector & fields, - size_t root_field_index, std::vector & parameters, StreamType & out_stream) +void Generator::CallSpace(FindHelper & find_helper, std::vector & fields, std::vector & 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; - size_t field_index = root_field_index; + size_t field_index = find_helper.field_index; /* * @@ -1395,18 +1445,18 @@ void Generator::CallSpace(morm::ModelWrapper & model_wrapper, pt::Sp else 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 ) { - 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; } 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 } } @@ -1437,7 +1487,7 @@ void Generator::CallSpace(morm::ModelWrapper & model_wrapper, pt::Sp #ifdef EZC_HAS_MORM_LIBRARY template -bool Generator::CallModel(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) +bool Generator::CallModelField(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) { /* * if 'field' is a POD type then 'str' will be used in get_raw_value() @@ -1471,124 +1521,152 @@ bool Generator::CallModel(morm::Model & model, const std::wstring & } +template +void Generator::CallModel(morm::Model & model, FindHelper & find_helper, std::vector & fields, + std::vector 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 -typename Generator::CallModelHelper Generator::FindLastModelWrapper(morm::ModelWrapper & models_base, std::vector & fields) +void Generator::FindLastModelWrapper(FindHelper & find_helper, std::vector & fields) { - CallModelHelper helper; - 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) + for(find_helper.field_index = 0 ; find_helper.field_index < fields.size() && find_helper.wrapper->has_model_object() ; ++find_helper.field_index) { - std::wstring & field = fields[helper.field_index]; - morm::ModelWrapper * child_model_wrapper = helper.model_wrapper->find_child(field); + std::wstring & field = fields[find_helper.field_index]; + morm::Wrapper * child_wrapper = find_helper.wrapper->find_child(field); - if( !child_model_wrapper ) + if( !child_wrapper ) { - helper.model = helper.model_wrapper->get_model(); - // this can return null for lists/vectors in a case when the iterator is not pointing to a valid item + morm::Model * model = nullptr; - if( helper.model ) + if( find_helper.wrapper->model ) { - child_model_wrapper = helper.model->get_model_wrapper(nullptr, field.c_str(), false); + 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 + } - if( child_model_wrapper ) + if( model ) + { + morm::Wrapper new_wrapper = model->get_wrapper(nullptr, field.c_str()); + + 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; - helper.model_wrapper = child_model_wrapper; - helper.model = nullptr; + find_helper.wrapper = child_wrapper; } - - return helper; } template -void Generator::CallModelWrapper(FindHelper & find_helper, std::vector & fields, +void Generator::CallWrapper(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) { last_res = false; - CallModelHelper helper = FindLastModelWrapper(*find_helper.model_wrapper, fields); + FindLastModelWrapper(find_helper, fields); // if: - // helper.field_index == fields.size() - all fields items are models or models containers - // helper.field_index == fields.size()-1 - last field is not a model nor a models container - // helper.field_index < fields.size()-1 - incorrect + // helper.field_index == fields.size() - all fields items are either models, models containers, space or a date + // helper.field_index == fields.size()-1 - only the last field is not known + // helper.field_index < fields.size()-1 - there are more not known fields - //morm::Model * model = helper.model_wrapper->get_model(); - pt::Space * space = helper.model_wrapper->get_space(); + bool all_fields_known = (find_helper.field_index == fields.size()); + 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 ) + { + if( all_fields_known ) { - CallSpace(*helper.model_wrapper, *space, find_helper, fields, helper.field_index, parameters, out_stream); + PrintDate(find_helper.wrapper->date, parameters, out_stream); } 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 - - if( helper.model ) - { - if( !CallModel(*helper.model, fields[helper.field_index], parameters, out_stream, in_stream) ) + // 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 ", fields[helper.field_index].c_str()); + CreateMsg(L"cannot find ", *find_helper.fun_name, fields, L", unknown property ", fields[find_helper.field_index].c_str(), L" of date object"); } } 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? + 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"); } } - 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 ) + { + CallModel(*find_helper.wrapper->model, find_helper, fields, parameters, out_stream, in_stream); + } + + if( find_helper.wrapper->model_container_wrapper ) + { + morm::Model * model = find_helper.wrapper->model_container_wrapper->get_model(); + + if( model ) { - CallSpace(*helper.model_wrapper, *space, find_helper, fields, helper.field_index, parameters, out_stream); + CallModel(*model, find_helper, fields, parameters, out_stream, in_stream); } 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 ) { - // helper.model_wrapper is always set - helper.model_wrapper->increment_iterator(); - helper.model_wrapper->clear_childs(); - last_res = helper.model_wrapper->is_iterator_correct(); + find_helper.wrapper->model_container_wrapper->increment_iterator(); + find_helper.wrapper->clear_childs(); + last_res = find_helper.wrapper->model_container_wrapper->is_iterator_correct(); } 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 @@ -1714,8 +1792,8 @@ std::vector parameters; } #ifdef EZC_HAS_MORM_LIBRARY - if( find_helper.model_wrapper ) - CallModelWrapper(find_helper, item_fun.fields, parameters, out_stream, in_stream); + if( find_helper.wrapper ) + CallWrapper(find_helper, item_fun.fields, parameters, out_stream, in_stream); else #endif if( find_helper.base_obj ) diff --git a/src/models.cpp b/src/models.cpp index a2fb8b4..bafe313 100644 --- a/src/models.cpp +++ b/src/models.cpp @@ -59,15 +59,6 @@ Models::~Models() 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(); } @@ -75,40 +66,59 @@ void Models::Clear() void Models::Add(const std::wstring & name, morm::Model & model) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperModel(&model); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model = &model; + models_map[name] = wrapper; } void Models::Add(const std::wstring & name, morm::Model * model) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperModel(model); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model = model; + models_map[name] = wrapper; } void Models::Add(const std::wstring & name, pt::Space & space) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperSpace(&space); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.space_wrapper = new morm::SpaceWrapper(&space); + models_map[name] = wrapper; } void Models::Add(const std::wstring & name, pt::Space * space) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperSpace(space); - models_map[name] = model_wrapper; + morm::Wrapper 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); if( iterator != models_map.end() ) { - return iterator->second; + return &iterator->second; } return nullptr; diff --git a/src/models.h b/src/models.h index 61204d9..0ae2078 100644 --- a/src/models.h +++ b/src/models.h @@ -40,7 +40,7 @@ #ifdef EZC_HAS_MORM_LIBRARY -#include "modelwrapper.h" +#include "wrapper.h" #include "funinfo.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::Date & space); + void Add(const std::wstring & name, pt::Date * space); + template void Add(const std::wstring & name, std::vector & container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVector(&container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperVector(&container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::vector * container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVector(container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperVector(container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::vector & container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVectorPointer(&container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperVectorPointer(&container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::vector * container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperVectorPointer(container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperVectorPointer(container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::list & container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperList(&container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperList(&container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::list * container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperList(container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperList(container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::list & container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperListPointer(&container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperListPointer(&container); + models_map[name] = wrapper; } template void Add(const std::wstring & name, std::list * container) { - morm::ModelWrapper * model_wrapper = new morm::ModelWrapperListPointer(container); - models_map[name] = model_wrapper; + morm::Wrapper wrapper; + wrapper.model_container_wrapper = new morm::ModelWrapperListPointer(container); + models_map[name] = wrapper; } - morm::ModelWrapper * Find(const std::wstring & name); + morm::Wrapper * Find(const std::wstring & name); void Clear(); protected: - std::map models_map; + std::map models_map; };