public List<String> generateTypesToIncludes(final List<Token> tokens) { final List<String> typesToInclude = new ArrayList<>(); for (final Token token : tokens) { switch (token.signal()) { case BEGIN_ENUM: case BEGIN_SET: case BEGIN_COMPOSITE: typesToInclude.add(token.applicableTypeName()); break; } } return typesToInclude; }
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; }
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 generateEnum(final List<Token> tokens) throws IOException { final Token enumToken = tokens.get(0); final String enumName = formatClassName(tokens.get(0).applicableTypeName()); try (Writer out = outputManager.createOutput(enumName)) { out.append(generateFileHeader(ir.namespaces(), enumName, null)); out.append(generateEnumDeclaration(enumName)); out.append(generateEnumValues(tokens.subList(1, tokens.size() - 1), enumToken)); out.append(generateEnumLookupMethod(tokens.subList(1, tokens.size() - 1), enumToken)); out.append("};\n"); out.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n"); } }
private static void generateEnums(final Ir ir, final OutputManager outputManager) throws IOException { final Set<String> enumTypeNames = new HashSet<>(); for (final List<Token> tokens : ir.types()) { if (tokens.isEmpty()) { continue; } final Token beginToken = tokens.get(0); if (beginToken.signal() != BEGIN_ENUM) { continue; } final String typeName = beginToken.applicableTypeName(); if (enumTypeNames.contains(typeName)) { continue; } generateEnum(tokens, outputManager); enumTypeNames.add(typeName); } }
private CharSequence generateChoices(final List<Token> tokens) { final StringBuilder sb = new StringBuilder(); for (final Token token : tokens) { if (token.signal() == Signal.CHOICE) { final String choiceName = toUpperFirstChar(token.applicableTypeName()); final String choiceBitPosition = token.encoding().constValue().toString(); final int choiceValue = (int)Math.pow(2, Integer.parseInt(choiceBitPosition)); sb.append(String.format(INDENT + INDENT + "%s = %s,\n", choiceName, choiceValue)); } } return sb; }
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 void generateEnum(final List<Token> tokens) throws IOException { final Token enumToken = tokens.get(0); final String enumName = CSharpUtil.formatClassName(enumToken.applicableTypeName()); try (Writer out = outputManager.createOutput(enumName)) { out.append(generateFileHeader(ir.applicableNamespace())); final String enumPrimitiveType = cSharpTypeName(enumToken.encoding().primitiveType()); out.append(generateEnumDeclaration(enumName, enumPrimitiveType, false)); out.append(generateEnumValues(tokens.subList(1, tokens.size() - 1), enumToken)); out.append(INDENT + "}\n"); out.append("}\n"); } }
private void generateBitSet(final List<Token> tokens) throws IOException { final Token enumToken = tokens.get(0); final String enumName = CSharpUtil.formatClassName(enumToken.applicableTypeName()); try (Writer out = outputManager.createOutput(enumName)) { out.append(generateFileHeader(ir.applicableNamespace())); final String enumPrimitiveType = cSharpTypeName(enumToken.encoding().primitiveType()); out.append(generateEnumDeclaration(enumName, enumPrimitiveType, true)); out.append(generateChoices(tokens.subList(1, tokens.size() - 1))); out.append(INDENT + "}\n"); out.append("}\n"); } }
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; }
public List<String> generateTypeStubs() throws IOException { final List<String> typesToInclude = new ArrayList<>(); for (final List<Token> tokens : ir.types()) { switch (tokens.get(0).signal()) { case BEGIN_ENUM: generateEnum(tokens); break; case BEGIN_SET: generateChoiceSet(tokens); break; case BEGIN_COMPOSITE: generateComposite(tokens); break; } typesToInclude.add(tokens.get(0).applicableTypeName()); } return typesToInclude; }
private void generateEnum(final List<Token> tokens) throws IOException { final Token enumToken = tokens.get(0); final String enumName = formatClassName(enumToken.applicableTypeName()); try (Writer out = outputManager.createOutput(enumName)) { out.append(generateEnumFileHeader(ir.applicableNamespace())); out.append(generateEnumDeclaration(enumName, enumToken)); out.append(generateEnumValues(getMessageBody(tokens))); out.append(generateEnumBody(enumToken, enumName)); out.append(generateEnumLookupMethod(getMessageBody(tokens), enumName)); out.append("}\n"); } }
private static void generateEnum(final List<Token> enumTokens, final OutputManager outputManager) throws IOException { final String originalEnumName = enumTokens.get(0).applicableTypeName(); final String enumRustName = formatTypeName(originalEnumName); try (Writer writer = outputManager.createOutput("Enum " + enumRustName)) { final List<Token> messageBody = getMessageBody(enumTokens); if (messageBody.isEmpty()) { throw new IllegalArgumentException("No valid values provided for enum " + originalEnumName); } writer.append("#[derive(Clone,Copy,Debug,PartialEq,Eq,PartialOrd,Ord,Hash)]").append("\n"); final String rustReprTypeName = rustTypeName(messageBody.get(0).encoding().primitiveType()); writer.append(format("#[repr(%s)]", rustReprTypeName)).append("\n"); writer.append("pub enum ").append(enumRustName).append(" {\n"); for (final Token token : messageBody) { final Encoding encoding = token.encoding(); final String literal = generateRustLiteral(encoding.primitiveType(), encoding.constValue().toString()); indent(writer, 1).append(token.name()) .append(" = ") .append(literal) .append(",\n"); } writer.append("}\n"); } }
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 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; }
private static CharSequence generateEnumLookupMethod(final List<Token> tokens, final Token encodingToken) { final String enumName = formatClassName(encodingToken.applicableTypeName()); final StringBuilder sb = new StringBuilder(); sb.append(String.format( " static %1$s::Value get(const %2$s value)\n" + " {\n" + " switch (value)\n" + " {\n", enumName, cppTypeName(tokens.get(0).encoding().primitiveType()))); for (final Token token : tokens) { sb.append(String.format( " case %1$s: return %2$s;\n", token.encoding().constValue().toString(), token.name())); } sb.append(String.format( " case %1$s: return NULL_VALUE;\n" + " }\n\n" + " throw std::runtime_error(\"unknown value for enum %2$s [E103]\");\n" + " }\n", encodingToken.encoding().applicableNullValue().toString(), enumName)); return sb; }
private static void generateSingleComposite(final List<Token> tokens, final OutputManager outputManager) throws IOException { final Token beginToken = tokens.get(0); final String originalTypeName = beginToken.applicableTypeName(); final String formattedTypeName = formatTypeName(originalTypeName); final SplitCompositeTokens splitTokens = SplitCompositeTokens.splitInnerTokens(tokens); try (Writer writer = outputManager.createOutput(formattedTypeName)) { appendStructHeader(writer, formattedTypeName, true); appendStructFields(writer, splitTokens.nonConstantEncodingTokens()); writer.append("}\n"); generateConstantAccessorImpl(writer, formattedTypeName, getMessageBody(tokens)); } }
private void generateBitSet(final List<Token> tokens) throws IOException { final Token token = tokens.get(0); final String bitSetName = formatClassName(token.applicableTypeName()); final String decoderName = decoderName(bitSetName); final String encoderName = encoderName(bitSetName); final List<Token> messageBody = getMessageBody(tokens); final String implementsString = implementsInterface(FLYWEIGHT); try (Writer out = outputManager.createOutput(decoderName)) { generateFixedFlyweightHeader(token, decoderName, implementsString, out, readOnlyBuffer, fqReadOnlyBuffer); out.append(generateChoiceIsEmpty(token.encoding().primitiveType())); out.append(generateChoiceDecoders(messageBody)); out.append(generateChoiceDisplay(messageBody)); out.append("}\n"); } try (Writer out = outputManager.createOutput(encoderName)) { generateFixedFlyweightHeader(token, encoderName, implementsString, out, mutableBuffer, fqMutableBuffer); out.append(generateChoiceClear(encoderName, token)); out.append(generateChoiceEncoders(encoderName, messageBody)); out.append("}\n"); } }
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))); }