[C++-sig] std::list wrapper [Was: Segfaults in object deallocation]
Alex Leach
beamesleach at gmail.com
Wed Apr 17 15:54:02 CEST 2013
On Wed, 20 Mar 2013 16:53:55 -0000, Alex Leach <beamesleach at gmail.com>
wrote:
> On Wed, 20 Mar 2013 16:34:00 -0000, Jim Bosch <talljimbo at gmail.com>
> wrote:
>
>>
>> [...] I'm curious what you're using to wrap std::list, as you clearly
>> have methods that return std::list, and the standard library can be
>> tricky to translate to Python due to things like iterator invalidation.
>
> Heh, not yet anyway! Although I've laid out the foundations, I haven't
> yet implemented my attempt at a solution, nor tested it,
I've since got around to fixing the std::list wrapper I think I sent
around before. Lots of errors in that version! Now, I've got it working,
though; its sort and reverse functions use C++ STL algorithms instead of
Python's, but that's probably a good thing; results appear to be
consistent with those on a normal Python list. That said, I haven't
profiled it for speed and compared performance against Python lists.
I attach a complete example in the attached zip archive; just run 'python
test_make_list.py' to compile an example extension, which exposes
std::list<int> and std::list<std::string>. Unit-tests are then run to
compare those against identical Python lists.
make_list.zip contents:-
./test_make_list.py // Compiles example code and runs unit-tests
./test_make_list.cpp // example showing how to expose list<string> and
list<int>
./boost_helpers/make_list.hpp // defines
boost::python::list_indexing_suite
./boost_helpers/make_callback.hpp // needed for sort and reverse
optional binary predicate
./util.py // helper functions for compiling with distutils
A couple things to mention:-
1. make_callback.hpp isn't as tidy as make_list.hpp; it probably
shouldn't even be necessary, but I needed something to help calling back
into Python code, and this seemed to work. I wrote quite a nice template
implementation using variadic templates, but the C++98 alternative isn't
great.
2. I haven't (yet) exposed a good initialiser for the list classes, so
it's not possible to do, e.g.
>>> int_list = test_make_list.IntList([1, 2, 3])
Instead, I've been populating lists like this:-
>>> int_list = test_make_list.IntList()
>>> int_list[:] = [1, 2, 3]
Obviously, that's not quite ideal. Any help or advice with making a
templatised initialiser would be very welcome though!
Kind regards,
Alex
-------------- next part --------------
A non-text attachment was scrubbed...
Name: make_list.zip
Type: application/zip
Size: 7153 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20130417/a903941f/attachment.zip>
More information about the Cplusplus-sig
mailing list