[C++-sig] Re: using shared_ptrs with the vector_indexing_suite

Chad Austin caustin at gmail.com
Thu Feb 3 16:56:39 CET 2005


Thanks Arthur!  That helps a lot!  Now can we convince someone to add
a note to the vector_indexing_suite documentation...?  :)


On Thu, 03 Feb 2005 09:36:46 -0600, Arthur Peters <amp at singingwizard.org> wrote:
> 
> Hello all,
> There were a couple of messages on the subject of shared_ptrs used with
> vector_indexing_suite.
> 
> Below is the most resent email on the subject. I am having the exact same
> problem and I have found a solution, and I thought I'd post it for the
> benafit of others who run into the same thing.
> 
> Turn off proxies by passing true as the NoProxy template parameter.
> shared_ptrs don't need proxies because calls on one a copy of the the
> shared_ptr will affect all of them (duh!).
> 
> If you have:
> class_<std::vector<boost::shared_ptr<CPropertySet> >
> >("vector_CPropertySet")
>   .def(vector_indexing_suite<std::vector<boost::shared_ptr<CPropertySet>
> > >());
> Change it to:
> class_<std::vector<boost::shared_ptr<CPropertySet> >
> >("vector_CPropertySet")
>   .def(vector_indexing_suite<std::vector<boost::shared_ptr<CPropertySet>
> >,
>                              true >());
> 
> The quoted message has a more extensive description of the initail
> problem.
> 
> Hope this helps someone
> -Arthur
> 
> >Date: Fri, 7 Jan 2005 14:56:55 -0800
> >From: Greg Landrum <greg.landrum at gmail.com>
> >Subject: [C++-sig] using shared_ptrs with the vector_indexing_suite
> >To: c++-sig at python.org
> >Message-ID: <60825b0f05010714564d71e769 at mail.gmail.com>
> >Content-Type: text/plain; charset="us-ascii"
> >
> >I'm attempting to get shared_ptrs working in combination with the
> >vector_indexing_suite in order to make it easy to return std::vectors
> >of shared_ptrs from our code.
> >
> >I feel like I've got a reasonable grasp of what's required to return
> >shared_ptrs (given how easy that is now, this isn't much of an
> >accomplishment), and I've even managed to get them working with the
> >iterator interface, but the combination with vector_indexing_suite
> >eludes me.
> >
> >The attached module and testing code demonstrate the problem.  When I
> >build this module and run the test (linux, python 2.3.4, g++ 3.2,
> >boost 1.32), all the tests pass except for test5 and test5b, which use
> >std::vectors of shared_ptrs. Both of those tests fail with the error:
> >
> >TypeError: No Python class registered for C++ class boost::shared_ptr<DemoKlass>
> >
> >Because the basic shared_ptr operations and the more complicated
> >iterator stuff work, I'm guessing this has something to do with the
> >vector_indexing_suite itself.
> >
> >Thanks in advance for any help,
> >-greg
> >-------------- next part --------------
> >// Copyright Rational Discovery LLC 2005.
> >// Distributed under the Boost Software License, Version 1.0. (See
> >// accompanying file LICENSE_1_0.txt or copy at
> >// http://www.boost.org/LICENSE_1_0.txt)
> >
> >
> >#include <boost/python.hpp>
> >#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
> >#include <boost/python/detail/api_placeholder.hpp>
> >#include <boost/shared_ptr.hpp>
> >
> >#include <vector>
> >
> >namespace python = boost::python;
> >
> >class DemoKlass {
> >public:
> >  explicit DemoKlass(int v) : val_(v) {};
> >  int getVal() const { return val_; };
> >private:
> >  int val_;
> >};
> >typedef boost::shared_ptr<DemoKlass> DemoKlassSPtr;
> >typedef std::vector<DemoKlass*> DemoKlassPtrVect;
> >typedef std::vector<DemoKlassSPtr> DemoKlassSPtrVect;
> >
> >DemoKlass *buildPtr(int v) {
> >  return new DemoKlass(v);
> >}
> >DemoKlassSPtr buildSPtr(int v) {
> >  return DemoKlassSPtr(new DemoKlass(v));
> >}
> >
> >DemoKlassPtrVect buildPtrVector(unsigned int sz){
> >  DemoKlassPtrVect res;
> >  for(unsigned int i=0;i<sz;i++){
> >    res.push_back(new DemoKlass(i));
> >  }
> >  return res;
> >}
> >
> >DemoKlassSPtrVect buildSPtrVector(unsigned int sz){
> >  DemoKlassSPtrVect res;
> >  for(unsigned int i=0;i<sz;i++){
> >    res.push_back(DemoKlassSPtr(new DemoKlass(i)));
> >  }
> >  return res;
> >}
> >
> >
> >class DemoContainer {
> >public:
> >  typedef DemoKlassSPtrVect::iterator iterator;
> >  typedef DemoKlassSPtrVect::const_iterator const_iterator;
> >  explicit DemoContainer(unsigned int sz) {
> >    vect_ = buildSPtrVector(sz);
> >  }
> >  iterator begin() {
> >    return vect_.begin();
> >  }
> >  iterator end() {
> >    return vect_.end();
> >  }
> >  const_iterator begin() const {
> >    return vect_.begin();
> >  }
> >  const_iterator end() const {
> >    return vect_.end();
> >  }
> >
> >private:
> >  DemoKlassSPtrVect vect_;
> >};
> >
> >
> >
> >BOOST_PYTHON_MODULE(SPtrTestModule)
> >{
> >  python::class_<DemoKlass,DemoKlassSPtr >("DemoKlass","demo class",python::init<int>())
> >    .def("GetVal",&DemoKlass::getVal)
> >    ;
> >
> >  python::def("buildPtr",buildPtr,python::return_value_policy<python::manage_new_object>());
> >  python::def("buildSPtr",buildSPtr);
> >
> >
> >  python::class_<DemoKlassPtrVect>("DemoKlassPtrVec")
> >    .def(python::vector_indexing_suite<DemoKlassPtrVect>())
> >    ;
> >  python::def("buildPtrVector",buildPtrVector);
> >
> >  python::class_<DemoKlassSPtrVect>("DemoKlassSPtrVec")
> >    .def(python::vector_indexing_suite<DemoKlassSPtrVect>())
> >    ;
> >  python::def("buildSPtrVector",buildSPtrVector);
> >
> >
> >  python::class_<DemoContainer>("DemoContainer","demo container",python::init<unsigned int>())
> >    .def("__iter__",python::iterator<DemoContainer>())
> >    ;
> >
> >
> >}
> >-------------- next part --------------
> >A non-text attachment was scrubbed...
> >Name: test.py
> >Type: text/x-python
> >Size: 1321 bytes
> >Desc: not available
> >Url : http://mail.python.org/pipermail/c++-sig/attachments/20050107/4ffbdf8a/test-0001.py
> >
> >------------------------------
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig
>



More information about the Cplusplus-sig mailing list