From 63a5d1e15a9b2c58afe132ed8fb7c0c0131fc822 Mon Sep 17 00:00:00 2001 From: Duy-Nguyen Ta Date: Sun, 11 Sep 2016 16:40:09 -0400 Subject: [PATCH] wrap pair. Improve return. --- wrap/Method.cpp | 19 ++++++++++++------- wrap/ReturnType.cpp | 10 +++++++++- wrap/ReturnType.h | 3 ++- wrap/ReturnValue.cpp | 34 +++++++++++++++++++++------------- wrap/ReturnValue.h | 3 ++- wrap/StaticMethod.cpp | 15 +++++++++------ wrap/tests/cythontest.h | 2 +- 7 files changed, 56 insertions(+), 30 deletions(-) diff --git a/wrap/Method.cpp b/wrap/Method.cpp index 6d297d58d..183374463 100644 --- a/wrap/Method.cpp +++ b/wrap/Method.cpp @@ -111,18 +111,23 @@ void Method::emit_cython_pyx(FileWriter& file, const Class& cls) const { /// Return part file.oss << "\t\t"; - if (!returnVals_[i].isVoid()) file.oss << "return "; - // ... casting return value - returnVals_[i].emit_cython_pyx_casting(file); - if (!returnVals_[i].isVoid()) file.oss << "("; + if (!returnVals_[i].isVoid()) { + file.oss << "cdef "; + returnVals_[i].emit_cython_pyx_return_type(file); + file.oss << " ret = "; + } + //... function call file.oss << "self." << cls.pyxCythonObj() << ".get()." << funcName; if (templateArgValue_) file.oss << "[" << templateArgValue_->pyxCythonClass() << "]"; - - // ... argument list file.oss << "("; argumentList(i).emit_cython_pyx_asParams(file); - if (!returnVals_[i].isVoid()) file.oss << ")"; file.oss << ")\n"; + + file.oss << "\t\t"; + if (!returnVals_[i].isVoid()) file.oss << "return "; + // ... casting return value + returnVals_[i].emit_cython_pyx_casting(file, "ret"); + file.oss << "\n"; } } /* ************************************************************************* */ diff --git a/wrap/ReturnType.cpp b/wrap/ReturnType.cpp index 48c9de648..1288e6853 100644 --- a/wrap/ReturnType.cpp +++ b/wrap/ReturnType.cpp @@ -76,7 +76,14 @@ void ReturnType::emit_cython_pxd(FileWriter& file) const { } /* ************************************************************************* */ -void ReturnType::emit_cython_pyx_casting(FileWriter& file) const { +void ReturnType::emit_cython_pyx_return_type(FileWriter& file) const { + string retType = pyxCythonClass(); + if (isPtr) retType = "shared_ptr[" + retType + "]"; + file.oss << retType; +} + +/* ************************************************************************* */ +void ReturnType::emit_cython_pyx_casting(FileWriter& file, const std::string& var) const { if (isEigen()) file.oss << "ndarray_copy"; else if (isNonBasicType()){ @@ -88,6 +95,7 @@ void ReturnType::emit_cython_pyx_casting(FileWriter& file) const { file.oss << pythonClassName() << ".cyCreateFromValue"; } } + file.oss << "(" << var << ")"; } /* ************************************************************************* */ diff --git a/wrap/ReturnType.h b/wrap/ReturnType.h index 2a63c9d1b..4d62f65c0 100644 --- a/wrap/ReturnType.h +++ b/wrap/ReturnType.h @@ -48,7 +48,8 @@ struct ReturnType: public Qualified { } void emit_cython_pxd(FileWriter& file) const; - void emit_cython_pyx_casting(FileWriter& file) const; + void emit_cython_pyx_return_type(FileWriter& file) const; + void emit_cython_pyx_casting(FileWriter& file, const std::string& var) const; private: diff --git a/wrap/ReturnValue.cpp b/wrap/ReturnValue.cpp index d0af2d60a..5217e14c5 100644 --- a/wrap/ReturnValue.cpp +++ b/wrap/ReturnValue.cpp @@ -83,22 +83,30 @@ void ReturnValue::emit_cython_pxd(FileWriter& file) const { } /* ************************************************************************* */ -void ReturnValue::emit_cython_pyx_casting(FileWriter& file) const { +void ReturnValue::emit_cython_pyx_return_type(FileWriter& file) const { if (isVoid()) return; if (isPair) { - // file.oss << "cdef pair[" << type1.pyxCythonClass() << "," << type2.pyxCythonClass() << "]" - // << "ret = "; - // file.oss << "("; - // type1.emit_cython_pyx_casting(file); - // file.oss << "("; - // file.oss << type1.pyxCythonClass(); - // file.oss << "),"; - // type2.emit_cython_pyx_casting(file); - // file.oss << "("; - // file.oss << type2.pyxCythonClass(); - // file.oss << "))"; + file.oss << "pair ["; + type1.emit_cython_pyx_return_type(file); + file.oss << ","; + type2.emit_cython_pyx_return_type(file); + file.oss << "]"; } else { - type1.emit_cython_pyx_casting(file); + type1.emit_cython_pyx_return_type(file); + } +} + +/* ************************************************************************* */ +void ReturnValue::emit_cython_pyx_casting(FileWriter& file, const std::string& var) const { + if (isVoid()) return; + if (isPair) { + file.oss << "("; + type1.emit_cython_pyx_casting(file, var + ".first"); + file.oss << ","; + type2.emit_cython_pyx_casting(file, var + ".second"); + file.oss << ")"; + } else { + type1.emit_cython_pyx_casting(file, var); } } diff --git a/wrap/ReturnValue.h b/wrap/ReturnValue.h index a6c93489b..c804e6e21 100644 --- a/wrap/ReturnValue.h +++ b/wrap/ReturnValue.h @@ -72,7 +72,8 @@ struct ReturnValue { void emit_matlab(FileWriter& proxyFile) const; void emit_cython_pxd(FileWriter& file) const; - void emit_cython_pyx_casting(FileWriter& file) const; + void emit_cython_pyx_return_type(FileWriter& file) const; + void emit_cython_pyx_casting(FileWriter& file, const std::string& var) const; friend std::ostream& operator<<(std::ostream& os, const ReturnValue& r) { if (!r.isPair && r.type1.category == ReturnType::VOID) diff --git a/wrap/StaticMethod.cpp b/wrap/StaticMethod.cpp index 2e5f9928f..d5531ca2a 100644 --- a/wrap/StaticMethod.cpp +++ b/wrap/StaticMethod.cpp @@ -81,18 +81,21 @@ void StaticMethod::emit_cython_pyx(FileWriter& file, const Class& cls) const { argumentList(i).emit_cython_pyx(file); file.oss << "):\n"; file.oss << "\t\t"; - if (!returnVals_[i].isVoid()) file.oss << "return "; - //... casting return value - returnVals_[i].emit_cython_pyx_casting(file); - if (!returnVals_[i].isVoid()) file.oss << "("; - + //... function call + if (!returnVals_[i].isVoid()) file.oss << "ret = "; file.oss << cls.pyxCythonClass() << "." << name_ << ((i>0)? "_" + to_string(i):""); if (templateArgValue_) file.oss << "[" << templateArgValue_->pyxCythonClass() << "]"; file.oss << "("; argumentList(i).emit_cython_pyx_asParams(file); - if (!returnVals_[i].isVoid()) file.oss << ")"; file.oss << ")\n"; + + //... casting return value + if (!returnVals_[i].isVoid()) { + file.oss << "\t\treturn "; + returnVals_[i].emit_cython_pyx_casting(file, "ret"); + } + file.oss << "\n"; } } diff --git a/wrap/tests/cythontest.h b/wrap/tests/cythontest.h index 6c0d586ea..747960292 100644 --- a/wrap/tests/cythontest.h +++ b/wrap/tests/cythontest.h @@ -380,7 +380,7 @@ virtual class GaussianFactor { Matrix augmentedInformation() const; Matrix information() const; Matrix augmentedJacobian() const; - // pair jacobian() const; + pair jacobian() const; size_t size() const; bool empty() const; };