This is an example of how to use CodeGen class. 
#include "Printer.h"
 
using namespace std;
 
#if defined (__GNUG__) || defined (__clang__)
#pragma GCC diagnostic ignored "-Wswitch"
#endif
 
void Printer::end (
const Root& ast)
 
{
    out_.close ();
}
 
void Printer::print_type (
const Type& t)
 
{
    static const char* const basic_types [(size_t)BasicType::ANY + 1] = {
        "boolean",
        "octet",
        "char",
        "wchar",
        "unsigned short",
        "unsigned long",
        "unsigned longlong",
        "short",
        "long",
        "long long",
        "float",
        "double",
        "long double",
        "Object",
        "ValueBase",
        "any"
    };
 
        case Type::Kind::BASIC_TYPE:
            break;
        case Type::Kind::NAMED_TYPE:
            break;
        case Type::Kind::STRING:
        case Type::Kind::WSTRING:
            out_ << (t.
tkind () == Type::Kind::STRING ? 
"string" : 
"wstring");
 
            break;
        case Type::Kind::FIXED:
            out_ << "fixed";
            break;
        case Type::Kind::SEQUENCE: {
            out_ << "sequence <";
            print_type (seq);
                out_ << 
", " << seq.
bound ();
 
            out_ << '>';
        } break;
        case Type::Kind::ARRAY: {
            print_type (arr);
            for (auto dim : arr.dimensions ()) {
                out_ << '[' << dim << ']';
            }
        } break;
        default:
            assert (false);
    }
}
 
void Printer::leaf (
const Include& item)
 
{
        out_ << 
"#include <" << item.
file ().string () << 
">\n";
 
    else
        out_ << 
"#include \"" << item.
file ().string () << 
"\"\n";
 
}
 
void Printer::leaf (
const Native& item)
 
{
    out_ << 
"native " << item.
name () << 
";\n";
 
    print_typeid (item);
}
 
void Printer::leaf (
const TypeDef& item)
 
{
    out_ << "typedef ";
    print_type (item);
    out_ << 
' ' << item.
name () << 
";\n";
 
    print_typeid (item);
}
 
void Printer::leaf (
const Constant& item)
 
{
    out_ << "const ";
    print_type (item);
    out_ << 
' ' << item.
name ();
 
    if (item.
vtype () != Variant::VT::EMPTY) {
 
        out_ << " = ";
        if (item.
vtype () == Variant::VT::WSTRING)
 
            out_ << 'L';
        if (item.
vtype () == Variant::VT::FIXED)
 
            out_ << 'D';
    }
    out_ <<";\n";
}
 
{
    out_.empty_line ();
    out_ << 
"module " << item.
name () << 
" {\n\n";
 
}
 
{
    out_ << "};\n\n";
}
 
{
        case InterfaceKind::ABSTRACT:
            out_ << "abstract ";
            break;
        case InterfaceKind::LOCAL:
            out_ << "local ";
            break;
        case InterfaceKind::PSEUDO:
            out_ << "pseudo ";
            break;
    }
}
 
{
    print_interface_kind (item);
    out_ << 
"interface " << item.
name () << 
";\n";
 
    print_typeid (item);
}
 
{
    out_.empty_line ();
    print_interface_kind (item);
    out_ << 
"interface " << item.
name ();
 
    if (!item.
bases ().empty ()) {
 
        out_ << " :\n";
        out_.indent ();
        auto base = item.
bases ().begin ();
 
        out_ << (*base)->name ();
        ++base;
        for (; base != item.
bases ().end (); ++base) {
 
            out_ << ",\n";
            out_ << (*base)->name ();
        }
        out_.unindent ();
    }
    out_ << '\n';
    out_ << "{\n";
    out_.indent ();
}
 
{
    complex_end (item);
}
 
void Printer::constructed_begin (
const char* type, 
const NamedItem& item)
 
{
    out_.empty_line ();
    out_ << type << item.
name () << 
" {\n";
 
    out_.indent ();
}
 
{
    out_.unindent ();
    out_ << "};\n";
    print_typeid (item);
    out_ << std::endl;
}
 
{
        out_ << "oneway void";
    else if (item.
tkind () == Type::Kind::VOID)
 
        out_ << "void";
    else
        print_type (item);
 
    print_op_base (item);
 
        out_ << " context (\"";
        out_ << *s;
        for (++s; s != item.
context ().end (); ++s) {
 
            out_ << "\", \"" << *s;
        }
        out_ << "\")";
    }
    out_ << ";\n";
}
 
{
    out_ << 
' ' << item.
name () << 
" (";
 
    if (!item.empty ()) {
        auto param = item.begin ();
        print (**param);
        for (++param; param != item.end (); ++param) {
            out_ << ", ";
            print (**param);
        }
    }
    out_ << ')';
    if (!item.
raises ().empty ()) {
 
        out_ << " raises ";
    }
}
 
void Printer::print (
const Raises& raises)
 
{
    auto ex = raises.begin ();
    out_ << '(' << (*ex)->name ();
    for (++ex; ex != raises.end (); ++ex) {
        out_ << ", " << (*ex)->name ();
    }
    out_ << ')';
}
 
