From: Josh C. <jc...@nc...> - 2006-02-02 22:45:25
|
On Thu, 2 Feb 2006, Luke Moore wrote: > Ideally, when I write "x = v[0]", x would own a copy of an RCPtr, > instead of pointing to the one in the vector. Does that seem > reasonable? If so, is there a way to make __getitem__ copy the RCPtr? > (If so, I could also go back to using shared_ptrs, too.) One simple way is if it returns and RCPtr by value rather than reference. It used to be that std_vector.i had a whole section that handled doing that for built-in types. Another way would be to define a typemap for const RCPtr& that makes a copy, or just apply the plain RCPtr typemap. Josh -- Joshua L. Cherry, Ph.D. NCBI/NLM/NIH (Contractor) jc...@nc... |
From: Luke M. <lu...@si...> - 2006-02-03 15:11:30
|
Josh Cherry wrote: > On Thu, 2 Feb 2006, Luke Moore wrote: > > >>Ideally, when I write "x = v[0]", x would own a copy of an RCPtr, >>instead of pointing to the one in the vector. Does that seem >>reasonable? If so, is there a way to make __getitem__ copy the RCPtr? >>(If so, I could also go back to using shared_ptrs, too.) > > > One simple way is if it returns and RCPtr by value rather than reference. > It used to be that std_vector.i had a whole section that handled doing > that for built-in types. Another way would be to define a typemap for > const RCPtr& that makes a copy, or just apply the plain RCPtr typemap. Thanks -- specializing std::vector for RCPtrs (and boost::shared_ptrs) did the trick. In case this is helpful for anyone else, I added this to my .i file: namespace std { template<class _Alloc > class vector<RCPtr<Foo>, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef RCPtr<Foo> value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(RCPtr<Foo>); %fragment(SWIG_Traits_frag(std::vector<RCPtr<Foo>, _Alloc >), "header", fragment=SWIG_Traits_frag(RCPtr<Foo>), fragment="StdVectorTraits") { namespace swig { template <> struct traits<std::vector<RCPtr<Foo>, _Alloc > > { typedef value_category category; static const char* type_name() { return "std::vector<RCPtr<Foo>," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector<RCPtr<Foo>, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector<RCPtr<Foo>, _Alloc >); #endif %std_vector_methods_val(vector); }; } I'm a little worried that the specialization above is a little too dependent on swig internals that could change from release to release. Strangely, if I try to partially specialize for RCPtrs of anything (adding _Tp as a template parameter and replacing Foo with _Tp), swig doesn't pick up the partial specialization. I suppose I can create a macro and specialize for all the types I need. Is the partial template specialization supposed to work, though? Thanks a lot, -Luke |