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