diff --git a/src/Makefile.dep b/src/Makefile.dep index 1685c2d..732d874 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -60,6 +60,7 @@ patternparser.o: ../../pikotools/src/convert/patternreplacer.h patternparser.o: ../../pikotools/src/convert/strtoint.h patternparser.o: ../../pikotools/src/convert/text.h patternparser.o: ../../pikotools/src/convert/misc.h +patternparser.o: ../../pikotools/src/utf8/utf8_stream.h patternparser.o: ../../pikotools/src/convert/double.h var.o: var.h ../../pikotools/src/date/date.h var.o: ../../pikotools/src/convert/inttostr.h diff --git a/src/generator.h b/src/generator.h index 9aa446f..f6fc51d 100644 --- a/src/generator.h +++ b/src/generator.h @@ -1897,10 +1897,14 @@ void Generator::EvaluateV if( !find_helper.found ) { - find_helper.result->clear(); + find_helper.result->clear(); // is this clear here needed? find_helper.current_var = FindInScope(name); + find_helper.found = (find_helper.current_var != nullptr); if( find_helper.current_var ) + *find_helper.result = *find_helper.current_var; + + if( find_helper.found ) { if( find_helper.current_var->type == Var::TYPE_FUNCTION && find_helper.current_var->user_function ) { @@ -1935,6 +1939,11 @@ void Generator::EvaluateV { find_helper.result->model_container_wrapper->increment_iterator(); find_helper.result->clear_childs(); + + // find_helper.result was copied from currrent_var so it doesn't have childs here...(childs are not copied) + if( find_helper.current_var ) + find_helper.current_var->clear_childs(); + // but it only clears child in the first level, is it correct? // childs from different vars will not be cleared } diff --git a/src/var.h b/src/var.h index 26cad3c..820e729 100644 --- a/src/var.h +++ b/src/var.h @@ -146,7 +146,11 @@ public: void set(morm::ModelContainerWrapper & model_container_wrapper); + template + void set(std::vector & model_container); + template + void set(std::list & model_container); bool is_equal(const char * str) const; @@ -594,6 +598,25 @@ void Var::set(morm::ModelContainerWrapper & model_container_wrapper) } +template +template +void Var::set(std::vector & model_container) +{ + type = TYPE_MODEL_CONTAINER_WRAPPER; + this->model_container_wrapper = new morm::ModelWrapperVector(&model_container); +} + + +template +template +void Var::set(std::list & model_container) +{ + type = TYPE_MODEL_CONTAINER_WRAPPER; + this->model_container_wrapper = new morm::ModelWrapperList(&model_container); +} + + + template bool Var::is_equal(const char * str) const diff --git a/src/vars.h b/src/vars.h index add668b..4ad71e7 100644 --- a/src/vars.h +++ b/src/vars.h @@ -78,6 +78,30 @@ public: Var & add(const std::string & name, morm::Model & model); Var & add(const std::wstring & name, morm::Model & model); + template + Var & add(const char * name, std::vector & model_container); + + template + Var & add(const wchar_t * name, std::vector & model_container); + + template + Var & add(const std::string & name, std::vector & model_container); + + template + Var & add(const std::wstring & name, std::vector & model_container); + + template + Var & add(const char * name, std::list & model_container); + + template + Var & add(const wchar_t * name, std::list & model_container); + + template + Var & add(const std::string & name, std::list & model_container); + + template + Var & add(const std::wstring & name, std::list & model_container); + Var * find(const char * name) const; Var * find(const wchar_t * name) const; Var * find(const std::string & name) const; @@ -238,6 +262,83 @@ Var & Vars::add(const std::wstring & name, morm::Model & } +template +template +Var & Vars::add(const char * name, std::vector & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const wchar_t * name, std::vector & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const std::string & name, std::vector & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const std::wstring & name, std::vector & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + + + +template +template +Var & Vars::add(const char * name, std::list & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const wchar_t * name, std::list & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const std::string & name, std::list & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + +template +template +Var & Vars::add(const std::wstring & name, std::list & model_container) +{ + Var & var = add(name); + var.set(model_container); + return var; +} + + + + template Var * Vars::find(const char * name) const