forwards : output |
Output the block to the stream.
Any other method of any other object can call this method. This is called 'public' access.
The data-type returned is "voidtype";
This method is contained in the object "forwards".
The method takes the following arguments:
filedef : Pointer to tgl_structure_parser
Not sure.
obj : Pointer to @schemaobj
Not sure.
This method is overridden from an abstract method with the same signature found in the object @block.
The files "schema/schema_method.hpp", "schema/schema_object.hpp", "schema/schema_obj.hpp", "schema/schema_typename.hpp", "tgl_structure_parser.hpp", "tgl_list_parser.hpp" and "boost/tokenizer.hpp" are included.
Work out any forward declarations needed.
// create a set for the includes. std::set<std::string> forwards; // add in any forward classes from methods. { ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_method> *v = dynamic_cast<ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_method> *>( obj->get_composite_object("methods")); if (!v) { filedef->error("No composite member 'methods'."); return; } for (ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_method>::iterator i=v->begin(); i != v->end(); i++) { ph::xmlobj::xmlobj_typed_ref<ph::tools::schema::schema_typename> *r = dynamic_cast<ph::xmlobj::xmlobj_typed_ref<ph::tools::schema::schema_typename> *>( i->get_composite_object("returns")); if (!r) { filedef->error("No composite member 'methods/returns'."); return; } if (r->get()) { std::string reftype = r->get()->get("reftype"); if (reftype != "") { if (!declare_reftype(filedef, obj, reftype, &forwards)) return; } } ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename> *a = dynamic_cast<ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename> *>( i->get_composite_object("arguments")); if (!a) { filedef->error("No composite member 'methods/arguments'."); return; } for (ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename>::iterator j=a->begin(); j != a->end(); j++) { std::string reftype = j->get("reftype"); if (reftype != "") { if (!declare_reftype(filedef, obj, reftype, &forwards)) return; } } } } // and do the same with the members. { ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename> *v = dynamic_cast<ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename> *>( obj->get_composite_object("members")); if (!v) { filedef->error("No composite member 'members'."); return; } for (ph::xmlobj::xmlobj_typed_vector<ph::tools::schema::schema_typename>::iterator i=v->begin(); i != v->end(); i++) { std::string reftype = i->get("reftype"); if (reftype != "") { if (!declare_reftype(filedef, obj, reftype, &forwards)) return; } } } // TBD: we should create a graph of namespaces so that we correctly nest them etc. // for now, we just declare them ouitright each time. boost::char_separator<char> sep(":"); for (std::set<std::string>::iterator i=forwards.begin(); i != forwards.end(); i++) { // split out the namespaces. std::vector<std::string> names; boost::tokenizer<boost::char_separator<char> > t(*i, sep); for (boost::tokenizer<boost::char_separator<char> >::iterator j=t.begin(); j != t.end(); j++) names.push_back(*j); if (names.size() == 1 && _local) filedef->write_output("class " + *i + ";\\n"); else if (names.size() > 0 && !_local && names[0] == "std") { // don't output std declarations. } else if (names.size() > 1 && !_local) { for (unsigned int k=0; k < (names.size() - 1); k++) filedef->write_output("namespace " + names[k] + " { "); filedef->write_output("\\nclass " + names[names.size() - 1] + ";\\n"); for (unsigned int k=0; k < (names.size() - 1); k++) filedef->write_output("}; "); filedef->write_output("\\n"); } }