Skip to content

Commit 917e4e3

Browse files
Merge pull request #161 from martinfantini/initial_vaLue_enum_set
Correct initial value for the default case
2 parents 5f49c52 + 581e0ce commit 917e4e3

File tree

10 files changed

+177
-9
lines changed

10 files changed

+177
-9
lines changed

src/fast_type_gen/cpp_gen.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,8 @@ void cpp_gen::visit(const mfast::enum_field_instruction *inst, void *pIndex) {
635635

636636
std::string context = gen_op_context(inst->name(), inst->op_context());
637637

638+
const mfast::value_storage &init_value = inst->initial_value();
639+
638640
out_ << "const static " << instruction_type.str() << "\n"
639641
<< instruction_variable_name << "(\n"
640642
<< " " << get_operator_name(inst) << ",\n"
@@ -643,8 +645,12 @@ void cpp_gen::visit(const mfast::enum_field_instruction *inst, void *pIndex) {
643645
<< " \"" << inst->name() << "\", // name\n"
644646
<< " \"" << inst->ns() << "\", // ns\n"
645647
<< " " << context << ", // opContext\n"
646-
<< " int_value_storage<uint64_t>("
647-
<< inst->initial_value().get<uint64_t>() << "), // initial_value\n"
648+
<< " int_value_storage<uint64_t>(";
649+
650+
if (!init_value.is_empty())
651+
out_ << init_value.get<uint64_t>();
652+
653+
out_ << "), // initial_value\n"
648654
<< " " << elements_variable_name.str() << ", // element names\n"
649655
<< " " << values_variable_name << ", // element values\n"
650656
<< " " << num_elements_name.str() << ",// num elements\n"
@@ -702,6 +708,9 @@ void cpp_gen::visit(const mfast::set_field_instruction *inst, void *pIndex)
702708
out_ << "};\n";
703709
}
704710
std::string context = gen_op_context(inst->name(), inst->op_context());
711+
712+
const mfast::value_storage &init_value = inst->initial_value();
713+
705714
out_ << "const static " << instruction_type.str() << "\n"
706715
<< instruction_variable_name << "(\n"
707716
<< " " << get_operator_name(inst) << ",\n"
@@ -710,8 +719,12 @@ void cpp_gen::visit(const mfast::set_field_instruction *inst, void *pIndex)
710719
<< " \"" << inst->name() << "\", // name\n"
711720
<< " \"" << inst->ns() << "\", // ns\n"
712721
<< " " << context << ", // opContext\n"
713-
<< " int_value_storage<uint64_t>("
714-
<< inst->initial_value().get<uint64_t>() << "), // initial_value\n"
722+
<< " int_value_storage<uint64_t>(";
723+
724+
if (!init_value.is_empty())
725+
out_ << init_value.get<uint64_t>();
726+
727+
out_ << "), // initial_value\n"
715728
<< " " << elements_variable_name.str() << ", // element names\n"
716729
<< " " << num_elements_name.str() << ",// num elements\n"
717730
<< " nullptr, // ref_instruction\n"

src/mfast/xml_parser/templates_builder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ templates_builder::templates_builder(dynamic_templates_description *definition,
3535
instructions_view_t(nullptr, 0), nullptr, nullptr,
3636
&length_instruction_prototype, "", "", cpp_ns_),
3737
enum_field_instruction_prototype_(operator_none, presence_mandatory, 0,
38-
nullptr, "", nullptr, 0, nullptr,
38+
nullptr, "", nullptr, int_value_storage<uint64_t>(), nullptr,
3939
nullptr, 0, nullptr, cpp_ns_),
4040
set_field_instruction_prototype_(operator_none, presence_mandatory, 0,
41-
nullptr, "", nullptr, 0, nullptr,
41+
nullptr, "", nullptr, int_value_storage<uint64_t>(), nullptr,
4242
0, nullptr, cpp_ns_) {
4343
static const int32_field_instruction int32_field_instruction_prototype(
4444
operator_none, presence_mandatory, 0, nullptr, "", nullptr,

tests/enum_encoder_decoder.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,33 @@ TEST_CASE("enum test copy encoder/decoder","[enum_copy_encoder_decoder]")
2727
REQUIRE(test_case.encoding(test_3.cref(),"\xE0\x83\x83",true));
2828
REQUIRE(test_case.decoding("\xE0\x83\x83",test_3.cref(),true));
2929
}
30+
31+
TEST_CASE("optional value present in enum with default encoder/decoder","[optional_preset_enum_default_encoder_decoder]")
32+
{
33+
fast_test_coding_case<simple16::templates_description> test_case;
34+
simple16::Test_4 test_4;
35+
simple16::Test_4_mref test_4_mref = test_4.mref();
36+
test_4_mref.set_discrete().as_Three();
37+
REQUIRE(test_4.cref().get_discrete().present());
38+
// \xE0 : 1110 : OK
39+
// 1 : Stop Bit.
40+
// 1 : Set Template Id.
41+
// 1 : Set Field discrete
42+
// 0 : Not used
43+
REQUIRE(test_case.encoding(test_4.cref(),"\xE0\x84\x84", true));
44+
REQUIRE(test_case.decoding("\xE0\x84\x84",test_4.cref(), true));
45+
}
46+
47+
TEST_CASE("optional value not present in enum with default encoder/decoder","[optional_preset_enum_default_encoder_decoder]")
48+
{
49+
fast_test_coding_case<simple16::templates_description> test_case;
50+
simple16::Test_4 test_4;
51+
REQUIRE(!test_4.cref().get_discrete().present());
52+
// \xC0 : 1100 : OK
53+
// 1 : Stop Bit.
54+
// 1 : Set Template Id.
55+
// 0 : Not Set Field discrete
56+
// 0 : Not used
57+
REQUIRE(test_case.encoding(test_4.cref(),"\xC0\x84", true));
58+
REQUIRE(test_case.decoding("\xC0\x84",test_4.cref(), true));
59+
}

tests/enum_encoder_decoder_v2.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,22 @@ TEST_CASE("enum test copy encoder_V2/decoder_v2","[enum_copy_encoder_v2_decoder_
2727
REQUIRE(test_case.encoding(test_3.cref(),"\xE0\x83\x83",true));
2828
REQUIRE(test_case.decoding("\xE0\x83\x83",test_3.cref(),true));
2929
}
30+
31+
TEST_CASE("optional value present in enum with default encoder_V2/decoder_v2","[optional_preset_enum_default_encoder_v2_decoder_v2]")
32+
{
33+
fast_test_coding_case_v2<simple16::templates_description> test_case;
34+
simple16::Test_4 test_4;
35+
simple16::Test_4_mref test_4_mref = test_4.mref();
36+
test_4_mref.set_discrete().as_Three();
37+
REQUIRE(test_case.encoding(test_4.cref(),"\xE0\x84\x84", true));
38+
REQUIRE(test_case.decoding("\xE0\x84\x84",test_4.cref(), true));
39+
}
40+
41+
TEST_CASE("optional value not present in enum with default encoder_V2/decoder_v2","[optional_preset_enum_default_encoder_v2_decoder_v2]")
42+
{
43+
fast_test_coding_case_v2<simple16::templates_description> test_case;
44+
simple16::Test_4 test_4;
45+
REQUIRE(!test_4.cref().get_discrete().present());
46+
REQUIRE(test_case.encoding(test_4.cref(),"\xC0\x84", true));
47+
REQUIRE(test_case.decoding("\xC0\x84",test_4.cref(), true));
48+
}

tests/set_encoder_decoder.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,29 @@ TEST_CASE("set encoder/decoder","[set_encoder_decoder]")
2323
REQUIRE(test_case.encoding(test_1.cref(),"\xF0\x81\x8A\x94",true));
2424
REQUIRE(test_case.decoding("\xF0\x81\x8A\x94",test_1.cref(),true));
2525
}
26+
27+
TEST_CASE("set optional field encoder/decoder","[set_optional_encoder_decoder]")
28+
{
29+
SECTION("optional field present")
30+
{
31+
fast_test_coding_case<simple19::templates_description> test_case;
32+
simple19::Test_3 test_3;
33+
simple19::Test_3_mref test_3_mref = test_3.mref();
34+
test_3_mref.set_field3().as(10);
35+
test_3_mref.set_TradeCondition().set_VolumeOnly();
36+
REQUIRE(test_3.cref().get_TradeCondition().present());
37+
REQUIRE(test_case.encoding(test_3.cref(), "\xF0\x83\x8A\x02\x81", true));
38+
REQUIRE(test_case.decoding("\xF0\x83\x8A\x02\x81", test_3.cref(), true));
39+
}
40+
41+
SECTION("optional field not present")
42+
{
43+
fast_test_coding_case<simple19::templates_description> test_case;
44+
simple19::Test_3 test_3;
45+
simple19::Test_3_mref test_3_mref = test_3.mref();
46+
test_3_mref.set_field3().as(10);
47+
REQUIRE(!test_3.cref().get_TradeCondition().present());
48+
REQUIRE(test_case.encoding(test_3.cref(), "\xE0\x83\x8A", true));
49+
REQUIRE(test_case.decoding("\xE0\x83\x8A", test_3.cref(), true));
50+
}
51+
}

tests/set_encoder_decoder_v2.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,29 @@ TEST_CASE("set encoder_V2/decoder_v2","[set_encoder_v2_decoder_v2]")
2323
REQUIRE(test_case.encoding(test_1.cref(),"\xF0\x81\x8A\x94",true));
2424
REQUIRE(test_case.decoding("\xF0\x81\x8A\x94",test_1.cref(),true));
2525
}
26+
27+
TEST_CASE("set optional field encoder_V2/decoder_v2","[set_optional_encoder_v2_decoder_v2]")
28+
{
29+
SECTION("optional field present")
30+
{
31+
fast_test_coding_case_v2<simple19::templates_description> test_case;
32+
simple19::Test_3 test_3;
33+
simple19::Test_3_mref test_3_mref = test_3.mref();
34+
test_3_mref.set_field3().as(10);
35+
test_3_mref.set_TradeCondition().set_VolumeOnly();
36+
REQUIRE(test_3.cref().get_TradeCondition().present());
37+
REQUIRE(test_case.encoding(test_3.cref(), "\xF0\x83\x8A\x02\x81", true));
38+
REQUIRE(test_case.decoding("\xF0\x83\x8A\x02\x81", test_3.cref(), true));
39+
}
40+
41+
SECTION("optional field not present")
42+
{
43+
fast_test_coding_case_v2<simple19::templates_description> test_case;
44+
simple19::Test_3 test_3;
45+
simple19::Test_3_mref test_3_mref = test_3.mref();
46+
test_3_mref.set_field3().as(10);
47+
REQUIRE(!test_3.cref().get_TradeCondition().present());
48+
REQUIRE(test_case.encoding(test_3.cref(), "\xE0\x83\x8A", true));
49+
REQUIRE(test_case.decoding("\xE0\x83\x8A", test_3.cref(), true));
50+
}
51+
}

