diff options
-rw-r--r-- | src/components/smart_objects/include/smart_objects/enum_schema_item.h | 10 | ||||
-rwxr-xr-x | tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py | 52 |
2 files changed, 47 insertions, 15 deletions
diff --git a/src/components/smart_objects/include/smart_objects/enum_schema_item.h b/src/components/smart_objects/include/smart_objects/enum_schema_item.h index f6b7bdff92..b0fd0ca418 100644 --- a/src/components/smart_objects/include/smart_objects/enum_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/enum_schema_item.h @@ -104,7 +104,7 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { **/ static std::shared_ptr<TEnumSchemaItem> createWithSignatures( const std::set<EnumType>& AllowedElements, - const std::set<ElementSignature>& ElementSignatures, + const std::map<EnumType, std::vector<ElementSignature>>& ElementSignatures, const TSchemaItemParameter<EnumType>& DefaultValue = TSchemaItemParameter<EnumType>()); /** @@ -160,14 +160,14 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { TEnumSchemaItem(const std::set<EnumType>& AllowedElements, const TSchemaItemParameter<EnumType>& DefaultValue, - const std::set<ElementSignature>& ElementSignatures); + const std::map<EnumType, std::vector<ElementSignature>>& ElementSignatures); SmartType getSmartType() const OVERRIDE; EnumType getDefaultValue() const OVERRIDE; /** * @brief Set of allowed enumeration elements. **/ const std::set<EnumType> mAllowedElements; - const std::set<ElementSignature> mElementSignatures; + const std::map<EnumType, std::vector<ElementSignature>> mElementSignatures; /** * @brief Default value. **/ @@ -276,7 +276,7 @@ std::shared_ptr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::create( template <typename EnumType> std::shared_ptr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::createWithSignatures( const std::set<EnumType>& AllowedElements, - const std::set<ElementSignature>& ElementSignatures, + const std::map<EnumType, std::vector<ElementSignature>>& ElementSignatures, const TSchemaItemParameter<EnumType>& DefaultValue ) { return std::shared_ptr<TEnumSchemaItem<EnumType> >( new TEnumSchemaItem<EnumType>(AllowedElements, DefaultValue, ElementSignatures)); @@ -363,7 +363,7 @@ template <typename EnumType> TEnumSchemaItem<EnumType>::TEnumSchemaItem( const std::set<EnumType>& AllowedElements, const TSchemaItemParameter<EnumType>& DefaultValue, - const std::set<ElementSignature>& ElementSignatures) + const std::map<EnumType, std::vector<ElementSignature>>& ElementSignatures) : CDefaultSchemaItem<EnumType>(DefaultValue) , mAllowedElements(AllowedElements) , mElementSignatures(mElementSignatures) {} diff --git a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py index 2f643edb3a..47a2e92c79 100755 --- a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py +++ b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py @@ -544,6 +544,18 @@ class CodeGenerator(object): return True return False + def _enum_param_type_has_history_present(self, param_type): + ''' + Check if any elements in an enum has history signature + ''' + for element in param_type.elements.values(): + if ( element.history is not None or + element.since is not None or + element.until is not None or + element.removed is not None ): + return True + return False + def _gen_schema_loc_decls(self, members, processed_enums): """Generate local declarations of variables for schema. @@ -794,16 +806,30 @@ class CodeGenerator(object): code = self._impl_code_struct_item_template.substitute( name=param.name) elif type(param) is Model.Enum: - code = self._impl_code_enum_item_template.substitute( - type=param.name, - params=u"".join( - [self._gen_schema_loc_emum_var_name(param), - u", ", - self._gen_schema_item_param_values( - [[u"".join([param.name, u"::eType"]), - u"".join([param.name, u"::", - default_value.primary_name]) if - default_value is not None else None]])])) + if self._enum_param_type_has_history_present(param): + code = self._impl_code_enum_item_with_history_template.substitute( + type=param.name, + params=u"".join( + [self._gen_schema_loc_emum_var_name(param), + u", ", + self._impl_gen_schema_enum_history_map_template.substitute(name=param.name), + u", ", + self._gen_schema_item_param_values( + [[u"".join([param.name, u"::eType"]), + u"".join([param.name, u"::", + default_value.primary_name]) if + default_value is not None else None]])])) + else: + code = self._impl_code_enum_item_template.substitute( + type=param.name, + params=u"".join( + [self._gen_schema_loc_emum_var_name(param), + u", ", + self._gen_schema_item_param_values( + [[u"".join([param.name, u"::eType"]), + u"".join([param.name, u"::", + default_value.primary_name]) if + default_value is not None else None]])])) elif type(param) is Model.EnumSubset: code = self._impl_code_enum_item_template.substitute( type=param.enum.name, @@ -1670,6 +1696,9 @@ class CodeGenerator(object): _impl_code_loc_decl_enum_history_set_insert_template = string.Template( u'''${enum}_element_signatures[${enum}::${value}].push_back(ElementSignature("${since}", "${until}", ${removed}));''') + _impl_gen_schema_enum_history_map_template = string.Template( + u'''${name}_element_signatures''') + _impl_code_item_decl_temlate = string.Template( u'''${comment}''' u'''std::shared_ptr<ISchemaItem> ${var_name} = ${item_decl};''') @@ -1699,6 +1728,9 @@ class CodeGenerator(object): _impl_code_enum_item_template = string.Template( u'''TEnumSchemaItem<${type}::eType>::create(${params})''') + _impl_code_enum_item_with_history_template = string.Template( + u'''TEnumSchemaItem<${type}::eType>::createWithSignatures(${params})''') + _impl_code_item_param_value_template = string.Template( u'''TSchemaItemParameter<$type>($value)''') |