From 7f6c64f2211d37db76a97fbc79a4b5492302ef2f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 27 Oct 2010 17:36:59 +0200 Subject: Implement support for composite value types New test: common/composite. --- odb/header.cxx | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 odb/header.cxx (limited to 'odb/header.cxx') diff --git a/odb/header.cxx b/odb/header.cxx new file mode 100644 index 0000000..9c816d8 --- /dev/null +++ b/odb/header.cxx @@ -0,0 +1,108 @@ +// file : odb/header.cxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC +// license : GNU GPL v3; see accompanying LICENSE file + +#include +#include + +namespace +{ + struct data_member: traversal::data_member, context + { + data_member (context& c) + : context (c) + { + } + + virtual void + traverse (semantics::data_member& m) + { + if (m.count ("transient")) + 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_ (context& c) + : context (c), member_ (c) + { + member_names_ >> member_; + } + + virtual void + traverse (type& c) + { + if (c.file () != unit.file ()) + return; + + if (!comp_value (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_; + }; +} + +void +generate_header (context& ctx) +{ + ctx.os << "#include " << endl + << "#include " << endl + << endl; + + /* + traversal::unit unit; + traversal::defines unit_defines; + traversal::namespace_ ns; + class_ c (ctx); + + unit >> unit_defines >> ns; + unit_defines >> c; + + traversal::defines ns_defines; + + ns >> ns_defines >> ns; + ns_defines >> c; + + ctx.os << "namespace odb" + << "{"; + + unit.dispatch (ctx.unit); + + ctx.os << "}"; + */ +} -- cgit v1.1