4
4
// Author: Mattia Barbon
6
6
// Created: 29/10/2000
7
// RCS-ID: $Id: helpers.cpp 2800 2010-02-11 22:20:09Z mbarbon $
7
// RCS-ID: $Id: helpers.cpp 2927 2010-06-06 08:06:10Z mbarbon $
8
8
// Copyright: (c) 2000-2010 Mattia Barbon
9
9
// Licence: This program is free software; you can redistribute it and/or
10
10
// modify it under the same terms as Perl itself
774
template<class A> class array_thingy
780
rvalue create( size_t n ) const { return new A[n]; }
781
void assign( lvalue lv, rvalue rv ) const { *lv = rv; }
782
void free( rvalue rv ) const { delete[] rv; }
785
template<class F, class C>
786
int wxPli_av_2_thingarray( pTHX_ SV* avref, typename C::lvalue array,
787
const F& convertf, const C& thingy )
791
if( !SvROK( avref ) ||
792
( SvTYPE( (SV*) ( av = (AV*) SvRV( avref ) ) ) != SVt_PVAV ) )
794
croak( "the value is not an array reference" );
798
int n = av_len( av ) + 1;
799
typename C::rvalue arr = thingy.create( n );
801
for( int i = 0; i < n; ++i )
803
SV* t = *av_fetch( av, i, 0 );
804
if( !convertf( aTHX_ arr[i], t ) )
807
croak( "invalid conversion for array element" );
812
thingy.assign( array, arr );
820
bool operator()( pTHX_ SV*& dest, SV* src ) const
827
775
int wxPli_av_2_svarray( pTHX_ SV* avref, SV*** array )
829
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_sv(),
830
array_thingy<SV*>() );
777
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_sv(),
778
wxPli_array_allocator<SV*>() );
833
781
class convert_udatacd
843
791
int wxPli_av_2_userdatacdarray( pTHX_ SV* avref, wxPliUserDataCD*** array )
845
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_udatacd(),
846
array_thingy<wxPliUserDataCD*>() );
793
return wxPli_av_2_arrayany( aTHX_ avref, array, convert_udatacd(),
794
wxPli_array_allocator<wxPliUserDataCD*>() );
852
bool operator()( pTHX_ unsigned char& dest, SV* src ) const
854
dest = (unsigned char) SvUV( src );
859
797
int wxPli_av_2_uchararray( pTHX_ SV* avref, unsigned char** array )
861
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_uchar(),
862
array_thingy<unsigned char>() );
799
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_uchar(),
800
wxPli_array_allocator<unsigned char>() );
868
bool operator()( pTHX_ int& dest, SV* src ) const
870
dest = (int) SvIV( src );
875
803
int wxPli_av_2_intarray( pTHX_ SV* avref, int** array )
877
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_int(),
878
array_thingy<int>() );
805
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_int(),
806
wxPli_array_allocator<int>() );
881
809
#include <wx/menu.h>
910
838
return SvIV( var );
913
class convert_wxstring
916
bool operator()( pTHX_ wxString& dest, SV* src ) const
918
WXSTRING_INPUT( dest, const char*, src );
923
841
int wxPli_av_2_stringarray( pTHX_ SV* avref, wxString** array )
925
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_wxstring(),
926
array_thingy<wxString>() );
843
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_wxstring(),
844
wxPli_array_allocator<wxString>() );
929
template<class A, class B, B init>
936
wxarray_thingy( lvalue lv ) : m_value( lv ) { }
937
rvalue create( size_t n ) const
940
for( size_t i = 0; i < n; ++i )
941
m_value->Add( init );
944
void assign( lvalue, rvalue ) const { }
945
void free( rvalue ) const {}
950
extern const wxChar wxPliEmptyString[];
952
847
int wxPli_av_2_arraystring( pTHX_ SV* avref, wxArrayString* array )
954
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_wxstring(),
955
wxarray_thingy<wxArrayString, const wxChar*, wxPliEmptyString>( array ) );
849
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_wxstring(),
850
wxPli_wxarray_allocator<wxArrayString, const wxChar*>( array ) );
958
853
int wxPli_av_2_arrayint( pTHX_ SV* avref, wxArrayInt* array )
960
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_int(),
961
wxarray_thingy<wxArrayInt, int, 0>( array ) );
855
return wxPli_av_2_arrayany( aTHX_ avref, array, wxPli_convert_int(),
856
wxPli_wxarray_allocator<wxArrayInt, int>( array ) );
964
859
const wxChar wxPliEmptyString[] = wxT("");
1000
895
int wxPli_av_2_charparray( pTHX_ SV* avref, char*** array )
1002
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_charp(),
1003
array_thingy<char*>() );
897
return wxPli_av_2_arrayany( aTHX_ avref, array, convert_charp(),
898
wxPli_array_allocator<char*>() );
1006
901
class convert_wxcharp
1018
913
int wxPli_av_2_wxcharparray( pTHX_ SV* avref, wxChar*** array )
1020
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_wxcharp(),
1021
array_thingy<wxChar*>() );
915
return wxPli_av_2_arrayany( aTHX_ avref, array, convert_wxcharp(),
916
wxPli_array_allocator<wxChar*>() );
1024
919
#if wxUSE_UNICODE
1199
1094
wxPoint wxPli_sv_2_wxpoint_test( pTHX_ SV* scalar, bool* ispoint )
1201
return wxPli_sv_2_wxpoint_test<wxPoint, int, convert_int>
1202
( aTHX_ scalar, convert_int(), "Wx::Point", ispoint );
1096
return wxPli_sv_2_wxpoint_test<wxPoint, int, wxPli_convert_int>
1097
( aTHX_ scalar, wxPli_convert_int(), "Wx::Point", ispoint );
1205
1100
wxPoint wxPli_sv_2_wxpoint( pTHX_ SV* scalar )
1207
return wxPli_sv_2_wxpoint_test<wxPoint, int, convert_int>
1208
( aTHX_ scalar, convert_int(), "Wx::Point", 0 );
1102
return wxPli_sv_2_wxpoint_test<wxPoint, int, wxPli_convert_int>
1103
( aTHX_ scalar, wxPli_convert_int(), "Wx::Point", 0 );
1211
1106
template<class T>
1305
1200
bool operator()( pTHX_ wxPoint& dest, SV* src ) const
1308
dest = wxPli_sv_2_wxpoint_test<wxPoint, int, convert_int>
1309
( aTHX_ src, convert_int(), "Wx::Point", &ispoint );
1203
dest = wxPli_sv_2_wxpoint_test<wxPoint, int, wxPli_convert_int>
1204
( aTHX_ src, wxPli_convert_int(), "Wx::Point", &ispoint );
1310
1205
return ispoint;
1314
1209
int wxPli_av_2_pointarray( pTHX_ SV* avref, wxPoint** array )
1316
return wxPli_av_2_thingarray( aTHX_ avref, array, convert_wxpoint(),
1317
array_thingy<wxPoint>() );
1211
return wxPli_av_2_arrayany( aTHX_ avref, array, convert_wxpoint(),
1212
wxPli_array_allocator<wxPoint>() );
1320
1215
class convert_double
1344
1239
int wxPli_av_2_point2ddoublearray( pTHX_ SV* avref, wxPoint2DDouble** array )
1346
return wxPli_av_2_thingarray( aTHX_ avref, array,
1347
convert_wxpoint2ddouble(),
1348
array_thingy<wxPoint2DDouble>() );
1241
return wxPli_av_2_arrayany( aTHX_ avref, array,
1242
convert_wxpoint2ddouble(),
1243
wxPli_array_allocator<wxPoint2DDouble>() );
1351
1246
#if WXPERL_W_VERSION_GE( 2, 9, 0 )