@@ -203,6 +203,10 @@ private static void generateGroupClassHeader(
203
203
indent + " std::uint64_t m_offset;\n " +
204
204
indent + " std::uint64_t m_actingVersion;\n " +
205
205
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 " +
206
210
indent + "public:\n " ,
207
211
formatClassName (groupName ), dimensionsClassName ));
208
212
@@ -269,13 +273,17 @@ private static void generateGroupClassHeader(
269
273
indent + " {\n " +
270
274
indent + " return *m_positionPtr;\n " +
271
275
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 " +
273
277
indent + " {\n " +
274
278
indent + " if (SBE_BOUNDS_CHECK_EXPECT((position > m_bufferLength), false))\n " +
275
279
indent + " {\n " +
276
- indent + " throw std::runtime_error(\" buffer too short [E100]\" );\n " +
280
+ indent + " throw std::runtime_error(\" buffer too short [E100]\" );\n " +
277
281
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 " +
279
287
indent + " }\n \n " +
280
288
indent + " inline std::uint64_t count() const SBE_NOEXCEPT\n " +
281
289
indent + " {\n " +
@@ -346,7 +354,7 @@ private static CharSequence generateGroupProperty(
346
354
sb .append (String .format ("\n " +
347
355
indent + " inline %1$s &%2$s()\n " +
348
356
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 " +
350
358
indent + " return m_%2$s;\n " +
351
359
indent + " }\n " ,
352
360
className ,
@@ -356,7 +364,7 @@ private static CharSequence generateGroupProperty(
356
364
indent + " %1$s &%2$sCount(const %3$s count)\n " +
357
365
indent + " {\n " +
358
366
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 " +
360
368
indent + " return m_%2$s;\n " +
361
369
indent + " }\n " ,
362
370
className ,
@@ -1514,18 +1522,6 @@ private CharSequence generateFixedFlyweightCode(final String className, final in
1514
1522
" std::uint64_t m_bufferLength;\n " +
1515
1523
" std::uint64_t m_offset = 0;\n " +
1516
1524
" 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 " +
1529
1525
"public:\n " +
1530
1526
" enum MetaAttribute\n " +
1531
1527
" {\n " +
@@ -1542,15 +1538,38 @@ private CharSequence generateFixedFlyweightCode(final String className, final in
1542
1538
" std::uint64_t uint_value;\n " +
1543
1539
" };\n \n " +
1544
1540
" %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 " +
1546
1567
" {\n " +
1547
- " reset(buffer, 0, bufferLength, actingVersion);\n " +
1548
1568
" }\n \n " +
1549
1569
" %1$s &wrap(char *buffer, const std::uint64_t offset, const std::uint64_t actingVersion," +
1550
1570
" const std::uint64_t bufferLength)\n " +
1551
1571
" {\n " +
1552
- " reset(buffer, offset, bufferLength, actingVersion);\n " +
1553
- " return *this;\n " +
1572
+ " return *this = %1$s(buffer, offset, bufferLength, actingVersion);\n " +
1554
1573
" }\n \n " +
1555
1574
" static SBE_CONSTEXPR std::uint64_t encodedLength() SBE_NOEXCEPT\n " +
1556
1575
" {\n " +
@@ -1592,23 +1611,27 @@ private static CharSequence generateConstructorsAndOperators(final String classN
1592
1611
{
1593
1612
return String .format (
1594
1613
" %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 " +
1601
1625
" {\n " +
1602
- " reset(buffer, 0, bufferLength, actingBlockLength, actingVersion);\n " +
1603
1626
" }\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 " +
1605
1629
" {\n " +
1606
- " reset(codec);\n " +
1607
1630
" }\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 " +
1609
1634
" {\n " +
1610
- " reset(codec);\n " +
1611
- " return *this;\n " +
1612
1635
" }\n \n " ,
1613
1636
className );
1614
1637
}
@@ -1625,32 +1648,12 @@ private CharSequence generateMessageFlyweightCode(final String className, final
1625
1648
"private:\n " +
1626
1649
" char *m_buffer = nullptr;\n " +
1627
1650
" std::uint64_t m_bufferLength = 0;\n " +
1628
- " std::uint64_t *m_positionPtr;\n " +
1629
1651
" std::uint64_t m_offset = 0;\n " +
1630
1652
" std::uint64_t m_position;\n " +
1631
- " std::uint64_t m_actingBlockLength;\n " +
1632
1653
" 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 " +
1646
1655
" {\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 " +
1654
1657
" }\n \n " +
1655
1658
"public:\n \n " +
1656
1659
" enum MetaAttribute\n " +
@@ -1694,10 +1697,9 @@ private CharSequence generateMessageFlyweightCode(final String className, final
1694
1697
" }\n \n " +
1695
1698
" %10$s &wrapForEncode(char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength)\n " +
1696
1699
" {\n " +
1697
- " reset(buffer, offset, bufferLength, sbeBlockLength(), sbeSchemaVersion());\n " +
1698
- " return *this;\n " +
1700
+ " return *this = %10$s(buffer, offset, bufferLength, sbeBlockLength(), sbeSchemaVersion());\n " +
1699
1701
" }\n \n " +
1700
- " %10$s &wrapAndApplyHeader( " +
1702
+ " %10$s &wrapAndApplyHeader(" +
1701
1703
"char *buffer, const std::uint64_t offset, const std::uint64_t bufferLength)\n " +
1702
1704
" {\n " +
1703
1705
" MessageHeader hdr(buffer + offset, bufferLength, sbeSchemaVersion());\n \n " +
@@ -1706,28 +1708,34 @@ private CharSequence generateMessageFlyweightCode(final String className, final
1706
1708
" .templateId(sbeTemplateId())\n " +
1707
1709
" .schemaId(sbeSchemaId())\n " +
1708
1710
" .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 " +
1712
1717
" }\n \n " +
1713
1718
" %10$s &wrapForDecode(\n " +
1714
1719
" char *buffer, const std::uint64_t offset, const std::uint64_t actingBlockLength,\n " +
1715
1720
" const std::uint64_t actingVersion, const std::uint64_t bufferLength)\n " +
1716
1721
" {\n " +
1717
- " reset(buffer, offset, bufferLength, actingBlockLength, actingVersion);\n " +
1718
- " return *this;\n " +
1722
+ " return *this = %10$s(buffer, offset, bufferLength, actingBlockLength, actingVersion);\n " +
1719
1723
" }\n \n " +
1720
1724
" std::uint64_t sbePosition() const SBE_NOEXCEPT\n " +
1721
1725
" {\n " +
1722
1726
" return m_position;\n " +
1723
1727
" }\n \n " +
1724
- " void sbePosition (const std::uint64_t position)\n " +
1728
+ " std::uint64_t sbeCheckPosition (const std::uint64_t position)\n " +
1725
1729
" {\n " +
1726
1730
" if (SBE_BOUNDS_CHECK_EXPECT((position > m_bufferLength), false))\n " +
1727
1731
" {\n " +
1728
1732
" throw std::runtime_error(\" buffer too short [E100]\" );\n " +
1729
1733
" }\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 " +
1731
1739
" }\n \n " +
1732
1740
" std::uint64_t encodedLength() const SBE_NOEXCEPT\n " +
1733
1741
" {\n " +
0 commit comments