aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-07-30 14:39:30 +0200
committerGitHub <noreply@github.com>2019-07-30 14:39:30 +0200
commitb9e33aa6cbee7806ae0dfab3a4f6466b98515961 (patch)
tree164a753a8ba212c2c34ddea6e6e595367b1bd1a1
parentf981a74a122dce8b17728dd735cdbcc155260900 (diff)
parent73c5587f4ea29e40fa05becd061a63e6ac0673ee (diff)
Merge pull request #10127 from vespa-engine/toregge/use-enum-class-in-generated-config
Use enum class when generating c++ code.
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java16
1 files changed, 11 insertions, 5 deletions
diff --git a/configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java b/configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java
index 14f1e15f4f2..bc8369677fc 100644
--- a/configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java
+++ b/configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java
@@ -272,7 +272,7 @@ public class CppClassBuilder implements ClassBuilder {
String typeName = getTypeName(child, false);
declaredTypes.add(child.getName());
if (child instanceof LeafCNode.EnumLeaf) {
- w.write(indent + "enum " + typeName + " { ");
+ w.write(indent + "enum class " + typeName + " { ");
LeafCNode.EnumLeaf leaf = (LeafCNode.EnumLeaf) child;
for (int i=0; i<leaf.getLegalValues().length; ++i) {
if (i != 0) {
@@ -623,7 +623,7 @@ public class CppClassBuilder implements ClassBuilder {
for (int i=0; i<leaf.getLegalValues().length; ++i) {
w.write(" " + (i != 0 ? "} else " : ""));
w.write("if (name == \"" + leaf.getLegalValues()[i] + "\") {\n"
- + " return " + leaf.getLegalValues()[i] + ";\n");
+ + " return " + typeName + "::" + leaf.getLegalValues()[i] + ";\n");
}
w.write(" } else {\n"
+ " throw InvalidConfigException(\"Illegal enum value '\" + name + \"'\");\n"
@@ -638,12 +638,12 @@ public class CppClassBuilder implements ClassBuilder {
+ " switch (t) {\n"
);
for (int i=0; i<leaf.getLegalValues().length; ++i) {
- w.write(" case " + leaf.getLegalValues()[i] + ": return \"" + leaf.getLegalValues()[i] + "\";\n");
+ w.write(" case " + typeName + "::" + leaf.getLegalValues()[i] + ": return \"" + leaf.getLegalValues()[i] + "\";\n");
}
w.write(" default:\n"
+ " {\n"
+ " vespalib::asciistream ost;\n"
- + " ost << \"UNKNOWN(\" << t << \")\";\n"
+ + " ost << \"UNKNOWN(\" << static_cast<int>(t) << \")\";\n"
+ " return ost.str();\n"
+ " }\n"
+ " }\n"
@@ -687,6 +687,9 @@ public class CppClassBuilder implements ClassBuilder {
} else if (child instanceof LeafCNode) { // If we have a default value, use that..
LeafCNode leaf = (LeafCNode) child;
if (leaf.getDefaultValue() != null) {
+ if (leaf.getType().equals("enum")) {
+ w.write(getTypeName(leaf, false) + "::");
+ }
w.write(getDefaultValue(leaf));
} else {
// Defines empty constructor defaults for primitives without default set
@@ -699,7 +702,7 @@ public class CppClassBuilder implements ClassBuilder {
} else if (leaf.getType().equals("string")) {
} else if (leaf.getType().equals("enum")) {
LeafCNode.EnumLeaf enumNode = (LeafCNode.EnumLeaf) leaf;
- w.write(enumNode.getLegalValues()[0]);
+ w.write(getTypeName(leaf, false) + "::" + enumNode.getLegalValues()[0]);
} else if (leaf.getType().equals("reference")) {
} else if (leaf.getType().equals("file")) {
}
@@ -1097,6 +1100,9 @@ public class CppClassBuilder implements ClassBuilder {
if (child instanceof LeafCNode && ((LeafCNode) child).getDefaultValue() != null) {
LeafCNode leaf = (LeafCNode) child;
String defaultValue = getDefaultValue(leaf);
+ if (leaf.getType().equals("enum")) {
+ defaultValue = getTypeName(leaf, false) + "::" + defaultValue;
+ }
w.write("()(" + childInspector + ", " + defaultValue + ");\n");
} else if (child instanceof InnerCNode) {
w.write("()(" + childInspector + ");\n");