[C++-sig] Re: will custom lvalue converters be supported?

Ralf W. Grosse-Kunstleve rwgk at yahoo.com
Wed Jul 21 20:32:02 CEST 2004


--- Igor Lapshin <igor at pcigeomatics.com> wrote:
> That's exactly the case:  there are already hundreds of functions
> written with that "write-back" requirement long before we decided to use
> Python and it seems to me that writing thin wrappers for all of them is
> quite problematic. Moreover, the new functions are still being
> written...

In that case I'd wrap your list-like classes like this:

http://cvs.sourceforge.net/viewcvs.py/cctbx/scitbx/include/scitbx/stl/vector_wrapper.h?view=markup

This makes your std::vector derived classes look and work almost exactly like a
native Python list. You can even write foo([1,2,3]) directly to call
foo(std::vector<int> const&). Only if you want the write-back you have to be a
bit more conscious:

    array = stl.vector.int([1,2,3])
    foo(array)
    print list(array)

This works because

    - std::vector<int> is wrapped with boost::python::class_<>
    - there is a custom rvalue converter from any Python sequence
      (list, tuple, any iterable) to std::vector<int>
    - the copy constructor for std::vector<int> is wrapped explicitly

About my implementation:

    - I am trying to keep it simple to keep compile times down.
    - All required header files are open source and quite small.
      The most important header file is container_conversions.h
      which has no other dependencies. You can easily copy and
      paste code from slice.h and utils.h.
    - You will not be interested in ref_from_array.h. Simply remove
      the include and the three corresponding lines near the bottom.
    - If you are not interested in pickling you can reduce compile
      times some more by removing .enable_pickling() and the getinitargs
      implementation.
    - For use examples, see:

http://cvs.sourceforge.net/viewcvs.py/cctbx/scitbx/include/scitbx/stl/vector_ext.cpp?view=markup

You may want to wrap the required std::vector instantiations in the way
outlined above, and your derived classes with class_<your_derived,
bases<std::vector<int> > >.

It may be better to use Jonathan's newer boost::python::slice instead of my
older code for handling slices. As a start you could simply remove the
functions involving my slice objects. Maybe Jonathan can suggest replacement
code?

Ralf



		
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail 



More information about the Cplusplus-sig mailing list