%module special_variable_attributes // Special variable expansion and special variable macros, aka embedded typemaps - expansion tests // Tests these are expanded within typemap attributes. // Also tests that these are expanded when used together, so that the special variables // can be used as the type passed to the special variable macro. // C# is used for testing as it is one of the few languages that uses a lot of typemap attributes. // Attributes in both 'in' and 'out' typemaps are needed, that is, // typemaps targeting both parameters and return values respectively). #ifdef SWIGCSHARP // Check special variable expansion in typemap attributes. // This changes return by reference into return by value. // Takes advantage of the fact that 'int' is a valid type in both C and C#. // This is not a realistic use, just a way to test the variable expansion in the 'out' attribute. %typemap(ctype, out="$*1_ltype") int& getNumber1 "_not_used_" %typemap(imtype, out="$*1_ltype") int& getNumber1 "_not_used_" %typemap(cstype, out="$*1_ltype") int& getNumber1 "_not_used_" %typemap(out) int& getNumber1 "$result = *$1;" %typemap(csout, excode=SWIGEXCODE) int & getNumber1 { int ret = $imcall;$excode return ret; } #endif %inline %{ int& getNumber1() { static int num = 111; return num; } %} #ifdef SWIGCSHARP // Check special variable macro expansion in typemap attributes. // This changes return by reference into return by value. %typemap(ctype, out="$typemap(ctype, int)") int& getNumber2 "_not_used_" %typemap(imtype, out="$typemap(imtype, int)") int& getNumber2 "_not_used_" %typemap(cstype, out="$typemap(cstype, int)") int& getNumber2 "_not_used_" %typemap(out) int& getNumber2 "$result = *$1;" %typemap(csout, excode=SWIGEXCODE) int & getNumber2 { int ret = $imcall;$excode return ret; } #endif %inline %{ int& getNumber2() { static int num = 222; return num; } %} #ifdef SWIGCSHARP // Check special variable macro expansion and special variable expansion in typemap attributes. // This changes return by reference into return by value. %typemap(ctype, out="$typemap(ctype, $*1_ltype)") int& getNumber3 "_not_used_" %typemap(imtype, out="$typemap(imtype, $*1_ltype)") int& getNumber3 "_not_used_" %typemap(cstype, out="$typemap(cstype, $*1_ltype)") int& getNumber3 "_not_used_" %typemap(out) int& getNumber3 "$result = *$1;" %typemap(csout, excode=SWIGEXCODE) int & getNumber3 { int ret = $imcall;$excode return ret; } #endif %inline %{ int& getNumber3() { static int num = 333; return num; } %} #ifdef SWIGCSHARP // Check special variable macro expansion in typemap attributes. %typemap(csin, pre=" $typemap(cstype, int) $csinput_scaled = 11;" ) int num1 %{$csinput * $csinput_scaled %} #endif %inline %{ int bounceNumber1(int num1) { return num1; } %} #ifdef SWIGCSHARP // Check special variable expansion in typemap attributes. %typemap(csin, pre=" $1_type $csinput_scaled = 22;" ) int num2 %{$csinput * $csinput_scaled %} #endif %inline %{ int bounceNumber2(int num2) { return num2; } %} #ifdef SWIGCSHARP // Check special variable and special variable macro expansion in typemap attributes. %typemap(csin, pre=" $typemap(cstype, $1_type) $csinput_scaled = 33;" ) int num3 %{$csinput * $csinput_scaled %} #endif %inline %{ int bounceNumber3(int num3) { return num3; } %} ///////////////////////////////// //// Multi-argument typemaps //// ///////////////////////////////// // Test expansion of special variables #ifdef SWIGCSHARP %typemap(ctype) (int intvar, char charvar) "double" %typemap(imtype) (int intvar, char charvar) "double" %typemap(cstype) (int intvar, char charvar) "double" %typemap(in) (int intvar, char charvar) %{ // split double value a.b into two numbers, a and b*100 $1 = (int)$input; $2 = (char)(($input - $1 + 0.005) * 100); %} %typemap(csin, pre=" $1_type $csinput_$1_type = 50;\n" // $1_type should expand to int " $2_type $csinput_$2_type = 'A';" // $2_type should expand to char ) (int intvar, char charvar) %{$csinput + ($csinput_int - 50 + $csinput_char - 'A') + ($csinput_$1_type - 50 + $csinput_$2_type - 'A')%} #endif %inline %{ int multi1(int intvar, char charvar) { return intvar + charvar; } %} #ifdef SWIGCSHARP %typemap(csin, pre=" $typemap(cstype, int) $csinput_$typemap(cstype, int) = 50;\n" // also should expand to int " $typemap(cstype, char) $csinput_$typemap(cstype, char) = 'A';" // also should expand to char ) (int intvar, char charvar) %{55 + $csinput + ($csinput_int - 50 + $csinput_char - 'A') + ($csinput_$typemap(cstype, int) - 50 + $csinput_$typemap(cstype, char) - 'A')%} #endif %inline %{ int multi2(int intvar, char charvar) { return intvar + charvar; } %} #ifdef SWIGCSHARP %typemap(csin, pre=" $typemap(cstype, $1_type) $csinput_$typemap(cstype, $1_type) = 50;\n" // also should expand to int " $typemap(cstype, $2_type) $csinput_$typemap(cstype, $2_type) = 'A';" // also should expand to char ) (int intvar, char charvar) %{77 + $csinput + ($csinput_int - 50 + $csinput_char - 'A') + ($csinput_$typemap(cstype, $1_type) - 50 + $csinput_$typemap(cstype, $2_type) - 'A')%} #endif %inline %{ int multi3(int intvar, char charvar) { return intvar + charvar; } %}