Skip to content

Commit 248eba4

Browse files
committed
[C++] gate constexpr char-constant accessor on c++14
1 parent 3eb1ac3 commit 248eba4

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,12 +2630,19 @@ private void generateConstPropertyMethods(
26302630
values);
26312631

26322632
sb.append(String.format("\n" +
2633+
indent + " #if __cplusplus >= 201402L\n" +
2634+
indent + " SBE_NODISCARD static SBE_CONSTEXPR %1$s %2$s(const std::uint64_t index) SBE_NOEXCEPT\n" +
2635+
indent + " {\n" +
2636+
indent + " const std::uint8_t %2$sValues[] = { %3$s, 0 };\n\n" +
2637+
indent + " return (char)%2$sValues[index];\n" +
2638+
indent + " }\n" +
2639+
indent + " #else\n" +
26332640
indent + " SBE_NODISCARD %1$s %2$s(const std::uint64_t index) const\n" +
26342641
indent + " {\n" +
26352642
indent + " static const std::uint8_t %2$sValues[] = { %3$s, 0 };\n\n" +
2636-
26372643
indent + " return (char)%2$sValues[index];\n" +
2638-
indent + " }\n",
2644+
indent + " }\n" +
2645+
indent + " #endif\n",
26392646
cppTypeName,
26402647
propertyName,
26412648
values));

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/cpp/CppGeneratorTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,33 @@ void shouldUseConstexprWhenInitializingSemanticVersion() throws Exception
7575
}
7676
}
7777

78+
@Test
79+
void shouldGenerateConstexprConstantCharAccessorOnlyForCpp14AndLater() throws Exception
80+
{
81+
try (InputStream in = Tests.getLocalResource("code-generation-schema.xml"))
82+
{
83+
final ParserOptions options = ParserOptions.builder().stopOnError(true).build();
84+
final MessageSchema schema = parse(in, options);
85+
final IrGenerator irg = new IrGenerator();
86+
final Ir ir = irg.generate(schema);
87+
final StringWriterOutputManager outputManager = new StringWriterOutputManager();
88+
outputManager.setPackageName(ir.applicableNamespace());
89+
90+
final CppGenerator generator = new CppGenerator(ir, false, outputManager);
91+
generator.generate();
92+
93+
final String source = outputManager.getSource("code.generation.test.Engine").toString();
94+
assertThat(source, containsString("#if __cplusplus >= 201402L"));
95+
assertThat(source, containsString(
96+
"SBE_NODISCARD static SBE_CONSTEXPR char fuel(const std::uint64_t index) SBE_NOEXCEPT"));
97+
assertThat(source, containsString("const std::uint8_t fuelValues[] = { 80, 101, 116, 114, 111, 108, 0 };"));
98+
assertThat(source, containsString("#else"));
99+
assertThat(source, containsString("SBE_NODISCARD char fuel(const std::uint64_t index) const"));
100+
assertThat(source, containsString(
101+
"static const std::uint8_t fuelValues[] = { 80, 101, 116, 114, 111, 108, 0 };"));
102+
}
103+
}
104+
78105
@Test
79106
void dtosShouldReferenceTypesInDifferentPackages() throws Exception
80107
{

0 commit comments

Comments
 (0)