#define SWIG_SHARED_PTR_NAMESPACE std %include %include %fragment("StdSharedPtrTraits","header",fragment="StdTraitsForwardDeclaration") { namespace swig { /* template specialization for functions defined in rubystdcommon.swg. here we should treat smart pointers in a way different from the way we treat raw pointers. */ template struct traits_asptr > { static int asptr(VALUE obj, std::shared_ptr **val) { std::shared_ptr *p=0; swig_type_info *descriptor = type_info >(); swig_ruby_owntype newmem = {0, 0}; int res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res) && p) { if (val && *val) **val = *p; if (newmem.own & SWIG_CAST_NEW_MEMORY) delete p; return SWIG_OK; } else { return SWIG_ERROR; } } }; 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; if (val) *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 && *val) { typedef typename noconst_traits >::noconst_type noconst_type; 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 { return traits_asptr >::asptr(obj, (std::shared_ptr **)(0)); } } }; template struct traits_as, pointer_category> { static std::shared_ptr as(VALUE obj, bool throw_error) { std::shared_ptr ret; std::shared_ptr *v = &ret; int res = traits_asptr >::asptr(obj, &v); if (SWIG_IsOK(res)) { return ret; } else { // Uninitialized return value, no Type() constructor required. if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { SWIG_Error(SWIG_TypeError, swig::type_name >()); } static std::shared_ptr *v_def = (std::shared_ptr*) malloc(sizeof(std::shared_ptr)); memset(v_def,0,sizeof(std::shared_ptr)); return *v_def; } } }; /* we have to remove the const qualifier to work around a BUG SWIG_TypeQuery("std::shared_ptr") == NULL, which is caused by %template treating const qualifiers not properly. */ 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); } }; } } //force the fragment. %fragment("StdSharedPtrTraits");