From 3b61ca6b9bcfd40336d4613989cfa9b832110b33 Mon Sep 17 00:00:00 2001 From: pcbk Date: Thu, 4 Nov 2021 15:54:14 +0100 Subject: [PATCH 1/6] Update fast_encoder.cpp Encode operator_default and operator_constant that has pmap --- src/mfast/coder/encoder/fast_encoder.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mfast/coder/encoder/fast_encoder.cpp b/src/mfast/coder/encoder/fast_encoder.cpp index 35b2205..0e834ac 100644 --- a/src/mfast/coder/encoder/fast_encoder.cpp +++ b/src/mfast/coder/encoder/fast_encoder.cpp @@ -195,8 +195,11 @@ void fast_encoder_impl::visit(message_cref cref, bool force_reset) { aggregate_cref message(cref.field_storage(0), instruction); for (auto &&field : message) - if (field.present() || field.instruction()->field_operator() == operator_none) + { + const operator_enum_t op = field.instruction()->field_operator(); + if (field.present() || op == operator_none || op == operator_default || (op == operator_constant && field.instruction()->pmap_size() > 0)) apply_accessor(*this, field); + } pmap.commit(); } From 36de805f5338097619ed64fb9f2768726a7884ba Mon Sep 17 00:00:00 2001 From: pcbk Date: Thu, 4 Nov 2021 16:03:56 +0100 Subject: [PATCH 2/6] set initial_value_.preent to true if init_value_str issue 109 --- .gitignore | 1 + src/mfast/xml_parser/field_op.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5acb669..3bfd071 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build .vscode +*.bak diff --git a/src/mfast/xml_parser/field_op.cpp b/src/mfast/xml_parser/field_op.cpp index c4fa1d7..d7df987 100644 --- a/src/mfast/xml_parser/field_op.cpp +++ b/src/mfast/xml_parser/field_op.cpp @@ -68,6 +68,7 @@ field_op::field_op(const decimal_field_instruction *inst, get_optional_attr(*field_op_element, "value", nullptr); if (init_value_str) { + initial_value_.present(true); // Set as preset if (strcmp(element->Name(), "exponent") != 0) initial_value_.set(boost::lexical_cast(init_value_str)); else { From c1faedc9fe182230167e2b11e8b446286009c229 Mon Sep 17 00:00:00 2001 From: pcbk Date: Thu, 4 Nov 2021 16:07:57 +0100 Subject: [PATCH 3/6] field_type_exponent same as field_type_decimal issue#110 --- src/mfast/field_mref.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mfast/field_mref.h b/src/mfast/field_mref.h index d33dce8..553bee0 100644 --- a/src/mfast/field_mref.h +++ b/src/mfast/field_mref.h @@ -73,6 +73,7 @@ template void field_mref::as(T value) { static_cast(*this).as(static_cast(value)); break; case field_type_decimal: + case field_type_exponent: static_cast(*this).as(value); break; default: From 7e9ba94e16896c84959d7386cb8b8a26be436891 Mon Sep 17 00:00:00 2001 From: pcbk Date: Wed, 10 Nov 2021 16:41:13 +0100 Subject: [PATCH 4/6] issue#108 Adding testcase for issue --- tests/coder_test.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/coder_test.cpp b/tests/coder_test.cpp index 749ea3a..f9c0d5e 100644 --- a/tests/coder_test.cpp +++ b/tests/coder_test.cpp @@ -404,3 +404,24 @@ TEST_CASE("test fast coder for a template with zero segment size", "[segment_pma } +TEST_CASE("test fast coder without code generation for a simple template with constant and default","[manual_reset_test]") +{ + fast_coding_test_case test_case ( + "\n" + "\n" + "\n" + "\n"); + + debug_allocator alloc; + message_type msg(&alloc, test_case.template_with_id(1)); + message_mref msg_ref = msg.mref(); + + // Not setting fields... + REQUIRE(test_case.encoding(msg_ref, "\xa0\x80")); + REQUIRE(test_case.decoding("\xa0\x80", msg_ref)); +} From 5423fc1856e6559cdd1ee2ea10f3e059860a522d Mon Sep 17 00:00:00 2001 From: pcbk Date: Wed, 10 Nov 2021 17:44:41 +0100 Subject: [PATCH 5/6] issue 109 Reverted change, fixed by issue 108 --- src/mfast/xml_parser/field_op.cpp | 1 - tests/coder_test.cpp | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/mfast/xml_parser/field_op.cpp b/src/mfast/xml_parser/field_op.cpp index d7df987..c4fa1d7 100644 --- a/src/mfast/xml_parser/field_op.cpp +++ b/src/mfast/xml_parser/field_op.cpp @@ -68,7 +68,6 @@ field_op::field_op(const decimal_field_instruction *inst, get_optional_attr(*field_op_element, "value", nullptr); if (init_value_str) { - initial_value_.present(true); // Set as preset if (strcmp(element->Name(), "exponent") != 0) initial_value_.set(boost::lexical_cast(init_value_str)); else { diff --git a/tests/coder_test.cpp b/tests/coder_test.cpp index f9c0d5e..d1be894 100644 --- a/tests/coder_test.cpp +++ b/tests/coder_test.cpp @@ -425,3 +425,26 @@ TEST_CASE("test fast coder without code generation for a simple template with co REQUIRE(test_case.encoding(msg_ref, "\xa0\x80")); REQUIRE(test_case.decoding("\xa0\x80", msg_ref)); } + +TEST_CASE("test fast coder without code generation for a simple template with default decimal","[manual_reset_test]") +{ + fast_coding_test_case test_case ( + "\n" + "\n" + "\n" + "\n"); + + debug_allocator alloc; + message_type msg(&alloc, test_case.template_with_id(1)); + message_mref msg_ref = msg.mref(); + + //msg_ref[0].as(8); + msg_ref[1].as(2); + + REQUIRE(test_case.encoding(msg_ref, "\xa0\x80\x88\x82")); + REQUIRE(test_case.decoding("\xa0\x80\x88\x82", msg_ref)); +} \ No newline at end of file From 850097713bccab2bb6ca2a6c16b0dffad264b88a Mon Sep 17 00:00:00 2001 From: pcbk Date: Wed, 10 Nov 2021 18:36:14 +0100 Subject: [PATCH 6/6] issue 109 removed unused testcase --- tests/coder_test.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/tests/coder_test.cpp b/tests/coder_test.cpp index d1be894..f9c0d5e 100644 --- a/tests/coder_test.cpp +++ b/tests/coder_test.cpp @@ -425,26 +425,3 @@ TEST_CASE("test fast coder without code generation for a simple template with co REQUIRE(test_case.encoding(msg_ref, "\xa0\x80")); REQUIRE(test_case.decoding("\xa0\x80", msg_ref)); } - -TEST_CASE("test fast coder without code generation for a simple template with default decimal","[manual_reset_test]") -{ - fast_coding_test_case test_case ( - "\n" - "\n" - "\n" - "\n"); - - debug_allocator alloc; - message_type msg(&alloc, test_case.template_with_id(1)); - message_mref msg_ref = msg.mref(); - - //msg_ref[0].as(8); - msg_ref[1].as(2); - - REQUIRE(test_case.encoding(msg_ref, "\xa0\x80\x88\x82")); - REQUIRE(test_case.decoding("\xa0\x80\x88\x82", msg_ref)); -} \ No newline at end of file