Skip to content

Commit aed568f

Browse files
committed
[#657] Fix packed array elements in runtime to be passed by reference
1 parent ee61625 commit aed568f

File tree

1 file changed

+26
-2
lines changed
  • compiler/extensions/cpp/runtime/src/zserio

1 file changed

+26
-2
lines changed

compiler/extensions/cpp/runtime/src/zserio/Array.h

+26-2
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,39 @@ void checkOffset(const OWNER_TYPE&, size_t, size_t)
9191

9292
// call the initContext method properly on packed array traits
9393
template <typename PACKED_ARRAY_TRAITS, typename OWNER_TYPE, typename PACKING_CONTEXT,
94-
typename std::enable_if<has_owner_type<PACKED_ARRAY_TRAITS>::value, int>::type = 0>
94+
typename std::enable_if<has_owner_type<PACKED_ARRAY_TRAITS>::value &&
95+
!std::is_scalar<typename PACKED_ARRAY_TRAITS::ElementType>::value,
96+
int>::type = 0>
97+
void packedArrayTraitsInitContext(const OWNER_TYPE& owner, PACKING_CONTEXT& context,
98+
const typename PACKED_ARRAY_TRAITS::ElementType& element)
99+
{
100+
PACKED_ARRAY_TRAITS::initContext(owner, context, element);
101+
}
102+
103+
template <typename PACKED_ARRAY_TRAITS, typename OWNER_TYPE, typename PACKING_CONTEXT,
104+
typename std::enable_if<has_owner_type<PACKED_ARRAY_TRAITS>::value &&
105+
std::is_scalar<typename PACKED_ARRAY_TRAITS::ElementType>::value,
106+
int>::type = 0>
95107
void packedArrayTraitsInitContext(
96108
const OWNER_TYPE& owner, PACKING_CONTEXT& context, typename PACKED_ARRAY_TRAITS::ElementType element)
97109
{
98110
PACKED_ARRAY_TRAITS::initContext(owner, context, element);
99111
}
100112

101113
template <typename PACKED_ARRAY_TRAITS, typename OWNER_TYPE, typename PACKING_CONTEXT,
102-
typename std::enable_if<!has_owner_type<PACKED_ARRAY_TRAITS>::value, int>::type = 0>
114+
typename std::enable_if<!has_owner_type<PACKED_ARRAY_TRAITS>::value &&
115+
!std::is_scalar<typename PACKED_ARRAY_TRAITS::ElementType>::value,
116+
int>::type = 0>
117+
void packedArrayTraitsInitContext(
118+
const OWNER_TYPE&, PACKING_CONTEXT& context, const typename PACKED_ARRAY_TRAITS::ElementType& element)
119+
{
120+
PACKED_ARRAY_TRAITS::initContext(context, element);
121+
}
122+
123+
template <typename PACKED_ARRAY_TRAITS, typename OWNER_TYPE, typename PACKING_CONTEXT,
124+
typename std::enable_if<!has_owner_type<PACKED_ARRAY_TRAITS>::value &&
125+
std::is_scalar<typename PACKED_ARRAY_TRAITS::ElementType>::value,
126+
int>::type = 0>
103127
void packedArrayTraitsInitContext(
104128
const OWNER_TYPE&, PACKING_CONTEXT& context, typename PACKED_ARRAY_TRAITS::ElementType element)
105129
{

0 commit comments

Comments
 (0)