From 07a162642faea34afdb5534af21f310cdeccf7fd Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Sat, 12 Apr 2025 14:36:11 +0200 Subject: [PATCH 1/3] Correct the presence bit for the case of the groups --- src/mfast/ext_ref.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mfast/ext_ref.h b/src/mfast/ext_ref.h index 60bf81aa..cba11441 100644 --- a/src/mfast/ext_ref.h +++ b/src/mfast/ext_ref.h @@ -205,13 +205,13 @@ class ext_cref explicit ext_cref(const field_cref &base) : base_(base) {} explicit ext_cref(const aggregate_cref &base) : base_(base) {} cref_type get() const { return base_; } - bool present() const { return !this->optional() || group_present_; } + bool present() const { return group_present_; } void set_group_present(bool present) { group_present_ = present; } private: cref_type base_; - bool group_present_ = true; + bool group_present_ = this->optional()?false:true; }; template From 494749cb7ea98ecda729f3eba31cfc4f2a6f5675 Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Sat, 12 Apr 2025 17:11:42 +0200 Subject: [PATCH 2/3] Correct group generation for the sequence --- src/fast_type_gen/inl_gen.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/fast_type_gen/inl_gen.cpp b/src/fast_type_gen/inl_gen.cpp index 6fabeae5..c19f19d1 100644 --- a/src/fast_type_gen/inl_gen.cpp +++ b/src/fast_type_gen/inl_gen.cpp @@ -681,8 +681,16 @@ void inl_gen::visit(const mfast::sequence_field_instruction *inst, for (std::size_t i = 0; i < inst->subinstructions().size(); ++i) { const field_instruction *subinst = inst->subinstructions()[i]; - out_ << " visitor.visit(" << get_ext_cref_type(subinst) << " ((*this)[" - << i << "]) );\n"; + if (is_group_type(subinst) && subinst->optional()) + { + out_ << " {\n" + << " " << get_ext_cref_type(subinst) << " ext_cref_group((*this)[" << i << "]);\n" + << " ext_cref_group.set_group_present(this->field_storage(" << i << ")->is_present());\n" + << " visitor.visit(ext_cref_group);\n" + << " }\n"; + } + else + out_ << " visitor.visit(" << get_ext_cref_type(subinst) << " ((*this)[" << i << "]) );\n"; } out_ << "}\n\n"; From 6b699d40899dacfd1f58753cf808ee28b6e96db7 Mon Sep 17 00:00:00 2001 From: Roberto Martin Fantini Date: Sat, 12 Apr 2025 14:36:54 +0200 Subject: [PATCH 3/3] Add unit test for the case of the group presence --- tests/fast_test_coding_case_v2.hpp | 6 ++--- tests/sequence_encoder_decoder.cpp | 38 +++++++++++++++++++++++++++ tests/sequence_encoder_decoder_v2.cpp | 38 +++++++++++++++++++++++++++ tests/simple14.xml | 9 +++++++ 4 files changed, 87 insertions(+), 4 deletions(-) diff --git a/tests/fast_test_coding_case_v2.hpp b/tests/fast_test_coding_case_v2.hpp index be06cf30..42dc0967 100644 --- a/tests/fast_test_coding_case_v2.hpp +++ b/tests/fast_test_coding_case_v2.hpp @@ -18,8 +18,7 @@ class fast_test_coding_case_v2 decoder_v2_(DESC::instance()) {} - bool - encoding(const mfast::message_cref& msg_ref, const byte_stream& result, bool reset=false) + bool encoding(const mfast::message_cref& msg_ref, const byte_stream& result, bool reset=false) { const int buffer_size = 128; char buffer[buffer_size]; @@ -32,8 +31,7 @@ class fast_test_coding_case_v2 return false; } - bool - decoding(const byte_stream& bytes, const mfast::message_cref& result, bool reset=false) + bool decoding(const byte_stream& bytes, const mfast::message_cref& result, bool reset=false) { const char* first = bytes.data(); mfast::message_cref msg = decoder_v2_.decode(first, first+bytes.size(), reset); diff --git a/tests/sequence_encoder_decoder.cpp b/tests/sequence_encoder_decoder.cpp index e2d1fb8c..6c4edf00 100644 --- a/tests/sequence_encoder_decoder.cpp +++ b/tests/sequence_encoder_decoder.cpp @@ -237,3 +237,41 @@ TEST_CASE("group sequence inside sequence encoder/decoder","[group_sequence_insi REQUIRE(test_case.decoding("\xC0\x86\x81\xD0\xB2\x82\xB2",test_6.cref(),true)); } } + +TEST_CASE("sequence with optional group encoder/decoder","[sequence_optional_group_encoder_decoder]") +{ + fast_test_coding_case test_case; + + SECTION("group not present") + { + simple14::Test_7 test_7; + simple14::Test_7_mref test_7_mref = test_7.mref(); + + auto sequence_7_mref = test_7_mref.set_sequence_7(); + sequence_7_mref.resize(1); + + auto element_sequence = sequence_7_mref.front(); + element_sequence.set_field_7_3().as(50); + + REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xC0\xB2",true)); + REQUIRE(test_case.decoding("\xC0\x87\x81\xC0\xB2",test_7.cref(),true)); + } + + SECTION("group present") + { + simple14::Test_7 test_7; + simple14::Test_7_mref test_7_mref = test_7.mref(); + + auto sequence_7_mref = test_7_mref.set_sequence_7(); + sequence_7_mref.resize(1); + + auto element_sequence = sequence_7_mref.front(); + element_sequence.set_field_7_3().as(50); + + auto group_7 = element_sequence.set_group_7(); + group_7.set_field_7_4().as(20); + + REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xE0\xB2\x94",true)); + REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true)); + } +} diff --git a/tests/sequence_encoder_decoder_v2.cpp b/tests/sequence_encoder_decoder_v2.cpp index bbf05cdd..bc3468b3 100644 --- a/tests/sequence_encoder_decoder_v2.cpp +++ b/tests/sequence_encoder_decoder_v2.cpp @@ -239,3 +239,41 @@ TEST_CASE("group sequence inside sequence encoder_V2/decoder_v2","[group_sequenc REQUIRE(test_case.decoding("\xC0\x86\x81\xD0\xB2\x82\xB2",test_6.cref(),true)); } } + +TEST_CASE("sequence with optional group encoder_V2/decoder_v2","[sequence_optional_group_encoder_v2_decoder_v2]") +{ + fast_test_coding_case_v2 test_case; + + SECTION("group not present") + { + simple14::Test_7 test_7; + simple14::Test_7_mref test_7_mref = test_7.mref(); + + auto sequence_7_mref = test_7_mref.set_sequence_7(); + sequence_7_mref.resize(1); + + auto element_sequence = sequence_7_mref.front(); + element_sequence.set_field_7_3().as(50); + + REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xC0\xB2",true)); + REQUIRE(test_case.decoding("\xC0\x87\x81\xC0\xB2",test_7.cref(),true)); + } + + SECTION("group present") + { + simple14::Test_7 test_7; + simple14::Test_7_mref test_7_mref = test_7.mref(); + + auto sequence_7_mref = test_7_mref.set_sequence_7(); + sequence_7_mref.resize(1); + + auto element_sequence = sequence_7_mref.front(); + element_sequence.set_field_7_3().as(50); + + auto group_7 = element_sequence.set_group_7(); + group_7.set_field_7_4().as(20); + + REQUIRE(test_case.encoding(test_7.cref(),"\xC0\x87\x81\xE0\xB2\x94",true)); + REQUIRE(test_case.decoding("\xC0\x87\x81\xE0\xB2\x94",test_7.cref(),true)); + } +} diff --git a/tests/simple14.xml b/tests/simple14.xml index e7f9b916..179e6273 100644 --- a/tests/simple14.xml +++ b/tests/simple14.xml @@ -54,4 +54,13 @@ +