tests/simple16.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@
2222
<string name="MsgType" id="35"><constant value="HP"/></string>
2323
<field name="discrete" id="2477"><type name="DiscreteEnum"><copy/></type></field>
2424
</template>
25+
<template name="Test_4" id="4">
26+
<string name="MsgType" id="35"><constant value="HP"/></string>
27+
<field name="discrete" id="2477"><type name="DiscreteEnum" presence="optional"><default/></type></field>
28+
</template>
2529
</templates>

tests/simple18.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,8 @@
2727
<string name="MsgType" id="36"><constant value="DQ"/></string>
2828
<field name="MDStatisticIntervalUnit" id="2467"><type name="TypeUnit"><default value="3"/></type></field>
2929
</template>
30-
</templates>
30+
<template name="Test_3" id="3">
31+
<string name="MsgType" id="36"><constant value="EQ"/></string>
32+
<field name="MDStatisticIntervalUnit" id="2467" presence="optional"><type name="TypeUnit"><default/></type></field>
33+
</template>
34+
</templates>

tests/xetra_enum_encoder_decoder.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,27 @@ TEST_CASE("xetra enum test encoder/decoder","[xetra_enum_encoder_decoder]")
4040
REQUIRE(test_case.encoding(test_1.cref(),"\xe0\x81\x81\x83",true));
4141
REQUIRE(test_case.decoding("\xe0\x81\x81\x83",test_1.cref(),true));
4242
}
43-
}
43+
}
44+
45+
TEST_CASE("xetra enum optional test encoder/decoder","[xetra_enum_encoder_decoder]")
46+
{
47+
SECTION("enum optional present")
48+
{
49+
fast_test_coding_case<simple18::templates_description> test_case;
50+
simple18::Test_3 test_3;
51+
simple18::Test_3_mref test_3_mref = test_3.mref();
52+
test_3_mref.set_MDStatisticIntervalUnit().as_MilliSeconds();
53+
REQUIRE(test_3.cref().get_MDStatisticIntervalUnit().present());
54+
REQUIRE(test_case.encoding(test_3.cref(), "\xE0\x83\x82", true));
55+
REQUIRE(test_case.decoding("\xE0\x83\x82", test_3.cref(), true));
56+
}
57+
58+
SECTION("enum optional not present")
59+
{
60+
fast_test_coding_case<simple18::templates_description> test_case;
61+
simple18::Test_3 test_3;
62+
REQUIRE(!test_3.cref().get_MDStatisticIntervalUnit().present());
63+
REQUIRE(test_case.encoding(test_3.cref(), "\xC0\x83", true));
64+
REQUIRE(test_case.decoding("\xC0\x83", test_3.cref(), true));
65+
}
66+
}

