From: klaas.holwerda <ng...@kl...> - 2008-10-27 19:25:52
|
John Labenski wrote: > On Sat, Oct 25, 2008 at 1:05 PM, klaas.holwerda <ng...@kl...> > wrote: >> Hi John, >> >> %operator a2dCanvasObjectListIter& operator--(int) >> >> If you change it to generate this, down here, it will work: >> >> *returns = ((*self).operator++(arg1)); > > I don't think that post-incrementing makes much sense for Lua. I would be very happy if you could still change it to become like the above, since else i can't get it compiled for STL lists. Its iterator does not accept the pre-incr only, or the other way around. I try to explain how i do it now, and it works, if i do the needed modification to the generated C++ wrapping, in order to fit the STL operators, which i can not change. First i already have a subclassed list based on STL and smart pointers. The members lbegin and lend i had to add to satisfy lua, it does not like function called end(). All the rest of the STL list functions and iterator functions, i do add in lua. class A2DCANVASDLLEXP a2dCanvasObjectList: public a2dSmrtPtrList<a2dCanvasObject> { public: a2dCanvasObjectList(); ~a2dCanvasObjectList(); iterator lbegin(); iterator lend(); .... all other members ... } Next i make a typedef for this list its iterator in order to have a non template iterator for wxLua. Understand that i do not subclass the iterator, and that this would make the trick impossible. The iterator above is a fixed subclass of the STL template list class, and i can not modify it or use another subclass of this iterator. That is why i need to use the operators of the base STL iterator, and i need to use them from wxLua directly also, or at least the code generated in C++ by the wrapper, must fit the STL iterator class directly. typedef a2dCanvasObjectList::iterator a2dCanvasObjectListIter; Now this is how the list is wrapped, notice the extra functions, which are not part of a2dCanvasObjectList directly, only of the lowest STL list base class. %include "canvas/include/objlist.h" %class %noclassinfo a2dCanvasObjectList, a2dSmrtPtrList a2dCanvasObjectList() a2dCanvasObjectListIter lbegin() a2dCanvasObjectListIter lend() bool empty() size_t size() a2dCanvasObject* front() a2dCanvasObject* back() void push_front( a2dCanvasObject* obj ) void pop_front() void push_back( a2dCanvasObject* obj ) void pop_back() %operator a2dCanvasObjectList& operator=( const a2dCanvasObjectList& other ) // REST here %endclass And now the wrapping code for the iterator. In principle i just add all function of STL list it's iterator. But first only the operator ones, because the are the key factor to succeed. %class %encapsulate %noclassinfo a2dCanvasObjectListIter a2dCanvasObjectListIter() %operator a2dCanvasObjectPtr operator*() const %operator a2dCanvasObjectListIter& operator=(const a2dCanvasObjectListIter& other) %operator bool operator ==( const a2dCanvasObjectListIter& iter ) const %operator bool operator !=( const a2dCanvasObjectListIter& iter ) const %operator a2dCanvasObjectListIter& operator++() %operator a2dCanvasObjectListIter& operator++( int ) %operator a2dCanvasObjectListIter& operator--() %operator a2dCanvasObjectListIter& operator--(int) %endclass And at last a working wxLua script with the above. iter3 = childs:lbegin() iter4 = childs:lend() if iter3:op_eq(iter4) then cmdh:Message("list is empty"..tostring(iter3)..tostring(iter4) ) else cmdh:Message("list has "..childs:size().." elements" ) end nameOfobj = "" iter3 = childs:lbegin() for i=1,childs:size() do obj = iter3:op_mul() nameOfobj = nameOfobj.."\n"..obj:Get():GetName() iter3:op_inc() end cmdh:Message("names are:\n"..nameOfobj) The only thing i do not like in this script is the name op_mul() to get a reference to the object in the list. A name like op_deref() would be much better. If we can get the operators to work (generate working code) for STL, in think that it is a nice way to use STL lists in lua. And the effort is very reasonable. But i need you to make it happen, because i can't make bananas of genwxbind.lua :-) Thanks, Klaas |