From: Thomas Geymayer Date: Sat, 10 May 2014 08:36:13 +0000 (+0200) Subject: cppbind: from_nasal/to_nasal for SGWeakReferenced based objects X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=7535dfd2d047311a54cead16db56288fec04e571;p=simgear.git cppbind: from_nasal/to_nasal for SGWeakReferenced based objects --- diff --git a/simgear/nasal/cppbind/Ghost.hxx b/simgear/nasal/cppbind/Ghost.hxx index 346f6fbb..263c9d85 100644 --- a/simgear/nasal/cppbind/Ghost.hxx +++ b/simgear/nasal/cppbind/Ghost.hxx @@ -1067,7 +1067,11 @@ from_nasal_helper(naContext c, naRef ref, const T*) * Convert any pointer to a SGReference based object to a ghost. */ template -typename boost::enable_if, naRef>::type +typename boost::enable_if_c< + boost::is_base_of::value + || boost::is_base_of::value, + naRef +>::type to_nasal_helper(naContext c, T* ptr) { return nasal::Ghost >::create(c, SGSharedPtr(ptr)); @@ -1077,8 +1081,15 @@ to_nasal_helper(naContext c, T* ptr) * Convert nasal ghosts/hashes to pointer (of a SGReference based ghost). */ template -typename boost::enable_if< - boost::is_base_of::type>, +typename boost::enable_if_c< + boost::is_base_of< + SGReferenced, + typename boost::remove_pointer::type + >::value + || boost::is_base_of< + SGWeakReferenced, + typename boost::remove_pointer::type + >::value, T >::type from_nasal_helper(naContext c, naRef ref, const T*) diff --git a/simgear/nasal/cppbind/cppbind_test.cxx b/simgear/nasal/cppbind/cppbind_test.cxx index 4910fa4a..289a13e1 100644 --- a/simgear/nasal/cppbind/cppbind_test.cxx +++ b/simgear/nasal/cppbind/cppbind_test.cxx @@ -82,10 +82,17 @@ class SGReferenceBasedClass: }; +class SGWeakReferenceBasedClass: + public SGWeakReferenced +{ + +}; + typedef boost::shared_ptr DerivedPtr; typedef boost::shared_ptr DoubleDerivedPtr; typedef boost::shared_ptr DoubleDerived2Ptr; typedef SGSharedPtr SGRefBasedPtr; +typedef SGSharedPtr SGWeakRefBasedPtr; typedef boost::weak_ptr DerivedWeakPtr; @@ -228,6 +235,21 @@ int main(int argc, char* argv[]) Ghost::init("DerivedWeakPtr"); Ghost::init("SGRefBasedPtr"); + Ghost::init("SGWeakRefBasedPtr"); + + SGWeakRefBasedPtr weak_ptr(new SGWeakReferenceBasedClass()); + naRef nasal_ref = to_nasal(c, weak_ptr), + nasal_ptr = to_nasal(c, weak_ptr.get()); + + VERIFY( naIsGhost(nasal_ref) ); + VERIFY( naIsGhost(nasal_ptr) ); + + SGWeakRefBasedPtr ptr1 = from_nasal(c, nasal_ref), + ptr2 = from_nasal(c, nasal_ptr); + + VERIFY( weak_ptr == ptr1 ); + VERIFY( weak_ptr == ptr2 ); + VERIFY( Ghost::isInit() ); nasal::to_nasal(c, DoubleDerived2Ptr());