diff --git a/src/generator.h b/src/generator.h index cee9647..93a98a3 100644 --- a/src/generator.h +++ b/src/generator.h @@ -331,8 +331,18 @@ private: void CallObject(BaseObj & base_obj, int method_index, FunInfo & info); - void CallSpace(morm::ModelWrapper & model_wrapper, pt::Space & root_space, FindHelper & find_helper, std::vector & fields, size_t field_index, - 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, + 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, + 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); #ifdef EZC_HAS_MORM_LIBRARY bool CallModel(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream); @@ -376,6 +386,9 @@ private: void CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream); + void CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, size_t how_many_fields_print, + const wchar_t * arg = nullptr, const wchar_t * arg2 = nullptr, const wchar_t * arg3 = nullptr); + void CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, const wchar_t * arg = nullptr, const wchar_t * arg2 = nullptr, const wchar_t * arg3 = nullptr); @@ -1245,106 +1258,149 @@ bool Generator::IsCurrentParam(std::vector & parameters) } + template -void Generator::CallSpace(morm::ModelWrapper & model_wrapper, pt::Space & root_space, FindHelper & find_helper, std::vector & fields, size_t field_index, - std::vector & parameters, StreamType & out_stream) +void Generator::CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space) +{ + // should we convert the last value to last_res? + + if( ShouldMakeDump(parameters) ) + { + space->serialize_to_json_stream(out_stream); // we can add pretty print + } +} + + +template +pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) +{ + std::wstring & next_field = fields[field_index]; + space = space->get_object_field(next_field); + + if( !space ) + { + CreateMsg(L"cannot find space field: ", root_space_name, fields, field_index + 1); + } + + return space; +} + + + +template +void Generator::CallSpaceTableForLastField(morm::ModelWrapper & model_wrapper, std::vector & parameters, StreamType & out_stream, + pt::Space * space, size_t model_wrapper_space_table_index) +{ + pt::Space::TableType * table = space->get_table(); + + 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); + last_res = (iterator_value < table->size()); + } + else + { + // we are not in [for..], it can be for example [if...], return true if the table is not empty + last_res = !table->empty(); + } + + if( ShouldMakeDump(parameters) ) + { + space->serialize_to_json_stream(out_stream); + } + + if( IsCurrentParam(parameters) ) + { + size_t iterator_value = model_wrapper.get_space_iterator_value(model_wrapper_space_table_index); + + if( iterator_value < table->size() ) + { + (*table)[iterator_value]->serialize_to_json_stream(out_stream); + } + } + +} + +template +pt::Space * Generator::CallSpaceTableForMiddleField(morm::ModelWrapper & model_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); + + if( iterator_value < table->size() ) + { + space = (*table)[iterator_value]; + } + else + { + CreateMsg(L"space table: ", root_space_name, fields, field_index, L" is not initialized, have you forgotten to use [for...] statement?"); + space = nullptr; + } + + return space; +} + + + +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) { pt::Space * space = &root_space; last_res = false; - std::wstring * field = nullptr; + size_t field_index = root_field_index; - for(size_t i=field_index ; i < fields.size() + 1 ; ) + /* + * + * we are iterating through such objects: + * [root_space, fields[field_index], fields[field_index+1], fields[field_index+2], fields[field_index+3] ...] + * the first item is the root_space with a find_helper.fun_name name + * + */ + while( (field_index < fields.size() + 1) && space ) { - bool is_last_field = (i == fields.size()); - field = (i == 0) ? find_helper.fun_name : &fields[i - 1]; + bool is_last_field = (field_index == fields.size()); if( space->is_object() ) { if( is_last_field ) { - if( ShouldMakeDump(parameters) ) - { - space->serialize_to_json_stream(out_stream); // we can add pretty print - } + CallSpaceObjectForLastField(parameters, out_stream, space); } else { - pt::Space * old = space; - std::wstring & next_field = fields[i]; - space = space->get_object_field(next_field); - - if( !space ) - { - if( plog ) - { - (*plog) << pt::Log::log2 << "Ezc: there is no " << next_field << " property of object " << *field << pt::Log::logend; - } - - break; - } + space = CallSpaceObjectForMiddleField(*find_helper.fun_name, fields, field_index, space); } - ++i; + field_index += 1; } else if( space->is_table() ) { - pt::Space::TableType * table = space->get_table(); - size_t space_index = i - field_index; + size_t model_wrapper_space_table_index = field_index - root_field_index; - // add testing space_index range [0..MODEL_WRAPPER_SPACE_INDICES_TABLE_SIZE - 1] - - if( is_last_field ) + if( model_wrapper_space_table_index < model_wrapper.space_indices_table_size() ) { - if( stack_tab[stack_index-1].is_for ) + if( is_last_field ) { - // we are in [for...]statement, increment iterator and check the range - model_wrapper.increment_iterator(space_index, table->size()); - size_t iterator_value = model_wrapper.get_space_iterator_value(space_index); - last_res = (iterator_value < table->size()); + CallSpaceTableForLastField(model_wrapper, parameters, out_stream, space, model_wrapper_space_table_index); + field_index += 1; } else { - // we are not in [for..], it can be for example [if...], return true if the table is not empty - last_res = !table->empty(); + space = CallSpaceTableForMiddleField(model_wrapper, *find_helper.fun_name, fields, field_index, space, model_wrapper_space_table_index); + // don't increment field_index } - - if( ShouldMakeDump(parameters) ) - { - space->serialize_to_json_stream(out_stream); - } - - if( IsCurrentParam(parameters) ) - { - size_t iterator_value = model_wrapper.get_space_iterator_value(space_index); - - if( iterator_value < table->size() ) - { - (*table)[iterator_value]->serialize_to_json_stream(out_stream); - } - } - - ++i; } else { - // 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(space_index); - last_res = (iterator_value < table->size()); - - if( last_res ) - { - space = (*table)[iterator_value]; - } - else - { - // IMPROVEME use CreateMsg() - if( plog ) - { - (*plog) << pt::Log::log1 << "Ezc: table: " << field << " is not initialized, have you forgotten to use [for...] statement?" << pt::Log::logend; - } - break; - } + CreateMsg(L"", *find_helper.fun_name, fields, field_index, L" exceeded the maximum number of fields for a space object"); + break; } } else @@ -1352,15 +1408,11 @@ void Generator::CallSpace(morm::ModelWrapper & model_wrapper, pt::Sp if( is_last_field ) { space->serialize_to_string(out_stream); - ++i; + field_index += 1; } else { - if( plog ) - { - (*plog) << pt::Log::log2 << "Ezc: " << (*field) << " is not a model not a model container nor a space" << pt::Log::logend; - } - + CreateMsg(L"", *find_helper.fun_name, fields, field_index, L" is not a model, model container nor a space"); break; } } @@ -1915,16 +1967,16 @@ void Generator::CreateMsg(const wchar_t * type, const wchar_t * arg) template -void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, +void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, size_t how_many_fields_print, const wchar_t * arg, const wchar_t * arg2, const wchar_t * arg3) { if( plog ) { (*plog) << pt::Log::log2 << L"Ezc: " << type << model_name; - for(std::wstring & str : fields) + for(size_t i=0 ; i < how_many_fields_print && i < fields.size() ; ++i) { - (*plog) << '.' << str; + (*plog) << '.' << fields[i]; } if( arg ) @@ -1947,6 +1999,16 @@ void Generator::CreateMsg(const wchar_t * type, const std::wstring & } +template +void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, + const wchar_t * arg, const wchar_t * arg2, const wchar_t * arg3) +{ + + CreateMsg(type, model_name, fields, fields.size(), arg, arg2, arg3); +} + + + template void Generator::CreateMsg(const std::wstring & type, const std::wstring & arg) {