Skip to content

Commit de3f0c5

Browse files
Merge pull request #152 from martinfantini/optional_group_inside_Sequence
Optional group inside sequence
2 parents 9b1af73 + 6b699d4 commit de3f0c5

6 files changed

Lines changed: 99 additions & 8 deletions

File tree

src/fast_type_gen/inl_gen.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,8 +681,16 @@ void inl_gen::visit(const mfast::sequence_field_instruction *inst,
681681
for (std::size_t i = 0; i < inst->subinstructions().size(); ++i) {
682682
const field_instruction *subinst = inst->subinstructions()[i];
683683

684-
out_ << " visitor.visit(" << get_ext_cref_type(subinst) << " ((*this)["
685-
<< i << "]) );\n";
684+
if (is_group_type(subinst) && subinst->optional())
685+
{
686+
out_ << " {\n"
687+
<< " " << get_ext_cref_type(subinst) << " ext_cref_group((*this)[" << i << "]);\n"
688+
<< " ext_cref_group.set_group_present(this->field_storage(" << i << ")->is_present());\n"
689+
<< " visitor.visit(ext_cref_group);\n"
690+
<< " }\n";
691+
}
692+
else
693+
out_ << " visitor.visit(" << get_ext_cref_type(subinst) << " ((*this)[" << i << "]) );\n";
686694
}
687695

688696
out_ << "}\n\n";

src/mfast/ext_ref.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,13 @@ class ext_cref<BaseCRef, group_type_tag, Properties>
205205
explicit ext_cref(const field_cref &base) : base_(base) {}
206206
explicit ext_cref(const aggregate_cref &base) : base_(base) {}
207207
cref_type get() const { return base_; }
208-
bool present() const { return !this->optional() || group_present_; }
208+
bool present() const { return group_present_; }
209209

210210
void set_group_present(bool present) { group_present_ = present; }
211211

212212
private:
213213
cref_type base_;
214-
bool group_present_ = true;
214+
bool group_present_ = this->optional()?false:true;
215215
};
216216

217217
template <typename Properties>

tests/fast_test_coding_case_v2.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ class fast_test_coding_case_v2
1818
decoder_v2_(DESC::instance())
1919
{}
2020

21-
bool
22-
encoding(const mfast::message_cref& msg_ref, const byte_stream& result, bool reset=false)
21+
bool encoding(const mfast::message_cref& msg_ref, const byte_stream& result, bool reset=false)
2322
{
2423
const int buffer_size = 128;
2524
char buffer[buffer_size];
@@ -32,8 +31,7 @@ class fast_test_coding_case_v2
3231
return false;
3332
}
3433

35-
bool
36-
decoding(const byte_stream& bytes, const mfast::message_cref& result, bool reset=false)
34+
bool decoding(const byte_stream& bytes, const mfast::message_cref& result, bool reset=false)
3735
{
3836
const char* first = bytes.data();
3937
mfast::message_cref msg = decoder_v2_.decode(first, first+bytes.size(), reset);

tests/sequence_encoder_decoder.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,41 @@ TEST_CASE("group sequence inside sequence encoder/decoder","[group_sequence_insi
237237
REQUIRE(test_case.decoding("\xC0\x86\x81\xD0\xB2\x82\xB2",test_6.cref(),true));
238238
}
239239
}
240+
241+
TEST_CASE("sequence with optional group encoder/decoder","[sequence_optional_group_encoder_decoder]")
242+
{
243+
fast_test_coding_case<simple14::templates_description> test_case;
244+
245+
SECTION("group not present")
246+
{
247+
simple14::Test_7 test_7;
248+
simple14::Test_7_mref test_7_mref = test_7.mref();
249+
250+
auto sequence_7_mref = test_7_mref.set_sequence_7();
251+
sequence_7_mref.resize(1);
252+
253+
auto element_sequence = sequence_7_mref.front();
254+
element_sequence.set_field_7_3().as(50);
255+
256+
REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xC0\xB2",true));
257+
REQUIRE(test_case.decoding("\xC0\x87\x81\xC0\xB2",test_7.cref(),true));
258+
}
259+
260+
SECTION("group present")
261+
{
262+
simple14::Test_7 test_7;
263+
simple14::Test_7_mref test_7_mref = test_7.mref();
264+
265+
auto sequence_7_mref = test_7_mref.set_sequence_7();
266+
sequence_7_mref.resize(1);
267+
268+
auto element_sequence = sequence_7_mref.front();
269+
element_sequence.set_field_7_3().as(50);
270+
271+
auto group_7 = element_sequence.set_group_7();
272+
group_7.set_field_7_4().as(20);
273+
274+
REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xE0\xB2\x94",true));
275+
REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true));
276+
}
277+
}

tests/sequence_encoder_decoder_v2.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,41 @@ TEST_CASE("group sequence inside sequence encoder_V2/decoder_v2","[group_sequenc
239239
REQUIRE(test_case.decoding("\xC0\x86\x81\xD0\xB2\x82\xB2",test_6.cref(),true));
240240
}
241241
}
242+
243+
TEST_CASE("sequence with optional group encoder_V2/decoder_v2","[sequence_optional_group_encoder_v2_decoder_v2]")
244+
{
245+
fast_test_coding_case_v2<simple14::templates_description> test_case;
246+
247+
SECTION("group not present")
248+
{
249+
simple14::Test_7 test_7;
250+
simple14::Test_7_mref test_7_mref = test_7.mref();
251+
252+
auto sequence_7_mref = test_7_mref.set_sequence_7();
253+
sequence_7_mref.resize(1);
254+
255+
auto element_sequence = sequence_7_mref.front();
256+
element_sequence.set_field_7_3().as(50);
257+
258+
REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xC0\xB2",true));
259+
REQUIRE(test_case.decoding("\xC0\x87\x81\xC0\xB2",test_7.cref(),true));
260+
}
261+
262+
SECTION("group present")
263+
{
264+
simple14::Test_7 test_7;
265+
simple14::Test_7_mref test_7_mref = test_7.mref();
266+
267+
auto sequence_7_mref = test_7_mref.set_sequence_7();
268+
sequence_7_mref.resize(1);
269+
270+
auto element_sequence = sequence_7_mref.front();
271+
element_sequence.set_field_7_3().as(50);
272+
273+
auto group_7 = element_sequence.set_group_7();
274+
group_7.set_field_7_4().as(20);
275+
276+
REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xE0\xB2\x94",true));
277+
REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true));
278+
}
279+
}

tests/simple14.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,13 @@
5454
</sequence>
5555
</group>
5656
</template>
57+
<template name="Test_7" id="7">
58+
<sequence name="sequence_7">
59+
<length name="field_7_2" id="72"></length>
60+
<uInt32 name="field_7_3" id="73"><copy/></uInt32>
61+
<group name="group_7" presence="optional">
62+
<uInt32 name="field_7_4" id="74"/>
63+
</group>
64+
</sequence>
65+
</template>
5766
</templates>

0 commit comments

Comments
 (0)