Skip to content

Commit 8aa6cae

Browse files
committed
[Java] Provide raw access to field containing a bitset via a getRaw() method on the generated bitset decoder. Issue #893.
1 parent b0f91d5 commit 8aa6cae

File tree

4 files changed

+30
-17
lines changed

4 files changed

+30
-17
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -706,14 +706,16 @@ private void generateVarDataDescriptors(
706706

707707
private void generateChoiceSet(final List<Token> tokens) throws IOException
708708
{
709-
final String bitSetName = formatClassName(tokens.get(0).applicableTypeName());
709+
final Token token = tokens.get(0);
710+
final String bitSetName = formatClassName(token.applicableTypeName());
710711

711712
try (Writer out = outputManager.createOutput(bitSetName))
712713
{
713714
out.append(generateFileHeader(ir.namespaces(), bitSetName, null));
714715
out.append(generateClassDeclaration(bitSetName));
715-
out.append(generateFixedFlyweightCode(bitSetName, tokens.get(0).encodedLength()));
716+
out.append(generateFixedFlyweightCode(bitSetName, token.encodedLength()));
716717

718+
final Encoding encoding = token.encoding();
717719
new Formatter(out).format("\n" +
718720
" %1$s &clear()\n" +
719721
" {\n" +
@@ -722,7 +724,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
722724
" return *this;\n" +
723725
" }\n",
724726
bitSetName,
725-
cppTypeName(tokens.get(0).encoding().primitiveType()));
727+
cppTypeName(encoding.primitiveType()));
726728

727729
new Formatter(out).format("\n" +
728730
" SBE_NODISCARD bool isEmpty() const\n" +
@@ -731,7 +733,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
731733
" std::memcpy(&val, m_buffer + m_offset, sizeof(%1$s));\n" +
732734
" return 0 == val;\n" +
733735
" }\n",
734-
cppTypeName(tokens.get(0).encoding().primitiveType()));
736+
cppTypeName(encoding.primitiveType()));
735737

736738
new Formatter(out).format("\n" +
737739
" SBE_NODISCARD %1$s rawValue() const\n" +
@@ -740,7 +742,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
740742
" std::memcpy(&val, m_buffer + m_offset, sizeof(%1$s));\n" +
741743
" return val;\n" +
742744
" }\n",
743-
cppTypeName(tokens.get(0).encoding().primitiveType()));
745+
cppTypeName(encoding.primitiveType()));
744746

745747
new Formatter(out).format("\n" +
746748
" %1$s &rawValue(%2$s value)\n" +
@@ -749,7 +751,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
749751
" return *this;\n" +
750752
" }\n",
751753
bitSetName,
752-
cppTypeName(tokens.get(0).encoding().primitiveType()));
754+
cppTypeName(encoding.primitiveType()));
753755

754756
out.append(generateChoices(bitSetName, tokens.subList(1, tokens.size() - 1)));
755757
out.append(generateChoicesDisplay(bitSetName, tokens.subList(1, tokens.size() - 1)));

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,23 +1185,34 @@ private void generateBitSet(final List<Token> tokens) throws IOException
11851185
final String bitSetName = token.applicableTypeName();
11861186
final String decoderName = decoderName(bitSetName);
11871187
final String encoderName = encoderName(bitSetName);
1188-
final List<Token> messageBody = getMessageBody(tokens);
1188+
final List<Token> choiceList = tokens.subList(1, tokens.size() - 1);
11891189
final String implementsString = implementsInterface(Flyweight.class.getSimpleName());
11901190

11911191
try (Writer out = outputManager.createOutput(decoderName))
11921192
{
1193+
final Encoding encoding = token.encoding();
11931194
generateFixedFlyweightHeader(out, token, decoderName, implementsString, readOnlyBuffer, fqReadOnlyBuffer);
1194-
out.append(generateChoiceIsEmpty(token.encoding().primitiveType()));
1195-
generateChoiceDecoders(out, messageBody);
1196-
out.append(generateChoiceDisplay(messageBody));
1195+
out.append(generateChoiceIsEmpty(encoding.primitiveType()));
1196+
1197+
new Formatter(out).format(
1198+
"\n" +
1199+
" public %s getRaw()\n" +
1200+
" {\n" +
1201+
" return %s;\n" +
1202+
" }\n",
1203+
primitiveTypeName(token),
1204+
generateGet(encoding.primitiveType(), "offset", byteOrderString(encoding)));
1205+
1206+
generateChoiceDecoders(out, choiceList);
1207+
out.append(generateChoiceDisplay(choiceList));
11971208
out.append("}\n");
11981209
}
11991210

12001211
try (Writer out = outputManager.createOutput(encoderName))
12011212
{
12021213
generateFixedFlyweightHeader(out, token, encoderName, implementsString, mutableBuffer, fqMutableBuffer);
12031214
generateChoiceClear(out, encoderName, token);
1204-
generateChoiceEncoders(out, encoderName, messageBody);
1215+
generateChoiceEncoders(out, encoderName, choiceList);
12051216
out.append("}\n");
12061217
}
12071218
}
@@ -1244,10 +1255,11 @@ private void generateEnum(final List<Token> tokens) throws IOException
12441255
out.append(generateEnumFileHeader(ir.applicableNamespace()));
12451256
out.append(generateEnumDeclaration(enumName, enumToken));
12461257

1247-
out.append(generateEnumValues(getMessageBody(tokens), generateLiteral(encoding.primitiveType(), nullVal)));
1258+
final List<Token> valuesList = tokens.subList(1, tokens.size() - 1);
1259+
out.append(generateEnumValues(valuesList, generateLiteral(encoding.primitiveType(), nullVal)));
12481260
out.append(generateEnumBody(enumToken, enumName));
12491261

1250-
out.append(generateEnumLookupMethod(getMessageBody(tokens), enumName, nullVal));
1262+
out.append(generateEnumLookupMethod(valuesList, enumName, nullVal));
12511263

12521264
out.append("}\n");
12531265
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/RustGenerator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import static uk.co.real_logic.sbe.ir.GenerationUtil.collectFields;
4040
import static uk.co.real_logic.sbe.ir.GenerationUtil.collectGroups;
4141
import static uk.co.real_logic.sbe.ir.GenerationUtil.collectVarData;
42-
import static uk.co.real_logic.sbe.ir.GenerationUtil.getMessageBody;
4342
import static uk.co.real_logic.sbe.ir.Signal.BEGIN_ENUM;
4443
import static uk.co.real_logic.sbe.ir.Signal.BEGIN_SET;
4544

@@ -137,7 +136,7 @@ public void generate() throws IOException
137136
{
138137
final Token msgToken = tokens.get(0);
139138
final String codecModName = codecModName(msgToken.name());
140-
final List<Token> messageBody = getMessageBody(tokens);
139+
final List<Token> messageBody = tokens.subList(1, tokens.size() - 1);
141140

142141
int i = 0;
143142
final List<Token> fields = new ArrayList<>();
@@ -1175,7 +1174,7 @@ private static void generateEnum(
11751174
{
11761175
final String originalEnumName = enumTokens.get(0).applicableTypeName();
11771176
final String enumRustName = formatStructName(originalEnumName);
1178-
final List<Token> messageBody = getMessageBody(enumTokens);
1177+
final List<Token> messageBody = enumTokens.subList(1, enumTokens.size() - 1);
11791178
if (messageBody.isEmpty())
11801179
{
11811180
throw new IllegalArgumentException("No valid values provided for enum " + originalEnumName);

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.25.4-SNAPSHOT
1+
1.26.0-SNAPSHOT

0 commit comments

Comments
 (0)