Skip to content

Commit 69b237c

Browse files
committed
[CSharp] Issue560 fix.
Constant enums were incorrectly being indexed in messages as for for non-constant enums. The getter now returns a constant value and the setter is removed.
1 parent badc099 commit 69b237c

File tree

5 files changed

+109
-28
lines changed

5 files changed

+109
-28
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ csharp/sbe-generated/baseline-bigendian
100100
csharp/sbe-generated/extension
101101
csharp/sbe-generated/issue435
102102
csharp/sbe-generated/issue483
103+
csharp/sbe-generated/issue560
103104
csharp/sbe-generated/since-deprecated
104105
csharp/sbe-generated/mktdata/*.cs
105106
csharp/sbe-generated/uk_co_real_logic_sbe_benchmarks_fix

csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ public static int Encode(MessageHeader messageHeader,
3232
mdIncGrp.MdUpdateAction = MDUpdateAction.NEW;
3333
mdIncGrp.RptSeq = 1;
3434
mdIncGrp.AggressorSide = Side.BUY;
35-
mdIncGrp.MdEntryType = MDEntryType.BID;
36-
35+
3736
mdIncGrp.Next();
3837
mdIncGrp.TradeId = 1234L;
3938
mdIncGrp.SecurityId = 56789L;
@@ -43,8 +42,7 @@ public static int Encode(MessageHeader messageHeader,
4342
mdIncGrp.MdUpdateAction = MDUpdateAction.NEW;
4443
mdIncGrp.RptSeq = 1;
4544
mdIncGrp.AggressorSide = Side.SELL;
46-
mdIncGrp.MdEntryType = MDEntryType.OFFER;
47-
45+
4846
return marketData.Size;
4947
}
5048

csharp/sbe-generated/sbe-generated.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@
1111
<ItemGroup>
1212
<ProjectReference Include="..\sbe-dll\sbe-dll.csproj" />
1313
</ItemGroup>
14+
15+
<ItemGroup>
16+
<Folder Include="issue560\" />
17+
</ItemGroup>
1418

1519
</Project>

csharp/sbe-tests/Issue560Tests.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (C) 2018 Bill Segall
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
using System;
16+
using Microsoft.VisualStudio.TestTools.UnitTesting;
17+
using Org.SbeTool.Sbe.Dll;
18+
19+
namespace Org.SbeTool.Sbe.Tests
20+
{
21+
[TestClass]
22+
public unsafe class Issue560Tests
23+
{
24+
private byte[] _buffer;
25+
private DirectBuffer _directBuffer;
26+
private Issue560.MessageHeader _messageHeader;
27+
private Issue560.Issue560 _issue560;
28+
29+
//public Issue560.Issue560 Issue560 { get => _issue560; set => _issue560 = value; }
30+
31+
[TestInitialize]
32+
public void SetUp()
33+
{
34+
_buffer = new Byte[4096];
35+
_directBuffer = new DirectBuffer(_buffer);
36+
_issue560 = new Issue560.Issue560();
37+
_messageHeader = new Issue560.MessageHeader();
38+
39+
_messageHeader.Wrap(_directBuffer, 0, Issue560.Issue560.SchemaVersion);
40+
_messageHeader.BlockLength = Issue560.Issue560.BlockLength;
41+
_messageHeader.SchemaId = Issue560.Issue560.SchemaId;
42+
_messageHeader.TemplateId = Issue560.Issue560.TemplateId;
43+
_messageHeader.Version = Issue560.Issue560.SchemaVersion;
44+
45+
}
46+
47+
[TestMethod]
48+
public void Issue560Test()
49+
{
50+
Assert.AreEqual(_issue560.DiscountedModel, Issue560.Model.C, "Incorrect const enum valueref");
51+
52+
}
53+
54+
}
55+
}

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

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ private CharSequence generateCompositePropertyElements(final List<Token> tokens,
466466
break;
467467

468468
case BEGIN_ENUM:
469-
sb.append(generateEnumProperty(propertyName, token, indent));
469+
sb.append(generateEnumProperty(propertyName, token, null, indent));
470470
break;
471471

472472
case BEGIN_SET:
@@ -1039,7 +1039,7 @@ private CharSequence generateFields(final List<Token> tokens, final String inden
10391039
break;
10401040

10411041
case BEGIN_ENUM:
1042-
sb.append(generateEnumProperty(propertyName, encodingToken, indent));
1042+
sb.append(generateEnumProperty(propertyName, encodingToken, signalToken, indent));
10431043
break;
10441044

10451045
case BEGIN_SET:
@@ -1109,7 +1109,11 @@ private CharSequence generateEnumFieldNotPresentCondition(
11091109
enumName);
11101110
}
11111111

1112-
private CharSequence generateEnumProperty(final String propertyName, final Token token, final String indent)
1112+
private CharSequence generateEnumProperty(
1113+
final String propertyName,
1114+
final Token token,
1115+
final Token signalToken,
1116+
final String indent)
11131117
{
11141118
final String enumName = formatClassName(token.applicableTypeName());
11151119
final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName());
@@ -1118,27 +1122,46 @@ private CharSequence generateEnumProperty(final String propertyName, final Token
11181122
final ByteOrder byteOrder = token.encoding().byteOrder();
11191123
final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size());
11201124

1121-
return String.format("\n" +
1122-
indent + INDENT + "public %1$s %2$s\n" +
1123-
indent + INDENT + "{\n" +
1124-
indent + INDENT + INDENT + "get\n" +
1125-
indent + INDENT + INDENT + "{\n" +
1126-
"%3$s" +
1127-
indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" +
1128-
indent + INDENT + INDENT + "}\n" +
1129-
indent + INDENT + INDENT + "set\n" +
1130-
indent + INDENT + INDENT + "{\n" +
1131-
indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" +
1132-
indent + INDENT + INDENT + "}\n" +
1133-
indent + INDENT + "}\n\n",
1134-
enumName,
1135-
toUpperFirstChar(propertyName),
1136-
generateEnumFieldNotPresentCondition(token.version(), enumName, indent),
1137-
enumName,
1138-
typePrefix,
1139-
offset,
1140-
byteOrderStr,
1141-
enumUnderlyingType);
1125+
if (signalToken != null && signalToken.isConstantEncoding())
1126+
{
1127+
final String constValue = signalToken.encoding().constValue().toString();
1128+
1129+
return String.format("\n" +
1130+
indent + INDENT + "public %1$s %2$s\n" +
1131+
indent + INDENT + "{\n" +
1132+
indent + INDENT + INDENT + "get\n" +
1133+
indent + INDENT + INDENT + "{\n" +
1134+
indent + INDENT + INDENT + INDENT + "return %3$s;\n" +
1135+
indent + INDENT + INDENT + "}\n" +
1136+
indent + INDENT + "}\n\n",
1137+
enumName,
1138+
toUpperFirstChar(propertyName),
1139+
constValue);
1140+
}
1141+
else
1142+
{
1143+
return String.format("\n" +
1144+
indent + INDENT + "public %1$s %2$s\n" +
1145+
indent + INDENT + "{\n" +
1146+
indent + INDENT + INDENT + "get\n" +
1147+
indent + INDENT + INDENT + "{\n" +
1148+
"%3$s" +
1149+
indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" +
1150+
indent + INDENT + INDENT + "}\n" +
1151+
indent + INDENT + INDENT + "set\n" +
1152+
indent + INDENT + INDENT + "{\n" +
1153+
indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" +
1154+
indent + INDENT + INDENT + "}\n" +
1155+
indent + INDENT + "}\n\n",
1156+
enumName,
1157+
toUpperFirstChar(propertyName),
1158+
generateEnumFieldNotPresentCondition(token.version(), enumName, indent),
1159+
enumName,
1160+
typePrefix,
1161+
offset,
1162+
byteOrderStr,
1163+
enumUnderlyingType);
1164+
}
11421165
}
11431166

11441167
private String generateBitSetProperty(final String propertyName, final Token token, final String indent)

0 commit comments

Comments
 (0)