bugfix #1356577, changed double=>lua_number in a few places.

added the std::pair wrapping


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8672 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Mark Gossage 2006-02-02 01:41:06 +00:00
commit df022e7354
6 changed files with 103 additions and 12 deletions

View file

@ -1,6 +1,10 @@
Version 1.3.28 (unreleased).
===========================
02/02/2006: mgossage
bugfix #1356577, changed double=>lua_number in a few places.
added the std::pair wrapping
01/30/2006: wsfulton
std::string and std::wstring member variables and global variables now use
%naturalvar by default, meaning they will now be wrapped as expected in all languages.

View file

@ -0,0 +1,34 @@
require("import") -- the import fn
import("li_std_pair") -- import code
for k,v in pairs(li_std_pair) do _G[k]=v end -- move to global
intPair = makeIntPair(7, 6)
assert(intPair.first==7 and intPair.second==6)
intPairPtr = makeIntPairPtr(7, 6)
assert(intPairPtr.first==7 and intPairPtr.second==6)
intPairRef = makeIntPairRef(7, 6)
assert(intPairRef.first == 7 and intPairRef.second == 6)
intPairConstRef = makeIntPairConstRef(7, 6)
assert(intPairConstRef.first == 7 and intPairConstRef.second == 6)
-- call fns
assert(product1(intPair) == 42)
assert(product2(intPair) == 42)
assert(product3(intPair) == 42)
-- also use the pointer version
assert(product1(intPairPtr) == 42)
assert(product2(intPairPtr) == 42)
assert(product3(intPairPtr) == 42)
-- or the other types
assert(product1(intPairRef) == 42)
assert(product2(intPairRef) == 42)
assert(product3(intPairRef) == 42)
assert(product1(intPairConstRef) == 42)
assert(product2(intPairConstRef) == 42)
assert(product3(intPairConstRef) == 42)

View file

@ -38,7 +38,7 @@
unsigned int,unsigned short,unsigned long,
signed char,unsigned char,
float,double
%{ lua_pushnumber(L, (double) $1); SWIG_arg++;%}
%{ lua_pushnumber(L, (lua_Number) $1); SWIG_arg++;%}
/* enums have to be handled slightly differently
VC++ .net will not allow a cast from double to enum directly
@ -49,7 +49,7 @@
%{$1 = ($type)(int)lua_tonumber(L, $input);%}
%typemap(out) enum SWIGTYPE
%{ lua_pushnumber(L, (double)(int)($1)); SWIG_arg++;%}
%{ lua_pushnumber(L, (lua_Number)(int)($1)); SWIG_arg++;%}
// boolean (which is a special type in lua)
// note: 1 & 0 are not booleans in lua, only true & false
@ -234,7 +234,7 @@ parmeters match which function
%typemap(in,checkfn="lua_isnumber") const TYPE &($basetype temp)
%{ temp=($basetype)lua_tonumber(L,$input); $1=&temp;%}
%typemap(out) const TYPE&
%{ lua_pushnumber(L, (double) *$1); SWIG_arg++;%}
%{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%}
%enddef
SWIG_NUMBER_BY_CONST_REF(int);
@ -260,7 +260,7 @@ SWIG_NUMBER_BY_CONST_REF(enum SWIGTYPE);
%typemap(in,checkfn="lua_isuserdata") SWIGTYPE* const &($*ltype temp)
%{temp=($*ltype)SWIG_MustGetPtr(L,$input,$*descriptor,0,$argnum,"$symname");
$1=&temp;%}
// and the pytcheck code
// and the typecheck code
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE* const &
%{
void *ptr;
@ -374,7 +374,7 @@ use %include <std_except.i> instead
long long,unsigned long long,
char, unsigned char, signed char,
enum SWIGTYPE
%{lua_pushfstring(L,"exception thrown of value %d",(long)$1);
%{lua_pushfstring(L,"exception thrown of value %f",(double)$1);
SWIG_fail; %}
// strings are just sent as errors

44
SWIG/Lib/lua/std_pair.i Normal file
View file

@ -0,0 +1,44 @@
/***********************************************************************
* std_pair.i
*
* std::pair typemaps for LUA
*
* Author : Mark Gossage (mark@gossage.cjb.net)
************************************************************************/
%{
#include <utility>
%}
/*
A really cut down version of the pair class.
this is not useful on its owns is it needs a %template definition with it
eg.
namespace std {
%template(IntPair) pair<int, int>;
%template(make_IntPair) make_pair<int, int>;
}
*/
namespace std {
template <class T, class U > struct pair {
typedef T first_type;
typedef U second_type;
pair();
pair(T first, U second);
pair(const pair& p);
T first;
U second;
};
template <class T, class U >
pair<T,U> make_pair(const T&,const U&);
}

View file

@ -44,6 +44,11 @@ assert(s==s2)
%{lua_pushstring(L,$1.c_str());
SWIG_fail; %}
// and the typechecks
%typecheck(SWIG_TYPECHECK_STRING) std::string,const std::string& {
$1 = lua_isstring(L,$input);
}
/*
std::string& can be wrappered, but you must inform SWIG if it is in or out
@ -100,6 +105,8 @@ This provides basic mapping of lua strings <-> std::string
and little else
(the std::string has a lot of unneeded functions anyway)
note: no fn's taking the const string&
as this is overloaded by the const char* version
*/
namespace std {
@ -107,7 +114,7 @@ namespace std {
public:
string();
string(const char*);
string(const string&);
//string(const string&);
unsigned int size() const;
unsigned int length() const;
bool empty() const;
@ -117,7 +124,7 @@ namespace std {
// assign does not return a copy of this object
// (no point in a scripting language)
void assign(const char*);
void assign(const string&);
//void assign(const string&);
// no support for all the other features
// its probably better to do it in lua
};

View file

@ -48,15 +48,17 @@ or provide a %apply statement
%define SWIG_NUMBER_TYPEMAP(TYPE)
%typemap(in,checkfn="lua_isnumber") TYPE *INPUT($*type temp), TYPE &INPUT($*type temp)
%{ temp = ($*type)lua_tonumber(L,$input);
%typemap(in,checkfn="lua_isnumber") TYPE *INPUT($*ltype temp), TYPE &INPUT($*ltype temp)
%{ temp = ($*ltype)lua_tonumber(L,$input);
$1 = &temp; %}
%typemap(in, numinputs=0) TYPE *OUTPUT ($*type temp)
%typemap(in, numinputs=0) TYPE *OUTPUT ($*ltype temp)
%{ $1 = &temp; %}
%typemap(argout) TYPE *OUTPUT
%{ lua_pushnumber(L, (double) *$1); SWIG_arg++;%}
%{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%}
%typemap(in) TYPE *INOUT = TYPE *INPUT;
%typemap(argout) TYPE *INOUT = TYPE *OUTPUT;
%typemap(in) TYPE &INOUT = TYPE *INPUT;
%typemap(argout) TYPE &INOUT = TYPE *OUTPUT;
// const version (the $*ltype is the basic number without ptr or const's)
%typemap(in,checkfn="lua_isnumber") const TYPE *INPUT($*ltype temp)
%{ temp = ($*ltype)lua_tonumber(L,$input);
@ -253,7 +255,7 @@ int SWIG_table_size(lua_State* L, int index)
int i;\
lua_newtable(L);\
for (i = 0; i < size; i++){\
lua_pushnumber(L,(double)array[i]);\
lua_pushnumber(L,(lua_Number)array[i]);\
lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ \
}\
}