static String getTypeName(CNode node, boolean includeArray) {
        String type = null;
        if (node instanceof InnerCNode innerNode) {
            type = getTypeName(innerNode.getName());
        } else if (node instanceof LeafCNode leaf) {
            if (leaf.getType().equals("bool")) {
                type = "bool";
            } else if (leaf.getType().equals("int")) {
                type = "int32_t";
            } else if (leaf.getType().equals("long")) {
                type = "int64_t";
            } else if (leaf.getType().equals("double")) {
                type = "double";
            } else if (leaf.getType().equals("enum")) {
                type = getTypeName(node.getName());
            } else if (leaf.getType().equals("string")) {
                type = "std::string";
            } else if (leaf.getType().equals("reference")) {
                type = "std::string";
            } else if (leaf.getType().equals("file")) {
                type = "std::string";
            } else {
                throw new IllegalArgumentException("Unknown leaf datatype " + leaf.getType());
            }
        }
        if (type == null) {
            throw new IllegalArgumentException("Unknown node " + node);
        }
        if (node.isArray && includeArray) {
            if (vectorTypeDefs.containsKey(type)) {
                type = vectorTypeDefs.get(type);
            } else {
                type = type + "Vector";
            }
        } else if (node.isMap && includeArray) {
            if (mapTypeDefs.containsKey(type)) {
                type = mapTypeDefs.get(type);
            } else {
                type = type + "Map";
            }
        }
        return type;
    }
\n"
                + " * This class contains the config. DO NOT USE THIS CLASS DIRECTLY. Use the typedeffed\n"
                + " * versions after this class declaration.\n"
                + "
configgen/src/main/java/com/yahoo/config/codegen/CppClassBuilder.java