tests/xetra_enum_encoder_decoder_v2.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,27 @@ TEST_CASE("xetra enum test encoder_V2/decoder_v2","[xetra_enum_encoder_v2_decode
4040
REQUIRE(test_case.encoding(test_1.cref(),"\xe0\x81\x81\x83",true));
4141
REQUIRE(test_case.decoding("\xe0\x81\x81\x83",test_1.cref(),true));
4242
}
43-
}
43+
}
44+
45+
TEST_CASE("xetra enum optional test encoder_V2/decoder_v2","[xetra_enum_optional_encoder_v2_decoder_v2]")
46+
{
47+
SECTION("enum optional present")
48+
{
49+
fast_test_coding_case_v2<simple18::templates_description> test_case;
50+
simple18::Test_3 test_3;
51+
simple18::Test_3_mref test_3_mref = test_3.mref();
52+
test_3_mref.set_MDStatisticIntervalUnit().as_MilliSeconds();
53+
REQUIRE(test_3.cref().get_MDStatisticIntervalUnit().present());
54+
REQUIRE(test_case.encoding(test_3.cref(), "\xE0\x83\x82", true));
55+
REQUIRE(test_case.decoding("\xE0\x83\x82", test_3.cref(), true));
56+
}
57+
58+
SECTION("enum optional not present")
59+
{
60+
fast_test_coding_case_v2<simple18::templates_description> test_case;
61+
simple18::Test_3 test_3;
62+
REQUIRE(!test_3.cref().get_MDStatisticIntervalUnit().present());
63+
REQUIRE(test_case.encoding(test_3.cref(), "\xC0\x83", true));
64+
REQUIRE(test_case.decoding("\xC0\x83", test_3.cref(), true));
65+
}
66+
}

0 commit comments

Comments
 (0)