John Labenski wrote:
>>  obj = iter3:op_mul()
>
> This should error out since op_mul() expects an argument.

No it really works. And operator*() generates things different compared too
 operator*( const a2dAffineMatrix& m )

Which is what i need, only the naming i don't like.

>
>> If possible adding an extra op_deref or something like that would be 
>> nice.
>
> Can you explain why you need to dereference an object pushed into Lua?
> wxLua uses pointers to all class objects, gets them as pointers in the
> bindings and simply puts a * in front if necessary. Unless I'm
> misunderstanding, the operator will convert the pointer to the object,
> but then immediately convert it back to a pointer to push it into Lua.



First of all a2dCanvasObjectListIter is internal in my code a:

typedef a2dCanvasObjectList::iterator a2dCanvasObjectListIter;

and

a2dCanvasObjectList is derived from a template instantiation of a smart 
pointer list called a2dSmrtPtrList<a2dCanvasObject>, which contain 
a2dCanvasObjectPtr, this last is a

typedef    a2dSmrtPtr<a2dCanvasObject> a2dCanvasObjectPtr;

a2dSmrtPtrList is on it turn a normal STL list containing Smart Pointers.

Now STL lists only work properly/best with complete objects in the list, 
so not pointers. STL makes copies of the objects you put in the list, 
and deletes them itself.
And that is why the STL list works very well with Smart Pointer, since 
they are objects, which internal uses a pointer to the actual object, 
which has a refcounter. Here that is a a2dCanvasObject. So copies are 
cheap, just increment the refcounter. (Very similar to the typical 
wxWidgest refcounting, but not copy on write here).
And deletion by STL, is calling a delete on the SmartPointer, which 
means only decrementing the refcount of the a2dCanvasObject, unless 0.

Anyway, the STL list has an internal nested iterator class. So my 
a2dCanvasObjectList above, has a a2dCanvasObjectList::iterator, which i 
need to use to iterate the list. I can't derive that iterator, and nor 
redefine its methods. So in order to use it in wxLua, i need to use its 
methods as is.
And to bad that is mostly operatorXXX.
The iterator in STL always delivers references to the object it points too.
And it does that with operator*(). I need to write:

a2dCanvasObjectList::value_type obj = *iter;

So in my case i get a a2dCanvasObjectPtr from it. And to get to the real 
object, i need to use the Get() method of my Smart Pointer 
a2dCanvasObjectPtr, which delivers me  a a2dCanvasObject*.

Here is what i have in the binding file.

%class %delete %encapsulate %noclassinfo a2dCanvasObjectPtr
    a2dCanvasObject* Get() const
%endclass

%class %encapsulate %noclassinfo a2dCanvasObjectListIter
    a2dCanvasObjectListIter()

    %operator a2dCanvasObjectPtr operator*() const
....rest...
%endclass

%class %noclassinfo a2dCanvasObjectList, a2dSmrtPtrList
    a2dCanvasObjectList()

    a2dCanvasObjectListIter lbegin()
    a2dCanvasObjectListIter lend()
....rest...
%endclass


And here is how it is use it inside a lua script.


iter3 = childs:lbegin()
for i=1,childs:size() do
    obj = iter3:op_mul()
    nameOfobj = obj:Get():GetName()
    iter3:op_inc()
end

As you can see, op_mul() gives me a a2dCanvasObjectPtr, and i can even 
call the Get() method on it.
Now if you say that is in fact not a a2dCanvasObjectPtr, but a 
a2dCanvasObjectPtr*, i believe you, and i see it in the C++ binding code 
:-) But that does not change the fact that in C++ the operator*() is 
really use to get to the STL iterator. Which is the only way possible. 
So some way or the other, currently op_mul() is correctly resulting in 
the operator*(), which i need to get to the STL iterator its objects.
The     a2dCanvasObjectPtr* returns = new a2dCanvasObjectPtr(*(*self)) 
is also interesting. First the iterator (*self) delivers a 
"a2dCanvasObjectPtr&" using *(*self).
I can write it like this also:
     a2dCanvasObjectPtr* returns = new a2dCanvasObjectPtr(self->operator 
*());

That lua wants a a2dCanvasObjectPtr* is fine with me, it deletes it 
himself, and its just an extra refcount behind the scenes inside the 
a2dCanvasObject.
Therefore it makes no differnce who deletes it first (Lua or the list).


Down here the code that is generated for operator*(), which is different 
compared to what is generated for //     %operator a2dAffineMatrix 
operator*( const a2dAffineMatrix& m ) const
There is contains:
    a2dAffineMatrix* returns = new a2dAffineMatrix((*self)*(*m));

//         %operator a2dCanvasObjectPtr operator*() const
static int LUACALL wxLua_a2dCanvasObjectListIter_op_mul(lua_State *L)
{
    // get this
    a2dCanvasObjectListIter * self = (a2dCanvasObjectListIter 
*)wxluaT_getuserdatatype(L, 1, wxluatype_a2dCanvasObjectListIter);
    // call op_mul
    // allocate a new object using the copy constructor
    a2dCanvasObjectPtr* returns = new a2dCanvasObjectPtr(*(*self));
    // add the new object to the tracked memory list
    wxluaO_addgcobject(L, (void*)returns, new 
wxLua_wxObject_a2dCanvasObjectPtr((a2dCanvasObjectPtr*)returns));
    // push the result datatype
    wxluaT_pushuserdatatype(L, returns, wxluatype_a2dCanvasObjectPtr);

    return 1;
}


So after all it looks this is really implemented, still i would like it 
to be called not op_mul but op_deref :-)

Hope this helps to understand what is happening here,

Regards,

Klaas
>   


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
wxlua-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wxlua-users

Reply via email to