diff --git a/configure.ac b/configure.ac index 11fffb6b..b0a3c69d 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ # m4_define([version_major],[1]) m4_define([version_minor],[0]) -m4_define([version_micro],[8]) +m4_define([version_micro],[9]) AC_INIT([fastcdr], [version_major.version_minor.version_micro], [support@eprosima.com], [eProsima FastCDR], [http://eprosima.com/]) CONFIG_ARGS="$*" diff --git a/src/java/com/eprosima/fastcdr/idl/generator/TypesGenerator.java b/src/java/com/eprosima/fastcdr/idl/generator/TypesGenerator.java index d7a742b8..43d8d1b8 100644 --- a/src/java/com/eprosima/fastcdr/idl/generator/TypesGenerator.java +++ b/src/java/com/eprosima/fastcdr/idl/generator/TypesGenerator.java @@ -16,6 +16,7 @@ import com.eprosima.idl.context.Context; import com.eprosima.idl.generator.manager.TemplateManager; +import com.eprosima.idl.parser.tree.AnnotationDeclaration; import com.eprosima.idl.parser.tree.Definition; import com.eprosima.idl.parser.tree.Export; import com.eprosima.idl.parser.tree.Interface; @@ -170,6 +171,27 @@ else if(definition.isIsTypeDeclaration()) } } } + else if(definition.isIsAnnotation()) + { + AnnotationDeclaration annotation = (AnnotationDeclaration)definition; + + // Create StringTemplate of the annotation + StringTemplate ifcst = stg_.getInstanceOf("annotation"); + ifcst.setAttribute("ctx", context); + //ifcst.setAttribute("parent", annotation.getParent()); + ifcst.setAttribute("annotation", annotation); + + StringTemplate extensionst = null; + String extensionname = null; + if(extensions != null && (extensionname = extensions.get("annotation")) != null) + { + extensionst = stg_.getInstanceOf(extensionname); + extensionst.setAttribute("ctx", context); + //extensionst.setAttribute("parent", annotation.getParent()); + extensionst.setAttribute("annotation", annotation); + ifcst.setAttribute("extension", extensionst.toString()); + } + } } } @@ -252,6 +274,18 @@ else if(typedecl.getTypeCode().getKind() == Kind.KIND_BITSET) extensionst.setAttribute("bitset", typedecl.getTypeCode()); } } + else if(typedecl.getTypeCode().getKind() == Kind.KIND_BITMASK) + { + typest = stg_.getInstanceOf("bitmask_type"); + typest.setAttribute("bitmask", typedecl.getTypeCode()); + + // Get extension + if(extensions != null && (extensionname = extensions.get("bitmask_type")) != null) + { + extensionst = stg_.getInstanceOf(extensionname); + extensionst.setAttribute("bitmask", typedecl.getTypeCode()); + } + } if(typest != null) { diff --git a/src/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg b/src/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg index 15944577..25ee320b 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/FastCdrCommon.stg @@ -61,6 +61,10 @@ scdr << $serializeCasting(typecode=object.typecode)$$preffix$$object.name$; $endif$ >> +bitfield_serialization(ctx, object) ::= <<$if(member.name)$ +scdr << static_cast<$member.spec.cppTypename$>($member.name$());$endif$ +>> + object_deserialization(ctx, object, preffix) ::= << $if(object.typecode.isType_f)$ $if(object.typecode.contentTypeCode.isType_c)$ @@ -75,6 +79,12 @@ $if(object.typecode.contentTypeCode.isType_c)$ dcdr \>> seq_length; dcdr.deserializeArray(reinterpret_cast($preffix$$object.name$.data()), seq_length); } +$elseif(object.typecode.contentTypeCode.isBitmaskType)$ +{ + $typecode.contentTypeCode.castingType$ seq_length = 0; + dcdr \>> seq_length; + dcdr.deserializeArray(reinterpret_cast<$typecode.contentTypeCode.castingType$*>($preffix$$object.name$.data()), seq_length); +} $else$ dcdr \>> $preffix$$object.name$; $endif$ @@ -83,6 +93,11 @@ $deserializePossibleEnum(typecode=object.typecode, name=object.name, preffix=pre $endif$ >> +bitfield_deserialization(ctx, object) ::= <<$if(member.name)$$member.spec.cppTypename$ aux_$member.name$; +dcdr \>> aux_$member.name$; +$member.name$(aux_$member.name$);$endif$ +>> + // TODO Todos los tipos. MEJORAR. size of 1 no deberia generar alignment. max_serialized_size(ctx, typecode, var) ::= << $if(typecode.isType_13)$ @@ -332,9 +347,7 @@ $endif$ >> serializeCasting(typecode) ::= << -$if(typecode.isType_c)$ -(uint32_t) -$endif$ +$if(typecode.isType_c)$(uint32_t)$elseif(typecode.isBitmaskType)$($typecode.castingType$)$elseif(typecode.forwarded)$*$endif$ >> deserializePossibleEnum(typecode, name, preffix) ::= << @@ -344,8 +357,14 @@ $if(typecode.isType_c)$ dcdr \>> enum_value; $preffix$$name$ = ($typecode.scopedname$)enum_value; } +$elseif(typecode.isBitmaskType)$ +{ + $typecode.castingType$ bitmask_value = 0; + dcdr \>> bitmask_value; + $preffix$$name$ = ($typecode.scopedname$)bitmask_value; +} $else$ -dcdr \>> $preffix$$name$; +dcdr \>> $if(typecode.forwarded)$*$endif$$preffix$$name$; $endif$ >> diff --git a/src/java/com/eprosima/fastcdr/idl/templates/JavaType.stg b/src/java/com/eprosima/fastcdr/idl/templates/JavaType.stg index f7c80cc1..1e1b12e5 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/JavaType.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/JavaType.stg @@ -228,3 +228,5 @@ public class $enum.name$ $extension$ } >> + +bitmask_type(ctx, parent, bitmask, extension) ::= <<>> \ No newline at end of file diff --git a/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectHeader.stg b/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectHeader.stg index 9fa312a8..ad2f782a 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectHeader.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectHeader.stg @@ -74,6 +74,14 @@ eProsima_user_DllExport const TypeObject* GetComplete$enum.name$Object(); >> +bitmask_type(ctx, parent, bitmask) ::= << +eProsima_user_DllExport const TypeIdentifier* Get$bitmask.name$Identifier(bool complete = false); +eProsima_user_DllExport const TypeObject* Get$bitmask.name$Object(bool complete = false); +eProsima_user_DllExport const TypeObject* GetMinimal$bitmask.name$Object(); +eProsima_user_DllExport const TypeObject* GetComplete$bitmask.name$Object(); + +>> + struct_type(ctx, parent, struct, extensions) ::= << eProsima_user_DllExport const TypeIdentifier* Get$struct.name$Identifier(bool complete = false); eProsima_user_DllExport const TypeObject* Get$struct.name$Object(bool complete = false); @@ -89,4 +97,38 @@ eProsima_user_DllExport const TypeObject* GetMinimal$union.name$Object(); eProsima_user_DllExport const TypeObject* GetComplete$union.name$Object(); >> + +bitset_type(ctx, parent, bitset, extensions) ::= << +eProsima_user_DllExport const TypeIdentifier* Get$bitset.name$Identifier(bool complete = false); +eProsima_user_DllExport const TypeObject* Get$bitset.name$Object(bool complete = false); +eProsima_user_DllExport const TypeObject* GetMinimal$bitset.name$Object(); +eProsima_user_DllExport const TypeObject* GetComplete$bitset.name$Object(); + +>> + +annotation(ctx, annotation) ::= << +eProsima_user_DllExport const TypeIdentifier* Get$annotation.name$Identifier(bool complete = false); +eProsima_user_DllExport const TypeObject* Get$annotation.name$Object(bool complete = false); +eProsima_user_DllExport const TypeObject* GetMinimal$annotation.name$Object(); +eProsima_user_DllExport const TypeObject* GetComplete$annotation.name$Object(); + +namespace $annotation.name$ +{ +$annotation.enums : {$enum_type(ctx=ctx, parent=annotation, enum=it)$}; separator="\n"$ + +$annotation.typeDefs : {$typedef_decl(ctx=ctx, parent=annotation, typedefs=it)$}; separator="\n"$ +} + +>> + +module(ctx, parent, module, definition_list) ::= << +$definition_list$ +>> + +definition_list(definitions) ::= << +$definitions; separator="\n"$ +>> + +const_decl(ctx, parent, const) ::= <<>> + /***** Utils *****/ \ No newline at end of file diff --git a/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectSource.stg b/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectSource.stg index 0f61a997..91061700 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectSource.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/TypeObjectSource.stg @@ -1,4 +1,4 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ namespace { char dummy; } #include #include #include +#include #include $if(ctx.cdr)$ #include @@ -44,7 +45,7 @@ using namespace eprosima::fastrtps::rtps; void register$ctx.filename$Types() { - TypeObjectFactory *factory = TypeObjectFactory::GetInstance(); + TypeObjectFactory *factory = TypeObjectFactory::get_instance(); $ctx.definitions: { def | $register_type(ctx=ctx, object=def, param="type_name")$}; separator="\n"$ } @@ -60,13 +61,39 @@ try_object(ctx, object, param) ::= << if ($param$ == "$object.name$") { Get$object.name$Identifier(complete); - return TypeObjectFactory::GetInstance()->GetTypeObject("$object.name$", complete); + return TypeObjectFactory::get_instance()->get_type_object("$object.name$", complete); } >> register_type(ctx, object, param) ::= << -factory->AddTypeObject("$object.name$", Get$object.name$Identifier(true), Get$object.name$Object(true)); -factory->AddTypeObject("$object.name$", Get$object.name$Identifier(false), Get$object.name$Object(false)); +$if(!object.isModule)$ +factory->add_type_object("$object.name$", Get$object.name$Identifier(true), Get$object.name$Object(true)); +factory->add_type_object("$object.name$", Get$object.name$Identifier(false), Get$object.name$Object(false)); +$if(object.isAnnotation)$ +{ + using namespace $object.name$; + $register_annotation_types(object)$ +} +$endif$ +$endif$ +>> + +register_annotation_types(annotation) ::= << + +$annotation.enums : {$register_annotation_enum(it)$}; separator="\n"$ + +$annotation.typeDefs : {$register_annotation_typedef(it)$}; separator="\n"$ + +>> + +register_annotation_enum(enum) ::= << +factory->add_type_object("$enum.name$", Get$enum.name$Identifier(true), Get$enum.name$Object(true)); +factory->add_type_object("$enum.name$", Get$enum.name$Identifier(false), Get$enum.name$Object(false)); +>> + +register_annotation_typedef(typedef) ::= << +factory->add_type_object("$typedef.name$", Get$typedef.name$Identifier(true), Get$typedef.name$Object(true)); +factory->add_type_object("$typedef.name$", Get$typedef.name$Identifier(false), Get$typedef.name$Object(false)); >> module(ctx, parent, module, definition_list) ::= << @@ -77,7 +104,175 @@ definition_list(definitions) ::= << $definitions; separator="\n"$ >> -annotation(ctx, annotation) ::= <<>> +annotation(ctx, annotation) ::= << +const TypeIdentifier* Get$annotation.name$Identifier(bool complete) +{ + const TypeIdentifier* c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$annotation.name$", complete); + if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) + { + return c_identifier; + } + + Get$annotation.name$Object(complete); // Generated inside + return TypeObjectFactory::get_instance()->get_type_identifier("$annotation.name$", complete); +} + +const TypeObject* Get$annotation.name$Object(bool complete) +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$annotation.name$", complete); + if (c_type_object != nullptr) + { + return c_type_object; + } + else if (complete) + { + return GetComplete$annotation.name$Object(); + } + // else + return GetMinimal$annotation.name$Object(); +} + +const TypeObject* GetMinimal$annotation.name$Object() +{ + using namespace $annotation.name$; + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$annotation.name$", false); + if (c_type_object != nullptr) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_MINIMAL); + type_object->minimal()._d(TK_ANNOTATION); + + $annotation.members:{ member | $minimal_annotation_member(ctx=ctx, object=member)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_MINIMAL); + + SerializedPayload_t payload(static_cast( + MinimalAnnotationType::getCdrSerializedSize(type_object->minimal().annotation_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$annotation.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$annotation.name$", false); +} + +const TypeObject* GetComplete$annotation.name$Object() +{ + using namespace $annotation.name$; + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$annotation.name$", true); + if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_COMPLETE); + type_object->complete()._d(TK_ANNOTATION); + + // No flags apply + //type_object->complete().annotation_type().annotation_flags().IS_FINAL(false); + //type_object->complete().annotation_type().annotation_flags().IS_APPENDABLE(false); + //type_object->complete().annotation_type().annotation_flags().IS_MUTABLE(false); + //type_object->complete().annotation_type().annotation_flags().IS_NESTED(false); + //type_object->complete().annotation_type().annotation_flags().IS_AUTOID_HASH(false); + + type_object->complete().annotation_type().header().annotation_name("$annotation.name$"); + + $annotation.members:{ member | $complete_annotation_member(ctx=ctx, object=member)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_COMPLETE); + + SerializedPayload_t payload(static_cast( + CompleteAnnotationType::getCdrSerializedSize(type_object->complete().annotation_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$annotation.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$annotation.name$", true); +} + +namespace $annotation.name$ +{ +$annotation.enums : {$enum_type(ctx=ctx, parent=annotation, enum=it)$}; separator="\n"$ + +$annotation.typeDefs : {$typedef_decl(ctx=ctx, parent=annotation, typedefs=it)$}; separator="\n"$ + +} // $annotation.name$ namespace +>> + +minimal_annotation_member(ctx, object) ::= << +MinimalAnnotationParameter mam_$object.name$; +TypeIdentifier* mam_$object.name$_typeId = $get_type_identifier(ctx=ctx, type=object.typecode, ek="false")$; +if (mam_$object.name$_typeId != nullptr) +{ + mam_$object.name$.common().member_type_id(*mam_$object.name$_typeId); +} +mam_$object.name$.name("$object.name$"); + +$if(object.value)$ +AnnotationParameterValue def_value_$object.name$; +def_value_$object.name$._d(mam_$object.name$.common().member_type_id()._d()); +def_value_$object.name$.from_string("$object.value$"); +mam_$object.name$.default_value(def_value_$object.name$); +$endif$ + +type_object->minimal().annotation_type().member_seq().emplace_back(mam_$object.name$); + +>> + +complete_annotation_member(ctx, object) ::= << +CompleteAnnotationParameter cam_$object.name$; +TypeIdentifier* cam_$object.name$_typeId = $get_type_identifier(ctx=ctx, type=object.typecode, ek="true")$; +if (mam_$object.name$_typeId != nullptr) +{ + cam_$object.name$.common().member_type_id(*cam_$object.name$_typeId); +} +cam_$object.name$.name("$object.name$"); + +$if(object.value)$ +AnnotationParameterValue def_value_$object.name$; +def_value_$object.name$._d(cam_$object.name$.common().member_type_id()._d()); +def_value_$object.name$.from_string("$object.value$"); +cam_$object.name$.default_value(def_value_$object.name$); +$endif$ + +type_object->complete().annotation_type().member_seq().emplace_back(cam_$object.name$); + +>> interface(ctx, parent, interface, export_list) ::= <<>> @@ -88,19 +283,19 @@ const_decl(ctx, parent, const) ::= <<>> typedef_decl(ctx, parent, typedefs) ::= << const TypeIdentifier* Get$typedefs.name$Identifier(bool complete) { - const TypeIdentifier* c_identifier = TypeObjectFactory::GetInstance()->GetTypeIdentifier("$typedefs.name$", complete); + const TypeIdentifier* c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$typedefs.name$", complete); if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) { return c_identifier; } Get$typedefs.name$Object(complete); // Generated inside - return TypeObjectFactory::GetInstance()->GetTypeIdentifier("$typedefs.name$", complete); + return TypeObjectFactory::get_instance()->get_type_identifier("$typedefs.name$", complete); } const TypeObject* Get$typedefs.name$Object(bool complete) { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$typedefs.name$", complete); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$typedefs.name$", complete); if (c_type_object != nullptr) { return c_type_object; @@ -117,7 +312,7 @@ const TypeObject* Get$typedefs.name$Object(bool complete) const TypeObject* GetMinimal$typedefs.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$typedefs.name$", false); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$typedefs.name$", false); if (c_type_object != nullptr) { return c_type_object; @@ -126,24 +321,27 @@ const TypeObject* GetMinimal$typedefs.name$Object() TypeObject *type_object = new TypeObject(); type_object->_d(EK_MINIMAL); type_object->minimal()._d(TK_ALIAS); - type_object->minimal().alias_type().alias_flags().IS_FINAL(false); - type_object->minimal().alias_type().alias_flags().IS_APPENDABLE(false); - type_object->minimal().alias_type().alias_flags().IS_MUTABLE(false); - type_object->minimal().alias_type().alias_flags().IS_NESTED(false); - type_object->minimal().alias_type().alias_flags().IS_AUTOID_HASH(false); + + // No flags apply + //type_object->minimal().alias_type().alias_flags().IS_FINAL(false); + //type_object->minimal().alias_type().alias_flags().IS_APPENDABLE(false); + //type_object->minimal().alias_type().alias_flags().IS_MUTABLE(false); + //type_object->minimal().alias_type().alias_flags().IS_NESTED(false); + //type_object->minimal().alias_type().alias_flags().IS_AUTOID_HASH(false); // type_object->minimal().alias_type().header()... Is empty - type_object->minimal().alias_type().body().common().related_flags().TRY_CONSTRUCT1(false); - type_object->minimal().alias_type().body().common().related_flags().TRY_CONSTRUCT2(false); - type_object->minimal().alias_type().body().common().related_flags().IS_EXTERNAL(false); - type_object->minimal().alias_type().body().common().related_flags().IS_OPTIONAL(false); - type_object->minimal().alias_type().body().common().related_flags().IS_MUST_UNDERSTAND(false); - type_object->minimal().alias_type().body().common().related_flags().IS_KEY(false); - type_object->minimal().alias_type().body().common().related_flags().IS_DEFAULT(false); + // No flags apply + //type_object->minimal().alias_type().body().common().related_flags().TRY_CONSTRUCT1(false); + //type_object->minimal().alias_type().body().common().related_flags().TRY_CONSTRUCT2(false); + //type_object->minimal().alias_type().body().common().related_flags().IS_EXTERNAL(false); + //type_object->minimal().alias_type().body().common().related_flags().IS_OPTIONAL(false); + //type_object->minimal().alias_type().body().common().related_flags().IS_MUST_UNDERSTAND(false); + //type_object->minimal().alias_type().body().common().related_flags().IS_KEY(false); + //type_object->minimal().alias_type().body().common().related_flags().IS_DEFAULT(false); // Must be defined already, if don't, may be an recursive alias - const TypeIdentifier *relatedType = TypeObjectFactory::GetInstance()->GetTypeIdentifier($get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$, false); + const TypeIdentifier *relatedType = TypeObjectFactory::get_instance()->get_type_identifier($get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$, false); if (relatedType != nullptr) @@ -180,16 +378,16 @@ const TypeObject* GetMinimal$typedefs.name$Object() } // Don't add our TypeIdentifier but our alias - TypeObjectFactory::GetInstance()->AddAlias("$typedefs.name$", $get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); + TypeObjectFactory::get_instance()->add_alias("$typedefs.name$", $get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); - TypeObjectFactory::GetInstance()->AddTypeObject("$typedefs.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$typedefs.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$typedefs.name$", false); + return TypeObjectFactory::get_instance()->get_type_object("$typedefs.name$", false); } const TypeObject* GetComplete$typedefs.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$typedefs.name$", true); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$typedefs.name$", true); if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) { return c_type_object; @@ -198,11 +396,13 @@ const TypeObject* GetComplete$typedefs.name$Object() TypeObject *type_object = new TypeObject(); type_object->_d(EK_COMPLETE); type_object->complete()._d(TK_ALIAS); - type_object->complete().alias_type().alias_flags().IS_FINAL(false); - type_object->complete().alias_type().alias_flags().IS_APPENDABLE(false); - type_object->complete().alias_type().alias_flags().IS_MUTABLE(false); - type_object->complete().alias_type().alias_flags().IS_NESTED(false); - type_object->complete().alias_type().alias_flags().IS_AUTOID_HASH(false); + + // No flags apply + //type_object->complete().alias_type().alias_flags().IS_FINAL(false); + //type_object->complete().alias_type().alias_flags().IS_APPENDABLE(false); + //type_object->complete().alias_type().alias_flags().IS_MUTABLE(false); + //type_object->complete().alias_type().alias_flags().IS_NESTED(false); + //type_object->complete().alias_type().alias_flags().IS_AUTOID_HASH(false); //type_object->complete().alias_type().header().detail().ann_builtin().verbatim().placement("placement"); //type_object->complete().alias_type().header().detail().ann_builtin().verbatim().language("language"); @@ -210,19 +410,20 @@ const TypeObject* GetComplete$typedefs.name$Object() //type_object->complete().alias_type().header().detail().ann_custom().push_back(...); type_object->complete().alias_type().header().detail().type_name("$typedefs.name$"); - type_object->complete().alias_type().body().common().related_flags().TRY_CONSTRUCT1(false); - type_object->complete().alias_type().body().common().related_flags().TRY_CONSTRUCT2(false); - type_object->complete().alias_type().body().common().related_flags().IS_EXTERNAL(false); - type_object->complete().alias_type().body().common().related_flags().IS_OPTIONAL(false); - type_object->complete().alias_type().body().common().related_flags().IS_MUST_UNDERSTAND(false); - type_object->complete().alias_type().body().common().related_flags().IS_KEY(false); - type_object->complete().alias_type().body().common().related_flags().IS_DEFAULT(false); + // No flags apply + //type_object->complete().alias_type().body().common().related_flags().TRY_CONSTRUCT1(false); + //type_object->complete().alias_type().body().common().related_flags().TRY_CONSTRUCT2(false); + //type_object->complete().alias_type().body().common().related_flags().IS_EXTERNAL(false); + //type_object->complete().alias_type().body().common().related_flags().IS_OPTIONAL(false); + //type_object->complete().alias_type().body().common().related_flags().IS_MUST_UNDERSTAND(false); + //type_object->complete().alias_type().body().common().related_flags().IS_KEY(false); + //type_object->complete().alias_type().body().common().related_flags().IS_DEFAULT(false); //type_object->complete().alias_type().body().common().ann_builtin() //type_object->complete().alias_type().body().common().ann_custom() // Must be defined already, if don't, may be an recursive alias - const TypeIdentifier *relatedType = TypeObjectFactory::GetInstance()->GetTypeIdentifierTryingComplete($get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); + const TypeIdentifier *relatedType = TypeObjectFactory::get_instance()->get_type_identifier_trying_complete($get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); if (relatedType != nullptr) @@ -259,11 +460,11 @@ const TypeObject* GetComplete$typedefs.name$Object() } // Don't add our TypeIdentifier but our alias - TypeObjectFactory::GetInstance()->AddAlias("$typedefs.name$", $get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); + TypeObjectFactory::get_instance()->add_alias("$typedefs.name$", $get_content_type(ctx=ctx, type=typedefs.typedefContentTypeCode)$); - TypeObjectFactory::GetInstance()->AddTypeObject("$typedefs.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$typedefs.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$typedefs.name$", true); + return TypeObjectFactory::get_instance()->get_type_object("$typedefs.name$", true); } >> @@ -271,19 +472,19 @@ const TypeObject* GetComplete$typedefs.name$Object() enum_type(ctx, parent, enum) ::= << const TypeIdentifier* Get$enum.name$Identifier(bool complete) { - const TypeIdentifier* c_identifier = TypeObjectFactory::GetInstance()->GetTypeIdentifier("$enum.name$", complete); + const TypeIdentifier* c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$enum.name$", complete); if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) { return c_identifier; } Get$enum.name$Object(complete); // Generated inside - return TypeObjectFactory::GetInstance()->GetTypeIdentifier("$enum.name$", complete); + return TypeObjectFactory::get_instance()->get_type_identifier("$enum.name$", complete); } const TypeObject* Get$enum.name$Object(bool complete) { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$enum.name$", complete); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$enum.name$", complete); if (c_type_object != nullptr) { return c_type_object; @@ -298,7 +499,7 @@ const TypeObject* Get$enum.name$Object(bool complete) const TypeObject* GetMinimal$enum.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$enum.name$", false); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$enum.name$", false); if (c_type_object != nullptr) { return c_type_object; @@ -307,7 +508,8 @@ const TypeObject* GetMinimal$enum.name$Object() TypeObject *type_object = new TypeObject(); type_object->_d(EK_MINIMAL); type_object->minimal()._d(TK_ENUM); - // Unused + + // No flags apply //type_object->minimal().enumerated_type().enum_flags().IS_FINAL(false); //type_object->minimal().enumerated_type().enum_flags().IS_APPENDABLE(false); //type_object->minimal().enumerated_type().enum_flags().IS_MUTABLE(false); @@ -341,14 +543,14 @@ const TypeObject* GetMinimal$enum.name$Object() identifier.equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$enum.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$enum.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$enum.name$", false); + return TypeObjectFactory::get_instance()->get_type_object("$enum.name$", false); } const TypeObject* GetComplete$enum.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$enum.name$", true); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$enum.name$", true); if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) { return c_type_object; @@ -358,17 +560,44 @@ const TypeObject* GetComplete$enum.name$Object() type_object->_d(EK_COMPLETE); type_object->complete()._d(TK_ENUM); - type_object->complete().enumerated_type().enum_flags().IS_FINAL(false); - type_object->complete().enumerated_type().enum_flags().IS_APPENDABLE(false); - type_object->complete().enumerated_type().enum_flags().IS_MUTABLE(false); - type_object->complete().enumerated_type().enum_flags().IS_NESTED(false); - type_object->complete().enumerated_type().enum_flags().IS_AUTOID_HASH(false); + // No flags apply + //type_object->complete().enumerated_type().enum_flags().IS_FINAL(false); + //type_object->complete().enumerated_type().enum_flags().IS_APPENDABLE(false); + //type_object->complete().enumerated_type().enum_flags().IS_MUTABLE(false); + //type_object->complete().enumerated_type().enum_flags().IS_NESTED(false); + //type_object->complete().enumerated_type().enum_flags().IS_AUTOID_HASH(false); type_object->complete().enumerated_type().header().common().bit_bound(32); // TODO fixed by IDL, isn't? - //type_object->complete().enumerated_type().header().detail().ann_builtin()... - //type_object->complete().enumerated_type().header().detail().ann_custom()... type_object->complete().enumerated_type().header().detail().type_name("$enum.name$"); + $if(enum.annotationList)$ + $enum.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().enumerated_type().header().detail().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ + uint32_t value = 0; $enum.members:{ member | $complete_enumerated_literal(ctx=ctx, object=member)$}; separator="\n"$ @@ -394,23 +623,22 @@ const TypeObject* GetComplete$enum.name$Object() identifier.equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$enum.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$enum.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$enum.name$", true); + return TypeObjectFactory::get_instance()->get_type_object("$enum.name$", true); } >> minimal_enumerated_literal(ctx, object) ::= << MinimalEnumeratedLiteral mel_$object.name$; -mel_$object.name$.common().flags().TRY_CONSTRUCT1(false); -mel_$object.name$.common().flags().TRY_CONSTRUCT2(false); -mel_$object.name$.common().flags().IS_EXTERNAL(false); -mel_$object.name$.common().flags().IS_OPTIONAL(false); -mel_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); -mel_$object.name$.common().flags().IS_KEY(false); -mel_$object.name$.common().flags().IS_DEFAULT(false); -mel_$object.name$.common().flags().IS_DEFAULT(false); +mel_$object.name$.common().flags().TRY_CONSTRUCT1(false); // Doesn't apply +mel_$object.name$.common().flags().TRY_CONSTRUCT2(false); // Doesn't apply +mel_$object.name$.common().flags().IS_EXTERNAL(false); // Doesn't apply +mel_$object.name$.common().flags().IS_OPTIONAL(false); // Doesn't apply +mel_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); // Doesn't apply +mel_$object.name$.common().flags().IS_KEY(false); // Doesn't apply +mel_$object.name$.common().flags().IS_DEFAULT($object.annotationDefaultLiteral$); mel_$object.name$.common().value(value++); MD5 $object.name$_hash("$object.name$"); for(int i = 0; i < 4; ++i) @@ -423,18 +651,44 @@ type_object->minimal().enumerated_type().literal_seq().emplace_back(mel_$object. complete_enumerated_literal(ctx, object) ::= << CompleteEnumeratedLiteral cel_$object.name$; -cel_$object.name$.common().flags().TRY_CONSTRUCT1(false); -cel_$object.name$.common().flags().TRY_CONSTRUCT2(false); -cel_$object.name$.common().flags().IS_EXTERNAL(false); -cel_$object.name$.common().flags().IS_OPTIONAL(false); -cel_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); -cel_$object.name$.common().flags().IS_KEY(false); -cel_$object.name$.common().flags().IS_DEFAULT(false); -cel_$object.name$.common().flags().IS_DEFAULT(false); +cel_$object.name$.common().flags().TRY_CONSTRUCT1(false); // Doesn't apply +cel_$object.name$.common().flags().TRY_CONSTRUCT2(false); // Doesn't apply +cel_$object.name$.common().flags().IS_EXTERNAL(false); // Doesn't apply +cel_$object.name$.common().flags().IS_OPTIONAL(false); // Doesn't apply +cel_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); // Doesn't apply +cel_$object.name$.common().flags().IS_KEY(false); // Doesn't apply +cel_$object.name$.common().flags().IS_DEFAULT($object.annotationDefaultLiteral$); cel_$object.name$.common().value(value++); cel_$object.name$.detail().name("$object.name$"); -//cel_$object.name$.detail().ann_builtin()... -//cel_$object.name$.detail().ann_custom()... + +$if(object.annotationList)$ +$object.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | + { + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + } + };separator="\n"$ + $endif$ + cel_$object.name$.detail().ann_custom().push_back(ann); +} +}; separator="\n"$ +$endif$ + type_object->complete().enumerated_type().literal_seq().emplace_back(cel_$object.name$); >> @@ -442,19 +696,19 @@ type_object->complete().enumerated_type().literal_seq().emplace_back(cel_$object struct_type(ctx, parent, struct, extensions) ::= << const TypeIdentifier* Get$struct.name$Identifier(bool complete) { - const TypeIdentifier * c_identifier = TypeObjectFactory::GetInstance()->GetTypeIdentifier("$struct.name$", complete); + const TypeIdentifier * c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$struct.name$", complete); if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) { return c_identifier; } Get$struct.name$Object(complete); // Generated inside - return TypeObjectFactory::GetInstance()->GetTypeIdentifier("$struct.name$", complete); + return TypeObjectFactory::get_instance()->get_type_identifier("$struct.name$", complete); } const TypeObject* Get$struct.name$Object(bool complete) { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$struct.name$", complete); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$struct.name$", complete); if (c_type_object != nullptr) { return c_type_object; @@ -469,7 +723,7 @@ const TypeObject* Get$struct.name$Object(bool complete) const TypeObject* GetMinimal$struct.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$struct.name$", false); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$struct.name$", false); if (c_type_object != nullptr) { return c_type_object; @@ -479,11 +733,11 @@ const TypeObject* GetMinimal$struct.name$Object() type_object->_d(EK_MINIMAL); type_object->minimal()._d(TK_STRUCTURE); - type_object->minimal().struct_type().struct_flags().IS_FINAL(false); - type_object->minimal().struct_type().struct_flags().IS_APPENDABLE(false); - type_object->minimal().struct_type().struct_flags().IS_MUTABLE(false); - type_object->minimal().struct_type().struct_flags().IS_NESTED(false); - type_object->minimal().struct_type().struct_flags().IS_AUTOID_HASH(false); + type_object->minimal().struct_type().struct_flags().IS_FINAL($struct.annotationFinal$); + type_object->minimal().struct_type().struct_flags().IS_APPENDABLE($struct.annotationAppendable$); + type_object->minimal().struct_type().struct_flags().IS_MUTABLE($struct.annotationMutable$); + type_object->minimal().struct_type().struct_flags().IS_NESTED($struct.annotationNested$); + type_object->minimal().struct_type().struct_flags().IS_AUTOID_HASH(false); // Unsupported MemberId memberId = 0; $struct.members:{ member | $minimal_member_object_type(ctx=ctx, object=member)$}; separator="\n"$ @@ -492,6 +746,7 @@ const TypeObject* GetMinimal$struct.name$Object() // TODO Inheritance //type_object->minimal().struct_type().header().base_type()._d(EK_MINIMAL); //type_object->minimal().struct_type().header().base_type().equivalence_hash()[0..13]; + $struct.inheritances:{$minimal_struct_inheritance(it)$}; separator="\n"$ TypeIdentifier identifier; identifier._d(EK_MINIMAL); @@ -515,14 +770,14 @@ const TypeObject* GetMinimal$struct.name$Object() identifier.equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$struct.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$struct.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$struct.name$", false); + return TypeObjectFactory::get_instance()->get_type_object("$struct.name$", false); } const TypeObject* GetComplete$struct.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$struct.name$", true); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$struct.name$", true); if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) { return c_type_object; @@ -532,22 +787,47 @@ const TypeObject* GetComplete$struct.name$Object() type_object->_d(EK_COMPLETE); type_object->complete()._d(TK_STRUCTURE); - type_object->complete().struct_type().struct_flags().IS_FINAL(false); - type_object->complete().struct_type().struct_flags().IS_APPENDABLE(false); - type_object->complete().struct_type().struct_flags().IS_MUTABLE(false); - type_object->complete().struct_type().struct_flags().IS_NESTED(false); - type_object->complete().struct_type().struct_flags().IS_AUTOID_HASH(false); + type_object->complete().struct_type().struct_flags().IS_FINAL($struct.annotationFinal$); + type_object->complete().struct_type().struct_flags().IS_APPENDABLE($struct.annotationAppendable$); + type_object->complete().struct_type().struct_flags().IS_MUTABLE($struct.annotationMutable$); + type_object->complete().struct_type().struct_flags().IS_NESTED($struct.annotationNested$); + type_object->complete().struct_type().struct_flags().IS_AUTOID_HASH(false); // Unsupported MemberId memberId = 0; $struct.members:{ member | $complete_member_object_type(ctx=ctx, object=member)$}; separator="\n"$ // Header type_object->complete().struct_type().header().detail().type_name("$struct.name$"); - //type_object->complete().struct_type().header().detail().ann_builtin()... - //type_object->complete().struct_type().header().detail().ann_custom()... // TODO inheritance - //type_object->complete().struct_type().header().base_type()._d(EK_COMPLETE); - //type_object->complete().struct_type().header().base_type().equivalence_hash()[0..13]; + $struct.inheritances:{$complete_struct_inheritance(it)$}; separator="\n"$ + + $if(struct.annotationList)$ + $struct.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().struct_type().header().detail().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ TypeIdentifier identifier; identifier._d(EK_COMPLETE); @@ -571,27 +851,35 @@ const TypeObject* GetComplete$struct.name$Object() identifier.equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$struct.name$", &identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$struct.name$", &identifier, type_object); delete type_object; - return TypeObjectFactory::GetInstance()->GetTypeObject("$struct.name$", true); + return TypeObjectFactory::get_instance()->get_type_object("$struct.name$", true); } >> +minimal_struct_inheritance(parent) ::= << +type_object->minimal().struct_type().header().base_type(*Get$parent.name$Identifier(false)); +>> + +complete_struct_inheritance(parent) ::= << +type_object->complete().struct_type().header().base_type(*Get$parent.name$Identifier(true)); +>> + minimal_member_object_type(ctx, object) ::= << MinimalStructMember mst_$object.name$; mst_$object.name$.common().member_id(memberId++); -mst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); -mst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); -mst_$object.name$.common().member_flags().IS_EXTERNAL(false); -mst_$object.name$.common().member_flags().IS_OPTIONAL(false); -mst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); -mst_$object.name$.common().member_flags().IS_KEY(false); -mst_$object.name$.common().member_flags().IS_DEFAULT(false); +mst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); // Unsupported +mst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); // Unsupported +mst_$object.name$.common().member_flags().IS_EXTERNAL(false); // Unsupported +mst_$object.name$.common().member_flags().IS_OPTIONAL($object.annotationOptional$); +mst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND($object.annotationMustUnderstand$); +mst_$object.name$.common().member_flags().IS_KEY($object.annotationKey$); +mst_$object.name$.common().member_flags().IS_DEFAULT(false); // Doesn't apply $if(object.typecode.plainType)$ mst_$object.name$.common().member_type_id(*$get_type_identifier(ctx=ctx, type=object.typecode, ek="false")$); $elseif(object.typecode.objectType)$ -mst_$object.name$.common().member_type_id(*Get$object.typecode.cppTypename$Identifier(false)); +mst_$object.name$.common().member_type_id(*Get$object.typecode.name$Identifier(false)); $else$ { std::string cppType = "$object.typecode.cppTypename$"; @@ -599,7 +887,7 @@ $else$ { cppType = "longdouble"; } - mst_$object.name$.common().member_type_id(*TypeObjectFactory::GetInstance()->GetTypeIdentifier(cppType, false)); + mst_$object.name$.common().member_type_id(*TypeObjectFactory::get_instance()->get_type_identifier(cppType, false)); } $endif$ @@ -616,17 +904,17 @@ type_object->minimal().struct_type().member_seq().emplace_back(mst_$object.name$ complete_member_object_type(ctx, object) ::= << CompleteStructMember cst_$object.name$; cst_$object.name$.common().member_id(memberId++); -cst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); -cst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); -cst_$object.name$.common().member_flags().IS_EXTERNAL(false); -cst_$object.name$.common().member_flags().IS_OPTIONAL(false); -cst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); -cst_$object.name$.common().member_flags().IS_KEY(false); -cst_$object.name$.common().member_flags().IS_DEFAULT(false); +cst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); // Unsupported +cst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); // Unsupported +cst_$object.name$.common().member_flags().IS_EXTERNAL(false); // Unsupported +cst_$object.name$.common().member_flags().IS_OPTIONAL($object.annotationOptional$); +cst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND($object.annotationMustUnderstand$); +cst_$object.name$.common().member_flags().IS_KEY($object.annotationKey$); +cst_$object.name$.common().member_flags().IS_DEFAULT(false); // Doesn't apply $if(object.typecode.plainType)$ cst_$object.name$.common().member_type_id(*$get_type_identifier(ctx=ctx, type=object.typecode, ek="true")$); $elseif(object.typecode.objectType)$ -cst_$object.name$.common().member_type_id(*Get$object.typecode.cppTypename$Identifier(true)); +cst_$object.name$.common().member_type_id(*Get$object.typecode.name$Identifier(true)); $else$ { std::string cppType = "$object.typecode.cppTypename$"; @@ -634,38 +922,65 @@ $else$ { cppType = "longdouble"; } - cst_$object.name$.common().member_type_id(*TypeObjectFactory::GetInstance()->GetTypeIdentifier(cppType, false)); + cst_$object.name$.common().member_type_id(*TypeObjectFactory::get_instance()->get_type_identifier(cppType, false)); } $endif$ cst_$object.name$.detail().name("$object.name$"); -//cst_$object.name$.detail().ann_builtin()... -//cst_$object.name$.detail().ann_custom()... + +$if(object.annotationList)$ +$object.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | + { + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + } + };separator="\n"$ + $endif$ + cst_$object.name$.detail().ann_custom().push_back(ann); +} +}; separator="\n"$ +$endif$ + type_object->complete().struct_type().member_seq().emplace_back(cst_$object.name$); >> -get_type_identifier(ctx, type, ek) ::= <<$if(type.isSequenceType)$TypeObjectFactory::GetInstance()->GetSequenceIdentifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isArrayType)$TypeObjectFactory::GetInstance()->GetArrayIdentifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, {$type.dimensions:{ dim |$dim$}; separator=", "$}, $ek$)$elseif(type.isSetType)$TypeObjectFactory::GetInstance()->GetSequenceIdentifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isMapType)$TypeObjectFactory::GetInstance()->GetMapIdentifier($get_content_type(ctx=ctx, type=type.keyTypeCode)$, $get_content_type(ctx=ctx, type=type.valueTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isStringType)$TypeObjectFactory::GetInstance()->GetStringIdentifier($type.maxsize$, false)$elseif(type.isWStringType)$TypeObjectFactory::GetInstance()->GetStringIdentifier($type.maxsize$, true)$elseif(type.objectType)$Get$type.cppTypename$Identifier($ek$)$elseif(type.plainType)$TypeObjectFactory::GetInstance()->GetTypeIdentifier("$type.cppTypename$", false)$else$TypeObjectFactory::GetInstance()->GetTypeIdentifier("$type.cppTypename$", false)$endif$>> +get_type_identifier(ctx, type, ek) ::= <<$if(type.isSequenceType)$TypeObjectFactory::get_instance()->get_sequence_identifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isArrayType)$TypeObjectFactory::get_instance()->get_array_identifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, {$type.dimensions:{ dim |$dim$}; separator=", "$}, $ek$)$elseif(type.isSetType)$TypeObjectFactory::get_instance()->get_sequence_identifier($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isMapType)$TypeObjectFactory::get_instance()->get_map_identifier($get_content_type(ctx=ctx, type=type.keyTypeCode)$, $get_content_type(ctx=ctx, type=type.valueTypeCode)$, $type.maxsize$, $ek$)$elseif(type.isStringType)$TypeObjectFactory::get_instance()->get_string_identifier($type.maxsize$, false)$elseif(type.isWStringType)$TypeObjectFactory::get_instance()->get_string_identifier($type.maxsize$, true)$elseif(type.objectType)$Get$type.name$Identifier($ek$)$elseif(type.plainType)$TypeObjectFactory::get_instance()->get_type_identifier("$type.cppTypename$", false)$else$TypeObjectFactory::get_instance()->get_type_identifier("$type.cppTypename$", false)$endif$>> -get_content_type(ctx, type) ::= <<$if(type.plainType)$$if(type.isSequenceType)$TypeNamesGenerator::getSequenceTypeName($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$)$elseif(type.isArrayType)$TypeNamesGenerator::getArrayTypeName($get_content_type(ctx=ctx, type=type.contentTypeCode)$, {$type.dimensions:{ dim |$dim$}; separator=", "$})$elseif(type.isSetType)$TypeNamesGenerator::getSequenceTypeName($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$)$elseif(type.isMapType)$TypeNamesGenerator::getMapTypeName($get_content_type(ctx=ctx, type=type.keyTypeCode)$, $get_content_type(ctx=ctx, type=type.valueTypeCode)$, $type.maxsize$)$elseif(type.isStringType)$TypeNamesGenerator::getStringTypeName($type.maxsize$, false)$elseif(type.isWStringType)$TypeNamesGenerator::getStringTypeName($type.maxsize$, true)$else$"$type.cppTypename$"$endif$$else$"$type.cppTypename$"$endif$>> +get_content_type(ctx, type) ::= <<$if(type.plainType)$$if(type.isSequenceType)$TypeNamesGenerator::get_sequence_type_name($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$)$elseif(type.isArrayType)$TypeNamesGenerator::get_array_type_name($get_content_type(ctx=ctx, type=type.contentTypeCode)$, {$type.dimensions:{ dim |$dim$}; separator=", "$})$elseif(type.isSetType)$TypeNamesGenerator::get_sequence_type_name($get_content_type(ctx=ctx, type=type.contentTypeCode)$, $type.maxsize$)$elseif(type.isMapType)$TypeNamesGenerator::get_map_type_name($get_content_type(ctx=ctx, type=type.keyTypeCode)$, $get_content_type(ctx=ctx, type=type.valueTypeCode)$, $type.maxsize$)$elseif(type.isStringType)$TypeNamesGenerator::get_string_type_name($type.maxsize$, false)$elseif(type.isWStringType)$TypeNamesGenerator::get_string_type_name($type.maxsize$, true)$else$"$type.cppTypename$"$endif$$else$"$type.cppTypename$"$endif$>> union_type(ctx, parent, union) ::= << const TypeIdentifier* Get$union.name$Identifier(bool complete) { - const TypeIdentifier * c_identifier = TypeObjectFactory::GetInstance()->GetTypeIdentifier("$union.name$", complete); + const TypeIdentifier * c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$union.name$", complete); if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) { return c_identifier; } Get$union.name$Object(complete); - return TypeObjectFactory::GetInstance()->GetTypeIdentifier("$union.name$", complete); + return TypeObjectFactory::get_instance()->get_type_identifier("$union.name$", complete); } const TypeObject* Get$union.name$Object(bool complete) { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$union.name$", complete); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$union.name$", complete); if (c_type_object != nullptr) { return c_type_object; @@ -680,7 +995,7 @@ const TypeObject* Get$union.name$Object(bool complete) const TypeObject* GetMinimal$union.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$union.name$", false); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$union.name$", false); if (c_type_object != nullptr) { return c_type_object; @@ -690,19 +1005,19 @@ const TypeObject* GetMinimal$union.name$Object() type_object->_d(EK_MINIMAL); type_object->minimal()._d(TK_UNION); - type_object->minimal().union_type().union_flags().IS_FINAL(false); - type_object->minimal().union_type().union_flags().IS_APPENDABLE(false); - type_object->minimal().union_type().union_flags().IS_MUTABLE(false); - type_object->minimal().union_type().union_flags().IS_NESTED(false); - type_object->minimal().union_type().union_flags().IS_AUTOID_HASH(false); + type_object->minimal().union_type().union_flags().IS_FINAL($union.annotationFinal$); + type_object->minimal().union_type().union_flags().IS_APPENDABLE($union.annotationAppendable$); + type_object->minimal().union_type().union_flags().IS_MUTABLE($union.annotationMutable$); + type_object->minimal().union_type().union_flags().IS_NESTED($union.annotationNested$); + type_object->minimal().union_type().union_flags().IS_AUTOID_HASH(false); // Unsupported - type_object->minimal().union_type().discriminator().common().member_flags().TRY_CONSTRUCT1(false); - type_object->minimal().union_type().discriminator().common().member_flags().TRY_CONSTRUCT2(false); - type_object->minimal().union_type().discriminator().common().member_flags().IS_EXTERNAL(false); - type_object->minimal().union_type().discriminator().common().member_flags().IS_OPTIONAL(false); - type_object->minimal().union_type().discriminator().common().member_flags().IS_MUST_UNDERSTAND(false); - type_object->minimal().union_type().discriminator().common().member_flags().IS_KEY(false); - type_object->minimal().union_type().discriminator().common().member_flags().IS_DEFAULT(false); + type_object->minimal().union_type().discriminator().common().member_flags().TRY_CONSTRUCT1(false); // Unsupported + type_object->minimal().union_type().discriminator().common().member_flags().TRY_CONSTRUCT2(false); // Unsupported + type_object->minimal().union_type().discriminator().common().member_flags().IS_EXTERNAL(false); // Doesn't apply + type_object->minimal().union_type().discriminator().common().member_flags().IS_OPTIONAL(false); // Doesn't apply + type_object->minimal().union_type().discriminator().common().member_flags().IS_MUST_UNDERSTAND(false); // Doesn't apply + type_object->minimal().union_type().discriminator().common().member_flags().IS_KEY(false); // Unsupported + type_object->minimal().union_type().discriminator().common().member_flags().IS_DEFAULT(false); // Doesn't apply type_object->minimal().union_type().discriminator().common().type_id(*$get_type_identifier(ctx=ctx, type=union.discriminator, ek="false")$); @@ -734,15 +1049,15 @@ const TypeObject* GetMinimal$union.name$Object() identifier->equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$union.name$", identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$union.name$", identifier, type_object); delete type_object; delete identifier; - return TypeObjectFactory::GetInstance()->GetTypeObject("$union.name$", false); + return TypeObjectFactory::get_instance()->get_type_object("$union.name$", false); } const TypeObject* GetComplete$union.name$Object() { - const TypeObject* c_type_object = TypeObjectFactory::GetInstance()->GetTypeObject("$union.name$", true); + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$union.name$", true); if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) { return c_type_object; @@ -752,32 +1067,83 @@ const TypeObject* GetComplete$union.name$Object() type_object->_d(EK_COMPLETE); type_object->complete()._d(TK_UNION); - type_object->complete().union_type().union_flags().IS_FINAL(false); - type_object->complete().union_type().union_flags().IS_APPENDABLE(false); - type_object->complete().union_type().union_flags().IS_MUTABLE(false); - type_object->complete().union_type().union_flags().IS_NESTED(false); - type_object->complete().union_type().union_flags().IS_AUTOID_HASH(false); - - //type_object->complete().union_type().discriminator().ann_builtin()... - //type_object->complete().union_type().discriminator().ann_custom()... - type_object->complete().union_type().discriminator().common().member_flags().TRY_CONSTRUCT1(false); - type_object->complete().union_type().discriminator().common().member_flags().TRY_CONSTRUCT2(false); - type_object->complete().union_type().discriminator().common().member_flags().IS_EXTERNAL(false); - type_object->complete().union_type().discriminator().common().member_flags().IS_OPTIONAL(false); - type_object->complete().union_type().discriminator().common().member_flags().IS_MUST_UNDERSTAND(false); - type_object->complete().union_type().discriminator().common().member_flags().IS_KEY(false); - type_object->complete().union_type().discriminator().common().member_flags().IS_DEFAULT(false); + type_object->complete().union_type().union_flags().IS_FINAL($union.annotationFinal$); + type_object->complete().union_type().union_flags().IS_APPENDABLE($union.annotationAppendable$); + type_object->complete().union_type().union_flags().IS_MUTABLE($union.annotationMutable$); + type_object->complete().union_type().union_flags().IS_NESTED($union.annotationNested$); + type_object->complete().union_type().union_flags().IS_AUTOID_HASH(false); // Unsupported + + type_object->complete().union_type().discriminator().common().member_flags().TRY_CONSTRUCT1(false); // Unsupported + type_object->complete().union_type().discriminator().common().member_flags().TRY_CONSTRUCT2(false); // Unsupported + type_object->complete().union_type().discriminator().common().member_flags().IS_EXTERNAL(false); // Doesn't apply + type_object->complete().union_type().discriminator().common().member_flags().IS_OPTIONAL(false); // Doesn't apply + type_object->complete().union_type().discriminator().common().member_flags().IS_MUST_UNDERSTAND(false); // Doesn't apply + type_object->complete().union_type().discriminator().common().member_flags().IS_KEY(false); // Unsupported + type_object->complete().union_type().discriminator().common().member_flags().IS_DEFAULT(false); // Doesn't apply type_object->complete().union_type().discriminator().common().type_id(*$get_type_identifier(ctx=ctx, type=union.discriminator, ek="true")$); + $if(union.discriminator.annotationList)$ + $union.discriminator.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().union_type().discriminator().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ + MemberId memberId = 0; $union.members:{ member | $complete_union_member_object_type(ctx=ctx, object=member, discriminator=union.discriminator)$}; separator="\n"$ // Header - //type_object->complete().union_type().header().detail().ann_builtin().. - //type_object->complete().union_type().header().detail().ann_builtin().. type_object->complete().union_type().header().detail().type_name("$union.name$"); + $if(union.annotationList)$ + $union.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().union_type().header().detail().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ TypeIdentifier* identifier = new TypeIdentifier(); identifier->_d(EK_COMPLETE); @@ -801,10 +1167,10 @@ const TypeObject* GetComplete$union.name$Object() identifier->equivalence_hash()[i] = objectHash.digest[i]; } - TypeObjectFactory::GetInstance()->AddTypeObject("$union.name$", identifier, type_object); + TypeObjectFactory::get_instance()->add_type_object("$union.name$", identifier, type_object); delete type_object; delete identifier; - return TypeObjectFactory::GetInstance()->GetTypeObject("$union.name$", true); + return TypeObjectFactory::get_instance()->get_type_object("$union.name$", true); } >> @@ -812,17 +1178,17 @@ const TypeObject* GetComplete$union.name$Object() minimal_union_member_object_type(ctx, object, discriminator) ::= << MinimalUnionMember mst_$object.name$; mst_$object.name$.common().member_id(memberId++); -mst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); -mst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); -mst_$object.name$.common().member_flags().IS_EXTERNAL(false); -mst_$object.name$.common().member_flags().IS_OPTIONAL(false); -mst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); -mst_$object.name$.common().member_flags().IS_KEY(false); -mst_$object.name$.common().member_flags().IS_DEFAULT(false); +mst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); // Unsupported +mst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); // Unsupported +mst_$object.name$.common().member_flags().IS_EXTERNAL(false); // Unsupported +mst_$object.name$.common().member_flags().IS_OPTIONAL(false); // Doesn't apply +mst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); // Doesn't apply +mst_$object.name$.common().member_flags().IS_KEY(false); // Doesn't apply +mst_$object.name$.common().member_flags().IS_DEFAULT($object.annotationDefault$); $if(object.typecode.plainType)$ mst_$object.name$.common().type_id(*$get_type_identifier(ctx=ctx, type=object.typecode, ek="false")$); $elseif(object.typecode.objectType)$ -mst_$object.name$.common().type_id(*Get$object.typecode.cppTypename$Identifier(false)); +mst_$object.name$.common().type_id(*Get$object.typecode.name$Identifier(false)); $else$ { std::string cppType = "$object.typecode.cppTypename$"; @@ -830,7 +1196,7 @@ $else$ { cppType = "longdouble"; } - mst_$object.name$.common().type_id(*TypeObjectFactory::GetInstance()->GetTypeIdentifier(cppType, false)); + mst_$object.name$.common().type_id(*TypeObjectFactory::get_instance()->get_type_identifier(cppType, false)); } $endif$ @@ -851,17 +1217,17 @@ type_object->minimal().union_type().member_seq().emplace_back(mst_$object.name$) complete_union_member_object_type(ctx, object, discriminator) ::= << CompleteUnionMember cst_$object.name$; cst_$object.name$.common().member_id(memberId++); -cst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); -cst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); -cst_$object.name$.common().member_flags().IS_EXTERNAL(false); -cst_$object.name$.common().member_flags().IS_OPTIONAL(false); -cst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); -cst_$object.name$.common().member_flags().IS_KEY(false); -cst_$object.name$.common().member_flags().IS_DEFAULT(false); +cst_$object.name$.common().member_flags().TRY_CONSTRUCT1(false); // Unsupported +cst_$object.name$.common().member_flags().TRY_CONSTRUCT2(false); // Unsupported +cst_$object.name$.common().member_flags().IS_EXTERNAL(false); // Unsupported +cst_$object.name$.common().member_flags().IS_OPTIONAL(false); // Doesn't apply +cst_$object.name$.common().member_flags().IS_MUST_UNDERSTAND(false); // Doesn't apply +cst_$object.name$.common().member_flags().IS_KEY(false); // Doesn't apply +cst_$object.name$.common().member_flags().IS_DEFAULT($object.annotationDefault$); $if(object.typecode.plainType)$ cst_$object.name$.common().type_id(*$get_type_identifier(ctx=ctx, type=object.typecode, ek="false")$); $elseif(object.typecode.objectType)$ -cst_$object.name$.common().type_id(*Get$object.typecode.cppTypename$Identifier(true)); +cst_$object.name$.common().type_id(*Get$object.typecode.name$Identifier(true)); $else$ { std::string cppType = "$object.typecode.cppTypename$"; @@ -869,22 +1235,560 @@ $else$ { cppType = "longdouble"; } - cst_$object.name$.common().type_id(*TypeObjectFactory::GetInstance()->GetTypeIdentifier(cppType, false)); + cst_$object.name$.common().type_id(*TypeObjectFactory::get_instance()->get_type_identifier(cppType, false)); } $endif$ - $if(object.labels)$ $object.labels:{ label | cst_$object.name$.common().label_seq().emplace_back($label$);}; separator="\n"$ $endif$ cst_$object.name$.detail().name("$object.name$"); -//cst_$object.name$.detail().ann_builtin()... -//cst_$object.name$.detail().ann_custom()... + +$if(object.annotationList)$ +$object.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | + { + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + } + };separator="\n"$ + $endif$ + cst_$object.name$.detail().ann_custom().push_back(ann); +} +}; separator="\n"$ +$endif$ type_object->complete().union_type().member_seq().emplace_back(cst_$object.name$); >> +bitmask_type(ctx, parent, bitmask) ::= << +const TypeIdentifier* Get$bitmask.name$Identifier(bool complete) +{ + const TypeIdentifier* c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$bitmask.name$", complete); + if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) + { + return c_identifier; + } + + Get$bitmask.name$Object(complete); // Generated inside + return TypeObjectFactory::get_instance()->get_type_identifier("$bitmask.name$", complete); +} + +const TypeObject* Get$bitmask.name$Object(bool complete) +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitmask.name$", complete); + if (c_type_object != nullptr) + { + return c_type_object; + } + else if (complete) + { + return GetComplete$bitmask.name$Object(); + } + // else + return GetMinimal$bitmask.name$Object(); +} + +const TypeObject* GetMinimal$bitmask.name$Object() +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitmask.name$", false); + if (c_type_object != nullptr) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_MINIMAL); + type_object->minimal()._d(TK_BITMASK); + + type_object->minimal().bitmask_type().header().common().bit_bound($bitmask.bitBound$); + + $bitmask.bitmasks:{ member | $minimal_bitmask_flag(ctx=ctx, object=member)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_MINIMAL); + + SerializedPayload_t payload(static_cast( + MinimalBitmaskType::getCdrSerializedSize(type_object->minimal().bitmask_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$bitmask.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$bitmask.name$", false); +} + +const TypeObject* GetComplete$bitmask.name$Object() +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitmask.name$", true); + if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_COMPLETE); + type_object->complete()._d(TK_BITMASK); + + // No flags apply + //type_object->complete().bitmask_type().bitmask_flags().IS_FINAL(false); + //type_object->complete().bitmask_type().bitmask_flags().IS_APPENDABLE(false); + //type_object->complete().bitmask_type().bitmask_flags().IS_MUTABLE(false); + //type_object->complete().bitmask_type().bitmask_flags().IS_NESTED(false); + //type_object->complete().bitmask_type().bitmask_flags().IS_AUTOID_HASH(false); + + type_object->complete().bitmask_type().header().common().bit_bound($bitmask.bitBound$); + + $if(union.annotationList)$ + $union.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().bitmask_type().header().detail().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ + + type_object->complete().bitmask_type().header().detail().type_name("$bitmask.name$"); + + $bitmask.members:{ member | $complete_bitmask_flag(ctx=ctx, object=member)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_COMPLETE); + + SerializedPayload_t payload(static_cast( + CompleteBitmaskType::getCdrSerializedSize(type_object->complete().bitmask_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$bitmask.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$bitmask.name$", true); +} + +>> + +minimal_bitmask_flag(ctx, object) ::= << +MinimalBitflag mbf_$object.name$; +mbf_$object.name$.common().flags().TRY_CONSTRUCT1(false); +mbf_$object.name$.common().flags().TRY_CONSTRUCT2(false); +mbf_$object.name$.common().flags().IS_EXTERNAL(false); +mbf_$object.name$.common().flags().IS_OPTIONAL(false); +mbf_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); +mbf_$object.name$.common().flags().IS_KEY(false); +mbf_$object.name$.common().flags().IS_DEFAULT(false); +mbf_$object.name$.common().position($object.position$); +MD5 $object.name$_hash("$object.name$"); +for(int i = 0; i < 4; ++i) +{ + mbf_$object.name$.detail().name_hash()[i] = $object.name$_hash.digest[i]; +} +type_object->minimal().bitmask_type().flag_seq().emplace_back(mbf_$object.name$); + +>> + +complete_bitmask_flag(ctx, object) ::= << +CompleteBitflag cbf_$object.name$; +cbf_$object.name$.common().flags().TRY_CONSTRUCT1(false); +cbf_$object.name$.common().flags().TRY_CONSTRUCT2(false); +cbf_$object.name$.common().flags().IS_EXTERNAL(false); +cbf_$object.name$.common().flags().IS_OPTIONAL(false); +cbf_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); +cbf_$object.name$.common().flags().IS_KEY(false); +cbf_$object.name$.common().flags().IS_DEFAULT(false); +cbf_$object.name$.common().position($object.position$); +cbf_$object.name$.detail().name("$object.name$"); + +// Position annotation always present +{ + AppliedAnnotation ann; + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("position")); + AppliedAnnotationParameter annParam; + MD5 message_hash("value"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d(TK_UINT16); + paramValue.uint_16_value($object.position$); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + + cbf_$object.name$.detail().ann_custom().push_back(ann); +} + +$if(object.annotationList)$ +$object.annotationList:{ ann | +{ + if (std::strcmp("position", "$ann.name$") != 0) + { + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | + { + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + } + };separator="\n"$ + $endif$ + cbf_$object.name$.detail().ann_custom().push_back(ann); + } +} +}; separator="\n"$ +$endif$ + +type_object->complete().bitmask_type().flag_seq().emplace_back(cbf_$object.name$); + +>> + +bitset_type(ctx, parent, bitset, extensions) ::= << +const TypeIdentifier* Get$bitset.name$Identifier(bool complete) +{ + const TypeIdentifier* c_identifier = TypeObjectFactory::get_instance()->get_type_identifier("$bitset.name$", complete); + if (c_identifier != nullptr && (!complete || c_identifier->_d() == EK_COMPLETE)) + { + return c_identifier; + } + + Get$bitset.name$Object(complete); // Generated inside + return TypeObjectFactory::get_instance()->get_type_identifier("$bitset.name$", complete); +} + +const TypeObject* Get$bitset.name$Object(bool complete) +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitset.name$", complete); + if (c_type_object != nullptr) + { + return c_type_object; + } + else if (complete) + { + return GetComplete$bitset.name$Object(); + } + // else + return GetMinimal$bitset.name$Object(); +} + +const TypeObject* GetMinimal$bitset.name$Object() +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitset.name$", false); + if (c_type_object != nullptr) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_MINIMAL); + type_object->minimal()._d(TK_BITSET); + + $bitset.bitfields:{ member | $minimal_bitfield(ctx=ctx, object=member)$}; separator="\n"$ + + $bitset.parents:{$minimal_bitset_inheritance(it)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_MINIMAL); + + SerializedPayload_t payload(static_cast( + MinimalBitsetType::getCdrSerializedSize(type_object->minimal().bitset_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$bitset.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$bitset.name$", false); +} + +const TypeObject* GetComplete$bitset.name$Object() +{ + const TypeObject* c_type_object = TypeObjectFactory::get_instance()->get_type_object("$bitset.name$", true); + if (c_type_object != nullptr && c_type_object->_d() == EK_COMPLETE) + { + return c_type_object; + } + + TypeObject *type_object = new TypeObject(); + type_object->_d(EK_COMPLETE); + type_object->complete()._d(TK_BITSET); + + // No flags apply + //type_object->complete().bitset_type().bitset_flags().IS_FINAL(false); + //type_object->complete().bitset_type().bitset_flags().IS_APPENDABLE(false); + //type_object->complete().bitset_type().bitset_flags().IS_MUTABLE(false); + //type_object->complete().bitset_type().bitset_flags().IS_NESTED(false); + //type_object->complete().bitset_type().bitset_flags().IS_AUTOID_HASH(false); + + $if(union.annotationList)$ + $union.annotationList:{ ann | +{ + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | +{ + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); +} + };separator="\n"$ + $endif$ + type_object->complete().bitset_type().header().detail().ann_custom().push_back(ann); +} + }; separator="\n"$ + $endif$ + + type_object->complete().bitset_type().header().detail().type_name("$bitset.name$"); + + $bitset.bitfields:{ member | $complete_bitfield(ctx=ctx, object=member)$}; separator="\n"$ + + $bitset.parents:{$complete_bitset_inheritance(it)$}; separator="\n"$ + + TypeIdentifier identifier; + identifier._d(EK_COMPLETE); + + SerializedPayload_t payload(static_cast( + CompleteBitsetType::getCdrSerializedSize(type_object->complete().bitset_type()) + 4)); + eprosima::fastcdr::FastBuffer fastbuffer((char*) payload.data, payload.max_size); + // Fixed endian (Page 221, EquivalenceHash definition of Extensible and Dynamic Topic Types for DDS document) + eprosima::fastcdr::Cdr ser( + fastbuffer, eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS, + eprosima::fastcdr::Cdr::DDS_CDR); // Object that serializes the data. + payload.encapsulation = CDR_LE; + + type_object->serialize(ser); + payload.length = (uint32_t)ser.getSerializedDataLength(); //Get the serialized length + MD5 objectHash; + objectHash.update((char*)payload.data, payload.length); + objectHash.finalize(); + for(int i = 0; i < 14; ++i) + { + identifier.equivalence_hash()[i] = objectHash.digest[i]; + } + + TypeObjectFactory::get_instance()->add_type_object("$bitset.name$", &identifier, type_object); + delete type_object; + return TypeObjectFactory::get_instance()->get_type_object("$bitset.name$", true); +} + +>> + +minimal_bitfield(ctx, object) ::= << +$if(object.name)$ +MinimalBitfield mbf_$object.name$; +mbf_$object.name$.common().flags().TRY_CONSTRUCT1(false); +mbf_$object.name$.common().flags().TRY_CONSTRUCT2(false); +mbf_$object.name$.common().flags().IS_EXTERNAL(false); +mbf_$object.name$.common().flags().IS_OPTIONAL(false); +mbf_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); +mbf_$object.name$.common().flags().IS_KEY(false); +mbf_$object.name$.common().flags().IS_DEFAULT(false); +mbf_$object.name$.common().position($object.basePosition$); +mbf_$object.name$.common().bitcount($object.spec.bitSize$); +mbf_$object.name$.common().holder_type($object.spec.typecode.typeIdentifier$); +MD5 $object.name$_hash("$object.name$"); +for(int i = 0; i < 4; ++i) +{ + mbf_$object.name$.name_hash()[i] = $object.name$_hash.digest[i]; +} +type_object->minimal().bitset_type().field_seq().emplace_back(mbf_$object.name$); +$endif$ + +>> + +complete_bitfield(ctx, object) ::= << +$if(object.name)$ +CompleteBitfield cbf_$object.name$; +cbf_$object.name$.common().flags().TRY_CONSTRUCT1(false); +cbf_$object.name$.common().flags().TRY_CONSTRUCT2(false); +cbf_$object.name$.common().flags().IS_EXTERNAL(false); +cbf_$object.name$.common().flags().IS_OPTIONAL(false); +cbf_$object.name$.common().flags().IS_MUST_UNDERSTAND(false); +cbf_$object.name$.common().flags().IS_KEY(false); +cbf_$object.name$.common().flags().IS_DEFAULT(false); +cbf_$object.name$.common().position($object.basePosition$); +cbf_$object.name$.common().bitcount($object.spec.bitSize$); +cbf_$object.name$.common().holder_type($object.spec.typecode.typeIdentifier$); +cbf_$object.name$.detail().name("$object.name$"); + +// Position annotation always present +{ + // Position + AppliedAnnotation ann; + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("position")); + AppliedAnnotationParameter annParam; + MD5 message_hash("value"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d(TK_UINT16); + paramValue.uint_16_value($object.basePosition$); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + + cbf_$object.name$.detail().ann_custom().push_back(ann); +} + +// Use bit_bound as bitcount. +{ + // Position + AppliedAnnotation ann; + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("bit_bound")); + AppliedAnnotationParameter annParam; + MD5 message_hash("value"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d(TK_UINT16); + paramValue.uint_16_value($object.spec.bitSize$); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + + cbf_$object.name$.detail().ann_custom().push_back(ann); +} + +$if(object.annotationList)$ +$object.annotationList:{ ann | +{ + if (std::strcmp("position", "$ann.name$") != 0 && std::strcmp("bit_bound", "$ann.name$") != 0) + { + AppliedAnnotation ann; + //ann.annotation_typeid(Get$ann.name$Identifier(true)); + ann.annotation_typeid(*TypeObjectFactory::get_instance()->get_type_identifier_trying_complete("$ann.name$")); + $if(ann.valueList)$ + $ann.valueList:{ annval | + { + AppliedAnnotationParameter annParam; + MD5 message_hash("$annval.name$"); + for(int i = 0; i < 4; ++i) + { + annParam.paramname_hash()[i] = message_hash.digest[i]; + } + AnnotationParameterValue paramValue; + paramValue._d($annval.typecode.typeIdentifier$); + paramValue.from_string("$annval.value$"); + annParam.value(paramValue); + ann.param_seq().push_back(annParam); + } + };separator="\n"$ + $endif$ + cbf_$object.name$.detail().ann_custom().push_back(ann); + } +} +}; separator="\n"$ +$endif$ + +type_object->complete().bitset_type().field_seq().emplace_back(cbf_$object.name$); +$endif$ + +>> + +minimal_bitset_inheritance(parent) ::= << +type_object->minimal().bitset_type().header().base_type(*Get$parent.name$Identifier(false)); +>> + +complete_bitset_inheritance(parent) ::= << +type_object->complete().bitset_type().header().base_type(*Get$parent.name$Identifier(true)); +>> + /***** Utils *****/ diff --git a/src/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg b/src/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg index cf544796..143212b8 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/TypesHeader.stg @@ -97,7 +97,17 @@ definition_list(definitions) ::= << $definitions; separator="\n"$ >> -annotation(ctx, annotation) ::= <<>> +annotation(ctx, annotation) ::= << +namespace $annotation.name$ +{ + $annotation.enums : {$enum_type(ctx=ctx, parent=annotation, enum=it)$}; separator="\n"$ + + $annotation.typeDefs : {$typedef_decl(ctx=ctx, parent=annotation, typedefs=it)$}; separator="\n"$ + + $annotation.constDecls : {$const_decl(ctx=ctx, parent=annotation, const=it)$}; separator="\n"$ + +} +>> interface(ctx, parent, interface, export_list) ::= << /*! @@ -196,7 +206,7 @@ struct_type(ctx, parent, struct, extensions) ::= << * @brief This class represents the structure $struct.name$ defined by the user in the IDL file. * @ingroup $ctx.trimfilename$ */ -class $struct.name$ +class $struct.name$$if(struct.inheritances)$ : public $struct.inheritances : {$public_struct_inheritances(it)$}; separator=", "$ $endif$ { public: @@ -208,7 +218,7 @@ public: /*! * @brief Default destructor. */ - eProsima_user_DllExport ~$struct.name$(); + eProsima_user_DllExport virtual ~$struct.name$(); /*! * @brief Copy constructor. @@ -329,7 +339,7 @@ bitset_type(ctx, parent, bitset, extensions) ::= << * @brief This class represents the structure $bitset.name$ defined by the user in the IDL file. * @ingroup $ctx.trimfilename$ */ -class $bitset.name$ +class $bitset.name$$if(bitset.parents)$ : public $bitset.parents : {$public_bitset_inheritances(it)$}; separator=", "$ $endif$ { public: @@ -341,7 +351,7 @@ public: /*! * @brief Default destructor. */ - eProsima_user_DllExport ~$bitset.name$(); + eProsima_user_DllExport virtual ~$bitset.name$(); /*! * @brief Copy constructor. @@ -391,93 +401,83 @@ enum $enum.name$ : uint32_t }; >> +bitmask_type(ctx, parent, bitmask) ::= << +/*! + * @brief This class represents the bitmask $bitmask.name$ defined by the user in the IDL file. + * @ingroup $ctx.trimfilename$ + */ +enum $bitmask.name$$bitmask.boundType$ +{ + $bitmask.members:{$it.name$ = 0x01 << $it.position$}; separator=",\n"$ +}; +>> + /***** Utils *****/ +public_struct_inheritances(parent) ::= <<$parent.scopedname$>> + +public_bitset_inheritances(parent) ::= <<$parent.scopedname$>> + public_member_declaration(member) ::= << $if(member.typecode.primitive)$ /*! * @brief This function sets a value in member $member.name$ * @param _$member.name$ New value for member $member.name$ */ -inline eProsima_user_DllExport void $member.name$($member.typecode.cppTypename$ _$member.name$) -{ - m_$member.name$ = _$member.name$; -} +eProsima_user_DllExport void $member.name$($member.typecode.cppTypename$ _$member.name$); /*! * @brief This function returns the value of member $member.name$ * @return Value of member $member.name$ */ -inline eProsima_user_DllExport $member.typecode.cppTypename$ $member.name$() const -{ - return m_$member.name$; -} +eProsima_user_DllExport $member.typecode.cppTypename$ $member.name$() const; /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ */ -inline eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$() -{ - return m_$member.name$; -} +eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$(); $else$ /*! * @brief This function copies the value in member $member.name$ * @param _$member.name$ New value to be copied in member $member.name$ */ -inline eProsima_user_DllExport void $member.name$(const $member.typecode.cppTypename$ &_$member.name$) -{ - m_$member.name$ = _$member.name$; -} +eProsima_user_DllExport void $member.name$(const $member.typecode.cppTypename$ &_$member.name$); /*! * @brief This function moves the value in member $member.name$ * @param _$member.name$ New value to be moved in member $member.name$ */ -inline eProsima_user_DllExport void $member.name$($member.typecode.cppTypename$ &&_$member.name$) -{ - m_$member.name$ = std::move(_$member.name$); -} +eProsima_user_DllExport void $member.name$($member.typecode.cppTypename$ &&_$member.name$); /*! * @brief This function returns a constant reference to member $member.name$ * @return Constant reference to member $member.name$ */ -inline eProsima_user_DllExport const $member.typecode.cppTypename$& $member.name$() const -{ - return m_$member.name$; -} +eProsima_user_DllExport const $member.typecode.cppTypename$& $member.name$() const; /*! * @brief This function returns a reference to member $member.name$ * @return Reference to member $member.name$ */ -inline eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$() -{ - return m_$member.name$; -} +eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$(); $endif$ >> public_bitfield_declaration(member) ::= << +$if(member.name)$ /*! * @brief This function sets a value in member $member.name$ * @param _$member.name$ New value for member $member.name$ */ -eProsima_user_DllExport void $member.name$($member.typecode.cppTypename$ _$member.name$); +eProsima_user_DllExport void $member.name$($member.spec.cppTypename$ _$member.name$); /*! * @brief This function returns the value of member $member.name$ * @return Value of member $member.name$ */ -eProsima_user_DllExport $member.typecode.cppTypename$ $member.name$() const; - -/*! - * @brief This function returns a reference to member $member.name$ - * @return Reference to member $member.name$ - */ -eProsima_user_DllExport $member.typecode.cppTypename$& $member.name$(); +eProsima_user_DllExport $member.spec.cppTypename$ $member.name$() const; +$endif$ >> private_member_declaration(member) ::= <<$private_declaration(typecode=member.typecode, name=member.name)$>> @@ -533,7 +533,7 @@ $endif$ >> private_declaration(typecode, name) ::= << -$typecode.cppTypename$ m_$name$; +$typecode.cppTypename$$if(typecode.forwarded)$*$endif$ m_$name$; >> diff --git a/src/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg b/src/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg index 8703bf13..d73af4a7 100644 --- a/src/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg +++ b/src/java/com/eprosima/fastcdr/idl/templates/TypesSource.stg @@ -74,7 +74,7 @@ $exception.scopedname$::$exception.name$() : UserException() $exception.scopedname$::$exception.name$(const $exception.name$ &x) : UserException(x) { - $exception.members : { member |m_$member.name$ = x.m_$member.name$;}; separator="\n"$ + $exception.members : { member |$member_copy(member=member)$}; separator="\n"$ } $exception.scopedname$::$exception.name$($exception.name$&& x) : UserException(std::move(x)) @@ -85,7 +85,7 @@ $exception.scopedname$::$exception.name$($exception.name$&& x) : UserException(s $exception.scopedname$& $exception.scopedname$::operator=(const $exception.name$ &x) { UserException::operator=(x); - $exception.members : { member |m_$member.name$ = x.m_$member.name$;}; separator="\n"$ + $exception.members : { member |$member_copy(member=member)$}; separator="\n"$ return *this; } @@ -179,7 +179,7 @@ $endif$ typedef_decl(ctx, parent, typedefs) ::= <<>> struct_type(ctx, parent, struct, extensions) ::= << -$struct.scopedname$::$struct.name$() +$struct.scopedname$::$struct.name$()$if(struct.inheritances)$ : $struct.inheritances : {$struct_inherit_default_init(it)$}; separator=",\n"$ $endif$ { $struct.members:{ member |$member_default_init(member=member)$}; separator="\n"$ @@ -191,27 +191,32 @@ $struct.scopedname$::$struct.name$() $struct.scopedname$::~$struct.name$() { + $struct.members:{ member |$member_destructor(member=member)$}; separator="\n"$ } -$struct.scopedname$::$struct.name$(const $struct.name$ &x) +$struct.scopedname$::$struct.name$(const $struct.name$ &x)$if(struct.inheritances)$ : $struct.inheritances : {$struct_inherit_copy_init(it)$}; separator=",\n"$ $endif$ { - $struct.members:{m_$it.name$ = x.m_$it.name$;}; separator="\n"$ + $struct.members:{$member_copy(it)$}; separator="\n"$ } -$struct.scopedname$::$struct.name$($struct.name$ &&x) +$struct.scopedname$::$struct.name$($struct.name$ &&x)$if(struct.inheritances)$ : $struct.inheritances : {$struct_inherit_move_init(it)$}; separator=",\n"$ $endif$ { $struct.members:{$member_move(it)$}; separator="\n"$ } $struct.scopedname$& $struct.scopedname$::operator=(const $struct.name$ &x) { - $struct.members:{m_$it.name$ = x.m_$it.name$;}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::operator=(x);}; separator="\n"$ $endif$ + + $struct.members:{$member_copy(it)$}; separator="\n"$ return *this; } $struct.scopedname$& $struct.scopedname$::operator=($struct.name$ &&x) { + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::operator=(std::move(x));}; separator="\n"$ $endif$ + $struct.members:{$member_move(it)$}; separator="\n"$ return *this; @@ -222,7 +227,9 @@ size_t $struct.scopedname$::getMaxCdrSerializedSize(size_t current_alignment) { size_t initial_alignment = current_alignment; - $struct.members : { member |$max_serialized_size(ctx=ctx, typecode=member.typecode, var="current_alignment")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {current_alignment += $it.scopedname$::getMaxCdrSerializedSize(current_alignment);}; separator="\n"$ $endif$ + + $struct.members : { member | $if(!member.annotationNonSerialized)$$max_serialized_size(ctx=ctx, typecode=member.typecode, var="current_alignment")$$endif$}; separator="\n"$ return current_alignment - initial_alignment; } @@ -232,7 +239,9 @@ size_t $struct.scopedname$::getCdrSerializedSize(const $struct.scopedname$& data (void)data; size_t initial_alignment = current_alignment; - $struct.members : { member |$serialized_size(ctx=ctx, object=member, data="data", var="current_alignment")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {current_alignment += $it.scopedname$::getCdrSerializedSize(data, current_alignment);}; separator="\n"$ $endif$ + + $struct.members : { member |$if(!member.annotationNonSerialized)$$serialized_size(ctx=ctx, object=member, data="data", var="current_alignment")$$endif$}; separator="\n"$ return current_alignment - initial_alignment; } @@ -242,12 +251,16 @@ $endif$ $if(ctx.cdr)$ void $struct.scopedname$::serialize(eprosima::fastcdr::Cdr &scdr) const { - $struct.members : { member |$object_serialization(ctx=ctx, object=member, preffix="m_")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::serialize(scdr);}; separator="\n"$ $endif$ + + $struct.members : { member |$if(!member.annotationNonSerialized)$$object_serialization(ctx=ctx, object=member, preffix="m_")$$endif$}; separator="\n"$ } void $struct.scopedname$::deserialize(eprosima::fastcdr::Cdr &dcdr) { - $struct.members : { member |$object_deserialization(ctx=ctx, object=member, preffix="m_")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::deserialize(dcdr);}; separator="\n"$ $endif$ + + $struct.members : { member |$if(!member.annotationNonSerialized)$$object_deserialization(ctx=ctx, object=member, preffix="m_")$$endif$}; separator="\n"$ } $endif$ @@ -255,21 +268,27 @@ $endif$ $if(ctx.fastcdr)$ void $struct.scopedname$::serialize(eprosima::fastcdr::FastCdr &scdr) const { - $struct.members : { member |$object_serialization(ctx=ctx, object=member, preffix="m_")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::serialize(scdr);}; separator="\n"$ $endif$ + + $struct.members : { member |$if(!member.annotationNonSerialized)$$object_serialization(ctx=ctx, object=member, preffix="m_")$$endif$}; separator="\n"$ } void $struct.scopedname$::deserialize(eprosima::fastcdr::FastCdr &dcdr) { - $struct.members : { member |$object_deserialization(ctx=ctx, object=member, preffix="m_")$}; separator="\n"$ + $if(struct.inheritances)$ $struct.inheritances : {$it.scopedname$::deserialize(dcdr);}; separator="\n"$ $endif$ + + $struct.members : { member |$if(!member.annotationNonSerialized)$$object_deserialization(ctx=ctx, object=member, preffix="m_")$$endif$}; separator="\n"$ } $endif$ +$struct.members:{$public_member_declaration(class=struct.scopedname, member=it)$}; separator="\n"$ + $extensions : {$it$}; separator="\n"$ >> bitset_type(ctx, parent, bitset) ::= << -$bitset.scopedname$::$bitset.name$() +$bitset.scopedname$::$bitset.name$()$if(bitset.parents)$ : $bitset.parents : {$bitset_inherit_default_init(it)$}; separator=",\n"$ $endif$ { $if(ctx.generateTypeObject)$ // Just to register all known types @@ -281,18 +300,20 @@ $bitset.scopedname$::~$bitset.name$() { } -$bitset.scopedname$::$bitset.name$(const $bitset.name$ &x) +$bitset.scopedname$::$bitset.name$(const $bitset.name$ &x)$if(bitset.parents)$ : $bitset.parents : {$bitset_inherit_copy_init(it)$}; separator=",\n"$ $endif$ { m_bitset = x.m_bitset; } -$bitset.scopedname$::$bitset.name$($bitset.name$ &&x) +$bitset.scopedname$::$bitset.name$($bitset.name$ &&x)$if(bitset.parents)$ : $bitset.parents : {$bitset_inherit_move_init(it)$}; separator=",\n"$ $endif$ { m_bitset = x.m_bitset; } $bitset.scopedname$& $bitset.scopedname$::operator=(const $bitset.name$ &x) { + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::operator=(x);}; separator="\n"$ $endif$ + m_bitset = x.m_bitset; return *this; @@ -300,6 +321,8 @@ $bitset.scopedname$& $bitset.scopedname$::operator=(const $bitset.name$ &x) $bitset.scopedname$& $bitset.scopedname$::operator=($bitset.name$ &&x) { + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::operator=(std::move(x));}; separator="\n"$ $endif$ + m_bitset = x.m_bitset; return *this; @@ -310,16 +333,20 @@ size_t $bitset.scopedname$::getMaxCdrSerializedSize(size_t current_alignment) { size_t initial_alignment = current_alignment; - initial_alignment += sizeof(m_bitset); + $if(bitset.parents)$ $bitset.parents : {current_alignment += $it.scopedname$::getMaxCdrSerializedSize(current_alignment);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member | $if(!member.annotationNonSerialized)$$if(member.name)$$max_serialized_size(ctx=ctx, typecode=member.spec.typecode, var="current_alignment")$$endif$$endif$}; separator="\n"$ return current_alignment - initial_alignment; } -size_t $bitset.scopedname$::getCdrSerializedSize(const $bitset.scopedname$&, size_t current_alignment) +size_t $bitset.scopedname$::getCdrSerializedSize(const $bitset.scopedname$& $if(bitset.parents)$data$endif$, size_t current_alignment) { size_t initial_alignment = current_alignment; - initial_alignment += sizeof(m_bitset); + $if(bitset.parents)$ $bitset.parents : {current_alignment += $it.scopedname$::getCdrSerializedSize(data, current_alignment);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member | $if(!member.annotationNonSerialized)$$if(member.name)$$serialized_size_type(ctx=ctx, typecode=member.spec.typecode, var="current_alignment")$$endif$$endif$}; separator="\n"$ return current_alignment - initial_alignment; } @@ -329,14 +356,16 @@ $endif$ $if(ctx.cdr)$ void $bitset.scopedname$::serialize(eprosima::fastcdr::Cdr &scdr) const { - scdr << static_cast(m_bitset.to_ullong()); + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::serialize(scdr);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_serialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ } void $bitset.scopedname$::deserialize(eprosima::fastcdr::Cdr &dcdr) { - uint64_t temp = 0; - dcdr \>> temp; - m_bitset = temp; + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::deserialize(dcdr);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_deserialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ } $endif$ @@ -344,14 +373,16 @@ $endif$ $if(ctx.fastcdr)$ void $bitset.scopedname$::serialize(eprosima::fastcdr::FastCdr &scdr) const { - scdr << static_cast(m_bitset.to_ullong()); + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::serialize(scdr);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_serialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ } void $bitset.scopedname$::deserialize(eprosima::fastcdr::FastCdr &dcdr) { - uint64_t temp = 0; - dcdr \>> temp; - m_bitset = temp; + $if(bitset.parents)$ $bitset.parents : {$it.scopedname$::deserialize(dcdr);}; separator="\n"$ $endif$ + + $bitset.bitfields : { member |$if(!member.annotationNonSerialized)$$bitfield_deserialization(ctx=ctx, object=member)$$endif$}; separator="\n"$ } $endif$ @@ -362,38 +393,40 @@ $bitset.bitfields:{$public_bitfield_definition(it)$}; separator="\n"$ >> public_bitfield_definition(member) ::= << -void $bitset.scopedname$::$member.name$($member.typecode.cppTypename$ _$member.name$) +$if(member.name)$ +void $bitset.scopedname$::$member.name$($member.spec.cppTypename$ _$member.name$) { int base = $member.basePosition$; -$if(member.typecode.typecode.isType_7)$ +$if(member.spec.typecode.isType_7)$ m_bitset.set(base, _$member.name$); $else$ - int size = $member.typecode.bitSize$; - for (int i = base + size - 1; i >= base; --i) + int size = $member.spec.bitSize$; + for (int i = base; i < base + size; ++i) { - m_bitset.set(i, _$member.name$ | 0x01); + m_bitset.set(i, !!(_$member.name$ & 0x01)); _$member.name$ = _$member.name$ \>> 1; } $endif$ } -$member.typecode.cppTypename$ $bitset.scopedname$::$member.name$() const +$member.spec.cppTypename$ $bitset.scopedname$::$member.name$() const { int base = $member.basePosition$; -$if(member.typecode.typecode.isType_7)$ +$if(member.spec.typecode.isType_7)$ return m_bitset.test(base); $else$ - int size = $member.typecode.bitSize$; - std::bitset<$member.typecode.bitSize$> aux; - for (int i = size - 1; i >= 0; --i) + int size = $member.spec.bitSize$; + std::bitset<$member.spec.bitSize$> aux; + for (int i = 0; i < size; ++i) { aux.set(i, m_bitset.test(i + base)); } - return static_cast<$member.typecode.cppTypename$>(aux.to_ullong()); + return static_cast<$member.spec.cppTypename$>(aux.to_ullong()); $endif$ } +$endif$ >> @@ -584,8 +617,79 @@ $endif$ enum_type(ctx, parent, enum) ::= <<>> +bitmask_type(ctx, parent, bitmask) ::= <<>> + /***** Utils *****/ + + +public_member_declaration(class, member) ::= << +$if(member.typecode.primitive)$ +/*! + * @brief This function sets a value in member $member.name$ + * @param _$member.name$ New value for member $member.name$ + */ +void $class$::$member.name$($member.typecode.cppTypename$ _$member.name$) +{ + $if(member.typecode.forwarded)$*$endif$m_$member.name$ = _$member.name$; +} + +/*! + * @brief This function returns the value of member $member.name$ + * @return Value of member $member.name$ + */ +$member.typecode.cppTypename$ $class$::$member.name$() const +{ + return $if(member.typecode.forwarded)$*$endif$m_$member.name$; +} + +/*! + * @brief This function returns a reference to member $member.name$ + * @return Reference to member $member.name$ + */ +$member.typecode.cppTypename$& $class$::$member.name$() +{ + return $if(member.typecode.forwarded)$*$endif$m_$member.name$; +} +$else$ +/*! + * @brief This function copies the value in member $member.name$ + * @param _$member.name$ New value to be copied in member $member.name$ + */ +void $class$::$member.name$(const $member.typecode.cppTypename$ &_$member.name$) +{ + $if(member.typecode.forwarded)$*$endif$m_$member.name$ = _$member.name$; +} + +/*! + * @brief This function moves the value in member $member.name$ + * @param _$member.name$ New value to be moved in member $member.name$ + */ +void $class$::$member.name$($member.typecode.cppTypename$ &&_$member.name$) +{ + $if(member.typecode.forwarded)$*$endif$m_$member.name$ = std::move(_$member.name$); +} + +/*! + * @brief This function returns a constant reference to member $member.name$ + * @return Constant reference to member $member.name$ + */ +const $member.typecode.cppTypename$& $class$::$member.name$() const +{ + return $if(member.typecode.forwarded)$*$endif$m_$member.name$; +} + +/*! + * @brief This function returns a reference to member $member.name$ + * @return Reference to member $member.name$ + */ +$member.typecode.cppTypename$& $class$::$member.name$() +{ + return $if(member.typecode.forwarded)$*$endif$m_$member.name$; +} +$endif$ +>> + public_unionmember_declaration(class, member, totallabels, defaultvalue) ::= << $if(member.typecode.primitive)$ void $class$::$member.name$($member.typecode.cppTypename$ _$member.name$) @@ -636,12 +740,26 @@ $member.typecode.cppTypename$& $class$::$member.name$() $endif$ >> +member_copy(member) ::= << +$if(member.typecode.forwarded)$ +m_$member.name$ = new $member.typecode.cppTypename$(); +*m_$member.name$ = *x.m_$member.name$; +$else$ +m_$member.name$ = x.m_$member.name$; +$endif$ +>> + member_move(member) ::= << $if(member.typecode.primitive)$ m_$member.name$ = x.m_$member.name$; $else$ +$if(member.typecode.forwarded)$ +m_$member.name$ = x.m_$member.name$; +x.m_$member.name$ = nullptr; +$else$ m_$member.name$ = std::move(x.m_$member.name$); $endif$ +$endif$ >> // TODO Mirar si el default: esta delante de otros casos, el resto no se ejecuta. @@ -813,4 +931,4 @@ $endif$ $endif$ break; ->> +>> \ No newline at end of file