| #define SWIG_SHARED_PTR_NAMESPACE std |
| %include <boost_shared_ptr.i> |
| %include <rubystdcommon_forward.swg> |
| |
| |
| %fragment("StdSharedPtrTraits","header",fragment="StdTraitsForwardDeclaration",fragment="<memory>") |
| { |
| namespace swig { |
| /* |
| Template specialization for functions defined in rubystdcommon.swg. Special handling for shared_ptr |
| is required as, shared_ptr<T> * is used rather than the usual T *, see shared_ptr.i. |
| */ |
| template <class Type> |
| struct traits_asptr<std::shared_ptr<Type> > { |
| static int asptr(VALUE obj, std::shared_ptr<Type> **val) { |
| int res = SWIG_ERROR; |
| swig_type_info *descriptor = type_info<std::shared_ptr<Type> >(); |
| if (val) { |
| std::shared_ptr<Type> *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<Type>(); |
| } 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 <class Type> |
| struct traits_asval<std::shared_ptr<Type> > { |
| static int asval(VALUE obj, std::shared_ptr<Type> *val) { |
| if (val) { |
| std::shared_ptr<Type> ret; |
| std::shared_ptr<Type> *p = &ret; |
| int res = traits_asptr<std::shared_ptr<Type> >::asptr(obj, &p); |
| if (!SWIG_IsOK(res)) |
| return res; |
| *val = ret; |
| return SWIG_OK; |
| } else { |
| return traits_asptr<std::shared_ptr<Type> >::asptr(obj, (std::shared_ptr<Type> **)(0)); |
| } |
| } |
| }; |
| |
| template <class Type> |
| struct traits_asval<std::shared_ptr<Type> *> { |
| static int asval(VALUE obj, std::shared_ptr<Type> **val) { |
| if (val) { |
| typedef typename noconst_traits<std::shared_ptr<Type> >::noconst_type noconst_type; |
| if (*val) { |
| noconst_type ret; |
| noconst_type *p = &ret; |
| int res = traits_asptr<noconst_type>::asptr(obj, &p); |
| if (SWIG_IsOK(res)) |
| **(const_cast<noconst_type**>(val)) = ret; |
| return res; |
| } else { |
| noconst_type *p = 0; |
| int res = traits_asptr<noconst_type>::asptr(obj, &p); |
| if (SWIG_IsOK(res)) |
| *val = p; |
| return res; |
| } |
| } else { |
| return traits_asptr<std::shared_ptr<Type> >::asptr(obj, (std::shared_ptr<Type> **)(0)); |
| } |
| } |
| }; |
| |
| template <class Type> |
| struct traits_as<std::shared_ptr<Type>, pointer_category> { |
| static std::shared_ptr<Type> as(VALUE obj) { |
| std::shared_ptr<Type> ret; |
| std::shared_ptr<Type> *v = &ret; |
| int res = traits_asptr<std::shared_ptr<Type> >::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<std::shared_ptr<Type> >()); |
| throw std::invalid_argument("bad type"); |
| } |
| } |
| }; |
| |
| template <class Type> |
| struct traits_as<std::shared_ptr<Type> *, pointer_category> { |
| static std::shared_ptr<Type> * as(VALUE obj) { |
| std::shared_ptr<Type> *p = 0; |
| int res = traits_asptr<std::shared_ptr<Type> >::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<std::shared_ptr<Type> *>()); |
| throw std::invalid_argument("bad type"); |
| } |
| } |
| }; |
| |
| template <class Type> |
| struct traits_from_ptr<std::shared_ptr<Type> > { |
| static VALUE from(std::shared_ptr<Type> *val, int owner = 0) { |
| if (val && *val) { |
| return SWIG_NewPointerObj(val, type_info<std::shared_ptr<Type> >(), 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<const Type>") will return NULL. |
| */ |
| template<class Type> |
| struct traits_from<std::shared_ptr<const Type> > { |
| static VALUE from(const std::shared_ptr<const Type>& val) { |
| std::shared_ptr<Type> p = std::const_pointer_cast<Type>(val); |
| return swig::from(p); |
| } |
| }; |
| } |
| } |
| |
| %fragment("StdSharedPtrTraits"); |