add test for inheritance of 3 classes deep which exposes a problem in the python shared_ptr wrappers. Manually added the %types for now.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10964 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
11b892b447
commit
91ba340a79
4 changed files with 65 additions and 2 deletions
|
|
@ -345,6 +345,16 @@ public class runme
|
||||||
verifyCount(1, kret);
|
verifyCount(1, kret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3rd derived class
|
||||||
|
{
|
||||||
|
Klass k = new Klass3rdDerived("me oh my");
|
||||||
|
String val = k.getValue();
|
||||||
|
verifyValue("me oh my-3rdDerived", val);
|
||||||
|
verifyCount(3, k); // 3 classes in inheritance chain == 3 swigCPtr values
|
||||||
|
val = li_boost_shared_ptr.test3rdupcast(k);
|
||||||
|
verifyValue("me oh my-3rdDerived", val);
|
||||||
|
verifyCount(3, k);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////// Member variables ////////////////////////////////////////
|
////////////////////////////////// Member variables ////////////////////////////////////////
|
||||||
// smart pointer by value
|
// smart pointer by value
|
||||||
|
|
|
||||||
|
|
@ -357,6 +357,16 @@ public class li_boost_shared_ptr_runme {
|
||||||
verifyCount(1, kret);
|
verifyCount(1, kret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3rd derived class
|
||||||
|
{
|
||||||
|
Klass k = new Klass3rdDerived("me oh my");
|
||||||
|
String val = k.getValue();
|
||||||
|
verifyValue("me oh my-3rdDerived", val);
|
||||||
|
verifyCount(3, k); // 3 classes in inheritance chain == 3 swigCPtr values
|
||||||
|
val = li_boost_shared_ptr.test3rdupcast(k);
|
||||||
|
verifyValue("me oh my-3rdDerived", val);
|
||||||
|
verifyCount(3, k);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////// Member variables ////////////////////////////////////////
|
////////////////////////////////// Member variables ////////////////////////////////////////
|
||||||
// smart pointer by value
|
// smart pointer by value
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,14 @@
|
||||||
%include <boost_shared_ptr.i>
|
%include <boost_shared_ptr.i>
|
||||||
SWIG_SHARED_PTR(Klass, Space::Klass)
|
SWIG_SHARED_PTR(Klass, Space::Klass)
|
||||||
SWIG_SHARED_PTR_DERIVED(KlassDerived, Space::Klass, Space::KlassDerived)
|
SWIG_SHARED_PTR_DERIVED(KlassDerived, Space::Klass, Space::KlassDerived)
|
||||||
|
SWIG_SHARED_PTR_DERIVED(Klass2ndDerived, Space::Klass, Space::Klass2ndDerived)
|
||||||
|
SWIG_SHARED_PTR_DERIVED(Klass3rdDerived, Space::Klass2ndDerived, Space::Klass3rdDerived)
|
||||||
|
|
||||||
|
// TEMP for python
|
||||||
|
%types(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< Space::Klass3rdDerived > = SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< Space::Klass >) {
|
||||||
|
*newmemory = SWIG_CAST_NEW_MEMORY;
|
||||||
|
return (void *) new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< Space::Klass >(*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< Space::Klass3rdDerived > *)$from);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -101,7 +109,13 @@ private:
|
||||||
};
|
};
|
||||||
SwigExamples::CriticalSection Space::Klass::critical_section;
|
SwigExamples::CriticalSection Space::Klass::critical_section;
|
||||||
|
|
||||||
struct IgnoredMultipleInheritBase { virtual ~IgnoredMultipleInheritBase() {} double d; double e;};
|
struct IgnoredMultipleInheritBase {
|
||||||
|
IgnoredMultipleInheritBase() : d(0.0), e(0.0) {}
|
||||||
|
virtual ~IgnoredMultipleInheritBase() {}
|
||||||
|
double d;
|
||||||
|
double e;
|
||||||
|
virtual void AVirtualMethod() {}
|
||||||
|
};
|
||||||
|
|
||||||
// For most compilers, this use of multiple inheritance results in different derived and base class
|
// For most compilers, this use of multiple inheritance results in different derived and base class
|
||||||
// pointer values ... for some more challenging tests :)
|
// pointer values ... for some more challenging tests :)
|
||||||
|
|
@ -142,7 +156,21 @@ SwigBoost::shared_ptr<KlassDerived>*& derivedsmartptrpointerreftest(SwigBoost::s
|
||||||
return kd;
|
return kd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3 classes in inheritance chain test
|
||||||
|
struct Klass2ndDerived : Klass {
|
||||||
|
Klass2ndDerived() : Klass() {}
|
||||||
|
Klass2ndDerived(const std::string &val) : Klass(val) {}
|
||||||
|
};
|
||||||
|
struct Klass3rdDerived : IgnoredMultipleInheritBase, Klass2ndDerived {
|
||||||
|
Klass3rdDerived() : Klass2ndDerived() {}
|
||||||
|
Klass3rdDerived(const std::string &val) : Klass2ndDerived(val) {}
|
||||||
|
virtual ~Klass3rdDerived() {}
|
||||||
|
virtual std::string getValue() const { return Klass2ndDerived::getValue() + "-3rdDerived"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string test3rdupcast( SwigBoost::shared_ptr< Klass > k) {
|
||||||
|
return k->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -217,8 +245,14 @@ SwigBoost::shared_ptr<Klass>* smartpointerpointerownertest() {
|
||||||
return new SwigBoost::shared_ptr<Klass>(new Klass("smartpointerpointerownertest"));
|
return new SwigBoost::shared_ptr<Klass>(new Klass("smartpointerpointerownertest"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide overloads for Klass and KlassDerived as some language modules, eg Python, create an extra reference in
|
// Provide overloads for Klass and derived classes as some language modules, eg Python, create an extra reference in
|
||||||
// the marshalling if an upcast to a base class is required.
|
// the marshalling if an upcast to a base class is required.
|
||||||
|
long use_count(const SwigBoost::shared_ptr<Klass3rdDerived>& sptr) {
|
||||||
|
return sptr.use_count();
|
||||||
|
}
|
||||||
|
long use_count(const SwigBoost::shared_ptr<Klass2ndDerived>& sptr) {
|
||||||
|
return sptr.use_count();
|
||||||
|
}
|
||||||
long use_count(const SwigBoost::shared_ptr<KlassDerived>& sptr) {
|
long use_count(const SwigBoost::shared_ptr<KlassDerived>& sptr) {
|
||||||
return sptr.use_count();
|
return sptr.use_count();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -304,6 +304,15 @@ class li_boost_shared_ptr_runme:
|
||||||
self.verifyValue(li_boost_shared_ptr.overload_smartbyptr(k), "smartbyptr")
|
self.verifyValue(li_boost_shared_ptr.overload_smartbyptr(k), "smartbyptr")
|
||||||
self.verifyValue(li_boost_shared_ptr.overload_smartbyptrref(k), "smartbyptrref")
|
self.verifyValue(li_boost_shared_ptr.overload_smartbyptrref(k), "smartbyptrref")
|
||||||
|
|
||||||
|
# 3rd derived class
|
||||||
|
k = li_boost_shared_ptr.Klass3rdDerived("me oh my")
|
||||||
|
val = k.getValue()
|
||||||
|
self.verifyValue("me oh my-3rdDerived", val)
|
||||||
|
self.verifyCount(1, k)
|
||||||
|
val = li_boost_shared_ptr.test3rdupcast(k)
|
||||||
|
self.verifyValue("me oh my-3rdDerived", val)
|
||||||
|
self.verifyCount(1, k)
|
||||||
|
|
||||||
# //////////////////////////////// Member variables ////////////////////////////////////////
|
# //////////////////////////////// Member variables ////////////////////////////////////////
|
||||||
# smart pointer by value
|
# smart pointer by value
|
||||||
m = li_boost_shared_ptr.MemberVariables()
|
m = li_boost_shared_ptr.MemberVariables()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue