diff --git a/compiler/extensions/cpp/freemarker/Structure.cpp.ftl b/compiler/extensions/cpp/freemarker/Structure.cpp.ftl index 0ed7a5d8b..56e5eafd1 100644 --- a/compiler/extensions/cpp/freemarker/Structure.cpp.ftl +++ b/compiler/extensions/cpp/freemarker/Structure.cpp.ftl @@ -564,16 +564,15 @@ void ${name}::read(::zserio::BitStreamReader& in<#if parameterArgs(true)?has_con <#if field.isExtended> if (::zserio::alignTo(UINT8_C(8), in.getBitPosition()) < in.getBufferBitSize()) { - <@compound_read_field field, name, 2, false/> ++m_numExtendedFields; in.alignTo(UINT32_C(8)); + <@compound_read_field field, name, 2, false/> } - <#if field.typeInfo.isSimple> else { - ${field.cppName} = {}; + ${field.cppName} = <#if !field.typeInfo.isSimple><@field_member_type_name field/>(<#rt> + <#lt><@field_default_constructor_arguments field/><#if !field.typeInfo.isSimple>); } - <#else> <@compound_read_field field, name, 1, false/> @@ -607,16 +606,15 @@ void ${name}::read(${name}::ZserioPackingContext& context, ::zserio::BitStreamRe <#if field.isExtended> if (::zserio::alignTo(UINT8_C(8), in.getBitPosition()) < in.getBufferBitSize()) { - <@compound_read_field field, name, 2, true/> ++m_numExtendedFields; in.alignTo(UINT32_C(8)); + <@compound_read_field field, name, 2, true/> } - <#if field.typeInfo.isSimple> else { - ${field.cppName} = {}; + ${field.cppName} = <#if !field.typeInfo.isSimple><@field_member_type_name field/>(<#rt> + <#lt><@field_default_constructor_arguments field/><#if !field.typeInfo.isSimple>); } - <#else> <@compound_read_field field, name, 1, true/> diff --git a/compiler/extensions/cpp/freemarker/Union.cpp.ftl b/compiler/extensions/cpp/freemarker/Union.cpp.ftl index 416fe553a..03039f81f 100644 --- a/compiler/extensions/cpp/freemarker/Union.cpp.ftl +++ b/compiler/extensions/cpp/freemarker/Union.cpp.ftl @@ -713,7 +713,7 @@ void ${name}::read(${name}::ZserioPackingContext& context, ::zserio::BitStreamRe <#if fieldList?has_content> - m_choiceTag = static_cast<${name}::ChoiceTag>(/*static_cast*/(in.readVarSize())); + m_choiceTag = static_cast<${name}::ChoiceTag>(/*static_cast*/(context.getChoiceTag().read<${choiceTagArrayTraits}>(in))); switch (m_choiceTag) { diff --git a/compiler/extensions/cpp/src/zserio/extension/cpp/CompoundFieldTemplateData.java b/compiler/extensions/cpp/src/zserio/extension/cpp/CompoundFieldTemplateData.java index 858d7f749..8c5439cb4 100644 --- a/compiler/extensions/cpp/src/zserio/extension/cpp/CompoundFieldTemplateData.java +++ b/compiler/extensions/cpp/src/zserio/extension/cpp/CompoundFieldTemplateData.java @@ -870,14 +870,18 @@ else if (compound != null) } else if (callExpr != null) { - //todo: AnyHolder.emplace + expr = "m_objectChoice.emplace<" + fieldCppTypeName() + ">("; + if (array == null) + expr += "::zserio::NoInit, "; + expr += "allocator)"; + expr += "." + callExpr + ";"; - expr = "m_objectChoice.set(" + fieldCppTypeName() + "("; + /*expr = "m_objectChoice.set(" + fieldCppTypeName() + "("; if (array == null) expr += "::zserio::NoInit, "; expr += "allocator));"; expr += String.format(" m_objectChoice.get<%s>().%s;", - fieldCppTypeName(), callExpr); + fieldCppTypeName(), callExpr);*/ return expr; } }