Skip to content

Commit

Permalink
[CSharp] Issue560 fix.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
billsegall committed Jun 27, 2018
1 parent badc099 commit 69b237c
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 28 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -100,6 +100,7 @@ csharp/sbe-generated/baseline-bigendian
csharp/sbe-generated/extension
csharp/sbe-generated/issue435
csharp/sbe-generated/issue483
csharp/sbe-generated/issue560
csharp/sbe-generated/since-deprecated
csharp/sbe-generated/mktdata/*.cs
csharp/sbe-generated/uk_co_real_logic_sbe_benchmarks_fix
Expand Down
6 changes: 2 additions & 4 deletions csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs
Expand Up @@ -32,8 +32,7 @@ public static class MarketDataBenchmark
mdIncGrp.MdUpdateAction = MDUpdateAction.NEW;
mdIncGrp.RptSeq = 1;
mdIncGrp.AggressorSide = Side.BUY;
mdIncGrp.MdEntryType = MDEntryType.BID;


mdIncGrp.Next();
mdIncGrp.TradeId = 1234L;
mdIncGrp.SecurityId = 56789L;
Expand All @@ -43,8 +42,7 @@ public static class MarketDataBenchmark
mdIncGrp.MdUpdateAction = MDUpdateAction.NEW;
mdIncGrp.RptSeq = 1;
mdIncGrp.AggressorSide = Side.SELL;
mdIncGrp.MdEntryType = MDEntryType.OFFER;


return marketData.Size;
}

Expand Down
4 changes: 4 additions & 0 deletions csharp/sbe-generated/sbe-generated.csproj
Expand Up @@ -11,5 +11,9 @@
<ItemGroup>
<ProjectReference Include="..\sbe-dll\sbe-dll.csproj" />
</ItemGroup>

<ItemGroup>
<Folder Include="issue560\" />
</ItemGroup>

</Project>
55 changes: 55 additions & 0 deletions csharp/sbe-tests/Issue560Tests.cs
@@ -0,0 +1,55 @@
// Copyright (C) 2018 Bill Segall
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Org.SbeTool.Sbe.Dll;

namespace Org.SbeTool.Sbe.Tests
{
[TestClass]
public unsafe class Issue560Tests
{
private byte[] _buffer;
private DirectBuffer _directBuffer;
private Issue560.MessageHeader _messageHeader;
private Issue560.Issue560 _issue560;

//public Issue560.Issue560 Issue560 { get => _issue560; set => _issue560 = value; }

[TestInitialize]
public void SetUp()
{
_buffer = new Byte[4096];
_directBuffer = new DirectBuffer(_buffer);
_issue560 = new Issue560.Issue560();
_messageHeader = new Issue560.MessageHeader();

_messageHeader.Wrap(_directBuffer, 0, Issue560.Issue560.SchemaVersion);
_messageHeader.BlockLength = Issue560.Issue560.BlockLength;
_messageHeader.SchemaId = Issue560.Issue560.SchemaId;
_messageHeader.TemplateId = Issue560.Issue560.TemplateId;
_messageHeader.Version = Issue560.Issue560.SchemaVersion;

}

[TestMethod]
public void Issue560Test()
{
Assert.AreEqual(_issue560.DiscountedModel, Issue560.Model.C, "Incorrect const enum valueref");

}

}
}
Expand Up @@ -466,7 +466,7 @@ private CharSequence generateCompositePropertyElements(final List<Token> tokens,
break;

case BEGIN_ENUM:
sb.append(generateEnumProperty(propertyName, token, indent));
sb.append(generateEnumProperty(propertyName, token, null, indent));
break;

case BEGIN_SET:
Expand Down Expand Up @@ -1039,7 +1039,7 @@ private CharSequence generateFields(final List<Token> tokens, final String inden
break;

case BEGIN_ENUM:
sb.append(generateEnumProperty(propertyName, encodingToken, indent));
sb.append(generateEnumProperty(propertyName, encodingToken, signalToken, indent));
break;

case BEGIN_SET:
Expand Down Expand Up @@ -1109,7 +1109,11 @@ private CharSequence generateEnumFieldNotPresentCondition(
enumName);
}

private CharSequence generateEnumProperty(final String propertyName, final Token token, final String indent)
private CharSequence generateEnumProperty(
final String propertyName,
final Token token,
final Token signalToken,
final String indent)
{
final String enumName = formatClassName(token.applicableTypeName());
final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName());
Expand All @@ -1118,27 +1122,46 @@ private CharSequence generateEnumProperty(final String propertyName, final Token
final ByteOrder byteOrder = token.encoding().byteOrder();
final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size());

return String.format("\n" +
indent + INDENT + "public %1$s %2$s\n" +
indent + INDENT + "{\n" +
indent + INDENT + INDENT + "get\n" +
indent + INDENT + INDENT + "{\n" +
"%3$s" +
indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" +
indent + INDENT + INDENT + "}\n" +
indent + INDENT + INDENT + "set\n" +
indent + INDENT + INDENT + "{\n" +
indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" +
indent + INDENT + INDENT + "}\n" +
indent + INDENT + "}\n\n",
enumName,
toUpperFirstChar(propertyName),
generateEnumFieldNotPresentCondition(token.version(), enumName, indent),
enumName,
typePrefix,
offset,
byteOrderStr,
enumUnderlyingType);
if (signalToken != null && signalToken.isConstantEncoding())
{
final String constValue = signalToken.encoding().constValue().toString();

return String.format("\n" +
indent + INDENT + "public %1$s %2$s\n" +
indent + INDENT + "{\n" +
indent + INDENT + INDENT + "get\n" +
indent + INDENT + INDENT + "{\n" +
indent + INDENT + INDENT + INDENT + "return %3$s;\n" +
indent + INDENT + INDENT + "}\n" +
indent + INDENT + "}\n\n",
enumName,
toUpperFirstChar(propertyName),
constValue);
}
else
{
return String.format("\n" +
indent + INDENT + "public %1$s %2$s\n" +
indent + INDENT + "{\n" +
indent + INDENT + INDENT + "get\n" +
indent + INDENT + INDENT + "{\n" +
"%3$s" +
indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" +
indent + INDENT + INDENT + "}\n" +
indent + INDENT + INDENT + "set\n" +
indent + INDENT + INDENT + "{\n" +
indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" +
indent + INDENT + INDENT + "}\n" +
indent + INDENT + "}\n\n",
enumName,
toUpperFirstChar(propertyName),
generateEnumFieldNotPresentCondition(token.version(), enumName, indent),
enumName,
typePrefix,
offset,
byteOrderStr,
enumUnderlyingType);
}
}

private String generateBitSetProperty(final String propertyName, final Token token, final String indent)
Expand Down

0 comments on commit 69b237c

Please sign in to comment.