@@ -536,6 +536,18 @@ private static void generateAccessOrderException(
536536 .append (fieldPrecedenceModel .generatedRepresentationClassName ()).append (".\" );\n " );
537537 }
538538
539+ private static void generateAccessOrderException (
540+ final StringBuilder sb ,
541+ final String indent ,
542+ final String action )
543+ {
544+ sb .append (indent ).append ("throw AccessOrderError(" )
545+ .append ("std::string(\" Illegal access. \" ) + \n " )
546+ .append (indent ).append (INDENT )
547+ .append ("\" Cannot call \\ \" " ).append (action )
548+ .append ("()\\ \" in state: \" + codecStateName(codecState()));\n " );
549+ }
550+
539551 private static void generateAccessOrderListenerMethodForNextGroupElement (
540552 final StringBuilder sb ,
541553 final FieldPrecedenceModel fieldPrecedenceModel ,
@@ -3027,6 +3039,7 @@ private CharSequence generateMessageFlyweightCode(
30273039
30283040 " SBE_NODISCARD std::uint64_t decodeLength() const\n " +
30293041 " {\n " +
3042+ "%22$s" +
30303043 " %10$s skipper(m_buffer, m_offset, m_bufferLength, m_actingBlockLength, m_actingVersion);\n " +
30313044 " skipper.skip();\n " +
30323045 " return skipper.encodedLength();\n " +
@@ -3071,7 +3084,8 @@ private CharSequence generateMessageFlyweightCode(
30713084 generateCodecStateTransitionForWrappingLatestVersion (fieldPrecedenceModel ),
30723085 generateOnWrappedListener (fieldPrecedenceModel ),
30733086 generateCodecStateTransitionForWrapping (fieldPrecedenceModel ),
3074- generateHiddenCopyConstructor (" " , className ));
3087+ generateHiddenCopyConstructor (" " , className ),
3088+ generateCheckForNotWrappedState ("decodeLength" , fieldPrecedenceModel ));
30753089 }
30763090
30773091 private CharSequence generateAccessOrderErrorType (final FieldPrecedenceModel fieldPrecedenceModel )
@@ -3311,6 +3325,31 @@ private CharSequence generateCodecStateTransitionForWrapping(final FieldPreceden
33113325 return generateAccessOrderListenerCall (fieldPrecedenceModel , TWO_INDENT , "onWrapped" , "actingVersion" );
33123326 }
33133327
3328+ private CharSequence generateCheckForNotWrappedState (
3329+ final String action ,
3330+ final FieldPrecedenceModel fieldPrecedenceModel )
3331+ {
3332+ if (null == fieldPrecedenceModel )
3333+ {
3334+ return "" ;
3335+ }
3336+
3337+ final StringBuilder sb = new StringBuilder ();
3338+ sb .append ("#if defined(" ).append (precedenceChecksFlagName ).append (")\n " )
3339+ .append (TWO_INDENT )
3340+ .append ("if (codecState() == " )
3341+ .append (qualifiedStateCase (fieldPrecedenceModel .notWrappedState ()))
3342+ .append (")\n " )
3343+ .append (TWO_INDENT ).append ("{\n " );
3344+
3345+ generateAccessOrderException (sb , THREE_INDENT , action );
3346+
3347+ sb .append (TWO_INDENT ).append ("}\n " )
3348+ .append ("#endif\n " );
3349+
3350+ return sb ;
3351+ }
3352+
33143353 private CharSequence generateCodecStateTransitionForWrappingLatestVersion (
33153354 final FieldPrecedenceModel fieldPrecedenceModel
33163355 )
0 commit comments