Skip to content

Commit 2841f62

Browse files
authored
Merge pull request #650 from denizevrenci/simplify_cpp_generator
Simplifications and improvements on C++ generator
2 parents 47ab746 + 12cdd13 commit 2841f62

File tree

1 file changed

+73
-65
lines changed

1 file changed

+73
-65
lines changed

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

Lines changed: 73 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ private static void generateGroupClassHeader(
203203
indent + " std::uint64_t m_offset;\n" +
204204
indent + " std::uint64_t m_actingVersion;\n" +
205205
indent + " %2$s m_dimensions;\n\n" +
206+
indent + " std::uint64_t *sbePositionPtr() SBE_NOEXCEPT\n" +
207+
indent + " {\n" +
208+
indent + " return m_positionPtr;\n" +
209+
indent + " }\n\n" +
206210
indent + "public:\n",
207211
formatClassName(groupName), dimensionsClassName));
208212

@@ -269,13 +273,17 @@ private static void generateGroupClassHeader(
269273
indent + " {\n" +
270274
indent + " return *m_positionPtr;\n" +
271275
indent + " }\n\n" +
272-
indent + " void sbePosition(const std::uint64_t position)\n" +
276+
indent + " std::uint64_t sbeCheckPosition(const std::uint64_t position)\n" +
273277
indent + " {\n" +
274278
indent + " if (SBE_BOUNDS_CHECK_EXPECT((position > m_bufferLength), false))\n" +
275279
indent + " {\n" +
276-
indent + " throw std::runtime_error(\"buffer too short [E100]\");\n" +
280+
indent + " throw std::runtime_error(\"buffer too short [E100]\");\n" +
277281
indent + " }\n" +
278-
indent + " *m_positionPtr = position;\n" +
282+
indent + " return position;\n" +
283+
indent + " }\n\n" +
284+
indent + " void sbePosition(const std::uint64_t position)\n" +
285+
indent + " {\n" +
286+
indent + " *m_positionPtr = sbeCheckPosition(position);\n" +
279287
indent + " }\n\n" +
280288
indent + " inline std::uint64_t count() const SBE_NOEXCEPT\n" +
281289
indent + " {\n" +
@@ -346,7 +354,7 @@ private static CharSequence generateGroupProperty(
346354
sb.append(String.format("\n" +
347355
indent + " inline %1$s &%2$s()\n" +
348356
indent + " {\n" +
349-
indent + " m_%2$s.wrapForDecode(m_buffer, m_positionPtr, m_actingVersion, m_bufferLength);\n" +
357+
indent + " m_%2$s.wrapForDecode(m_buffer, sbePositionPtr(), m_actingVersion, m_bufferLength);\n" +
350358
indent + " return m_%2$s;\n" +
351359
indent + " }\n",
352360
className,
@@ -356,7 +364,7 @@ private static CharSequence generateGroupProperty(
356364
indent + " %1$s &%2$sCount(const %3$s count)\n" +
357365
indent + " {\n" +
358366
indent + " m_%2$s.wrapForEncode(" +
359-
"m_buffer, count, m_positionPtr, m_actingVersion, m_bufferLength);\n" +
367+
"m_buffer, count, sbePositionPtr(), m_actingVersion, m_bufferLength);\n" +
360368
indent + " return m_%2$s;\n" +
361369
indent + " }\n",
362370
className,
@@ -1514,18 +1522,6 @@ private CharSequence generateFixedFlyweightCode(final String className, final in
15141522
" std::uint64_t m_bufferLength;\n" +
15151523
" std::uint64_t m_offset = 0;\n" +
15161524
" std::uint64_t m_actingVersion;\n\n" +
1517-
" inline void reset(char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength," +
1518-
" const std::uint64_t actingVersion)\n" +
1519-
" {\n" +
1520-
" if (SBE_BOUNDS_CHECK_EXPECT(((offset + %2$s) > bufferLength), false))\n" +
1521-
" {\n" +
1522-
" throw std::runtime_error(\"buffer too short for flyweight [E107]\");\n" +
1523-
" }\n\n" +
1524-
" m_buffer = buffer;\n" +
1525-
" m_bufferLength = bufferLength;\n" +
1526-
" m_offset = offset;\n" +
1527-
" m_actingVersion = actingVersion;\n" +
1528-
" }\n\n" +
15291525
"public:\n" +
15301526
" enum MetaAttribute\n" +
15311527
" {\n" +
@@ -1542,15 +1538,38 @@ private CharSequence generateFixedFlyweightCode(final String className, final in
15421538
" std::uint64_t uint_value;\n" +
15431539
" };\n\n" +
15441540
" %1$s() = default;\n\n" +
1545-
" %1$s(char *buffer, const std::uint64_t bufferLength, const std::uint64_t actingVersion)\n" +
1541+
" %1$s(\n" +
1542+
" char *buffer,\n" +
1543+
" const std::uint64_t offset,\n" +
1544+
" const std::uint64_t bufferLength,\n" +
1545+
" const std::uint64_t actingVersion) :\n" +
1546+
" m_buffer(buffer),\n" +
1547+
" m_bufferLength(bufferLength),\n" +
1548+
" m_offset(offset),\n" +
1549+
" m_actingVersion(actingVersion)\n" +
1550+
" {\n" +
1551+
" if (SBE_BOUNDS_CHECK_EXPECT(((m_offset + %2$s) > m_bufferLength), false))\n" +
1552+
" {\n" +
1553+
" throw std::runtime_error(\"buffer too short for flyweight [E107]\");\n" +
1554+
" }\n" +
1555+
" }\n\n" +
1556+
" %1$s(\n" +
1557+
" char *buffer,\n" +
1558+
" const std::uint64_t bufferLength,\n" +
1559+
" const std::uint64_t actingVersion) :\n" +
1560+
" %1$s(buffer, 0, bufferLength, actingVersion)\n" +
1561+
" {\n" +
1562+
" }\n\n" +
1563+
" %1$s(\n" +
1564+
" char *buffer,\n" +
1565+
" const std::uint64_t bufferLength) :\n" +
1566+
" %1$s(buffer, 0, bufferLength, sbeSchemaVersion())\n" +
15461567
" {\n" +
1547-
" reset(buffer, 0, bufferLength, actingVersion);\n" +
15481568
" }\n\n" +
15491569
" %1$s &wrap(char *buffer, const std::uint64_t offset, const std::uint64_t actingVersion," +
15501570
" const std::uint64_t bufferLength)\n" +
15511571
" {\n" +
1552-
" reset(buffer, offset, bufferLength, actingVersion);\n" +
1553-
" return *this;\n" +
1572+
" return *this = %1$s(buffer, offset, bufferLength, actingVersion);\n" +
15541573
" }\n\n" +
15551574
" static SBE_CONSTEXPR std::uint64_t encodedLength() SBE_NOEXCEPT\n" +
15561575
" {\n" +
@@ -1592,23 +1611,27 @@ private static CharSequence generateConstructorsAndOperators(final String classN
15921611
{
15931612
return String.format(
15941613
" %1$s() = default;\n\n" +
1595-
" %1$s(char *buffer, const std::uint64_t bufferLength)\n" +
1596-
" {\n" +
1597-
" reset(buffer, 0, bufferLength, sbeBlockLength(), sbeSchemaVersion());\n" +
1598-
" }\n\n" +
1599-
" %1$s(char *buffer, const std::uint64_t bufferLength, const std::uint64_t actingBlockLength," +
1600-
" const std::uint64_t actingVersion)\n" +
1614+
" %1$s(\n" +
1615+
" char *buffer,\n" +
1616+
" const std::uint64_t offset,\n" +
1617+
" const std::uint64_t bufferLength,\n" +
1618+
" const std::uint64_t actingBlockLength,\n" +
1619+
" const std::uint64_t actingVersion) :\n" +
1620+
" m_buffer(buffer),\n" +
1621+
" m_bufferLength(bufferLength),\n" +
1622+
" m_offset(offset),\n" +
1623+
" m_position(sbeCheckPosition(offset + actingBlockLength)),\n" +
1624+
" m_actingVersion(actingVersion)\n" +
16011625
" {\n" +
1602-
" reset(buffer, 0, bufferLength, actingBlockLength, actingVersion);\n" +
16031626
" }\n\n" +
1604-
" %1$s(const %1$s& codec) SBE_NOEXCEPT\n" +
1627+
" %1$s(char *buffer, const std::uint64_t bufferLength) :\n" +
1628+
" %1$s(buffer, 0, bufferLength, sbeBlockLength(), sbeSchemaVersion())\n" +
16051629
" {\n" +
1606-
" reset(codec);\n" +
16071630
" }\n\n" +
1608-
" %1$s& operator=(const %1$s& codec) SBE_NOEXCEPT\n" +
1631+
" %1$s(char *buffer, const std::uint64_t bufferLength, const std::uint64_t actingBlockLength," +
1632+
" const std::uint64_t actingVersion) :\n" +
1633+
" %1$s(buffer, 0, bufferLength, actingBlockLength, actingVersion)\n" +
16091634
" {\n" +
1610-
" reset(codec);\n" +
1611-
" return *this;\n" +
16121635
" }\n\n",
16131636
className);
16141637
}
@@ -1625,32 +1648,12 @@ private CharSequence generateMessageFlyweightCode(final String className, final
16251648
"private:\n" +
16261649
" char *m_buffer = nullptr;\n" +
16271650
" std::uint64_t m_bufferLength = 0;\n" +
1628-
" std::uint64_t *m_positionPtr;\n" +
16291651
" std::uint64_t m_offset = 0;\n" +
16301652
" std::uint64_t m_position;\n" +
1631-
" std::uint64_t m_actingBlockLength;\n" +
16321653
" std::uint64_t m_actingVersion;\n\n" +
1633-
" inline void reset(\n" +
1634-
" char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength,\n" +
1635-
" const std::uint64_t actingBlockLength, const std::uint64_t actingVersion)\n" +
1636-
" {\n" +
1637-
" m_buffer = buffer;\n" +
1638-
" m_offset = offset;\n" +
1639-
" m_bufferLength = bufferLength;\n" +
1640-
" m_actingBlockLength = actingBlockLength;\n" +
1641-
" m_actingVersion = actingVersion;\n" +
1642-
" m_positionPtr = &m_position;\n" +
1643-
" sbePosition(offset + m_actingBlockLength);\n" +
1644-
" }\n\n" +
1645-
" inline void reset(const %10$s& codec) SBE_NOEXCEPT\n" +
1654+
" inline std::uint64_t *sbePositionPtr() SBE_NOEXCEPT\n" +
16461655
" {\n" +
1647-
" m_buffer = codec.m_buffer;\n" +
1648-
" m_offset = codec.m_offset;\n" +
1649-
" m_bufferLength = codec.m_bufferLength;\n" +
1650-
" m_actingBlockLength = codec.m_actingBlockLength;\n" +
1651-
" m_actingVersion = codec.m_actingVersion;\n" +
1652-
" m_positionPtr = &m_position;\n" +
1653-
" m_position = codec.m_position;\n" +
1656+
" return &m_position;\n" +
16541657
" }\n\n" +
16551658
"public:\n\n" +
16561659
" enum MetaAttribute\n" +
@@ -1694,10 +1697,9 @@ private CharSequence generateMessageFlyweightCode(final String className, final
16941697
" }\n\n" +
16951698
" %10$s &wrapForEncode(char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength)\n" +
16961699
" {\n" +
1697-
" reset(buffer, offset, bufferLength, sbeBlockLength(), sbeSchemaVersion());\n" +
1698-
" return *this;\n" +
1700+
" return *this = %10$s(buffer, offset, bufferLength, sbeBlockLength(), sbeSchemaVersion());\n" +
16991701
" }\n\n" +
1700-
" %10$s &wrapAndApplyHeader( " +
1702+
" %10$s &wrapAndApplyHeader(" +
17011703
"char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength)\n" +
17021704
" {\n" +
17031705
" MessageHeader hdr(buffer + offset, bufferLength, sbeSchemaVersion());\n\n" +
@@ -1706,28 +1708,34 @@ private CharSequence generateMessageFlyweightCode(final String className, final
17061708
" .templateId(sbeTemplateId())\n" +
17071709
" .schemaId(sbeSchemaId())\n" +
17081710
" .version(sbeSchemaVersion());\n\n" +
1709-
" reset(buffer + offset + MessageHeader::encodedLength(), 0, bufferLength, sbeBlockLength(), " +
1710-
"sbeSchemaVersion());\n" +
1711-
" return *this;\n" +
1711+
" return *this = %10$s(\n" +
1712+
" buffer + offset + MessageHeader::encodedLength(),\n" +
1713+
" 0,\n" +
1714+
" bufferLength - MessageHeader::encodedLength(),\n" +
1715+
" sbeBlockLength()\n," +
1716+
" sbeSchemaVersion());\n" +
17121717
" }\n\n" +
17131718
" %10$s &wrapForDecode(\n" +
17141719
" char *buffer, const std::uint64_t offset, const std::uint64_t actingBlockLength,\n" +
17151720
" const std::uint64_t actingVersion, const std::uint64_t bufferLength)\n" +
17161721
" {\n" +
1717-
" reset(buffer, offset, bufferLength, actingBlockLength, actingVersion);\n" +
1718-
" return *this;\n" +
1722+
" return *this = %10$s(buffer, offset, bufferLength, actingBlockLength, actingVersion);\n" +
17191723
" }\n\n" +
17201724
" std::uint64_t sbePosition() const SBE_NOEXCEPT\n" +
17211725
" {\n" +
17221726
" return m_position;\n" +
17231727
" }\n\n" +
1724-
" void sbePosition(const std::uint64_t position)\n" +
1728+
" std::uint64_t sbeCheckPosition(const std::uint64_t position)\n" +
17251729
" {\n" +
17261730
" if (SBE_BOUNDS_CHECK_EXPECT((position > m_bufferLength), false))\n" +
17271731
" {\n" +
17281732
" throw std::runtime_error(\"buffer too short [E100]\");\n" +
17291733
" }\n" +
1730-
" m_position = position;\n" +
1734+
" return position;\n" +
1735+
" }\n\n" +
1736+
" void sbePosition(const std::uint64_t position)\n" +
1737+
" {\n" +
1738+
" m_position = sbeCheckPosition(position);\n" +
17311739
" }\n\n" +
17321740
" std::uint64_t encodedLength() const SBE_NOEXCEPT\n" +
17331741
" {\n" +

0 commit comments

Comments
 (0)