~neon/perlkde/master

« back to all changes in this revision

Viewing changes to qttest/qtesteventlist_macros.h

  • Committer: Chris Michael Burel
  • Date: 2010-10-27 17:31:23 UTC
  • Revision ID: git-v1:21dbf7d9f3e5a3131986c076c878d21c40bb3c2d
Add support for QTestEventList, QXmlStreamAttributes, and QItemSelection.
Use _pTHX macro in XS function definitions, to support Perls compiled with and without threads.
Clean up some memory management in the array functions.  Only copy when we need to, and keep track of when we do copy.

svn path=/trunk/KDE/kdebindings/perl/; revision=1190447

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef QTESTEVENTLIST_MACROS_H
 
2
#define QTESTEVENTLIST_MACROS_H
 
3
 
 
4
#include <listclass_macros.h>
 
5
#include <QTestEvent>
 
6
#include <QtTest>
 
7
#include <QList>
 
8
#include <typeinfo>
 
9
 
 
10
template <class ItemList, class Item, const char *ItemSTR, const char* PerlName>
 
11
void XS_qtesteventlist_store( pTHX_ CV* cv)
 
12
{
 
13
    dXSARGS;
 
14
    if (items != 3)
 
15
        Perl_croak(aTHX_ "Usage: %s::store(array, index, value)", PerlName);
 
16
    PERL_UNUSED_VAR(cv); /* -W */
 
17
    {
 
18
        SV*     array = ST(0);
 
19
        int     index = (int)SvIV(ST(1));
 
20
        SV*     value = ST(2);
 
21
        SV *    RETVAL;
 
22
        smokeperl_object* o = sv_obj_info(array);
 
23
        if (!o || !o->ptr)
 
24
            XSRETURN_UNDEF;
 
25
        smokeperl_object* valueo = sv_obj_info(value);
 
26
        if (!valueo || !valueo->ptr)
 
27
            XSRETURN_UNDEF;
 
28
        ItemList* list = (ItemList*)o->ptr;
 
29
        Item* point = (Item*)valueo->ptr;
 
30
 
 
31
        if ( 0 > index || index > list->size()+1 )
 
32
            XSRETURN_UNDEF;
 
33
        else if ( index == list->size() )
 
34
            list->append( point );
 
35
        else
 
36
            list->replace( index, point );
 
37
 
 
38
        RETVAL = newSVsv(value);
 
39
        ST(0) = RETVAL;
 
40
        sv_2mortal(ST(0));
 
41
    }
 
42
    XSRETURN(1);
 
43
}
 
44
 
 
45
template <class ItemList, class Item, const char *ItemSTR, const char* PerlName>
 
46
void XS_qtesteventlist_storesize( pTHX_ CV* cv)
 
47
{
 
48
    dXSARGS;
 
49
    if (items != 2)
 
50
        Perl_croak(aTHX_ "Usage: %s::storesize(array, count)", PerlName);
 
51
    PERL_UNUSED_VAR(cv); /* -W */
 
52
    PERL_UNUSED_VAR(ax); /* -Wall */
 
53
    SP -= items;
 
54
    {
 
55
        SV*     array = ST(0);
 
56
        int     count = (int)SvIV(ST(1));
 
57
        AV *    RETVAL;
 
58
        smokeperl_object* o = sv_obj_info(array);
 
59
        if (!o || !o->ptr || count < 0)
 
60
            XSRETURN_UNDEF;
 
61
        ItemList* list = (ItemList*)o->ptr;
 
62
 
 
63
        while ( count < list->size() )
 
64
            list->removeLast();
 
65
 
 
66
        PUTBACK;
 
67
        return;
 
68
    }
 
69
}
 
70
 
 
71
#define DEF_QTESTEVENTLIST_FUNCTIONS(ItemList,Item,ItemName,PerlName) \
 
72
namespace { \
 
73
char ItemList##STR[] = #ItemList;\
 
74
char ItemName##STR[] = #Item "*";\
 
75
char ItemName##PerlNameSTR[] = #PerlName;\
 
76
void (*XS_##ItemList##_at)(pTHX_ CV*)                    = XS_Vector_at<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
77
void (*XS_##ItemList##_exists)(pTHX_ CV*)                = XS_ValueVector_exists<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
78
void (*XS_##ItemList##_size)(pTHX_ CV*)                  = XS_ValueVector_size<ItemList, ItemName##PerlNameSTR>;\
 
79
void (*XS_##ItemList##_store)(pTHX_ CV*)                 = XS_qtesteventlist_store<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
80
void (*XS_##ItemList##_storesize)(pTHX_ CV*)             = XS_qtesteventlist_storesize<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
81
void (*XS_##ItemList##_clear)(pTHX_ CV*)                 = XS_ValueVector_clear<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
82
void (*XS_##ItemList##_push)(pTHX_ CV*)                  = XS_Vector_push<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
83
void (*XS_##ItemList##_pop)(pTHX_ CV*)                   = XS_ValueVector_pop<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
84
void (*XS_##ItemList##_shift)(pTHX_ CV*)                 = XS_Vector_shift<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
85
void (*XS_##ItemList##_unshift)(pTHX_ CV*)               = XS_Vector_unshift<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
86
void (*XS_##ItemList##_splice)(pTHX_ CV*)                = XS_List_splice<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR>;\
 
87
void (*XS_##ItemList##__overload_op_equality)(pTHX_ CV*) = XS_ValueVector__overload_op_equality<ItemList, Item, ItemName##STR, ItemName##PerlNameSTR, ItemList##STR>;\
 
88
\
 
89
}
 
90
#endif