From 4a5afcf8cac695c88635f4bf791f03fa8bc98bc0 Mon Sep 17 00:00:00 2001 From: JackLivio Date: Sat, 4 Aug 2018 17:23:16 -0400 Subject: Fixes for parsing enum history elements --- .../include/smart_objects/enum_schema_item.h | 10 ++--- .../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 { **/ static std::shared_ptr createWithSignatures( const std::set& AllowedElements, - const std::set& ElementSignatures, + const std::map>& ElementSignatures, const TSchemaItemParameter& DefaultValue = TSchemaItemParameter()); /** @@ -160,14 +160,14 @@ class TEnumSchemaItem : public CDefaultSchemaItem { TEnumSchemaItem(const std::set& AllowedElements, const TSchemaItemParameter& DefaultValue, - const std::set& ElementSignatures); + const std::map>& ElementSignatures); SmartType getSmartType() const OVERRIDE; EnumType getDefaultValue() const OVERRIDE; /** * @brief Set of allowed enumeration elements. **/ const std::set mAllowedElements; - const std::set mElementSignatures; + const std::map> mElementSignatures; /** * @brief Default value. **/ @@ -276,7 +276,7 @@ std::shared_ptr > TEnumSchemaItem::create( template std::shared_ptr > TEnumSchemaItem::createWithSignatures( const std::set& AllowedElements, - const std::set& ElementSignatures, + const std::map>& ElementSignatures, const TSchemaItemParameter& DefaultValue ) { return std::shared_ptr >( new TEnumSchemaItem(AllowedElements, DefaultValue, ElementSignatures)); @@ -363,7 +363,7 @@ template TEnumSchemaItem::TEnumSchemaItem( const std::set& AllowedElements, const TSchemaItemParameter& DefaultValue, - const std::set& ElementSignatures) + const std::map>& ElementSignatures) : CDefaultSchemaItem(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 ${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)''') -- cgit v1.2.1