summaryrefslogtreecommitdiff
path: root/Examples/test-suite/primitive_types.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/primitive_types.i')
-rw-r--r--Examples/test-suite/primitive_types.i617
1 files changed, 617 insertions, 0 deletions
diff --git a/Examples/test-suite/primitive_types.i b/Examples/test-suite/primitive_types.i
new file mode 100644
index 0000000..e00108b
--- /dev/null
+++ b/Examples/test-suite/primitive_types.i
@@ -0,0 +1,617 @@
+// Massive primitive datatype test.
+%module(directors="1") primitive_types
+
+%{
+#if defined(_MSC_VER)
+ #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
+#endif
+%}
+
+// Ruby constant names
+#pragma SWIG nowarn=SWIGWARN_RUBY_WRONG_NAME
+
+// Using thread unsafe wrapping
+#pragma SWIG nowarn=SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR
+ /*
+
+ if your language has problems with MyInt* and/or Hello*,
+ you need to change the constant reference typemaps from something
+ like:
+
+ %typemap(in) const char & (char temp),
+ const signed char & (signed char temp),
+ const unsigned char & (unsigned char temp),
+ const short & (short temp),
+ const unsigned short & (unsigned short temp),
+ const int & (int temp),
+ const unsigned int & (unsigned int temp),
+ const long & (long temp),
+ const unsigned long & (unsigned long temp),
+ const long long & ($*1_ltype temp),
+ const float & (float temp),
+ const double & (double temp)
+ %{ temp = ($*1_ltype)$input; $1 = &temp; %}
+
+ to the following:
+
+ %typemap(in) const char & ($basetype temp),
+ const signed char & ($basetype temp),
+ const unsigned char & ($basetype temp),
+ const short & ($basetype temp),
+ const unsigned short & ($basetype temp),
+ const int & ($basetype temp),
+ const unsigned int & ($basetype temp),
+ const long & ($basetype temp),
+ const unsigned long & ($basetype temp),
+ const long long & ($basetype temp),
+ const float & ($basetype temp),
+ const double & ($basetype temp)
+ %{ temp = ($basetype)$input; $1 = &temp; %}
+
+ the other tipical change is to add the enum SWIGTYPE to the
+ integer throws typemaps:
+
+ %typemap(throws) int,
+ long,
+ short,
+ unsigned int,
+ unsigned long,
+ unsigned short,
+ enum SWIGTYPE {
+ Tcl_SetObjResult(interp, Tcl_NewIntObj((long) $1));
+ SWIG_fail;
+ }
+
+ or just add the %apply directive after all the typemaps declaration
+
+ %apply int { enum SWIGTYPE };
+
+
+ Also note that this test should not only compile, if you run the
+ program
+
+ grep 'resultobj = SWIG_NewPointerObj' primitive_types_wrap.cxx
+
+ you should get only two calls:
+
+ resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_Test, 1);
+ resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_TestDirector, 1);
+
+ if you get a lot more, some typemap could be not defined.
+
+ The same with
+
+ grep SWIG_ConvertPtr primitive_types_wrap.cxx| egrep -v 'Test'
+
+ you should only get
+
+ #define SWIG_ConvertPtr(obj, pp, type, flags)
+
+ */
+
+//
+// Try your language module with and without
+// these nowarn flags.
+//
+%warnfilter(SWIGWARN_TYPEMAP_CHARLEAK);
+
+%{
+#include <stddef.h>
+#include <iostream>
+#include <sstream>
+%}
+
+%feature("director") TestDirector;
+
+%{
+ // Integer class, only visible in C++
+ struct MyInt
+ {
+ char name[5];
+ int val;
+
+ MyInt(int v = 0): val(v) {
+ }
+
+ operator int() const { return val; }
+ };
+
+ // Template primitive type, only visible in C++
+ template <class T>
+ struct Param
+ {
+ char name[5];
+ T val;
+
+ Param(T v = 0): val(v) {
+ name[0] = 0;
+ name[1] = 0;
+ name[2] = 0;
+ name[3] = 0;
+ name[4] = 0;
+ }
+
+ operator T() const { return val; }
+ };
+
+ typedef char namet[5];
+ extern namet gbl_namet;
+ namet gbl_namet;
+
+%}
+
+
+//
+// adding applies for incomplete swig type MyInt
+//
+%apply int { MyInt };
+%apply const int& { const MyInt& };
+%apply int { Param<int> };
+%apply char { Param<char> };
+%apply float { Param<float> };
+%apply double { Param<double> };
+%apply const int& { const Param<int>& };
+%apply const char& { const Param<char>& };
+%apply const float& { const Param<float>& };
+%apply const double& { const Param<double>& };
+
+
+
+//
+// These applies shouldn't be needed ....!!
+//
+//%apply const int& { const Hello& };
+
+%apply void* { pint };
+%apply void* const& { const pint& };
+
+
+//
+// Some simple types
+%apply char FIXSIZE[ANY] {char fixsize[8]};
+
+
+
+%inline %{
+ enum Hello {
+ Hi, Hola
+ };
+
+ typedef char namet[5];
+ typedef char* pchar;
+ typedef const char* pcharc;
+ typedef char* pint;
+
+ char* const def_pchar = (char *const)"hello";
+ const char* const def_pcharc = "hija";
+
+ const namet def_namet = {'h','o',0, 'l','a'};
+
+ extern namet gbl_namet;
+
+ char fixsize[8] = {'h','o',0, 'l','a', 0, 0, 0};
+%}
+
+
+/* all the primitive types */
+#define def_bool 1
+#define def_schar 1
+#define def_uchar 1
+#define def_int 1
+#define def_uint 1
+#define def_short 1
+#define def_ushort 1
+#define def_long 1
+#define def_ulong 1
+#define def_llong 1
+#define def_ullong 1
+#define def_float 1
+#define def_double 1
+#define def_char 'H'
+#define def_pint 0
+#define def_sizet 1
+#define def_hello Hola
+#define def_myint 1
+#define def_parami 1
+#define def_paramd 1
+#define def_paramc 'c'
+
+/* types that can be declared as static const class members */
+%define %test_prim_types_stc(macro, pfx)
+macro(bool, pfx, bool)
+macro(signed char, pfx, schar)
+macro(unsigned char, pfx, uchar)
+macro(int, pfx, int)
+macro(unsigned int, pfx, uint)
+macro(short, pfx, short)
+macro(unsigned short, pfx, ushort)
+macro(long, pfx, long)
+macro(unsigned long, pfx, ulong)
+macro(long long, pfx, llong)
+macro(unsigned long long, pfx, ullong)
+macro(char, pfx, char)
+%enddef
+
+
+/* types that can be used to test overloading */
+%define %test_prim_types_ovr(macro, pfx)
+%test_prim_types_stc(macro, pfx)
+macro(pchar, pfx, pchar)
+%enddef
+
+/* all the types */
+%define %test_prim_types(macro, pfx)
+%test_prim_types_ovr(macro, pfx)
+macro(pcharc, pfx, pcharc)
+macro(pint, pfx, pint)
+/* these ones should behave like primitive types too */
+macro(Hello, pfx, hello)
+macro(MyInt, pfx, myint)
+macro(Param<int>, pfx, parami)
+macro(Param<double>, pfx, paramd)
+macro(Param<char>, pfx, paramc)
+macro(size_t, pfx, sizet)
+%enddef
+
+
+/* function passing by value */
+%define val_decl(type, pfx, name)
+ type pfx##_##name(type x) throw (type) { return x; }
+%enddef
+/* function passing by ref */
+%define ref_decl(type, pfx, name)
+ const type& pfx##_##name(const type& x) throw (type) { return x; }
+%enddef
+
+/* C++ constant declaration */
+%define cct_decl(type, pfx, name)
+ const type pfx##_##name = def##_##name;
+%enddef
+
+/* C++ static constant declaration */
+%define stc_decl(type, pfx, name)
+ static const type pfx##_##name = def##_##name;
+%enddef
+
+/* Swig constant declaration */
+%define sct_decl(type, pfx, name)
+ %constant type pfx##_##name = def##_##name;
+%enddef
+
+/* variable delaration */
+%define var_decl(type, pfx, name)
+ type pfx##_##name;
+%enddef
+
+/* virtual function passing by value */
+%define vval_decl(type, pfx, name)
+ virtual val_decl(type, pfx, name)
+%enddef
+/* virtual function passing by ref */
+%define vref_decl(type, pfx, name)
+ virtual ref_decl(type, pfx, name)
+%enddef
+
+
+%test_prim_types(sct_decl, sct)
+
+%inline {
+ %test_prim_types(val_decl, val)
+ %test_prim_types(ref_decl, ref)
+ %test_prim_types(cct_decl, cct)
+ %test_prim_types(var_decl, var)
+
+ var_decl(namet, var, namet)
+
+ void var_init()
+ {
+ var_pchar = 0;
+ var_pcharc = 0;
+ var_pint = 0;
+ var_namet[0] = 'h';
+ }
+
+}
+
+/* check variables */
+%define var_check(type, pfx, name)
+ if (pfx##_##name != def_##name) {
+ std::ostringstream a; std::ostringstream b;
+ a << pfx##_##name;
+ b << def_##name;
+ if (a.str() != b.str()) {
+ std::cout << "failing in pfx""_""name : "
+ << a.str() << " : " << b.str() << std::endl;
+ // return 0;
+ }
+ }
+%enddef
+
+/* check a function call */
+%define call_check(type, pfx, name)
+ type pfx##_##tmp##name = def_##name;
+ if (pfx##_##name(pfx##_##tmp##name) != def_##name) {
+ std::ostringstream a; std::ostringstream b;
+ a << pfx##_##name(pfx##_##tmp##name);
+ b << def_##name;
+ if (a.str() != b.str()) {
+ std::cout << "failing in pfx""_""name : "
+ << a.str() << " : " << b.str() << std::endl;
+ // return 0;
+ }
+ }
+%enddef
+
+%define wrp_decl(type, pfx, name)
+ type wrp##_##pfx##_##name(type x) {
+ return pfx##_##name(x);
+ }
+%enddef
+
+/* function passing by value */
+%define ovr_decl(type, pfx, name)
+ virtual int pfx##_##val(type x) { return 1; }
+ virtual int pfx##_##ref(const type& x) { return 1; }
+%enddef
+
+
+%apply (char *STRING, int LENGTH) { (const char *str, size_t len) }
+
+%inline {
+ struct Foo
+ {
+ int _a;
+
+ Foo (int a) : _a(a)
+ {
+ }
+
+ Foo(const Foo&)
+ {
+ }
+
+ Foo copy(Foo x)
+ {
+ return x;
+ }
+
+ const Foo copy_c(const Foo x)
+ {
+ return x;
+ }
+
+ const Foo& copy_r(const Foo& x)
+ {
+ return x;
+ }
+
+ Foo* this_p()
+ {
+ return this;
+ }
+
+ Foo& this_r()
+ {
+ return *this;
+ }
+
+ };
+
+ typedef Foo* foo_ptr;
+
+ foo_ptr fptr_val(foo_ptr a) {
+ return a;
+ }
+
+ const foo_ptr& fptr_ref(const foo_ptr& a) {
+ return a;
+ }
+
+
+ struct Test
+ {
+ Test()
+ : var_pchar(0), var_pcharc(0), var_pint(0)
+ {
+ }
+
+ virtual ~Test()
+ {
+ }
+
+ %test_prim_types_stc(stc_decl, stc)
+ %test_prim_types(var_decl, var)
+ var_decl(namet, var, namet)
+
+
+ const char* val_namet(namet x) throw(namet)
+ {
+ return x;
+ }
+
+ const char* val_cnamet(const namet x) throw(namet)
+ {
+ return x;
+ }
+
+#if 0
+ /* I have no idea how to define a typemap for
+ const namet&, where namet is a char[ANY] array */
+ const namet& ref_namet(const namet& x) throw(namet)
+ {
+ return x;
+ }
+#endif
+
+
+ %test_prim_types(val_decl, val)
+ %test_prim_types(ref_decl, ref)
+
+ int c_check()
+ {
+ %test_prim_types(call_check, val)
+ %test_prim_types(call_check, ref)
+ return 1;
+ }
+
+ int v_check()
+ {
+ %test_prim_types_stc(var_check, stc)
+ %test_prim_types(var_check, var)
+ var_check(namet, var, namet);
+ return 1;
+ }
+
+ %test_prim_types_ovr(ovr_decl, ovr)
+
+ size_t strlen(const char *str, size_t len)
+ {
+ return len;
+ }
+
+ static const double stc_double;
+ static const double stc_float;
+
+
+ };
+
+ struct TestDirector
+ {
+ TestDirector()
+ : var_pchar(0), var_pcharc(0), var_pint(0)
+ {
+ }
+
+
+ virtual ~TestDirector()
+ {
+ var_namet[0]='h';
+ }
+
+ virtual const char* vval_namet(namet x) throw(namet)
+ {
+ return x;
+ }
+
+ virtual const char* vval_cnamet(const namet x) throw(namet)
+ {
+ return x;
+ }
+
+#if 0
+ /* I have no idea how to define a typemap for
+ const namet&, where namet is a char[ANY] array */
+ virtual const namet& vref_namet(const namet& x) throw(namet)
+ {
+ return x;
+ }
+#endif
+
+
+ %test_prim_types_stc(stc_decl, stc)
+ %test_prim_types(var_decl, var)
+ var_decl(namet, var, namet)
+
+ %test_prim_types(val_decl, val)
+ %test_prim_types(ref_decl, ref)
+
+ %test_prim_types(vval_decl, vval)
+ %test_prim_types(vref_decl, vref)
+
+ %test_prim_types(wrp_decl, vref)
+ %test_prim_types(wrp_decl, vval)
+
+ int c_check()
+ {
+ %test_prim_types(call_check, vval)
+ %test_prim_types(call_check, vref)
+ return 1;
+ }
+
+ int v_check()
+ {
+ %test_prim_types_stc(var_check, stc)
+ %test_prim_types(var_check, var)
+ return 1;
+ }
+
+ %test_prim_types_ovr(ovr_decl, ovr)
+
+
+ virtual Test* vtest(Test* t) const throw (Test)
+ {
+ return t;
+ }
+
+ };
+
+ int v_check()
+ {
+ %test_prim_types(var_check, cct)
+ %test_prim_types(var_check, var)
+ var_check(namet, var, namet);
+ return 1;
+ }
+
+}
+
+%inline %{
+
+ const char* char_foo(float f, const char *s) {
+ return s;
+ }
+
+ int char_foo(double d, int i) {
+ return i;
+ }
+
+%}
+
+%{
+ const double Test::stc_double = 1;
+ const double Test::stc_float = 1;
+%}
+
+
+%inline
+%{
+ namespace DCTypes
+ {
+ typedef const unsigned int cuint;
+ }
+
+ namespace DCSystem
+ {
+ using namespace DCTypes;
+ unsigned int SetPos(cuint& x, cuint& y) {return x + y;}
+ }
+
+ double val_double_2(double x, const double& y = 3.0) {
+ return x + y;
+ }
+
+ double val_double(double x) {
+ return x;
+ }
+
+ float val_float_2(float x, const float& y = 3.0) {
+ return x + y;
+ }
+
+ // Regression test for bug1699646 - we weren't handling
+ // + or - after e for float constants.
+ float regression_test_for_bug1699646(float f = 1e-02f) {
+ return f;
+ }
+
+ float val_float(float x) {
+ return x;
+ }
+%}
+
+
+%apply SWIGTYPE* { char *};
+
+%include "carrays.i"
+%array_functions(char,pchar);
+