private static Object generateCompositeProperty(final String propertyName, final Token token, final String indent) { final String compositeName = formatClassName(token.applicableTypeName()); final int offset = token.offset(); final StringBuilder sb = new StringBuilder(); sb.append(String.format("\n" + "private:\n" + indent + " %1$s m_%2$s;\n\n" + "public:\n", compositeName, propertyName)); sb.append(String.format("\n" + indent + " %1$s &%2$s()\n" + indent + " {\n" + indent + " m_%2$s.wrap(m_buffer, m_offset + %3$d, m_actingVersion, m_bufferLength);\n" + indent + " return m_%2$s;\n" + indent + " }\n", compositeName, propertyName, offset)); return sb; }
generatePropertyNotPresentCondition(inComposite, codecType, propertyToken, null, indent), propertyName, bitsetToken.offset(), propertyName));
generatePropertyNotPresentCondition(inComposite, codecType, propertyToken, null, indent), propertyName, compositeToken.offset(), propertyName));
indent + " }\n", propertyName, encodingToken.offset()));
private static Object generateBitsetProperty(final String propertyName, final Token token, final String indent) { final StringBuilder sb = new StringBuilder(); final String bitsetName = formatClassName(token.applicableTypeName()); final int offset = token.offset(); sb.append(String.format("\n" + indent + "private:\n" + indent + " %1$s m_%2$s;\n\n" + indent + "public:\n", bitsetName, propertyName)); sb.append(String.format("\n" + indent + " %1$s &%2$s()\n" + indent + " {\n" + indent + " m_%2$s.wrap(m_buffer, m_offset + %3$d, m_actingVersion, m_bufferLength);\n" + indent + " return m_%2$s;\n" + indent + " }\n", bitsetName, propertyName, offset)); sb.append(String.format("\n" + indent + " static SBE_CONSTEXPR std::size_t %1$sEncodingLength() SBE_NOEXCEPT\n" + indent + " {\n" + indent + " return %2$d;\n" + indent + " }\n", propertyName, token.encoding().primitiveType().size())); return sb; }
private int generatePropertyEncodeDecode( final Token token, final String typeName, final StringBuilder encode, final StringBuilder decode, final int currentOffset) { final char varName = Character.toLowerCase(typeName.charAt(0)); final String propertyName = formatPropertyName(token.name()); final int gap = token.offset() - currentOffset; encode.append(generateEncodeOffset(gap, "")); decode.append(generateDecodeOffset(gap, "")); encode.append(String.format( "\tif err := %1$s.%2$s.Encode(_m, _w); err != nil {\n" + "\t\treturn err\n" + "\t}\n", varName, propertyName)); decode.append(String.format( "\tif %1$s.%2$sInActingVersion(actingVersion) {\n" + "\t\tif err := %1$s.%2$s.Decode(_m, _r, actingVersion); err != nil {\n" + "\t\t\treturn err\n" + "\t\t}\n" + "\t}\n", varName, propertyName)); return token.encodedLength() + gap; }
private Object generateCompositeProperty(final String propertyName, final Token token, final String indent) { final String compositeName = CSharpUtil.formatClassName(token.applicableTypeName()); final int offset = token.offset(); final StringBuilder sb = new StringBuilder(); sb.append(String.format("\n" + indent + INDENT + "private readonly %1$s _%2$s = new %3$s();\n", compositeName, toLowerFirstChar(propertyName), compositeName)); sb.append(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 + "_%4$s.Wrap(_buffer, _offset + %5$d, _actingVersion);\n" + indent + INDENT + INDENT + INDENT + "return _%4$s;\n" + indent + INDENT + INDENT + "}\n" + indent + INDENT + "}\n", compositeName, toUpperFirstChar(propertyName), generateTypeFieldNotPresentCondition(token.version(), indent), toLowerFirstChar(propertyName), offset)); return sb; }
final int offset = token.offset(); final StringBuilder sb = new StringBuilder();
@Test public void shouldGenerateCorrectOffsetsForFieldsWithEmbeddedComposite() throws Exception { final MessageSchema schema = parse(getLocalResource("composite-offsets-schema.xml"), ParserOptions.DEFAULT); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); final List<Token> message2 = ir.getMessage(2); final int fieldOneIndex = 1; assertThat(message2.get(fieldOneIndex).offset(), is(0)); assertThat(message2.get(fieldOneIndex + 1).encodedLength(), is(4)); final int fieldTwoIndex = 4; assertThat(message2.get(fieldTwoIndex).offset(), is(8)); assertThat(message2.get(fieldTwoIndex + 1).encodedLength(), is(16)); assertThat(message2.get(fieldTwoIndex + 2).offset(), is(0)); assertThat(message2.get(fieldTwoIndex + 2).encodedLength(), is(1)); assertThat(message2.get(fieldTwoIndex + 3).offset(), is(8)); assertThat(message2.get(fieldTwoIndex + 3).encodedLength(), is(8)); final int fieldThreeIndex = 10; assertThat(message2.get(fieldThreeIndex).offset(), is(24)); assertThat(message2.get(fieldThreeIndex + 1).encodedLength(), is(8)); assertThat(message2.get(0).encodedLength(), is(32)); } }
private CharSequence generatePrimitivePropertyEncode( final String containingClassName, final String propertyName, final Token token, final String indent) { final Encoding encoding = token.encoding(); final String javaTypeName = javaTypeName(encoding.primitiveType()); final int offset = token.offset(); final String byteOrderStr = byteOrderString(encoding); return String.format( "\n" + indent + " public %s %s(final %s value)\n" + indent + " {\n" + indent + " %s;\n" + indent + " return this;\n" + indent + " }\n\n", formatClassName(containingClassName), formatPropertyName(propertyName), javaTypeName, generatePut(encoding.primitiveType(), "offset + " + offset, "value", byteOrderStr)); }
private CharSequence generateEnumEncoder( final String containingClassName, final String propertyName, final Token token, final String indent) { if (token.isConstantEncoding()) { return ""; } final String enumName = formatClassName(token.applicableTypeName()); final Encoding encoding = token.encoding(); final int offset = token.offset(); return String.format("\n" + indent + " public %s %s(final %s value)\n" + indent + " {\n" + indent + " %s;\n" + indent + " return this;\n" + indent + " }\n", formatClassName(containingClassName), propertyName, enumName, generatePut(encoding.primitiveType(), "offset + " + offset, "value.value()", byteOrderString(encoding))); }
private CharSequence generatePrimitivePropertyDecode( final boolean inComposite, final String propertyName, final Token propertyToken, final Token encodingToken, final String indent) { final Encoding encoding = encodingToken.encoding(); final String javaTypeName = javaTypeName(encoding.primitiveType()); final int offset = encodingToken.offset(); final String byteOrderStr = byteOrderString(encoding); return String.format( "\n" + indent + " public %s %s()\n" + indent + " {\n" + "%s" + indent + " return %s;\n" + indent + " }\n\n", javaTypeName, formatPropertyName(propertyName), generateFieldNotPresentCondition(inComposite, propertyToken.version(), encoding, indent), generateGet(encoding.primitiveType(), "offset + " + offset, byteOrderStr)); }
final int offset = token.offset(); final String byteOrderStr = byteOrderString(encoding); final int fieldLength = token.arrayLength();
generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent); generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent); generateFieldMetaAttributeMethod(sb, fieldToken, indent);
generatePropertyNotPresentCondition(inComposite, DECODER, fieldToken, enumName, indent), enumName, generateGet(encoding.primitiveType(), "offset + " + typeToken.offset(), byteOrderString(encoding)));
assertThat(mantissaToken.offset(), is(0)); assertThat(mantissaToken.encoding().primitiveType(), is(PrimitiveType.INT64)); assertThat(exponentToken.offset(), is(8)); assertThat(exponentToken.encoding().primitiveType(), is(PrimitiveType.INT8)); assertThat(enumToken.encodedLength(), is(1)); assertThat(enumToken.encoding().primitiveType(), is(PrimitiveType.UINT8)); assertThat(enumToken.offset(), is(10));
private CharSequence generateSingleValueProperty( final String propertyName, final Token token, final String indent) { final String typeName = cSharpTypeName(token.encoding().primitiveType()); final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName()); final int offset = token.offset(); final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); return String.format("\n" + indent + "public %1$s %2$s\n" + indent + "{\n" + indent + INDENT + "get\n" + indent + INDENT + "{\n" + "%3$s" + indent + INDENT + INDENT + "return _buffer.%4$sGet%6$s(_offset + %5$d);\n" + indent + INDENT + "}\n" + indent + INDENT + "set\n" + indent + INDENT + "{\n" + indent + INDENT + INDENT + "_buffer.%4$sPut%6$s(_offset + %5$d, value);\n" + indent + INDENT + "}\n" + indent + "}\n\n", typeName, toUpperFirstChar(propertyName), generateFieldNotPresentCondition(token.version(), token.encoding(), indent), typePrefix, offset, byteOrderStr); }
private String generateBitSetProperty(final String propertyName, final Token token, final String indent) { final String bitSetName = formatClassName(token.applicableTypeName()); final int offset = token.offset(); final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName()); final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); final String typeName = cSharpTypeName(token.encoding().primitiveType()); 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", bitSetName, toUpperFirstChar(propertyName), generateTypeFieldNotPresentCondition(token.version(), indent), bitSetName, typePrefix, offset, byteOrderStr, typeName); }
private void assertEqual(final Token lhs, final Token rhs) { assertThat(lhs.name(), is(rhs.name())); assertThat(lhs.version(), is(rhs.version())); assertThat(lhs.offset(), is(rhs.offset())); assertThat((long)lhs.id(), is((long)rhs.id())); assertThat(lhs.signal(), is(rhs.signal())); assertThat(lhs.encodedLength(), is(rhs.encodedLength())); assertThat(lhs.encoding().byteOrder(), is(rhs.encoding().byteOrder())); assertThat(lhs.encoding().primitiveType(), is(rhs.encoding().primitiveType())); assertThat(lhs.encoding().presence(), is(rhs.encoding().presence())); assertThat(lhs.encoding().constValue(), is(rhs.encoding().constValue())); assertThat(lhs.encoding().minValue(), is(rhs.encoding().minValue())); assertThat(lhs.encoding().maxValue(), is(rhs.encoding().maxValue())); assertThat(lhs.encoding().nullValue(), is(rhs.encoding().nullValue())); assertThat(lhs.encoding().characterEncoding(), is(rhs.encoding().characterEncoding())); assertThat(lhs.encoding().epoch(), is(rhs.encoding().epoch())); assertThat(lhs.encoding().timeUnit(), is(rhs.encoding().timeUnit())); assertThat(lhs.encoding().semanticType(), is(rhs.encoding().semanticType())); }