{
    const char* att = "in";
        case Parameter::Attribute::OUT:
            att = "out";
            break;
        case Parameter::Attribute::INOUT:
            att = "inout";
            break;
    }
    out_ << att << ' ';
    print_type (p);
    out_ << 
' ' << p.
name ();
 
}
 
{
        out_ << "readonly attribute ";
        print_type (item);
        out_ << 
' ' << item.
name ();
 
            out_ << " raises ";
        }
    } else {
        out_ << "attribute ";
        print_type (item);
        out_ << 
' ' << item.
name ();
 
            out_ << " getraises ";
        }
            out_ << " setraises ";
        }
    }
    out_ << ";\n";
}
 
{
    constructed_begin (item.
kind () == Item::Kind::EXCEPTION ? 
"exception " : 
"struct ", item);
 
    for (auto m : item) {
        print_type (*m);
        out_ << ' ' << m->name () << ";\n";
    }
    complex_end (item);
}
 
{
    constructed (item);
}
 
{
    out_ << 
"struct " << item.
name () << 
";\n";
 
}
 
void Printer::leaf (
const Struct& item)
 
{
    constructed (item);
}
 
{
    out_ << 
"union " << item.
name () << 
";\n";
 
}
 
void Printer::leaf (
const Union& item)
 
{
    out_ << 
"union " << item.
name () << 
" switch (";
 
    out_ << ") {\n";
    out_.indent ();
    for (auto el : item) {
        if (!el->is_default ()) {
            for (const auto& label : el->labels ()) {
                out_ << "case " << label.to_string () << ":\n";
            }
        } else
            out_ << "default:\n";
        out_.indent ();
        print_type (*el);
        out_ << ' ' << el->name () << ";\n";
        out_.unindent ();
    }
    complex_end (item);
}
 
void Printer::leaf (
const Enum& item)
 
{
    constructed_begin ("enum ", item);
    auto it = item.begin ();
    for (++it; it != item.end (); ++it) {
        out_ << ",\n";
        out_ << (*it)->name ();
    }
    out_ << endl;
    complex_end (item);
}
 
{
        out_ << "abstract ";
    out_ << 
"valuetype " << item.
name () << 
";\n";
 
    print_typeid (item);
}
 
{
        case ValueType::Modifier::ABSTRACT:
            out_ << "abstract ";
            break;
        case ValueType::Modifier::CUSTOM:
            out_ << "custom ";
            break;
    }
    out_ << 
"valuetype " << item.
name ();
 
 
    if (!item.
bases ().empty ()) {
 
        out_ << ":\n";
        out_.indent ();
        auto base = item.
bases ().begin ();
 
        out_ << (*base)->name ();
        ++base;
        for (; base != item.
bases ().end (); ++base) {
 
            out_ << ",\n";
            out_ << (*base)->name ();
        }
        out_.unindent ();
    }
 
        out_ << "supports\n";
        out_.indent ();
        if (item.
modifier () == ValueType::Modifier::TRUNCATABLE)
 
            out_ << "truncatable ";
        out_ << (*base)->name ();
        ++base;
        for (; base != item.
supports ().end (); ++base) {
 
            out_ << ",\n";
            out_ << (*base)->name ();
        }
        out_.unindent ();
    }
 
    out_ << '\n';
    out_ << "{\n";
    out_.indent ();
}
 
{
    complex_end (item);
}
 
{
        out_ << "public ";
    else
        out_ << "private ";
    print_type (item);
    out_ << 
' ' << item.
name () << 
";\n";
 
}
 
{
    out_ << "factory ";
    print_op_base (item);
    out_ << ";\n";
}
 
void Printer::leaf (
const ValueBox& item)
 
{
    out_ << 
"valuetype " << item.
name () << 
' ';
 
    print_type (item);
    out_ << ";\n";
    print_typeid (item);
}
 
{
}
The array type descriptor.
 
bool readonly() const noexcept
 
const Raises & getraises() const noexcept
 
const Raises & setraises() const noexcept
 
const std::filesystem::path & file() const noexcept
Returns the name of included IDL file.
 
bool system() const noexcept
 
const Interfaces & bases() const noexcept
 
Kind interface_kind() const noexcept
 
Kind kind() const noexcept
 
std::string repository_id() const
 
const Identifier & name() const noexcept
 
std::string qualified_name() const
 
const Identifier & name() const noexcept
 
const Raises & raises() const noexcept
 
const Context & context() const noexcept
 
bool oneway() const noexcept
 
Attribute attribute() const noexcept
 
The sequence type descriptor.
 
Dim bound() const noexcept
 
bool is_public() const noexcept
 
Kind tkind() const noexcept
 
const Array & array() const noexcept
 
uint16_t fixed_digits() const noexcept
 
BasicType basic_type() const noexcept
 
uint16_t fixed_scale() const noexcept
 
const NamedItem & named_type() const noexcept
 
const Sequence & sequence() const noexcept
 
Dim string_bound() const noexcept
 
const Type & discriminator_type() const noexcept
 
bool is_abstract() const noexcept
 
const ValueTypes & bases() const noexcept
 
Modifier modifier() const noexcept
 
const Interfaces & supports() const noexcept
 
VT vtype() const noexcept
 
std::string to_string() const
 
Abstract Syntax Tree namespace.