From 5704e8e02dee08df6bf0330f8f50aa4435620c40 Mon Sep 17 00:00:00 2001 From: Dmitry Vyazelenko <696855+vyazelenko@users.noreply.github.com> Date: Fri, 18 Dec 2020 15:32:41 +0100 Subject: [PATCH 1/3] [C++] Use generated literal as the constant one to be shifted in the bitset code. --- .../sbe/generation/cpp/CppGenerator.java | 29 ++++++---- .../sbe/generation/cpp/CppGeneratorTest.java | 58 +++++++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java index aee24d877c..d293b826df 100755 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java @@ -822,29 +822,32 @@ private CharSequence generateChoices(final String bitsetClassName, final List { final String choiceName = formatPropertyName(token.name()); - final String typeName = cppTypeName(token.encoding().primitiveType()); + final PrimitiveType type = token.encoding().primitiveType(); + final String typeName = cppTypeName(type); final String choiceBitPosition = token.encoding().constValue().toString(); - final String byteOrderStr = formatByteOrderEncoding( - token.encoding().byteOrder(), token.encoding().primitiveType()); + final String byteOrderStr = formatByteOrderEncoding(token.encoding().byteOrder(), type); + final CharSequence constantOne = generateLiteral(type, "1"); new Formatter(sb).format("\n" + " static bool %1$s(const %2$s bits)\n" + " {\n" + - " return (bits & (1u << %3$su)) != 0;\n" + + " return (bits & (%4$s << %3$su)) != 0;\n" + " }\n", choiceName, typeName, - choiceBitPosition); + choiceBitPosition, + constantOne); new Formatter(sb).format("\n" + " static %2$s %1$s(const %2$s bits, const bool value)\n" + " {\n" + " return value ?" + - " static_cast<%2$s>(bits | (1u << %3$su)) : static_cast<%2$s>(bits & ~(1u << %3$su));\n" + + " static_cast<%2$s>(bits | (%4$s << %3$su)) : static_cast<%2$s>(bits & ~(%4$s << %3$su));\n" + " }\n", choiceName, typeName, - choiceBitPosition); + choiceBitPosition, + constantOne); new Formatter(sb).format("\n" + " SBE_NODISCARD bool %1$s() const\n" + @@ -852,13 +855,14 @@ private CharSequence generateChoices(final String bitsetClassName, final List(%4$s(bits) | (1u << %5$su)) " + - ": static_cast<%3$s>(%4$s(bits) & ~(1u << %5$su)));\n" + + " static_cast<%3$s>(%4$s(bits) | (%6$s << %5$su)) " + + ": static_cast<%3$s>(%4$s(bits) & ~(%6$s << %5$su)));\n" + " std::memcpy(m_buffer + m_offset, &bits, sizeof(%3$s));\n" + " return *this;\n" + " }\n", @@ -875,7 +879,8 @@ private CharSequence generateChoices(final String bitsetClassName, final List(1) << ")); + } +} From 1e27aa70d79ffe4c27836948089a87d085eafa4b Mon Sep 17 00:00:00 2001 From: Dmitry Vyazelenko <696855+vyazelenko@users.noreply.github.com> Date: Fri, 18 Dec 2020 15:42:17 +0100 Subject: [PATCH 2/3] [C++] Add dedicated test. --- .../sbe/generation/cpp/CppGeneratorTest.java | 22 ++++++----------- sbe-tool/src/test/resources/issue827.xml | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 sbe-tool/src/test/resources/issue827.xml diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java index bbbef33b07..3177481356 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java @@ -16,7 +16,6 @@ package uk.co.real_logic.sbe.generation.cpp; import org.agrona.generation.StringWriterOutputManager; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.co.real_logic.sbe.Tests; import uk.co.real_logic.sbe.ir.Ir; @@ -30,29 +29,22 @@ public class CppGeneratorTest { - private final StringWriterOutputManager outputManager = new StringWriterOutputManager(); - private Ir ir; - - @BeforeEach - public void setUp() throws Exception + @Test + public void shouldUseGeneratedLiteralForConstantOneWhenGeneratingBitsetCode() throws Exception { final ParserOptions options = ParserOptions.builder().stopOnError(true).build(); - final MessageSchema schema = parse(Tests.getLocalResource("code-generation-schema.xml"), options); + final MessageSchema schema = parse(Tests.getLocalResource("issue827.xml"), options); final IrGenerator irg = new IrGenerator(); - ir = irg.generate(schema); - + final Ir ir = irg.generate(schema); + final StringWriterOutputManager outputManager = new StringWriterOutputManager(); outputManager.clear(); outputManager.setPackageName(ir.applicableNamespace()); - } - @Test - public void shouldUseGeneratedLiteralForConstantOneWhenGeneratingBitsetCode() throws Exception - { final CppGenerator generator = new CppGenerator(ir, outputManager); generator.generate(); - final String source = outputManager.getSource("code.generation.test.OptionalExtras").toString(); + final String source = outputManager.getSource("issue827.FlagsSet").toString(); assertFalse(source.contains("1u << ")); - assertTrue(source.contains("static_cast(1) << ")); + assertTrue(source.contains("UINT64_C(0x1) << ")); } } diff --git a/sbe-tool/src/test/resources/issue827.xml b/sbe-tool/src/test/resources/issue827.xml new file mode 100644 index 0000000000..07db19475e --- /dev/null +++ b/sbe-tool/src/test/resources/issue827.xml @@ -0,0 +1,24 @@ + + + + + 0 + 35 + + + + + + + + + + + + From 10ee386c870e84642729f3df655dcb5fce2414a0 Mon Sep 17 00:00:00 2001 From: Dmitry Vyazelenko <696855+vyazelenko@users.noreply.github.com> Date: Fri, 18 Dec 2020 15:42:33 +0100 Subject: [PATCH 3/3] [C++] Simplfiy test. --- .../uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java index 3177481356..95902bc6d9 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java @@ -37,7 +37,6 @@ public void shouldUseGeneratedLiteralForConstantOneWhenGeneratingBitsetCode() th final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); final StringWriterOutputManager outputManager = new StringWriterOutputManager(); - outputManager.clear(); outputManager.setPackageName(ir.applicableNamespace()); final CppGenerator generator = new CppGenerator(ir, outputManager);