[C++-sig] Re: IntWrapper.hpp in indexing_suite

Niall Douglas s_sourceforge at nedprod.com
Sat Oct 11 20:45:48 CEST 2003


On 11 Oct 2003 at 12:14, Raoul Gough wrote:

> I've used IntWrapper in a number of different test cases, and ISTR one
> of them needed a conversion to shared pointer. I suspect that test
> didn't make it into the CVS, so the shared pointer conversion is
> currently redundant.

Right, sorry, as I mentioned before I don't quite get how all this 
works ...

> I don't think the shared pointer conversion has anything to do with
> this. The really important bit is this:
> 
>   boost::python::class_<IntWrapper> ("IntWrapper",
>   boost::python::init<int>())
>     .def ("increment", &IntWrapper::increment)
>     .def ("__repr__", repr)
>     .def ("__cmp__", compare)
>     ;
> 
> which turns IntWrapper into a Python class, with enough support to
> convert it to a string and compare two IntWrapper objects. There is
> also an implicit conversion from int, which means that code like this
> will work:

Hang on, back up a way bit. Firstly, you appear to be implying that 
the sequence in python is actually of IntWrapper's, not real int's. 
Actually, now that looks obvious, but I hadn't realised that before.

Therefore the down conversion from an IntWrapper to an int is 
happening when python pulls a value /from/ the sequence eg; 
repr(sequence).

Ok, I now get why there's the __cmp__ and __repr__. But why the 
increment()? Surely that should be __inc__ or something? (I can't 
find __inc__ anywhere in the python docs. But it can't be a reference 
count as there's no way of reading it, decrementing it and besides, 
it's incrementing the value, not a refCount).

Actually, how the hell is bpl converting an IntWrapper to an int? I 
understand how int becomes IntWrapper (the explicit copy 
constructor), but not vice versa!

> > 	CArrayMember<std::string> 
> > *data=static_cast<CArrayMember<std::string> *>(l.getData());
> 
> Wow. This is almost certainly undefined behaviour.

Might be according to the standard, but if CArrayMember<> contains no 
data members, there's no chance of copy slicing and thus no problem.

> > 	return 
> > boost::python::indexing::iterator_pair<CArrayMember<std::string> *>
> > 		(data, data+100000); // Issue if l is near the 4Gb mark
> > }
> 
> The bounds checking code will still be compiled, of course, so lying
> about the bound doesn't actually gain you anything (unless you have no
> way of figuring out the real bound). You should be able to provide the
> correct bound without too much trouble in this example.

Yeah twas temporary code I'll fix later. I was going to have a 
template parameter take an address to a function which when called, 
returns the length of the array (seeing as that function varies 
between classes). And a template specialisation taking arrays with 
length attached.

> OK, so CArrayMember<std::string> is-a std::string. You still haven't
> exposed it to Python though. You will need something like this:
> 
> class_<CArrayMember<std::string>, bases<std::string> >
>    ("CArrayMember_string");
> 
> I don't know exactly what else you'll have to do here - maybe define
> implicit conversions to/from std::string, maybe make it no_init. The
> container suite doesn't attempt to expose the container's value type
> to Python - it assumes that you will do that yourself. I would suggest
> first trying to get CArrayMember<...> working in Python before trying
> to expose a container of CArrayMembers.

I had been assuming that std::string already has a registered 
converter converting it to a python string.

But what's *very* important to understand here is that soon I'll make 
the std::string a template parameter as I want it to be generically 
applicable ie; you can wrap any C++ object with the necessary gumph 
to make it a member of a sequence.

Ideally however I'd like to somehow divorce the conversion of the 
types in the array from the accessing of the array. The conversions 
are already registered and mapped to python types - my CArray code 
should merely index the array and return a type (often pointer to 
type) to the array member which then BPL converts as it would 
normally do (when returned from a method) to its corresponding python 
type.

Cheers,
Niall




-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 208 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20031011/5f7d3105/attachment.pgp>


More information about the Cplusplus-sig mailing list