@@ -181,14 +181,24 @@ private void generateGroupClassHeader(
181181 dimensionsClassName ,
182182 parentMessageClassName ));
183183
184+ final Token numInGroupToken = tokens .get (index + 3 );
185+ final boolean isIntCastSafe = isRepresentableByInt32 (numInGroupToken .encoding ());
186+
187+ if (!isIntCastSafe )
188+ {
189+ throw new IllegalArgumentException (String .format (
190+ "%s.numInGroup - cannot be represented safely by an int. Please constrain the maxValue." ,
191+ groupName ));
192+ }
193+
184194 sb .append (String .format ("\n " +
185195 indent + INDENT + "public void WrapForDecode(%s parentMessage, DirectBuffer buffer, int actingVersion)\n " +
186196 indent + INDENT + "{\n " +
187197 indent + INDENT + INDENT + "_parentMessage = parentMessage;\n " +
188198 indent + INDENT + INDENT + "_buffer = buffer;\n " +
189199 indent + INDENT + INDENT + "_dimensions.Wrap(buffer, parentMessage.Limit, actingVersion);\n " +
190200 indent + INDENT + INDENT + "_blockLength = _dimensions.BlockLength;\n " +
191- indent + INDENT + INDENT + "_count = _dimensions.NumInGroup;\n " +
201+ indent + INDENT + INDENT + "_count = (int) _dimensions.NumInGroup;\n " + // cast safety checked above
192202 indent + INDENT + INDENT + "_actingVersion = actingVersion;\n " +
193203 indent + INDENT + INDENT + "_index = -1;\n " +
194204 indent + INDENT + INDENT + "_parentMessage.Limit = parentMessage.Limit + SbeHeaderSize;\n " +
@@ -197,7 +207,6 @@ private void generateGroupClassHeader(
197207
198208 final int blockLength = tokens .get (index ).encodedLength ();
199209 final String typeForBlockLength = cSharpTypeName (tokens .get (index + 2 ).encoding ().primitiveType ());
200- final Token numInGroupToken = tokens .get (index + 3 );
201210 final String typeForNumInGroup = cSharpTypeName (numInGroupToken .encoding ().primitiveType ());
202211
203212 sb .append (String .format ("\n " +
@@ -233,6 +242,11 @@ private void generateGroupClassHeader(
233242 blockLength ,
234243 dimensionHeaderLength ));
235244
245+ generateGroupEnumerator (sb , groupName , indent );
246+ }
247+
248+ private void generateGroupEnumerator (final StringBuilder sb , final String groupName , final String indent )
249+ {
236250 sb .append (
237251 indent + INDENT + "public int ActingBlockLength { get { return _blockLength; } }\n \n " +
238252 indent + INDENT + "public int Count { get { return _count; } }\n \n " +
@@ -262,6 +276,13 @@ private void generateGroupClassHeader(
262276 indent + INDENT + "}\n " );
263277 }
264278
279+ private boolean isRepresentableByInt32 (final Encoding encoding )
280+ {
281+ // These min and max values are the same in .NET
282+ return encoding .applicableMinValue ().longValue () >= Integer .MIN_VALUE &&
283+ encoding .applicableMaxValue ().longValue () <= Integer .MAX_VALUE ;
284+ }
285+
265286 private CharSequence generateGroupProperty (final String groupName , final Token token , final String indent )
266287 {
267288 final StringBuilder sb = new StringBuilder ();
0 commit comments