73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file ReturnValue.cpp
 | |
|  * @date Dec 1, 2011
 | |
|  * @author Alex Cunningham
 | |
|  * @author Andrew Melim
 | |
|  * @author Richard Roberts
 | |
|  */
 | |
| 
 | |
| #include "ReturnValue.h"
 | |
| #include "utilities.h"
 | |
| #include <boost/foreach.hpp>
 | |
| #include <iostream>
 | |
| 
 | |
| using namespace std;
 | |
| using namespace wrap;
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| ReturnValue ReturnValue::expandTemplate(const TemplateSubstitution& ts) const {
 | |
|   ReturnValue instRetVal = *this;
 | |
|   instRetVal.type1 = ts.tryToSubstitite(type1);
 | |
|   if (isPair)
 | |
|     instRetVal.type2 = ts.tryToSubstitite(type2);
 | |
|   return instRetVal;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| string ReturnValue::return_type(bool add_ptr) const {
 | |
|   if (isPair)
 | |
|     return "pair< " + type1.str(add_ptr) + ", " + type2.str(add_ptr) + " >";
 | |
|   else
 | |
|     return type1.str(add_ptr);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| string ReturnValue::matlab_returnType() const {
 | |
|   return isPair ? "[first,second]" : "result";
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ReturnValue::wrap_result(const string& result, FileWriter& wrapperFile,
 | |
|     const TypeAttributesTable& typeAttributes) const {
 | |
|   if (isPair) {
 | |
|     // For a pair, store the returned pair so we do not evaluate the function twice
 | |
|     wrapperFile.oss << "  " << return_type(true) << " pairResult = " << result
 | |
|         << ";\n";
 | |
|     type1.wrap_result("  out[0]", "pairResult.first", wrapperFile,
 | |
|         typeAttributes);
 | |
|     type2.wrap_result("  out[1]", "pairResult.second", wrapperFile,
 | |
|         typeAttributes);
 | |
|   } else { // Not a pair
 | |
|     type1.wrap_result("  out[0]", result, wrapperFile, typeAttributes);
 | |
|   }
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ReturnValue::wrapTypeUnwrap(FileWriter& wrapperFile) const {
 | |
|   type1.wrapTypeUnwrap(wrapperFile);
 | |
|   if (isPair)
 | |
|     type2.wrapTypeUnwrap(wrapperFile);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| void ReturnValue::emit_matlab(FileWriter& proxyFile) const {
 | |
|   string output;
 | |
|   if (isPair)
 | |
|     proxyFile.oss << "[ varargout{1} varargout{2} ] = ";
 | |
|   else if (type1.category != ReturnType::VOID)
 | |
|     proxyFile.oss << "varargout{1} = ";
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| 
 |