diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index 7c14607d6a..02ee6d4406 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -1902,11 +1902,11 @@ private void generateBitSet(final List tokens) throws IOException final String encoderName = encoderName(bitSetName); final List choiceList = tokens.subList(1, tokens.size() - 1); final String implementsString = implementsInterface(Flyweight.class.getSimpleName()); + final Encoding encoding = token.encoding(); registerTypesPackageName(token, ir); try (Writer out = outputManager.createOutput(decoderName)) { - final Encoding encoding = token.encoding(); generateFixedFlyweightHeader( out, token, decoderName, implementsString, readOnlyBuffer, fqReadOnlyBuffer, PACKAGES_EMPTY_SET); out.append(generateChoiceIsEmpty(encoding.primitiveType())); @@ -1931,6 +1931,18 @@ private void generateBitSet(final List tokens) throws IOException generateFixedFlyweightHeader( out, token, encoderName, implementsString, mutableBuffer, fqMutableBuffer, PACKAGES_EMPTY_SET); generateChoiceClear(out, encoderName, token); + + new Formatter(out).format( + "\n" + + " public %s setRaw(final %s value)\n" + + " {\n" + + " %s;\n" + + " return this;\n" + + " }\n", + encoderName, + primitiveTypeName(token), + generatePut(encoding.primitiveType(), "offset", "value", byteOrderString(encoding))); + generateChoiceEncoders(out, encoderName, choiceList); out.append("}\n"); } diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java index e5d4a1f5a1..0b18c32ff1 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java @@ -382,6 +382,30 @@ void shouldGenerateBitSetCodecs() throws Exception assertTrue(getCruiseControl(extrasDecoder)); } + @Test + void shouldGenerateBitSetRawAccessor() throws Exception + { + final UnsafeBuffer buffer = new UnsafeBuffer(new byte[4096]); + + generator().generate(); + + final Object encoder = wrap(buffer, compileCarEncoder().getConstructor().newInstance()); + final Object decoder = getCarDecoder(buffer, encoder); + + final Object extrasEncoder = getExtras(encoder); + final Object extrasDecoder = getExtras(decoder); + + final Method getRawMethod = extrasDecoder.getClass().getMethod("getRaw"); + final Class rawType = getRawMethod.getReturnType(); + final Method setRawMethod = extrasEncoder.getClass().getMethod("setRaw", rawType); + + final Short boxedValue = (short)0b0000_0101; + setRawMethod.invoke(extrasEncoder, boxedValue); + + final Object result = getRawMethod.invoke(extrasDecoder); + assertEquals(boxedValue, result); + } + @Test void shouldGenerateEnumCodecs() throws Exception {