diff --git a/compiler/src/main/java/org/tysonite/asn1/gen/Main.java b/compiler/src/main/java/org/tysonite/asn1/gen/Main.java index 6118f44..907aab7 100644 --- a/compiler/src/main/java/org/tysonite/asn1/gen/Main.java +++ b/compiler/src/main/java/org/tysonite/asn1/gen/Main.java @@ -26,6 +26,8 @@ public final class Main { "ASN.1 compiler command line options"); public static final Option NO_CPP_CODE = new Option("ncpp", "no-cpp", false, "Do not generate C++ code, only parser ASN.1"); + public static final Option CPP11_CODE = new Option("cpp11", "cpp11", false, + "Generate C++ code with C++11 features"); public static final Option BIG_INTEGER = new Option("bi", "big-int", false, "Generate code with variable length integers"); @@ -45,6 +47,7 @@ private void initOptions() { options.addOption(METHOD_DER); options.addOption(METHOD_XER); options.addOption(NO_CPP_CODE); + options.addOption(CPP11_CODE); options.addOption(BIG_INTEGER); options.addOption(HELP); } diff --git a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/ChoiceTypeBody.java b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/ChoiceTypeBody.java index eedf64b..9e1da90 100644 --- a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/ChoiceTypeBody.java +++ b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/ChoiceTypeBody.java @@ -3,6 +3,7 @@ import org.tysonite.asn1.gen.ContentProvider; import org.tysonite.asn1.gen.DoNothingASTVisitor; import org.tysonite.asn1.gen.GeneratorContext; +import org.tysonite.asn1.gen.Main; import org.tysonite.asn1.gen.utils.CodeBuilder; import org.tysonite.asn1.gen.utils.GenerationUtils; import org.tysonite.asn1.gen.utils.VisitorUtils; @@ -42,6 +43,25 @@ public Object visit(ASTElementType node, Object data) { append(" }"); builder.newLine(); + // setter (move semantics) + if (context.getCommandLine().hasOption(Main.CPP11_CODE.getOpt())) { + builder.append(2, "void set_"). + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())). + append("("); + if (!VisitorUtils.visitChildsAndAccept(builder, node, new SimpleTypeName(context), + new DefinedCPPTypeName())) { + builder.append(VisitorUtils.queueGeneratedCodeForTypes(node, context)); + } + + builder.append("::ValueType&& v) { _"). + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())). + append(" = std::move(v);"); + builder.append(" _id = "). + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())).append("_ID;"). + append(" }"); + builder.newLine(); + } + // getter (const) builder.append(2, "const "); if (!VisitorUtils.visitChildsAndAccept(builder, node, new SimpleTypeName(context), diff --git a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceReadWriteDefinition.java b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceReadWriteDefinition.java index a0d0429..985a436 100644 --- a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceReadWriteDefinition.java +++ b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceReadWriteDefinition.java @@ -68,8 +68,13 @@ public Object visit(ASTElementType node, Object data) { // write code for setting value builder.append(2, "value.set_"). - append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())).append("(v);"). - newLine(); + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())); + if (context.getCommandLine().hasOption(Main.CPP11_CODE.getOpt())) { + builder.append("(std::move(v));"); + } else { + builder.append("(v);"); + } + builder.newLine(); builder.append(1, "}").newLine(); return data; diff --git a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceTypeBody.java b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceTypeBody.java index ef563ad..f42fb06 100644 --- a/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceTypeBody.java +++ b/compiler/src/main/java/org/tysonite/asn1/gen/visitor/SetOrSequenceTypeBody.java @@ -3,6 +3,7 @@ import org.tysonite.asn1.gen.ContentProvider; import org.tysonite.asn1.gen.DoNothingASTVisitor; import org.tysonite.asn1.gen.GeneratorContext; +import org.tysonite.asn1.gen.Main; import org.tysonite.asn1.gen.utils.CodeBuilder; import org.tysonite.asn1.gen.utils.GenerationUtils; import org.tysonite.asn1.gen.utils.VisitorUtils; @@ -41,6 +42,25 @@ public Object visit(ASTElementType node, Object data) { builder.append(" }"); builder.newLine(); + // setter (move semantics) + if (context.getCommandLine().hasOption(Main.CPP11_CODE.getOpt())) { + builder.append(2, "void set_"). + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())). + append("("); + if (!VisitorUtils.visitChildsAndAccept(builder, node, new SimpleTypeName(context), + new DefinedCPPTypeName()) + || VisitorUtils.visitChildsAndAccept(builder, node, new IsNamedIntegerType())) { + builder.append(VisitorUtils.queueGeneratedCodeForTypes(node, context)); + } + + builder.append("::ValueType&& v) { _"). + append(GenerationUtils.asCPPToken(node.jjtGetFirstToken().toString())). + append(" = std::move(v); "); + VisitorUtils.visitNodeAndAccept(builder, node, new SetAsPresent()); + builder.append(" }"); + builder.newLine(); + } + // getter (const) builder.append(2, "const "); if (!VisitorUtils.visitChildsAndAccept(builder, node, new SimpleTypeName(context),