From e035276bf0ac5abea21a0aafc6d05e7746e902d1 Mon Sep 17 00:00:00 2001 From: Jens Thiele Date: Tue, 21 Nov 2006 09:22:10 +0000 Subject: [PATCH] added type_info struct --- codegen/codegen-stubhead.hxx | 2 + codegen/main.cpp | 81 ++++++++++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/codegen/codegen-stubhead.hxx b/codegen/codegen-stubhead.hxx index 465ef15..a05540e 100644 --- a/codegen/codegen-stubhead.hxx +++ b/codegen/codegen-stubhead.hxx @@ -21,3 +21,5 @@ #define LIBT2N_EXPORT #define LIBT2N_EXPORT_GROUP(group) #endif + +#endif diff --git a/codegen/main.cpp b/codegen/main.cpp index 052be02..6cf197e 100644 --- a/codegen/main.cpp +++ b/codegen/main.cpp @@ -10,6 +10,26 @@ void print_indentation(unsigned int indentation) std::cout << " "; } +std::string +toupper(std::string s) { + for (unsigned i=0; is.length() ) || ( std::string(s,0,prefix.length())!=prefix ) ) return error; + return std::string(s, prefix.length(), s.length()-prefix.length()); +} + //! get child element by id /*! \return pointer to element having id or null on error @@ -45,13 +65,27 @@ std::string get_namespace(const xmlpp::Element* root, const std::string &id) return element->get_attribute("name")->get_value(); } + +struct type_info +{ + std::string name; + std::string noref_name; + bool operator==(const type_info& o) {return (name==o.name) && (noref_name == o.noref_name);} + std::string noref() const {return noref_name;} +}; + +std::ostream &operator<<(std::ostream &o, const type_info &t) { + o << t.name; + return o; +} + //! get type by id /*! \return type name or empty string on error */ -std::string get_type(const xmlpp::Element* root, const std::string &id) +type_info get_type(const xmlpp::Element* root, const std::string &id) { - std::string error; + type_info error; const xmlpp::Element* element(get_element_by_id(root, id)); if (!element) return error; @@ -65,27 +99,34 @@ std::string get_type(const xmlpp::Element* root, const std::string &id) std::string tag(element->get_name()); if (tag=="ReferenceType") { assert(element->get_attribute("type")); - std::string ret(get_type(root, element->get_attribute("type")->get_value())); + type_info ret(get_type(root, element->get_attribute("type")->get_value())); if (ret==error) return error; - return ret+"&"; + // at the moment we only support const & + // todo: nice error message! + if ((ret.noref_name=strip(ret.name,"const ")).empty()) return error; + ret.name=ret.name+"&"; + return ret; }else if (tag=="CvQualifiedType") { assert(element->get_attribute("type")); - std::string ret(get_type(root, element->get_attribute("type")->get_value())); + type_info ret(get_type(root, element->get_attribute("type")->get_value())); if (ret==error) return error; - return std::string("const ")+ret; + ret.name=std::string("const ")+ret.name; + return ret; } assert(element->get_attribute("name")); assert(element->get_attribute("context")); - return get_namespace(root, element->get_attribute("context")->get_value())+"::"+element->get_attribute("name")->get_value(); + type_info ret; + ret.name=get_namespace(root, element->get_attribute("context")->get_value())+"::"+element->get_attribute("name")->get_value(); + return ret; } struct t2n_procedure { - typedef std::map Args; + typedef std::map Args; std::string group; - std::string ret_type; + type_info ret_type; std::string name; Args args; @@ -292,6 +333,7 @@ void output_common_hpp(std::ostream &o, const std::list &procs) { << " ar & BOOST_SERIALIZATION_NVP(res);\n" << " }\n" << "public:\n" + << " " << it->ret_classname() << "() {}\n" << " " << it->ret_classname() << "(const " << it->ret_type << " &_res) : res(_res) {}\n" << " " << it->ret_type << " get_data() { return res; }\n" << "};\n"; @@ -301,7 +343,7 @@ void output_common_hpp(std::ostream &o, const std::list &procs) { << "{\n" << "private:\n"; for (t2n_procedure::Args::const_iterator ait=it->args.begin();ait!=it->args.end();++ait) { - o << " " << ait->second << " " << ait->first << ";\n"; + o << " " << ait->second.noref() << " " << ait->first << ";\n"; } o << " friend class boost::serialization::access;\n" << " template\n" @@ -339,7 +381,7 @@ void output_common_cpp(std::ostream &o, const std::list &procs, c std::set groups(used_groups(procs)); o << "#include \"" << common_hpp << "\"\n" - << "#include \n" + << "#include \n" << "\n" << "/* register types with boost serialization */\n"; for (std::set::iterator it=groups.begin();it!=groups.end();++it) { @@ -425,19 +467,6 @@ void output_server_cpp(std::ostream &o, const std::list &procs, c o << "#include \"" << common_cpp << "\"\n"; } - -std::string -toupper(std::string s) { - for (unsigned i=0; i