|
Re: Support for Indexing and Iteration Safety: msg#00345python.c++
"David Abrahams" <dave@xxxxxxxxxxxxxxxxxxxx> wrote in message news:u65nv6j6h.fsf@xxxxxxxxxxxxxxxxxxxxxxx > 1. Unlike most of the other operators, which can be wrapped using > "self op other", there's no easy way to wrap the indexing > operator. You end up having to write your own __getitem__ > and __setitem__ functions. I don't see any _general_ way to automate that, however it might be worth for STL containers. Probably simplistic approach will do; any advanced person can do that himself and starters will benefit right out of the box. inline void IndexError() { PyErr_SetString(PyExc_IndexError,"Index too large"); throw_error_already_set(); } template<class T> struct std_item { typedef typename T::value_type Value; static Value const& get(T& x, int n) { if( n<0 ) n+=x.size(); if( n<x.size() && n>=0 ) return x[n]; IndexError(); } static void set(T& x, int n, const Value& val) { if( n<0 ) n+=x.size(); if( n<x.size() && n>=0 ) x[n]=val; else IndexError(); } static void del(T& x, int n) { if( n<0 ) n+=x.size(); if( n<x.size() && n>=0 ) x.erase(&x[n]); else IndexError(); } }; > 2. You also have to implement the code which raises an exception > if the index is out of range or the key is not found (in case > you're implementing a mapping). If you forget, your extension > class is prone to crashes and accessing invalid data. Ditto. > 3. Even if you get that right, you may still be prone to crashes. > Suppose you're wrapping a std::vector<SomeBigObject>. If you > want to support syntax like: Let's return to basics. What is foo[10]? In C++ it's a memory chunk, in Python it's an object. To overcome that difference I propose to introduce differenciation in wrapping, a la it is in Python: there are tuples and lists; mutable and immutable. So let user decide what he wants out of foo[10] - mutable object (a copy), or readonly - an inplace reference. Again please don't argue about general ineffiency, IMHO better safe than sorry ..egh crash. I take for granted that some _simple_ enought way to override that default behaviour with custom is provided. > 4. Similar problem with exposed iterators: Same. > These problems are not vector-specific. I have some ideas about > addressing them but I'm not sure how far to go, and first I want to > know how many people care. My 0.02. Hope I made my point clear. Mike Rovner |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: accessing the python type system: 00345, David Abrahams |
|---|---|
| Next by Date: | Re: Support for Indexing and Iteration Safety: 00345, David Abrahams |
| Previous by Thread: | Re: Support for Indexing and Iteration Safetyi: 00345, Brett Calcott |
| Next by Thread: | Re: Support for Indexing and Iteration Safety: 00345, Mike Rovner |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |