Stream operator for many classes
							parent
							
								
									482dbd9226
								
							
						
					
					
						commit
						efd544527f
					
				|  | @ -45,6 +45,13 @@ struct Argument { | |||
| 
 | ||||
|   /// MATLAB code generation, MATLAB to C++
 | ||||
|   void matlab_unwrap(FileWriter& file, const std::string& matlabName) const; | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, const Argument& arg) { | ||||
|     os << (arg.is_const ? "const " : "") << arg.type << (arg.is_ptr ? "*" : "") | ||||
|         << (arg.is_ref ? "&" : ""); | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| /// Argument list is just a container with Arguments
 | ||||
|  | @ -100,6 +107,19 @@ struct ArgumentList: public std::vector<Argument> { | |||
|   void emit_conditional_call(FileWriter& proxyFile, | ||||
|       const ReturnValue& returnVal, const std::string& wrapperName, int id, | ||||
|       bool staticMethod = false) const; | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, | ||||
|       const ArgumentList& argList) { | ||||
|     os << "("; | ||||
|     if (argList.size() > 0) | ||||
|       os << argList.front(); | ||||
|     if (argList.size() > 1) | ||||
|       for (size_t i = 1; i < argList.size(); i++) | ||||
|         os << ", " << argList[i]; | ||||
|     os << ")"; | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| template<class T> | ||||
|  | @ -108,7 +128,7 @@ inline void verifyArguments(const std::vector<std::string>& validArgs, | |||
|   typedef typename std::map<std::string, T>::value_type NamedMethod; | ||||
|   BOOST_FOREACH(const NamedMethod& namedMethod, vt) { | ||||
|     const T& t = namedMethod.second; | ||||
|     t.verifyArguments(validArgs,t.name_); | ||||
|     t.verifyArguments(validArgs, t.name_); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -247,6 +247,7 @@ Class Class::expandTemplate(const TemplateSubstitution& ts) const { | |||
|   inst.constructor.args_list = inst.constructor.expandArgumentListsTemplate(ts); | ||||
|   inst.constructor.name = inst.name; | ||||
|   inst.deconstructor.name = inst.name; | ||||
|   cout << inst << endl; | ||||
|   return inst; | ||||
| } | ||||
| 
 | ||||
|  | @ -254,10 +255,12 @@ Class Class::expandTemplate(const TemplateSubstitution& ts) const { | |||
| vector<Class> Class::expandTemplate(Str templateArg, | ||||
|     const vector<Qualified>& instantiations) const { | ||||
|   vector<Class> result; | ||||
|   cout << *this << endl; | ||||
|   BOOST_FOREACH(const Qualified& instName, instantiations) { | ||||
|     Qualified expandedClass = (Qualified) (*this); | ||||
|     expandedClass.name += instName.name; | ||||
|     const TemplateSubstitution ts(templateArg, instName, expandedClass); | ||||
|     cout << ts << endl; | ||||
|     Class inst = expandTemplate(ts); | ||||
|     inst.name = expandedClass.name; | ||||
|     inst.templateArgs.clear(); | ||||
|  | @ -274,12 +277,10 @@ void Class::addMethod(bool verbose, bool is_const, Str methodName, | |||
|     Str templateArgName, const vector<Qualified>& templateArgValues) { | ||||
|   // Check if templated
 | ||||
|   if (!templateArgName.empty() && templateArgValues.size() > 0) { | ||||
|     cout << methodName << endl; | ||||
|     // Create method to expand
 | ||||
|     // For all values of the template argument, create a new method
 | ||||
|     BOOST_FOREACH(const Qualified& instName, templateArgValues) { | ||||
|       const TemplateSubstitution ts(templateArgName, instName, this->name); | ||||
|       cout << ts << endl; | ||||
|       // substitute template in arguments
 | ||||
|       ArgumentList expandedArgs = argumentList.expandTemplate(ts); | ||||
|       // do the same for return type
 | ||||
|  |  | |||
							
								
								
									
										17
									
								
								wrap/Class.h
								
								
								
								
							
							
						
						
									
										17
									
								
								wrap/Class.h
								
								
								
								
							|  | @ -19,15 +19,18 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <string> | ||||
| #include <map> | ||||
| 
 | ||||
| #include "Constructor.h" | ||||
| #include "Deconstructor.h" | ||||
| #include "Method.h" | ||||
| #include "StaticMethod.h" | ||||
| #include "TypeAttributesTable.h" | ||||
| 
 | ||||
| #include <boost/foreach.hpp> | ||||
| #include <boost/range/adaptor/map.hpp> | ||||
| 
 | ||||
| #include <string> | ||||
| #include <map> | ||||
| 
 | ||||
| namespace wrap { | ||||
| 
 | ||||
| /// Class has name, constructors, methods
 | ||||
|  | @ -108,6 +111,14 @@ public: | |||
|   void deserialization_fragments(FileWriter& proxyFile, FileWriter& wrapperFile, | ||||
|       Str wrapperName, std::vector<std::string>& functionNames) const; | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, const Class& cls) { | ||||
|     os << "class " <<   cls.name << "{\n"; | ||||
|     BOOST_FOREACH(const Method& m, cls.methods | boost::adaptors::map_values) | ||||
|       os << m << ";\n"; | ||||
|     os << "};" << std::endl; | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
|   void pointer_constructor_fragments(FileWriter& proxyFile, | ||||
|  |  | |||
|  | @ -93,6 +93,13 @@ public: | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, | ||||
|       const ArgumentOverloads& overloads) { | ||||
|     BOOST_FOREACH(const ArgumentList& argList, overloads.argLists_) | ||||
|       os << argList << std::endl; | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -168,6 +175,13 @@ public: | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, | ||||
|       const SignatureOverloads& overloads) { | ||||
|     for (size_t i = 0; i < overloads.nrOverloads(); i++) | ||||
|       os << overloads.returnVals_[i] << overloads.argLists_[i] << std::endl; | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| // Templated checking functions
 | ||||
|  |  | |||
|  | @ -41,6 +41,12 @@ struct Method: public StaticMethod { | |||
|       const ArgumentList& args, const ReturnValue& retVal, | ||||
|       const Qualified& instName = Qualified()); | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, const Method& m) { | ||||
|     for (size_t i = 0; i < m.nrOverloads(); i++) | ||||
|       os << m.returnVals_[i] << " " << m.name_ << m.argLists_[i]; | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
|   // Emit method header
 | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ struct Qualified { | |||
|   } | ||||
| 
 | ||||
|   bool operator!=(const Qualified& other) const { | ||||
|     return other.name!=name || other.namespaces != namespaces; | ||||
|     return other.name != name || other.namespaces != namespaces; | ||||
|   } | ||||
| 
 | ||||
|   /// Return a qualified string using given delimiter
 | ||||
|  | @ -66,6 +66,11 @@ struct Qualified { | |||
|     return result; | ||||
|   } | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, const Qualified& q) { | ||||
|     os << q.qualifiedName("::"); | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| } // \namespace wrap
 | ||||
|  |  | |||
|  | @ -18,7 +18,8 @@ using namespace wrap; | |||
| ReturnValue ReturnValue::expandTemplate(const TemplateSubstitution& ts) const { | ||||
|   ReturnValue instRetVal = *this; | ||||
|   instRetVal.type1 = ts(type1); | ||||
|   if (isPair) instRetVal.type2 = ts(type2); | ||||
|   if (isPair) | ||||
|     instRetVal.type2 = ts(type2); | ||||
|   return instRetVal; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,6 +49,14 @@ struct ReturnValue { | |||
| 
 | ||||
|   void emit_matlab(FileWriter& proxyFile) const; | ||||
| 
 | ||||
|   friend std::ostream& operator<<(std::ostream& os, const ReturnValue& r) { | ||||
|     if (!r.isPair && r.type1.category == ReturnType::VOID) | ||||
|       os << "void"; | ||||
|     else | ||||
|       os << r.return_type(true); | ||||
|     return os; | ||||
|   } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| } // \namespace wrap
 | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ public: | |||
| 
 | ||||
|   // Substitute if needed
 | ||||
|   ReturnType operator()(const ReturnType& type) const { | ||||
|     ReturnType instType; | ||||
|     ReturnType instType = type; | ||||
|     if (type.name == templateArg_ && type.namespaces.empty()) | ||||
|       instType.rename(qualifiedType_); | ||||
|     else if (type.name == "This") | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue