diff --git a/examples/osgintrospection/osgintrospection.cpp b/examples/osgintrospection/osgintrospection.cpp index 371ecf7d6..feae2e49a 100644 --- a/examples/osgintrospection/osgintrospection.cpp +++ b/examples/osgintrospection/osgintrospection.cpp @@ -47,6 +47,193 @@ bool type_order(const Type *v1, const Type *v2) return v1->getQualifiedName().compare(v2->getQualifiedName()) < 0; } +void print_method(const MethodInfo &mi) +{ + std::cout << "\t "; + + // display if the method is virtual + if (mi.isVirtual()) + std::cout << "virtual "; + + // display the method's return type if defined + if (mi.getReturnType().isDefined()) + std::cout << mi.getReturnType().getQualifiedName() << " "; + else + std::cout << "[UNDEFINED TYPE] "; + + // display the method's name + std::cout << mi.getName() << "("; + + // display method's parameters + const ParameterInfoList ¶ms = mi.getParameters(); + for (ParameterInfoList::const_iterator k=params.begin(); k!=params.end(); ++k) + { + // get the ParameterInfo object that describes the + // current parameter + const ParameterInfo &pi = **k; + + // display the parameter's modifier + if (pi.isIn()) + std::cout << "IN"; + if (pi.isOut()) + std::cout << "OUT"; + if (pi.isIn() || pi.isOut()) + std::cout << " "; + + // display the parameter's type name + if (pi.getParameterType().isDefined()) + std::cout << pi.getParameterType().getQualifiedName(); + + // display the parameter's name if defined + if (!pi.getName().empty()) + std::cout << " " << pi.getName(); + + if ((k+1)!=params.end()) + std::cout << ", "; + } + std::cout << ")"; + if (mi.isConst()) + std::cout << " const"; + if (mi.isPureVirtual()) + std::cout << " = 0"; + std::cout << "\n"; +} + +void print_type(const Type &type) +{ + // ignore pointer types and undefined types + if (!type.isDefined() || type.isPointer() || type.isReference()) + return; + + // print the type name + std::cout << type.getQualifiedName() << "\n"; + + // check whether the type is abstract + if (type.isAbstract()) std::cout << "\t[abstract]\n"; + + // check whether the type is atomic + if (type.isAtomic()) std::cout << "\t[atomic]\n"; + + // check whether the type is an enumeration. If yes, display + // the list of enumeration labels + if (type.isEnum()) + { + std::cout << "\t[enum]\n"; + std::cout << "\tenumeration values:\n"; + const EnumLabelMap &emap = type.getEnumLabels(); + for (EnumLabelMap::const_iterator j=emap.begin(); j!=emap.end(); ++j) + { + std::cout << "\t\t" << j->second << " = " << j->first << "\n"; + } + } + + // if the type has one or more base types, then display their + // names + if (type.getNumBaseTypes() > 0) + { + std::cout << "\tderived from: "; + for (int j=0; jisDefined() || (*i)->isPointer() || (*i)->isReference()) - continue; - - // print the type name - std::cout << (*i)->getQualifiedName() << "\n"; - - // check whether the type is abstract - if ((*i)->isAbstract()) std::cout << "\t[abstract]\n"; - - // check whether the type is atomic - if ((*i)->isAtomic()) std::cout << "\t[atomic]\n"; - - // check whether the type is an enumeration. If yes, display - // the list of enumeration labels - if ((*i)->isEnum()) - { - std::cout << "\t[enum]\n"; - std::cout << "\tenumeration values:\n"; - const EnumLabelMap &emap = (*i)->getEnumLabels(); - for (EnumLabelMap::const_iterator j=emap.begin(); j!=emap.end(); ++j) - { - std::cout << "\t\t" << j->second << " = " << j->first << "\n"; - } - } - - // if the type has one or more base types, then display their - // names - if ((*i)->getNumBaseTypes() > 0) - { - std::cout << "\tderived from: "; - for (int j=0; j<(*i)->getNumBaseTypes(); ++j) - { - const Type &base = (*i)->getBaseType(j); - if (base.isDefined()) - std::cout << base.getQualifiedName() << " "; - else - std::cout << "[undefined type] "; - } - std::cout << "\n"; - } - - // display a list of methods defined for the current type - const MethodInfoList &mil = (*i)->getMethods(); - if (!mil.empty()) - { - std::cout << "\t* methods:\n"; - for (MethodInfoList::const_iterator j=mil.begin(); j!=mil.end(); ++j) - { - // get the MethodInfo object that describes the current - // method - const MethodInfo &mi = **j; - - std::cout << "\t "; - - // display if the method is virtual - if (mi.isVirtual()) - std::cout << "virtual "; - - // display the method's return type if defined - if (mi.getReturnType().isDefined()) - std::cout << mi.getReturnType().getQualifiedName() << " "; - else - std::cout << "[UNDEFINED TYPE] "; - - // display the method's name - std::cout << mi.getName() << "("; - - // display method's parameters - const ParameterInfoList ¶ms = mi.getParameters(); - for (ParameterInfoList::const_iterator k=params.begin(); k!=params.end(); ++k) - { - // get the ParameterInfo object that describes the - // current parameter - const ParameterInfo &pi = **k; - - // display the parameter's modifier - if (pi.isIn()) - std::cout << "IN"; - if (pi.isOut()) - std::cout << "OUT"; - if (pi.isIn() || pi.isOut()) - std::cout << " "; - - // display the parameter's type name - if (pi.getParameterType().isDefined()) - std::cout << pi.getParameterType().getQualifiedName(); - - // display the parameter's name if defined - if (!pi.getName().empty()) - std::cout << " " << pi.getName(); - - if ((k+1)!=params.end()) - std::cout << ", "; - } - std::cout << ")"; - if (mi.isConst()) - std::cout << " const"; - if (mi.isPureVirtual()) - std::cout << " = 0"; - std::cout << "\n"; - } - } - - // display a list of properties defined for the current type - const PropertyInfoList &pil = (*i)->getProperties(); - if (!pil.empty()) - { - std::cout << "\t* properties:\n"; - for (PropertyInfoList::const_iterator j=pil.begin(); j!=pil.end(); ++j) - { - // get the PropertyInfo object that describes the current - // property - const PropertyInfo &pi = **j; - - std::cout << "\t "; - - std::cout << "{"; - std::cout << (pi.canGet()? "G": " "); - std::cout << (pi.canSet()? "S": " "); - std::cout << (pi.canCount()? "C": " "); - std::cout << (pi.canAdd()? "A": " "); - std::cout << "} "; - - // display the property's name - std::cout << pi.getName(); - - // display the property's value type if defined - std::cout << " ("; - if (pi.getPropertyType().isDefined()) - std::cout << pi.getPropertyType().getQualifiedName(); - else - std::cout << "UNDEFINED TYPE"; - std::cout << ") "; - - // check whether the property is an array property - if (pi.isArray()) - { - std::cout << " [ARRAY]"; - } - - // check whether the property is an indexed property - if (pi.isIndexed()) - { - std::cout << " [INDEXED]\n\t\t indices:\n"; - - const ParameterInfoList &ind = pi.getIndexParameters(); - - // print the list of indices - int num = 1; - for (ParameterInfoList::const_iterator k=ind.begin(); k!=ind.end(); ++k, ++num) - { - std::cout << "\t\t " << num << ") "; - const ParameterInfo &par = **k; - std::cout << par.getParameterType().getQualifiedName() << " " << par.getName(); - std::cout << "\n"; - } - } - - std::cout << "\n"; - } - } - std::cout << "\n" << std::string(75, '-') << "\n"; + print_type(**i); } }