* Convert any pointer to a SGReference based object to a ghost.
*/
template<class T>
-typename boost::enable_if<boost::is_base_of<SGReferenced, T>, naRef>::type
+typename boost::enable_if_c<
+ boost::is_base_of<SGReferenced, T>::value
+ || boost::is_base_of<SGWeakReferenced, T>::value,
+ naRef
+>::type
to_nasal_helper(naContext c, T* ptr)
{
return nasal::Ghost<SGSharedPtr<T> >::create(c, SGSharedPtr<T>(ptr));
* Convert nasal ghosts/hashes to pointer (of a SGReference based ghost).
*/
template<class T>
-typename boost::enable_if<
- boost::is_base_of<SGReferenced, typename boost::remove_pointer<T>::type>,
+typename boost::enable_if_c<
+ boost::is_base_of<
+ SGReferenced,
+ typename boost::remove_pointer<T>::type
+ >::value
+ || boost::is_base_of<
+ SGWeakReferenced,
+ typename boost::remove_pointer<T>::type
+ >::value,
T
>::type
from_nasal_helper(naContext c, naRef ref, const T*)
};
+class SGWeakReferenceBasedClass:
+ public SGWeakReferenced
+{
+
+};
+
typedef boost::shared_ptr<Derived> DerivedPtr;
typedef boost::shared_ptr<DoubleDerived> DoubleDerivedPtr;
typedef boost::shared_ptr<DoubleDerived2> DoubleDerived2Ptr;
typedef SGSharedPtr<SGReferenceBasedClass> SGRefBasedPtr;
+typedef SGSharedPtr<SGWeakReferenceBasedClass> SGWeakRefBasedPtr;
typedef boost::weak_ptr<Derived> DerivedWeakPtr;
Ghost<DerivedWeakPtr>::init("DerivedWeakPtr");
Ghost<SGRefBasedPtr>::init("SGRefBasedPtr");
+ Ghost<SGWeakRefBasedPtr>::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<SGWeakRefBasedPtr>(c, nasal_ref),
+ ptr2 = from_nasal<SGWeakRefBasedPtr>(c, nasal_ptr);
+
+ VERIFY( weak_ptr == ptr1 );
+ VERIFY( weak_ptr == ptr2 );
+
VERIFY( Ghost<BasePtr>::isInit() );
nasal::to_nasal(c, DoubleDerived2Ptr());