added basic support for containers with pointers to models
added to Model: template<typename ContainerItemType> void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list<ContainerItemType*> & field_value, const FT & field_type = FT::default_type); template<typename ContainerItemType> void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ContainerItemType*> & field_value, const FT & field_type = FT::default_type);
This commit is contained in:
parent
dc1c601eac
commit
5cf55ecce3
|
@ -166,8 +166,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename ModelContainer>
|
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
void field_list(const wchar_t * field_name, ModelContainer & field_value, const FT & field_type, ModelConnector * model_connector, ModelEnv * model_env)
|
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) )
|
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_field_name_and_table_if_needed(field_name, field_type, model_env);
|
||||||
put_name_value_separator();
|
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();
|
field_after();
|
||||||
|
@ -353,6 +354,92 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
|
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<Model, ModelContainerType>())
|
||||||
|
{
|
||||||
|
if constexpr (std::is_base_of<Model, IsContainerByValueRenameMe>())
|
||||||
|
{
|
||||||
|
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<typename ModelContainer, typename ModelContainerType>
|
||||||
|
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<typename ModelContainer, typename ModelContainerType>
|
||||||
|
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<typename ModelContainerType>
|
||||||
|
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<typename ModelContainer>
|
template<typename ModelContainer>
|
||||||
void put_field_value_list_non_model(ModelContainer & field_value, ModelConnector * model_connector)
|
void put_field_value_list_non_model(ModelContainer & field_value, ModelConnector * model_connector)
|
||||||
{
|
{
|
||||||
|
@ -377,212 +464,6 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename ModelContainer>
|
|
||||||
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<char> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<unsigned char> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<std::wstring> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<std::string> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<bool> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<short> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<unsigned short> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<int> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<unsigned int> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<unsigned long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<long long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<unsigned long long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<float> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<double> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<long double> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::vector<pt::Date> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<char> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<unsigned char> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<std::wstring> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<std::string> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<bool> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<short> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<unsigned short> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<int> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<unsigned int> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<unsigned long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<long long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<unsigned long long> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<float> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<double> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<long double> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_field_value_list(std::list<pt::Date> & field_value, ModelConnector * model_connector, ModelEnv *)
|
|
||||||
{
|
|
||||||
put_field_value_list_non_model(field_value, model_connector);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// used in 'in()' statements, may should be renamed?
|
// used in 'in()' statements, may should be renamed?
|
||||||
template<typename FieldValue, typename Container>
|
template<typename FieldValue, typename Container>
|
||||||
|
|
|
@ -74,9 +74,22 @@ public:
|
||||||
|
|
||||||
virtual void clear_model(Model & field_value);
|
virtual void clear_model(Model & field_value);
|
||||||
|
|
||||||
template<typename ModelContainer>
|
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
void clear_container(ModelContainer & container)
|
void clear_container(ModelContainer & container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo)
|
||||||
{
|
{
|
||||||
|
if constexpr (std::is_base_of<Model, ModelContainerType>())
|
||||||
|
{
|
||||||
|
if constexpr (!std::is_base_of<Model, IsContainerByValueRenameMe>())
|
||||||
|
{
|
||||||
|
for(auto * item : container)
|
||||||
|
{
|
||||||
|
// IMPROVEME we need to rethink how to handle pointers
|
||||||
|
// delete item;
|
||||||
|
// item = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
container.clear();
|
container.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
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)
|
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 )
|
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() )
|
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() )
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
227
src/model.h
227
src/model.h
|
@ -445,6 +445,17 @@ protected:
|
||||||
field_vector(field_name, field_name, field_value, field_type);
|
field_vector(field_name, field_name, field_value, field_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename ContainerItemType>
|
||||||
|
void field(const wchar_t * field_name, std::list<ContainerItemType*> & field_value, const FT & field_type = FT::default_type)
|
||||||
|
{
|
||||||
|
field_list(field_name, field_name, field_value, field_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ContainerItemType>
|
||||||
|
void field(const wchar_t * field_name, std::vector<ContainerItemType*> & 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)
|
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);
|
field_model(db_field_name, flat_field_name, field_value, field_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ModelClass>
|
template<typename ContainerItemType>
|
||||||
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list<ModelClass> & field_value, const FT & field_type = FT::default_type)
|
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list<ContainerItemType> & field_value, const FT & field_type = FT::default_type)
|
||||||
{
|
{
|
||||||
field_list(db_field_name, flat_field_name, field_value, field_type);
|
field_list(db_field_name, flat_field_name, field_value, field_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ModelClass>
|
template<typename ContainerItemType>
|
||||||
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ModelClass> & field_value, const FT & field_type = FT::default_type)
|
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ContainerItemType> & field_value, const FT & field_type = FT::default_type)
|
||||||
{
|
{
|
||||||
field_vector(db_field_name, flat_field_name, field_value, field_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<typename ContainerItemType>
|
||||||
|
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list<ContainerItemType*> & 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<typename ContainerItemType>
|
||||||
|
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ContainerItemType*> & field_value, const FT & field_type = FT::default_type)
|
||||||
|
{
|
||||||
|
field_vector(db_field_name, flat_field_name, field_value, field_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -857,17 +879,18 @@ protected:
|
||||||
void field_model_save_key(const wchar_t * db_field_name);
|
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_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_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_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_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_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_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(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);
|
void field_model_for_db(const wchar_t * db_field_name, Model & field_model, const FT & field_type);
|
||||||
|
|
||||||
|
|
||||||
template<typename ModelContainer, typename ModelContainerType>
|
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
void field_list_set_parent_key(const wchar_t * db_field_name, ModelContainer & field_container, ModelContainerType * model_container_type)
|
void field_list_set_parent_key(const wchar_t * db_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo)
|
||||||
{
|
{
|
||||||
FieldValueHelper helper;
|
FieldValueHelper helper;
|
||||||
helper.db_field_name = db_field_name;
|
helper.db_field_name = db_field_name;
|
||||||
|
@ -881,10 +904,13 @@ protected:
|
||||||
model_env->field_value_helper_tab = &helper_tab;
|
model_env->field_value_helper_tab = &helper_tab;
|
||||||
field_model_save_key(db_field_name);
|
field_model_save_key(db_field_name);
|
||||||
|
|
||||||
for(ModelContainerType & child_model : field_container)
|
if constexpr (std::is_base_of<Model, IsContainerByValueRenameMe>())
|
||||||
{
|
{
|
||||||
child_model.set_connector(model_connector);
|
field_list_set_parent_key_by_value<ModelContainer, ModelContainerType>(db_field_name, field_container);
|
||||||
field_model_set_parent_key_in_child(db_field_name, child_model);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
field_list_set_parent_key_by_pointer<ModelContainer, ModelContainerType>(db_field_name, field_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
model_env->field_value_helper_tab = nullptr;
|
model_env->field_value_helper_tab = nullptr;
|
||||||
|
@ -892,46 +918,84 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
template<typename ModelContainer, typename ModelContainerType>
|
template<typename ModelContainer, typename ModelContainerType>
|
||||||
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)
|
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.set_connector(model_connector);
|
||||||
child_model.table();
|
field_model_set_parent_key_in_child(db_field_name, child_model);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename ModelContainer>
|
template<typename ModelContainer, typename ModelContainerType>
|
||||||
void field_list_generate_flat_string(const wchar_t * flat_field_name, ModelContainer & field_container, const FT & field_type)
|
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<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
|
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<Model, IsContainerByValueRenameMe>())
|
||||||
|
{
|
||||||
|
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<typename ModelContainer, typename ModelContainerType>
|
||||||
|
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<typename ModelContainer, typename ModelContainerType>
|
||||||
|
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<typename ModelContainerType>
|
||||||
|
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<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
|
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();
|
FlatConnector * flat_connector = model_connector->get_flat_connector();
|
||||||
|
|
||||||
|
@ -941,20 +1005,20 @@ protected:
|
||||||
|
|
||||||
if( flat_expression )
|
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<typename ModelContainer>
|
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
void field_list_clearing_values(ModelContainer & field_container)
|
void field_list_clearing_values(ModelContainer & field_container, ModelContainerType * model_container_type, IsContainerByValueRenameMe * foo)
|
||||||
{
|
{
|
||||||
Clearer * clearer = model_connector->get_clearer();
|
Clearer * clearer = model_connector->get_clearer();
|
||||||
|
|
||||||
if( clearer )
|
if( clearer )
|
||||||
{
|
{
|
||||||
clearer->clear_container(field_container);
|
clearer->clear_container(field_container, model_container_type, foo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -978,7 +1042,8 @@ protected:
|
||||||
}
|
}
|
||||||
else
|
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
|
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<typename ContainerItemType>
|
||||||
|
void field_vector(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector<ContainerItemType*> & 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<Model, ContainerItemType>())
|
||||||
|
{
|
||||||
|
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<typename ModelContainer, typename ModelContainerType>
|
template<typename ContainerItemType>
|
||||||
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)
|
void field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list<ContainerItemType*> & 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<Model, ContainerItemType>())
|
||||||
|
{
|
||||||
|
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<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||||
|
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 )
|
if( model_connector && model_env )
|
||||||
{
|
{
|
||||||
|
@ -1038,12 +1153,14 @@ protected:
|
||||||
{
|
{
|
||||||
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_SET_PARENT_ID )
|
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 )
|
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
|
else
|
||||||
|
@ -1071,13 +1188,13 @@ protected:
|
||||||
{
|
{
|
||||||
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING )
|
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 )
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,76 +170,12 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ContainerType>
|
||||||
|
class ModelWrapperBaseContainer : public ModelWrapper
|
||||||
template<typename VectorType>
|
|
||||||
class ModelWrapperVector : public ModelWrapper
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ModelWrapperVector(std::vector<VectorType> * container)
|
ModelWrapperBaseContainer(ContainerType * 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<VectorType> * container;
|
|
||||||
size_t index;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<typename ListType>
|
|
||||||
class ModelWrapperList : public ModelWrapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
ModelWrapperList(std::list<ListType> * container)
|
|
||||||
{
|
{
|
||||||
this->container = container;
|
this->container = container;
|
||||||
iterator = container->end();
|
iterator = container->end();
|
||||||
|
@ -272,6 +208,33 @@ public:
|
||||||
return iterator != container->end();
|
return iterator != container->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
ContainerType * container;
|
||||||
|
typename ContainerType::iterator iterator;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename VectorType>
|
||||||
|
class ModelWrapperVector : public ModelWrapperBaseContainer<std::vector<VectorType>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
using ModelWrapperBaseContainer<std::vector<VectorType>>::container;
|
||||||
|
using ModelWrapperBaseContainer<std::vector<VectorType>>::iterator;
|
||||||
|
|
||||||
|
ModelWrapperVector(std::vector<VectorType> * container) : ModelWrapperBaseContainer<std::vector<VectorType>>(container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
Model * get_model()
|
Model * get_model()
|
||||||
{
|
{
|
||||||
if( iterator != container->end() )
|
if( iterator != container->end() )
|
||||||
|
@ -282,16 +245,93 @@ public:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
std::list<ListType> * container;
|
|
||||||
typename std::list<ListType>::iterator iterator;
|
|
||||||
|
template<typename VectorType>
|
||||||
|
class ModelWrapperVectorPointer : public ModelWrapperBaseContainer<std::vector<VectorType*>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
using ModelWrapperBaseContainer<std::vector<VectorType*>>::container;
|
||||||
|
using ModelWrapperBaseContainer<std::vector<VectorType*>>::iterator;
|
||||||
|
|
||||||
|
ModelWrapperVectorPointer(std::vector<VectorType*> * container) : ModelWrapperBaseContainer<std::vector<VectorType*>>(container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Model * get_model()
|
||||||
|
{
|
||||||
|
if( iterator != container->end() )
|
||||||
|
{
|
||||||
|
return (*iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ListType>
|
||||||
|
class ModelWrapperList : public ModelWrapperBaseContainer<std::list<ListType>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
using ModelWrapperBaseContainer<std::list<ListType>>::container;
|
||||||
|
using ModelWrapperBaseContainer<std::list<ListType>>::iterator;
|
||||||
|
|
||||||
|
ModelWrapperList(std::list<ListType> * container): ModelWrapperBaseContainer<std::list<ListType>>(container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Model * get_model()
|
||||||
|
{
|
||||||
|
if( iterator != container->end() )
|
||||||
|
{
|
||||||
|
return &(*iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template<typename ListType>
|
||||||
|
class ModelWrapperListPointer : public ModelWrapperBaseContainer<std::list<ListType*>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
using ModelWrapperBaseContainer<std::list<ListType*>>::container;
|
||||||
|
using ModelWrapperBaseContainer<std::list<ListType*>>::iterator;
|
||||||
|
|
||||||
|
ModelWrapperListPointer(std::list<ListType*> * container): ModelWrapperBaseContainer<std::list<ListType*>>(container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Model * get_model()
|
||||||
|
{
|
||||||
|
if( iterator != container->end() )
|
||||||
|
{
|
||||||
|
return (*iterator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue