| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file GlobalFunction.h | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @brief Implements codegen for a global function wrapped in matlab | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @date Jul 22, 2012 | 
					
						
							|  |  |  |  * @author Alex Cunningham | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 23:43:53 +08:00
										 |  |  | #include "FullyOverloadedFunction.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:41:46 +08:00
										 |  |  | #ifdef __GNUC__
 | 
					
						
							|  |  |  | #pragma GCC diagnostic push
 | 
					
						
							|  |  |  | #pragma GCC diagnostic ignored "-Wunused-variable"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #include <boost/lambda/bind.hpp>
 | 
					
						
							|  |  |  | #include <boost/lambda/lambda.hpp>
 | 
					
						
							|  |  |  | #ifdef __GNUC__
 | 
					
						
							|  |  |  | #pragma GCC diagnostic pop
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace bl = boost::lambda; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | namespace wrap { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 23:43:53 +08:00
										 |  |  | struct GlobalFunction: public FullyOverloadedFunction { | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-13 19:52:41 +08:00
										 |  |  |   std::vector<Qualified> overloads; ///< Stack of qualified names
 | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 23:43:53 +08:00
										 |  |  |   // adds an overloaded version of this function,
 | 
					
						
							|  |  |  |   void addOverload(const Qualified& overload, const ArgumentList& args, | 
					
						
							| 
									
										
										
										
											2014-12-01 16:48:56 +08:00
										 |  |  |       const ReturnValue& retVal, boost::optional<const Qualified> instName = | 
					
						
							|  |  |  |           boost::none, bool verbose = false); | 
					
						
							| 
									
										
										
										
											2012-07-24 02:24:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-14 05:43:29 +08:00
										 |  |  |   void verifyArguments(const std::vector<std::string>& validArgs) const { | 
					
						
							|  |  |  |     SignatureOverloads::verifyArguments(validArgs, name_); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void verifyReturnTypes(const std::vector<std::string>& validtypes) const { | 
					
						
							|  |  |  |     SignatureOverloads::verifyReturnTypes(validtypes, name_); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   // codegen function called from Module to build the cpp and matlab versions of the function
 | 
					
						
							| 
									
										
										
										
											2014-05-26 04:01:30 +08:00
										 |  |  |   void matlab_proxy(const std::string& toolboxPath, | 
					
						
							|  |  |  |       const std::string& wrapperName, const TypeAttributesTable& typeAttributes, | 
					
						
							|  |  |  |       FileWriter& file, std::vector<std::string>& functionNames) const; | 
					
						
							| 
									
										
										
										
											2012-07-24 02:24:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-15 00:47:25 +08:00
										 |  |  |   // emit python wrapper
 | 
					
						
							|  |  |  |   void python_wrapper(FileWriter& wrapperFile) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 02:24:35 +08:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Creates a single global function - all in same namespace
 | 
					
						
							| 
									
										
										
										
											2014-05-26 04:01:30 +08:00
										 |  |  |   void generateSingleFunction(const std::string& toolboxPath, | 
					
						
							|  |  |  |       const std::string& wrapperName, const TypeAttributesTable& typeAttributes, | 
					
						
							|  |  |  |       FileWriter& file, std::vector<std::string>& functionNames) const; | 
					
						
							| 
									
										
										
										
											2012-07-24 02:24:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:30:36 +08:00
										 |  |  | typedef std::map<std::string, GlobalFunction> GlobalFunctions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:41:46 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // http://boost-spirit.com/distrib/spirit_1_8_2/libs/spirit/doc/grammar.html
 | 
					
						
							|  |  |  | struct GlobalFunctionGrammar: public classic::grammar<GlobalFunctionGrammar> { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   GlobalFunctions& global_functions_; ///< successful parse will be placed in here
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:49:25 +08:00
										 |  |  |   std::vector<std::string>& namespaces_; | 
					
						
							| 
									
										
										
										
											2014-12-02 20:41:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /// Construct type grammar and specify where result is placed
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:49:25 +08:00
										 |  |  |   GlobalFunctionGrammar(GlobalFunctions& global_functions, | 
					
						
							|  |  |  |       std::vector<std::string>& namespaces) : | 
					
						
							|  |  |  |       global_functions_(global_functions), namespaces_(namespaces) { | 
					
						
							| 
									
										
										
										
											2014-12-02 20:41:46 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Definition of type grammar
 | 
					
						
							|  |  |  |   template<typename ScannerT> | 
					
						
							|  |  |  |   struct definition: BasicRules<ScannerT> { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //    using BasicRules<ScannerT>::name_p;
 | 
					
						
							|  |  |  | //    using BasicRules<ScannerT>::className_p;
 | 
					
						
							|  |  |  |     using BasicRules<ScannerT>::comments_p; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ArgumentList args; | 
					
						
							|  |  |  |     ArgumentListGrammar argumentList_g; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ReturnValue retVal0, retVal; | 
					
						
							|  |  |  |     ReturnValueGrammar returnValue_g; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Qualified globalFunction; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     classic::rule<ScannerT> globalFunctionName_p, global_function_p; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     definition(GlobalFunctionGrammar const& self) : | 
					
						
							|  |  |  |         argumentList_g(args), returnValue_g(retVal) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       using namespace classic; | 
					
						
							|  |  |  |       bool verbose = false; // TODO
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       globalFunctionName_p = lexeme_d[(upper_p | lower_p) >> *(alnum_p | '_')]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // parse a global function
 | 
					
						
							|  |  |  |       global_function_p = (returnValue_g | 
					
						
							|  |  |  |           >> globalFunctionName_p[assign_a(globalFunction.name_)] | 
					
						
							|  |  |  |           >> argumentList_g >> ';' >> *comments_p) //
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:49:25 +08:00
										 |  |  |           [assign_a(globalFunction.namespaces_, self.namespaces_)][bl::bind( | 
					
						
							|  |  |  |               &GlobalFunction::addOverload, | 
					
						
							| 
									
										
										
										
											2014-12-02 20:41:46 +08:00
										 |  |  |               bl::var(self.global_functions_)[bl::var(globalFunction.name_)], | 
					
						
							|  |  |  |               bl::var(globalFunction), bl::var(args), bl::var(retVal), | 
					
						
							|  |  |  |               boost::none, verbose)] //
 | 
					
						
							|  |  |  |           [assign_a(retVal, retVal0)][clear_a(globalFunction)][clear_a(args)]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     classic::rule<ScannerT> const& start() const { | 
					
						
							|  |  |  |       return global_function_p; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | // GlobalFunctionGrammar
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 20:49:25 +08:00
										 |  |  | }// \namespace wrap
 | 
					
						
							| 
									
										
										
										
											2012-07-23 22:09:40 +08:00
										 |  |  | 
 |