Skip to content

Commit 59c7357

Browse files
committed
[C#] Cast numInGroup representation to be an int. Check cast safety during generation.
1 parent 28c481a commit 59c7357

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)