// file : odb/header.cxx // author : Boris Kolpackov // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file #include #include #include using namespace std; namespace { struct data_member: traversal::data_member, context { virtual void traverse (semantics::data_member& m) { if (transient (m)) return; string const& name (public_name (m)); string const& type (m.type ().fq_name (m.belongs ().hint ())); os << "static " << type << "&" << endl << name << " (value_type&);" << endl; os << "static const " << type << "&" << endl << name << " (const value_type&);" << endl; } }; struct class_: traversal::class_, context { class_ () { member_names_ >> member_; } virtual void traverse (type& c) { if (c.file () != unit.file ()) return; if (!composite (c)) return; string const& type (c.fq_name ()); os << "// " << c.name () << endl << "//" << endl; os << "template <>" << endl << "class access::value_traits< " << type << " >" << "{" << "public:" << endl; // value_type // os << "typedef " << type << " value_type;" << endl; names (c, member_names_); os << "};"; } private: data_member member_; traversal::names member_names_; }; } namespace header { void generate () { context ctx; ostream& os (ctx.os); os << "#include " << endl << "#include " << endl // std::size_t << endl; os << "#include " << endl << "#include " << endl << "#include " << endl << "#include " << endl << "#include " << endl; // In case of a boost TR1 implementation, we cannot distinguish // between the boost::shared_ptr and std::tr1::shared_ptr usage since // the latter is just a using-declaration for the former. To resolve // this we will include TR1 traits if the Boost TR1 header is included. // if (ctx.unit.count ("tr1-pointer-used") && ctx.unit.get ("tr1-pointer-used")) { os << "#include " << endl << "#include " << endl; } else if (ctx.unit.count ("boost-pointer-used") && ctx.unit.get ("boost-pointer-used")) { os << "#ifdef BOOST_TR1_MEMORY_HPP_INCLUDED" << endl << "# include " << endl << "# include " << endl << "#endif" << endl; } os << "#include " << endl; if (ctx.options.generate_query ()) os << "#include " << endl; os << endl; /* traversal::unit unit; traversal::defines unit_defines; traversal::namespace_ ns; class_ c; unit >> unit_defines >> ns; unit_defines >> c; traversal::defines ns_defines; ns >> ns_defines >> ns; ns_defines >> c; os << "namespace odb" << "{"; unit.dispatch (ctx.unit); os << "}"; */ } }