@@ -342,6 +342,7 @@ private void generateGroupDecoderClassHeader(
342342 final String indent )
343343 {
344344 final Token groupToken = tokens .get (index );
345+ final String className = formatClassName (groupName );
345346 final int dimensionHeaderLen = tokens .get (index + 1 ).encodedLength ();
346347
347348 final Token blockLengthToken = Generators .findFirst ("blockLength" , tokens , index );
@@ -372,14 +373,27 @@ private void generateGroupDecoderClassHeader(
372373 .append (indent ).append (" if (buffer != this.buffer)\n " )
373374 .append (indent ).append (" {\n " )
374375 .append (indent ).append (" this.buffer = buffer;\n " )
375- .append (indent ).append (" }\n " )
376- .append (indent ).append (" index = -1 ;\n " )
376+ .append (indent ).append (" }\n \n " )
377+ .append (indent ).append (" index = 0 ;\n " )
377378 .append (indent ).append (" final int limit = parentMessage.limit();\n " )
378379 .append (indent ).append (" parentMessage.limit(limit + HEADER_SIZE);\n " )
379380 .append (indent ).append (" blockLength = (int)" ).append (blockLengthGet ).append (";\n " )
380381 .append (indent ).append (" count = (int)" ).append (numInGroupGet ).append (";\n " )
381382 .append (indent ).append (" }\n " );
382383
384+ sb .append ("\n " )
385+ .append (indent ).append (" public " ).append (className ).append (" next()\n " )
386+ .append (indent ).append (" {\n " )
387+ .append (indent ).append (" if (index >= count)\n " )
388+ .append (indent ).append (" {\n " )
389+ .append (indent ).append (" throw new java.util.NoSuchElementException();\n " )
390+ .append (indent ).append (" }\n \n " )
391+ .append (indent ).append (" offset = parentMessage.limit();\n " )
392+ .append (indent ).append (" parentMessage.limit(offset + blockLength);\n " )
393+ .append (indent ).append (" ++index;\n \n " )
394+ .append (indent ).append (" return this;\n " )
395+ .append (indent ).append (" }\n " );
396+
383397 sb .append ("\n " )
384398 .append (indent ).append (" public static int sbeHeaderSize()\n " )
385399 .append (indent ).append (" {\n " )
@@ -392,7 +406,6 @@ private void generateGroupDecoderClassHeader(
392406 .append (indent ).append (" return " ).append (tokens .get (index ).encodedLength ()).append (";\n " )
393407 .append (indent ).append (" }\n " );
394408
395- final String className = formatClassName (groupName );
396409 sb .append ("\n " )
397410 .append (indent ).append (" public int actingBlockLength()\n " )
398411 .append (indent ).append (" {\n " )
@@ -412,20 +425,7 @@ private void generateGroupDecoderClassHeader(
412425 .append (indent ).append (" }\n \n " )
413426 .append (indent ).append (" public boolean hasNext()\n " )
414427 .append (indent ).append (" {\n " )
415- .append (indent ).append (" return (index + 1) < count;\n " )
416- .append (indent ).append (" }\n " );
417-
418- sb .append ("\n " )
419- .append (indent ).append (" public " ).append (className ).append (" next()\n " )
420- .append (indent ).append (" {\n " )
421- .append (indent ).append (" if (index + 1 >= count)\n " )
422- .append (indent ).append (" {\n " )
423- .append (indent ).append (" throw new java.util.NoSuchElementException();\n " )
424- .append (indent ).append (" }\n \n " )
425- .append (indent ).append (" offset = parentMessage.limit();\n " )
426- .append (indent ).append (" parentMessage.limit(offset + blockLength);\n " )
427- .append (indent ).append (" ++index;\n \n " )
428- .append (indent ).append (" return this;\n " )
428+ .append (indent ).append (" return index < count;\n " )
429429 .append (indent ).append (" }\n " );
430430 }
431431
@@ -477,35 +477,25 @@ private void generateGroupEncoderClassHeader(
477477 ind + " {\n " +
478478 ind + " this.buffer = buffer;\n " +
479479 ind + " }\n \n " +
480- ind + " index = -1 ;\n " +
480+ ind + " index = 0 ;\n " +
481481 ind + " this.count = count;\n " +
482482 ind + " final int limit = parentMessage.limit();\n " +
483+ ind + " initialLimit = limit;\n " +
483484 ind + " parentMessage.limit(limit + HEADER_SIZE);\n " +
484485 ind + " %5$s;\n " +
485486 ind + " %6$s;\n " +
486- ind + " }\n \n " ,
487+ ind + " }\n " ,
487488 parentMessageClassName ,
488489 mutableBuffer ,
489490 numInGroupToken .encoding ().applicableMinValue ().longValue (),
490491 numInGroupToken .encoding ().applicableMaxValue ().longValue (),
491492 blockLengthPut ,
492493 numInGroupPut );
493494
494- sb .append (ind ).append (" public static int sbeHeaderSize()\n " )
495- .append (ind ).append (" {\n " )
496- .append (ind ).append (" return HEADER_SIZE;\n " )
497- .append (ind ).append (" }\n " );
498-
499- sb .append ("\n " )
500- .append (ind ).append (" public static int sbeBlockLength()\n " )
501- .append (ind ).append (" {\n " )
502- .append (ind ).append (" return " ).append (blockLength ).append (";\n " )
503- .append (ind ).append (" }\n " );
504-
505495 sb .append ("\n " )
506496 .append (ind ).append (" public " ).append (encoderName (groupName )).append (" next()\n " )
507497 .append (ind ).append (" {\n " )
508- .append (ind ).append (" if (index + 1 >= count)\n " )
498+ .append (ind ).append (" if (index >= count)\n " )
509499 .append (ind ).append (" {\n " )
510500 .append (ind ).append (" throw new java.util.NoSuchElementException();\n " )
511501 .append (ind ).append (" }\n \n " )
@@ -514,6 +504,30 @@ private void generateGroupEncoderClassHeader(
514504 .append (ind ).append (" ++index;\n \n " )
515505 .append (ind ).append (" return this;\n " )
516506 .append (ind ).append (" }\n " );
507+
508+ final String countOffset = "initialLimit + " + numInGroupToken .offset ();
509+ final String resetCountPut = generatePut (
510+ numInGroupType , countOffset , numInGroupValue , byteOrderString (numInGroupToken .encoding ()));
511+
512+ sb .append ("\n " )
513+ .append (ind ).append (" public int resetCountToIndex()\n " )
514+ .append (ind ).append (" {\n " )
515+ .append (ind ).append (" count = index;\n " )
516+ .append (ind ).append (" " ).append (resetCountPut ).append (";\n \n " )
517+ .append (ind ).append (" return count;\n " )
518+ .append (ind ).append (" }\n " );
519+
520+ sb .append ("\n " )
521+ .append (ind ).append (" public static int sbeHeaderSize()\n " )
522+ .append (ind ).append (" {\n " )
523+ .append (ind ).append (" return HEADER_SIZE;\n " )
524+ .append (ind ).append (" }\n " );
525+
526+ sb .append ("\n " )
527+ .append (ind ).append (" public static int sbeBlockLength()\n " )
528+ .append (ind ).append (" {\n " )
529+ .append (ind ).append (" return " ).append (blockLength ).append (";\n " )
530+ .append (ind ).append (" }\n " );
517531 }
518532
519533 private static String primitiveTypeName (final Token token )
@@ -595,7 +609,8 @@ private void generateGroupEncoderClassDeclaration(
595609 indent + " private %4$s buffer;\n " +
596610 indent + " private int count;\n " +
597611 indent + " private int index;\n " +
598- indent + " private int offset;\n " ,
612+ indent + " private int offset;\n " +
613+ indent + " private int initialLimit;\n " ,
599614 className ,
600615 dimensionHeaderSize ,
601616 parentMessageClassName ,
0 commit comments