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/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(); } 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: 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)); +}