diff --git a/src/baseexpression.h b/src/baseexpression.h index 9447f68..db10ee2 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -166,8 +166,9 @@ public: } - template - void field_list(const wchar_t * field_name, ModelContainer & field_value, const FT & field_type, ModelConnector * model_connector, ModelEnv * model_env) + template + void field_list(const wchar_t * field_name, ModelContainer & field_value, ModelContainerType * model_container_type, + const FT & field_type, ModelConnector * model_connector, ModelEnv * model_env, IsContainerByValueRenameMe * foo) { if( out_stream && can_field_be_generated(field_type) ) { @@ -182,7 +183,7 @@ public: { put_field_name_and_table_if_needed(field_name, field_type, model_env); put_name_value_separator(); - put_field_value_list(field_value, model_connector, model_env); + put_field_value_list(field_value, model_container_type, model_connector, model_env, foo); } field_after(); @@ -353,6 +354,92 @@ protected: } + template + void put_field_value_list(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector, + ModelEnv * model_env, IsContainerByValueRenameMe * foo) + { + if constexpr (std::is_base_of()) + { + if constexpr (std::is_base_of()) + { + put_field_value_list_model_by_value(field_value, model_container_type, model_connector, model_env); + } + else + { + put_field_value_list_model_by_pointer(field_value, model_container_type, model_connector, model_env); + } + } + else + { + put_field_value_list_non_model(field_value, model_connector); + } + } + + + template + void put_field_value_list_model_by_value(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector, + ModelEnv * model_env) + { + if( model_connector && model_env && out_stream ) + { + bool is_first = true; + before_field_value_list(); + + for(auto & child_model_item : field_value) + { + if( !is_first ) + { + field_value_list_separator(); + } + + put_field_value_list_model(child_model_item, model_connector, model_env); + is_first = false; + } + + after_field_value_list(); + } + } + + + template + void put_field_value_list_model_by_pointer(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector, + ModelEnv * model_env) + { + if( model_connector && model_env && out_stream ) + { + bool is_first = true; + before_field_value_list(); + + for(auto * child_model_item : field_value) + { + if( !is_first ) + { + field_value_list_separator(); + } + + put_field_value_list_model(*child_model_item, model_connector, model_env); + is_first = false; + } + + after_field_value_list(); + } + } + + + template + void put_field_value_list_model(ModelContainerType & child_model, ModelConnector * model_connector, ModelEnv * model_env) + { + ModelEnv model_env_local(*model_env); + child_model.model_env = &model_env_local; + child_model.model_env->has_primary_key_set = child_model.get_has_primary_key_set(); + child_model.set_connector(model_connector); + + generate_from_model(child_model); + + child_model.model_env = nullptr; + } + + template void put_field_value_list_non_model(ModelContainer & field_value, ModelConnector * model_connector) { @@ -377,212 +464,6 @@ protected: } - template - void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, ModelEnv * model_env) - { - if( model_connector && model_env && out_stream ) - { - bool is_first = true; - before_field_value_list(); - - for(auto & m : field_value) - { - if( !is_first ) - { - field_value_list_separator(); - } - - ModelEnv model_env_local(*model_env); - m.model_env = &model_env_local; - m.model_env->has_primary_key_set = m.get_has_primary_key_set(); - m.set_connector(model_connector); - - generate_from_model(m); - - m.model_env = nullptr; - is_first = false; - } - - after_field_value_list(); - } - } - - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - - - - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) - { - put_field_value_list_non_model(field_value, model_connector); - } - - // used in 'in()' statements, may should be renamed? template diff --git a/src/clearer.h b/src/clearer.h index 5427de2..357b3b2 100644 --- a/src/clearer.h +++ b/src/clearer.h @@ -74,9 +74,22 @@ public: virtual void clear_model(Model & field_value); - template - void clear_container(ModelContainer & container) + template + void clear_container(ModelContainer & container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo) { + if constexpr (std::is_base_of()) + { + if constexpr (!std::is_base_of()) + { + for(auto * item : container) + { +// IMPROVEME we need to rethink how to handle pointers +// delete item; +// item = nullptr; + } + } + } + container.clear(); } diff --git a/src/model.cpp b/src/model.cpp index 3db73a8..173995f 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -1378,7 +1378,7 @@ void Model::field_model_set_parent_key(const wchar_t * db_field_name, Model & fi } -void Model::field_model_iterate_through_childs(const wchar_t * db_field_name, Model & field_model, const FT & field_type) +void Model::field_model_iterate_through_childs(Model & field_model, const FT & field_type) { if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_INSERT ) { @@ -1618,6 +1618,7 @@ void Model::field_model(const wchar_t * db_field_name, const wchar_t * flat_fiel } + void Model::field_model_for_db(const wchar_t * db_field_name, Model & field_model, const FT & field_type) { if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_SET_PARENT_ID ) @@ -1632,7 +1633,7 @@ void Model::field_model_for_db(const wchar_t * db_field_name, Model & field_mode { if( field_type.is_foreign_key() ) { - field_model_iterate_through_childs(db_field_name, field_model, field_type); + field_model_iterate_through_childs(field_model, field_type); } } @@ -1640,7 +1641,7 @@ void Model::field_model_for_db(const wchar_t * db_field_name, Model & field_mode { if( field_type.is_foreign_key_in_child() ) { - field_model_iterate_through_childs(db_field_name, field_model, field_type); + field_model_iterate_through_childs(field_model, field_type); } } diff --git a/src/model.h b/src/model.h index 910e423..8383d09 100644 --- a/src/model.h +++ b/src/model.h @@ -445,6 +445,17 @@ protected: field_vector(field_name, field_name, field_value, field_type); } + template + void field(const wchar_t * field_name, std::list & field_value, const FT & field_type = FT::default_type) + { + field_list(field_name, field_name, field_value, field_type); + } + + template + void field(const wchar_t * field_name, std::vector & field_value, const FT & field_type = FT::default_type) + { + field_vector(field_name, field_name, field_value, field_type); + } @@ -549,23 +560,34 @@ protected: void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_value, const FT & field_type = FT::default_type) { - // has_foreign_key was here field_model(db_field_name, flat_field_name, field_value, field_type); } - template - void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value, const FT & field_type = FT::default_type) + template + void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value, const FT & field_type = FT::default_type) { field_list(db_field_name, flat_field_name, field_value, field_type); } - template - void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector & field_value, const FT & field_type = FT::default_type) + template + void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector & field_value, const FT & field_type = FT::default_type) { field_vector(db_field_name, flat_field_name, field_value, field_type); } + // FIXME we need to correct handle such pointerns, cctor, dtor etc. + template + void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value, const FT & field_type = FT::default_type) + { + field_list(db_field_name, flat_field_name, field_value, field_type); + } + // FIXME we need to correct handle such pointerns, cctor, dtor etc. + template + void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector & field_value, const FT & field_type = FT::default_type) + { + field_vector(db_field_name, flat_field_name, field_value, field_type); + } protected: @@ -857,17 +879,18 @@ protected: void field_model_save_key(const wchar_t * db_field_name); void field_model_set_parent_key_in_child(const wchar_t * db_field_name, Model & field_model); void field_model_set_parent_key(const wchar_t * db_field_name, Model & field_model); - void field_model_iterate_through_childs(const wchar_t * db_field_name, Model & field_model, const FT & field_type); + void field_model_iterate_through_childs(Model & field_model, const FT & field_type); void field_model_generate_flat_string(const wchar_t * flat_field_name, Model & field_model, const FT & field_type); void field_model_generate_db_sql(const wchar_t * db_field_name, Model & field_model, const FT & field_type); void field_model_clear_values(Model & field_model); void field_model_read_values_from_queryresult(const wchar_t * db_field_name, Model & field_model, const FT & field_type); void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, const FT & field_type); + void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model * field_model, const FT & field_type); void field_model_for_db(const wchar_t * db_field_name, Model & field_model, const FT & field_type); - template - void field_list_set_parent_key(const wchar_t * db_field_name, ModelContainer & field_container, ModelContainerType * model_container_type) + template + void field_list_set_parent_key(const wchar_t * db_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo) { FieldValueHelper helper; helper.db_field_name = db_field_name; @@ -881,10 +904,13 @@ protected: model_env->field_value_helper_tab = &helper_tab; field_model_save_key(db_field_name); - for(ModelContainerType & child_model : field_container) + if constexpr (std::is_base_of()) { - child_model.set_connector(model_connector); - field_model_set_parent_key_in_child(db_field_name, child_model); + field_list_set_parent_key_by_value(db_field_name, field_container); + } + else + { + field_list_set_parent_key_by_pointer(db_field_name, field_container); } model_env->field_value_helper_tab = nullptr; @@ -892,46 +918,84 @@ protected: template - void field_list_iterate_through_childs(const wchar_t * db_field_name, ModelContainer & field_container, ModelContainerType * model_container_type) + void field_list_set_parent_key_by_value(const wchar_t * db_field_name, ModelContainer & field_container) { for(ModelContainerType & child_model : field_container) { - ModelEnv model_env_local; - model_env_local.copy_global_objects(*model_env); - model_env_local.model = &child_model; - - child_model.model_env = &model_env_local; - child_model.model_env->has_primary_key_set = child_model.has_primary_key_set; child_model.set_connector(model_connector); - child_model.table(); - - if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_INSERT ) - { - child_model.insert_tree(true); - } - - if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_UPDATE ) - { - child_model.update_tree(true); - } - - if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_REMOVE ) - { - child_model.remove_tree(true); - } - - if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_SAVE ) - { - child_model.save_tree(true); - } - - child_model.model_env = nullptr; + field_model_set_parent_key_in_child(db_field_name, child_model); } } - template - void field_list_generate_flat_string(const wchar_t * flat_field_name, ModelContainer & field_container, const FT & field_type) + template + void field_list_set_parent_key_by_pointer(const wchar_t * db_field_name, ModelContainer & field_container) + { + for(ModelContainerType * child_model : field_container) + { + child_model->set_connector(model_connector); + field_model_set_parent_key_in_child(db_field_name, *child_model); + } + } + + + template + void field_list_iterate_through_childs(ModelContainer & field_container, ModelContainerType * model_container_type, const FT & field_type, IsContainerByValueRenameMe * foo) + { + if constexpr (std::is_base_of()) + { + field_list_iterate_through_childs_by_value(field_container, model_container_type, field_type); + } + else + { + field_list_iterate_through_childs_by_pointer(field_container, model_container_type, field_type); + } + } + + + template + void field_list_iterate_through_childs_by_value(ModelContainer & field_container, ModelContainerType * model_container_type, const FT & field_type) + { + for(ModelContainerType & child_model : field_container) + { + field_list_iterate_through_childs(child_model, field_type); + } + } + + + template + void field_list_iterate_through_childs_by_pointer(ModelContainer & field_container, ModelContainerType * model_container_type, const FT & field_type) + { + for(ModelContainerType * child_model : field_container) + { + field_list_iterate_through_childs(*child_model, field_type); + } + } + + + + + template + void field_list_iterate_through_childs(ModelContainerType & child_model, const FT & field_type) + { + ModelEnv model_env_local; + model_env_local.copy_global_objects(*model_env); + model_env_local.model = &child_model; + + child_model.model_env = &model_env_local; + child_model.model_env->has_primary_key_set = child_model.has_primary_key_set; + child_model.set_connector(model_connector); + child_model.table(); + + field_model_iterate_through_childs(child_model, field_type); + + child_model.model_env = nullptr; + } + + + template + void field_list_generate_flat_string(const wchar_t * flat_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, + const FT & field_type, IsContainerByValueRenameMe * foo) { FlatConnector * flat_connector = model_connector->get_flat_connector(); @@ -941,20 +1005,20 @@ protected: if( flat_expression ) { - flat_expression->field_list(flat_field_name, field_container, field_type, model_connector, model_env); + flat_expression->field_list(flat_field_name, field_container, model_container_type, field_type, model_connector, model_env, foo); } } } - template - void field_list_clearing_values(ModelContainer & field_container) + template + void field_list_clearing_values(ModelContainer & field_container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo) { Clearer * clearer = model_connector->get_clearer(); if( clearer ) { - clearer->clear_container(field_container); + clearer->clear_container(field_container, model_container_type, foo); } } @@ -978,7 +1042,8 @@ protected: } else { - field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type); + ContainerItemType * pointer = nullptr; + field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type, pointer); } } @@ -1002,15 +1067,65 @@ protected: } else { - field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type); + ContainerItemType * pointer = nullptr; + field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type, pointer); } } + template + void field_vector(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector & field_value, const FT & field_type) + { + ContainerItemType * item_type_null_pointer = nullptr; + + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GET_MODEL_WRAPPER ) + { + if constexpr (std::is_base_of()) + { + if( (is_empty_field(model_env->db_field_name) || is_the_same_field(db_field_name, model_env->db_field_name)) && + (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) && + !model_env->model_wrapper ) + { + model_env->model_wrapper = new ModelWrapperVectorPointer(&field_value); + } + } + } + else + { + void * pointer = nullptr; + field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type, pointer); + } + } - template - void field_list_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, const FT & field_type) + template + void field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value, const FT & field_type) + { + ContainerItemType * item_type_null_pointer = nullptr; + + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GET_MODEL_WRAPPER ) + { + if constexpr (std::is_base_of()) + { + if( (is_empty_field(model_env->db_field_name) || is_the_same_field(db_field_name, model_env->db_field_name)) && + (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) && + !model_env->model_wrapper ) + { + model_env->model_wrapper = new ModelWrapperListPointer(&field_value); + } + } + } + else + { + void * pointer = nullptr; + field_list_generic(db_field_name, flat_field_name, field_value, item_type_null_pointer, field_type, pointer); + } + } + + + template + void field_list_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, + const FT & field_type, IsContainerByValueRenameMe * foo) { if( model_connector && model_env ) { @@ -1038,12 +1153,14 @@ protected: { if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_SET_PARENT_ID ) { - field_list_set_parent_key(db_field_name, field_container, model_container_type); + field_list_set_parent_key(db_field_name, field_container, model_container_type, foo); } if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY ) { - field_list_iterate_through_childs(db_field_name, field_container, model_container_type); + // IMPROVEME it would be good to make some optimisation before going through all items + // such as: if UPDATE is called then we check if field_type allows to make update + field_list_iterate_through_childs(field_container, model_container_type, field_type, foo); } } else @@ -1071,13 +1188,13 @@ protected: { if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING ) { - field_list_generate_flat_string(flat_field_name, field_container, field_type); + field_list_generate_flat_string(flat_field_name, field_container, model_container_type, field_type, foo); } } if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_CLEARING_VALUE ) { - field_list_clearing_values(field_container); + field_list_clearing_values(field_container, model_container_type, foo); } } } diff --git a/src/modelwrapper.h b/src/modelwrapper.h index 7055579..12e0b24 100644 --- a/src/modelwrapper.h +++ b/src/modelwrapper.h @@ -170,76 +170,12 @@ protected: - - -template -class ModelWrapperVector : public ModelWrapper +template +class ModelWrapperBaseContainer : public ModelWrapper { public: - ModelWrapperVector(std::vector * container) - { - this->container = container; - index = container->size(); - } - - bool is_container() - { - return true; - } - - bool is_container_empty() - { - return container->empty(); - } - - void increment_iterator() - { - if( index >= container->size() ) - { - index = 0; - } - else - { - index += 1; - } - } - - bool is_iterator_correct() - { - return index < container->size(); - } - - Model * get_model() - { - if( index < container->size() ) - { - return &(*container)[index]; - } - - return nullptr; - } - - -protected: - - std::vector * container; - size_t index; - - -}; - - - - - - -template -class ModelWrapperList : public ModelWrapper -{ -public: - - ModelWrapperList(std::list * container) + ModelWrapperBaseContainer(ContainerType * container) { this->container = container; iterator = container->end(); @@ -272,6 +208,33 @@ public: return iterator != container->end(); } + + +protected: + + ContainerType * container; + typename ContainerType::iterator iterator; + +}; + + + + + + + +template +class ModelWrapperVector : public ModelWrapperBaseContainer> +{ +public: + + using ModelWrapperBaseContainer>::container; + using ModelWrapperBaseContainer>::iterator; + + ModelWrapperVector(std::vector * container) : ModelWrapperBaseContainer>(container) + { + } + Model * get_model() { if( iterator != container->end() ) @@ -282,16 +245,93 @@ public: return nullptr; } +}; -protected: - std::list * container; - typename std::list::iterator iterator; + + +template +class ModelWrapperVectorPointer : public ModelWrapperBaseContainer> +{ +public: + + using ModelWrapperBaseContainer>::container; + using ModelWrapperBaseContainer>::iterator; + + ModelWrapperVectorPointer(std::vector * container) : ModelWrapperBaseContainer>(container) + { + } + + Model * get_model() + { + if( iterator != container->end() ) + { + return (*iterator); + } + + return nullptr; + } }; + + +template +class ModelWrapperList : public ModelWrapperBaseContainer> +{ +public: + + using ModelWrapperBaseContainer>::container; + using ModelWrapperBaseContainer>::iterator; + + ModelWrapperList(std::list * container): ModelWrapperBaseContainer>(container) + { + } + + Model * get_model() + { + if( iterator != container->end() ) + { + return &(*iterator); + } + + return nullptr; + } + +}; + + + + +template +class ModelWrapperListPointer : public ModelWrapperBaseContainer> +{ +public: + + using ModelWrapperBaseContainer>::container; + using ModelWrapperBaseContainer>::iterator; + + ModelWrapperListPointer(std::list * container): ModelWrapperBaseContainer>(container) + { + } + + Model * get_model() + { + if( iterator != container->end() ) + { + return (*iterator); + } + + return nullptr; + } + +}; + + + + } #endif