private void generateChoiceEncodeDecode(final StringBuilder sb, final String choiceName, final Token token) { final char varName = Character.toLowerCase(choiceName.charAt(0)); generateEncodeHeader(sb, varName, choiceName, false, false); sb.append(String.format( "\tvar wireval uint%1$d = 0\n" + "\tfor k, v := range %2$s {\n" + "\t\tif v {\n" + "\t\t\twireval |= (1 << uint(k))\n" + "\t\t}\n\t}\n" + "\treturn _m.WriteUint%1$d(_w, wireval)\n" + "}\n", token.encodedLength() * 8, varName)); generateDecodeHeader(sb, varName, choiceName, false, false); sb.append(String.format( "\tvar wireval uint%1$d\n\n" + "\tif err := _m.ReadUint%1$d(_r, &wireval); err != nil {\n" + "\t\treturn err\n" + "\t}\n" + "\n" + "\tvar idx uint\n" + "\tfor idx = 0; idx < %1$d; idx++ {\n" + "\t\t%2$s[idx] = (wireval & (1 << idx)) > 0\n" + "\t}\n", token.encodedLength() * 8, varName)); sb.append("\treturn nil\n}\n"); }
private void generateCompositeFlyweightHeader( final Token token, final String typeName, final Writer out, final String buffer, final String fqBuffer, final String implementsString) throws IOException { out.append(generateFileHeader(ir.applicableNamespace(), fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); }
private void generateFixedFlyweightHeader( final Token token, final String typeName, final String implementsString, final Writer out, final String buffer, final String fqBuffer) throws IOException { out.append(generateFileHeader(ir.applicableNamespace(), fqBuffer)); out.append(generateDeclaration(typeName, implementsString, token)); out.append(generateFixedFlyweightCode(typeName, token.encodedLength(), buffer)); }
private void generateComposite(final List<Token> tokens) throws IOException { final String compositeName = CSharpUtil.formatClassName(tokens.get(0).applicableTypeName()); try (Writer out = outputManager.createOutput(compositeName)) { out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(compositeName)); out.append(generateFixedFlyweightCode(tokens.get(0).encodedLength())); out.append(generateCompositePropertyElements(tokens.subList(1, tokens.size() - 1), BASE_INDENT)); out.append(INDENT + "}\n"); out.append("}\n"); } }
private void generateComposite(final List<Token> tokens) throws IOException { final String compositeName = formatClassName(tokens.get(0).applicableTypeName()); try (Writer out = outputManager.createOutput(compositeName)) { out.append(generateFileHeader(ir.namespaces(), compositeName, generateTypesToIncludes(tokens.subList(1, tokens.size() - 1)))); out.append(generateClassDeclaration(compositeName)); out.append(generateFixedFlyweightCode(compositeName, tokens.get(0).encodedLength())); out.append(generateCompositePropertyElements( compositeName, tokens.subList(1, tokens.size() - 1), BASE_INDENT)); out.append("};\n"); out.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n"); } }
private void generateComposite(final List<Token> tokens, final String namePrefix) throws IOException { final String compositeName = namePrefix + formatTypeName(tokens.get(0).applicableTypeName()); final StringBuilder sb = new StringBuilder(); try (Writer out = outputManager.createOutput(compositeName)) { imports = new TreeSet<>(); imports.add("io"); generateTypeDeclaration(sb, compositeName); generateTypeBodyComposite(sb, compositeName, tokens.subList(1, tokens.size() - 1)); generateEncodeDecode(sb, compositeName, tokens.subList(1, tokens.size() - 1), false, false); generateEncodedLength(sb, compositeName, tokens.get(0).encodedLength()); generateCompositePropertyElements(sb, compositeName, tokens.subList(1, tokens.size() - 1)); // The FileHeader needs to know which imports to add so // it's created last once that's known. out.append(generateFileHeader(ir.namespaces())); out.append(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 void generateChoiceSet(final List<Token> tokens) throws IOException { final Token choiceToken = tokens.get(0); final String choiceName = formatTypeName(choiceToken.applicableTypeName()); final StringBuilder sb = new StringBuilder(); try (Writer out = outputManager.createOutput(choiceName)) { imports = new TreeSet<>(); imports.add("io"); generateChoiceDecls( sb, choiceName, tokens.subList(1, tokens.size() - 1), choiceToken); generateChoiceEncodeDecode(sb, choiceName, choiceToken); // EncodedLength sb.append(String.format( "\nfunc (%1$s) EncodedLength() int64 {\n" + "\treturn %2$s\n" + "}\n", choiceName, choiceToken.encodedLength())); for (final Token token : tokens.subList(1, tokens.size() - 1)) { generateSinceActingDeprecated(sb, choiceName, token.name(), token); } out.append(generateFileHeader(ir.namespaces())); out.append(sb); } }
"}\n", enumName, enumToken.encodedLength()));
private void generateChoiceSet(final List<Token> tokens) throws IOException { final String bitSetName = formatClassName(tokens.get(0).applicableTypeName()); try (Writer out = outputManager.createOutput(bitSetName)) { out.append(generateFileHeader(ir.namespaces(), bitSetName, null)); out.append(generateClassDeclaration(bitSetName)); out.append(generateFixedFlyweightCode(bitSetName, tokens.get(0).encodedLength())); out.append(String.format( " %1$s &clear()\n" + " {\n" + " %2$s zero = 0;\n" + " std::memcpy(m_buffer + m_offset, &zero, sizeof(%2$s));\n" + " return *this;\n" + " }\n", bitSetName, cppTypeName(tokens.get(0).encoding().primitiveType()))); out.append(String.format("\n" + " bool isEmpty() const\n" + " {\n" + " %1$s val;\n" + " std::memcpy(&val, m_buffer + m_offset, sizeof(%1$s));\n" + " return 0 == val;\n" + " }\n", cppTypeName(tokens.get(0).encoding().primitiveType()))); out.append(generateChoices(bitSetName, tokens.subList(1, tokens.size() - 1))); out.append("};\n"); out.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n"); } }
private void generateExtensibilityMethods( final StringBuilder sb, final String typeName, final Token token) { sb.append(String.format( "\nfunc (*%1$s) SbeBlockLength() (blockLength uint) {\n" + "\treturn %2$s\n" + "}\n" + "\nfunc (*%1$s) SbeSchemaVersion() (schemaVersion %3$s) {\n" + "\treturn %4$s\n" + "}\n", typeName, generateLiteral(ir.headerStructure().blockLengthType(), Integer.toString(token.encodedLength())), golangTypeName(ir.headerStructure().schemaVersionType()), generateLiteral(ir.headerStructure().schemaVersionType(), Integer.toString(ir.version())))); }
@Test public void shouldGenerateValueRefToEnum() throws Exception { final MessageSchema schema = parse(getLocalResource("value-ref-schema.xml"), ParserOptions.DEFAULT); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); assertThat(ir.getMessage(1).get(1).encodedLength(), is(8)); assertThat(ir.getMessage(2).get(1).encodedLength(), is(0)); assertThat(ir.getMessage(3).get(1).encodedLength(), is(0)); assertThat(ir.getMessage(4).get(1).encodedLength(), is(0)); assertThat(ir.getMessage(5).get(1).encodedLength(), is(0)); } }
private void generateVarData( final StringBuilder sb, final String typeName, final List<Token> tokens) { for (int i = 0, size = tokens.size(); i < size;) { final Token token = tokens.get(i); if (token.signal() != Signal.BEGIN_VAR_DATA) { throw new IllegalStateException("tokens must begin with BEGIN_VAR_DATA: token=" + token); } final String propertyName = toUpperFirstChar(token.name()); final Token lengthToken = Generators.findFirst("length", tokens, i); final int lengthOfLengthField = lengthToken.encodedLength(); final Token varDataToken = Generators.findFirst("varData", tokens, i); final String characterEncoding = varDataToken.encoding().characterEncoding(); generateFieldMetaAttributeMethod(sb, typeName, propertyName, token); generateVarDataDescriptors(sb, token, typeName, propertyName, characterEncoding, lengthOfLengthField); i += token.componentTokenCount(); } }
@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)); } }
final int sizeOfLengthField = lengthToken.encodedLength(); final Encoding lengthEncoding = lengthToken.encoding(); final int maxLengthValue = (int)lengthEncoding.applicableMaxValue().longValue();
generateFieldSinceVersionMethod(sb, fieldToken, indent); generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent); generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent); generateFieldMetaAttributeMethod(sb, fieldToken, indent);
generateFieldSinceVersionMethod(sb, fieldToken, indent); generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent); generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent); generateFieldMetaAttributeMethod(sb, fieldToken, indent);
assertThat(beginCompositeToken.encodedLength(), is(11)); assertThat(enumToken.encodedLength(), is(1)); assertThat(enumToken.encoding().primitiveType(), is(PrimitiveType.UINT8)); assertThat(enumToken.offset(), is(10));
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())); }
length = headerStructure.tokens().get(0).encodedLength();