@@ -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