[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