#define SWIG_SHARED_PTR_NAMESPACE std %include %include %fragment("StdSharedPtrTraits","header",fragment="StdTraitsForwardDeclaration",fragment="") { namespace swig { /* Template specialization for functions defined in rubystdcommon.swg. Special handling for shared_ptr is required as, shared_ptr * is used rather than the usual T *, see shared_ptr.i. */ template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { int res = SWIG_ERROR; swig_type_info *descriptor = type_info >(); if (val) { std::shared_ptr *p = 0; swig_ruby_owntype newmem = {0, 0}; res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (*val) { **val = p ? *p : std::shared_ptr(); } else { *val = p; if (newmem.own & SWIG_CAST_NEW_MEMORY) { // Upcast for pointers to shared_ptr in this generic framework has not been implemented res = SWIG_ERROR; } } if (newmem.own & SWIG_CAST_NEW_MEMORY) delete p; } } else { res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } }; template struct traits_asval > { static int asval(VALUE obj, std::shared_ptr *val) { if (val) { std::shared_ptr ret; std::shared_ptr *p = &ret; int res = traits_asptr >::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; *val = ret; return SWIG_OK; } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_asval *> { static int asval(VALUE obj, std::shared_ptr **val) { if (val) { typedef typename noconst_traits >::noconst_type noconst_type; if (*val) { noconst_type ret; noconst_type *p = &ret; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) **(const_cast(val)) = ret; return res; } else { noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) *val = p; return res; } } else { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_as, pointer_category> { static std::shared_ptr as(VALUE obj) { std::shared_ptr ret; std::shared_ptr *v = &ret; int res = traits_asptr >::asptr(obj, &v); if (SWIG_IsOK(res)) { return ret; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name >()); throw std::invalid_argument("bad type"); } } }; template struct traits_as *, pointer_category> { static std::shared_ptr * as(VALUE obj) { std::shared_ptr *p = 0; int res = traits_asptr >::asptr(obj, &p); if (SWIG_IsOK(res)) { return p; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) SWIG_Error(SWIG_TypeError, swig::type_name *>()); throw std::invalid_argument("bad type"); } } }; template struct traits_from_ptr > { static VALUE from(std::shared_ptr *val, int owner = 0) { if (val && *val) { return SWIG_NewPointerObj(val, type_info >(), owner); } else { return Qnil; } } }; /* The descriptors in the shared_ptr typemaps remove the const qualifier for the SWIG type system. Remove const likewise here, otherwise SWIG_TypeQuery("std::shared_ptr") will return NULL. */ template struct traits_from > { static VALUE from(const std::shared_ptr& val) { std::shared_ptr p = std::const_pointer_cast(val); return swig::from(p); } }; } } %fragment("StdSharedPtrTraits");