The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "pig.h"
#include <qstrlist.h>
#include "pigperl.h"
#include "pigtype_qt.h"

static SV *_pig_extract_QStrList(const QStrList &piglist) {
    AV *pigav = newAV();
    SV *pigr = newRV((SV *)pigav);
    SvREFCNT_dec(pigav);
    QStrListIterator piglistit(piglist);
    for(; piglistit.current(); ++piglistit)
	av_push(pigav, newSVpv(piglistit.current(), 0));
    return pigr;
}

static QStrList *_pig_create_QStrList(AV *pigav) {
    I32 pigcnt = av_len(pigav) + 1;
    I32 pigi;
    STRLEN n_a;
    QStrList *pigr = new QStrList;

    for(pigi = 0; pigi < pigcnt; pigi++) {
        SV **pigsvp = av_fetch(pigav, pigi, 0);
        if(pigsvp) {
	    const char *pigdata = SvPV(*pigsvp, n_a);
	    if(pigdata)
		pigr->append(pigdata);
	}
    }

    return pigr;
}

PIG_DEFINE_SCOPE_ARGUMENT(pig_type_qt_QStrList_ptr) {
    delete (QStrList *)pig0;
}

PIG_DEFINE_SCOPE_VIRTUAL(pig_type_qt_QStrList_ptr) {
    delete (QStrList *)pig0;
}

PIG_DEFINE_TYPE_ARGUMENT(pig_type_qt_QStrList_ptr, class QStrList *) {
    PIGARGS;
    if(!SvOK(PIG_ARG) || !SvROK(PIG_ARG) || SvTYPE(SvRV(PIG_ARG)) != SVt_PVAV)
        PIGARGUMENT(0);

    QStrList *pigr = _pig_create_QStrList((AV *)SvRV(PIG_ARG));

    PIGSCOPE_ARGUMENT(pig_type_qt_QStrList_ptr, pigr);
    PIGARGUMENT(pigr);
}

PIG_DEFINE_TYPE_DEFARGUMENT(pig_type_qt_QStrList_ptr, class QStrList *) {
    PIGARGS;
    if(!PIG_ARGOK)
	PIGARGUMENT(pig0);
    if(!SvOK(PIG_ARG) || !SvROK(PIG_ARG) || SvTYPE(SvRV(PIG_ARG)) != SVt_PVAV)
	PIGARGUMENT(0);

    QStrList *pigr = _pig_create_QStrList((AV *)SvRV(PIG_ARG));

    PIGSCOPE_ARGUMENT(pig_type_qt_QStrList_ptr, pigr);
    PIGARGUMENT(pigr);
}

PIG_DEFINE_TYPE_RETURN(pig_type_qt_QStrList_ptr, class QStrList *) {
    PIGRET;
    PIGRETURN(pig0 ?
	      sv_2mortal(_pig_extract_QStrList(*pig0)) :
	      sv_mortalcopy(&PIGsv_undef));
}

PIG_DEFINE_TYPE_PUSH(pig_type_qt_QStrList_ptr, class QStrList *) {
    PIGPUSHSTACK;
    PIGPUSH(pig0 ?
	    sv_2mortal(_pig_extract_QStrList(*pig0)) :
	    sv_mortalcopy(&PIGsv_undef));
}

PIG_DEFINE_TYPE_POP(pig_type_qt_QStrList_ptr, class QStrList *) {
    PIGPOPSTACK;
    SV *pigsv = PIG_TOPSTACK;
    if(!SvOK(pigsv) || !SvROK(pigsv) || SvTYPE(SvRV(pigsv)) != SVt_PVAV)
        PIGPOP(0);

    QStrList *pigr = _pig_create_QStrList((AV *)SvRV(pigsv));

    PIGSCOPE_VIRTUAL(pig_type_qt_QStrList_ptr, pigr);
    PIGPOP(pigr);
}


PIG_DEFINE_TYPE_ARGUMENT(pig_type_qt_leak_QStrList_ptr, class QStrList *) {
    PIGARGS;
    if(!SvOK(PIG_ARG) || !SvROK(PIG_ARG) || SvTYPE(SvRV(PIG_ARG)) != SVt_PVAV)
        PIGARGUMENT(0);
    AV *pigav = (AV *)SvRV(PIG_ARG);
    QStrList *pigr = _pig_create_QStrList(pigav);

    //    PIGSCOPE_ARGUMENT(pig_type_qt_QStrList_ptr, pigr);
    PIGARGUMENT(pigr);
}

PIG_DEFINE_TYPE_DEFARGUMENT(pig_type_qt_leak_QStrList_ptr, class QStrList *) {
    PIGARGS;
    if(!PIG_ARGOK)
	PIGARGUMENT(pig0);
    if(!SvOK(PIG_ARG) || !SvROK(PIG_ARG) || SvTYPE(SvRV(PIG_ARG)) != SVt_PVAV)
	PIGARGUMENT(0);

    AV *pigav = (AV *)SvRV(PIG_ARG);
    QStrList *pigr = _pig_create_QStrList(pigav);

    //    PIGSCOPE_ARGUMENT(pig_type_qt_QStrList_ptr, pigr);
    PIGARGUMENT(pigr);
}

PIG_DEFINE_STUB_RETURN(pig_type_qt_leak_QStrList_ptr, class QStrList *)
PIG_DEFINE_STUB_PUSH(pig_type_qt_leak_QStrList_ptr, class QStrList *)

PIG_DEFINE_TYPE_POP(pig_type_qt_leak_QStrList_ptr, class QStrList *) {
    PIGPOPSTACK;
    SV *pigsv = PIG_TOPSTACK;
    if(!SvOK(pigsv) || !SvROK(pigsv) || SvTYPE(SvRV(pigsv)) != SVt_PVAV)
        PIGPOP(0);

    QStrList *pigr = _pig_create_QStrList((AV *)SvRV(pigsv));

    //    PIGSCOPE_VIRTUAL(pig_type_qt_QStrList_ptr, pigr);
    PIGPOP(pigr);
}


PIG_DEFINE_TYPE(pig_type_qt_QStrList_ptr)
PIG_DEFINE_TYPE(pig_type_qt_leak_QStrList_ptr)

PIG_EXPORT_TABLE(pigtype_qt_QStrList)
    PIG_EXPORT_TYPE(pig_type_qt_QStrList_ptr, "Qt QStrList*")
    PIG_EXPORT_TYPE(pig_type_qt_leak_QStrList_ptr, "Qt new QStrList*")
PIG_EXPORT_ENDTABLE