add castmode in python and cleaning the castdispatch mechanism
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8051 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
485ccd5809
commit
6bf5187168
16 changed files with 461 additions and 101 deletions
|
|
@ -15,7 +15,7 @@ SWIG_From_dec(long)(long value)
|
|||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(long),"header",
|
||||
fragment=SWIG_AsVal_frag(double)) {
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(long)(SV *obj, long* val)
|
||||
{
|
||||
|
|
@ -34,25 +34,16 @@ SWIG_AsVal_dec(long)(SV *obj, long* val)
|
|||
} else {
|
||||
if (*endptr == '\0') {
|
||||
if (val) *val = v;
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_AsVal(double)(obj,&d);
|
||||
if (SWIG_IsOK(res)) {
|
||||
if (LONG_MIN <= d && d <= LONG_MAX) {
|
||||
double rd = rint(d);
|
||||
if (errno) {
|
||||
errno = 0;
|
||||
} else {
|
||||
if (rd == d) {
|
||||
if (val) *val = (long)(rd);
|
||||
return SWIG_AddCast(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
|
||||
if (val) *val = (long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -74,7 +65,7 @@ SWIG_From_dec(unsigned long)(unsigned long value)
|
|||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(unsigned long),"header",
|
||||
fragment=SWIG_AsVal_frag(double)) {
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val)
|
||||
{
|
||||
|
|
@ -101,29 +92,19 @@ SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val)
|
|||
} else {
|
||||
if (*endptr == '\0') {
|
||||
if (val) *val = v;
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_AsVal(double)(obj,&d);
|
||||
if (SWIG_IsOK(res) && (d >= 0)) {
|
||||
if (d <= ULONG_MAX) {
|
||||
double rd = rint(d);
|
||||
if (errno) {
|
||||
errno = 0;
|
||||
} else {
|
||||
if (rd == d) {
|
||||
if (val) *val = (long)(rd);
|
||||
return SWIG_AddCast(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
|
||||
if (val) *val = (unsigned long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -149,8 +130,8 @@ SWIG_From_dec(long long)(long long value)
|
|||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(long long),"header",
|
||||
fragment=SWIG_AsVal_frag(double),
|
||||
fragment="<limits.h>") {
|
||||
fragment="<limits.h>",
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(long long)(SV *obj, long long *val)
|
||||
|
|
@ -170,25 +151,16 @@ SWIG_AsVal_dec(long long)(SV *obj, long long *val)
|
|||
} else {
|
||||
if (*endptr == '\0') {
|
||||
if (val) *val = v;
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_AsVal(double)(obj,&d);
|
||||
if (SWIG_IsOK(res)) {
|
||||
if (LLONG_MIN <= d && d <= LLONG_MAX) {
|
||||
double rd = rint(d);
|
||||
if (errno) {
|
||||
errno = 0;
|
||||
} else {
|
||||
if (rd == d) {
|
||||
if (val) *val = (long long)(rd);
|
||||
return SWIG_AddCast(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LLONG_MIN, LLONG_MAX)) {
|
||||
if (val) *val = (long long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -217,8 +189,8 @@ SWIG_From_dec(unsigned long long)(unsigned long long value)
|
|||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(unsigned long long),"header",
|
||||
fragment=SWIG_AsVal_frag(double),
|
||||
fragment="<limits.h>") {
|
||||
fragment="<limits.h>",
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val)
|
||||
{
|
||||
|
|
@ -237,25 +209,16 @@ SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val)
|
|||
} else {
|
||||
if (*endptr == '\0') {
|
||||
if (val) *val = v;
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_AsVal(double)(obj,&d);
|
||||
if (SWIG_IsOK(res) && (d >=0 )) {
|
||||
if (d <= ULLONG_MAX) {
|
||||
double rd = rint(d);
|
||||
if (errno) {
|
||||
errno = 0;
|
||||
} else {
|
||||
if (rd == d) {
|
||||
if (val) *val = (unsigned long long)(rd);
|
||||
return SWIG_AddCast(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULLONG_MAX)) {
|
||||
if (val) *val = (unsigned long long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -283,8 +246,8 @@ SWIG_AsVal_dec(double)(SV *obj, double *val)
|
|||
if (val) *val = SvNV(obj);
|
||||
return SWIG_OK;
|
||||
} else if (SvIOK(obj)) {
|
||||
if (val) *val = SvIV(obj);
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
if (val) *val = (double) SvIV(obj);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
const char *nptr = SvPV(obj, PL_na);
|
||||
if (nptr) {
|
||||
|
|
@ -296,7 +259,7 @@ SWIG_AsVal_dec(double)(SV *obj, double *val)
|
|||
} else {
|
||||
if (*endptr == '\0') {
|
||||
if (val) *val = v;
|
||||
return SWIG_AddCast(SWIG_OK);
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,11 +32,12 @@ SWIG_AsVal(Type) (PyObject *o, Type* val)
|
|||
return SWIG_OK;
|
||||
} else {
|
||||
double d;
|
||||
if (SWIG_AsVal(double)(o, &d) == SWIG_OK) {
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(o, &d));
|
||||
if (SWIG_IsOK(res)) {
|
||||
if (val) *val = Constructor(d, 0.0);
|
||||
return SWIG_OK;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -61,10 +62,11 @@ SWIG_AsVal(Type)(PyObject *o, Type *val)
|
|||
return SWIG_OverflowError;
|
||||
}
|
||||
} else {
|
||||
float re;
|
||||
if (SWIG_AsVal(float)(o, &re) == SWIG_OK) {
|
||||
float re;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(float)(o, &re));
|
||||
if (SWIG_IsOK(res)) {
|
||||
if (val) *val = Constructor(re, 0.0);
|
||||
return SWIG_OK;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
return SWIG_TypeError;
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ SWIG_AsVal_dec(bool)(PyObject *obj, bool *val)
|
|||
return SWIG_OK;
|
||||
} else {
|
||||
long v = 0;
|
||||
int res = SWIG_AsVal(long)(obj, val ? &v : 0);
|
||||
if (res == SWIG_OK && val) *val = v ? true : false;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(long)(obj, val ? &v : 0));
|
||||
if (SWIG_IsOK(res) && val) *val = v ? true : false;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
|
@ -41,7 +41,8 @@ SWIG_AsVal_dec(bool)(PyObject *obj, bool *val)
|
|||
%define_as(SWIG_From_dec(long), PyInt_FromLong)
|
||||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(long),"header") {
|
||||
%fragment(SWIG_AsVal_frag(long),"header",
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(long)(PyObject *obj, long* val)
|
||||
{
|
||||
|
|
@ -57,6 +58,26 @@ SWIG_AsVal_dec(long)(PyObject *obj, long* val)
|
|||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
%#ifdef SWIG_PYTHON_CAST_MODE
|
||||
{
|
||||
int dispatch = 0;
|
||||
long v = PyInt_AsLong(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (val) *val = v;
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
|
||||
if (val) *val = (long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
%#endif
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -73,7 +94,8 @@ SWIG_From_dec(unsigned long)(unsigned long value)
|
|||
}
|
||||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(unsigned long),"header") {
|
||||
%fragment(SWIG_AsVal_frag(unsigned long),"header",
|
||||
fragment="SWIG_CanCastAsInteger") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val)
|
||||
{
|
||||
|
|
@ -94,6 +116,30 @@ SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val)
|
|||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
%#ifdef SWIG_PYTHON_CAST_MODE
|
||||
{
|
||||
int dispatch = 0;
|
||||
long v = PyInt_AsLong(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (v >= 0) {
|
||||
if (val) *val = v;
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
return SWIG_OverflowError;
|
||||
}
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
|
||||
if (val) *val = (unsigned long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
%#endif
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -111,7 +157,9 @@ SWIG_From_dec(long long)(long long value)
|
|||
}
|
||||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(long long),"header") {
|
||||
%fragment(SWIG_AsVal_frag(long long),"header",
|
||||
fragment="SWIG_CanCastAsInteger",
|
||||
fragment="<limits.h>") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(long long)(PyObject *obj, long long *val)
|
||||
{
|
||||
|
|
@ -127,6 +175,26 @@ SWIG_AsVal_dec(long long)(PyObject *obj, long long *val)
|
|||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
%#ifdef SWIG_PYTHON_CAST_MODE
|
||||
{
|
||||
int dispatch = 0;
|
||||
long v = PyInt_AsLong(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (val) *val = v;
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LLONG_MIN, LLONG_MAX)) {
|
||||
if (val) *val = (long long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
%#endif
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -145,7 +213,9 @@ SWIG_From_dec(unsigned long long)(unsigned long long value)
|
|||
}
|
||||
|
||||
%fragment(SWIG_AsVal_frag(unsigned long long),"header",
|
||||
fragment=SWIG_AsVal_frag(unsigned long)) {
|
||||
fragment=SWIG_AsVal_frag(unsigned long),
|
||||
fragment="SWIG_CanCastAsInteger",
|
||||
fragment="<limits.h>") {
|
||||
SWIGINTERN int
|
||||
SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val)
|
||||
{
|
||||
|
|
@ -160,9 +230,33 @@ SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val)
|
|||
} else {
|
||||
unsigned long v;
|
||||
int res = SWIG_AsVal(unsigned long)(obj,&v);
|
||||
if (res == SWIG_OK && val) *val = v;
|
||||
if (SWIG_IsOK(res) && val) *val = v;
|
||||
return res;
|
||||
}
|
||||
%#ifdef SWIG_PYTHON_CAST_MODE
|
||||
{
|
||||
int dispatch = 0;
|
||||
long v = PyInt_AsLong(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (v >= 0) {
|
||||
if (val) *val = v;
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
return SWIG_OverflowError;
|
||||
}
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!dispatch) {
|
||||
double d;
|
||||
int res = SWIG_CastRank(SWIG_AsVal(double)(obj,&d));
|
||||
if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULLONG_MAX)) {
|
||||
if (val) *val = (unsigned long)(d);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
%#endif
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
@ -192,6 +286,27 @@ SWIG_AsVal_dec(double)(PyObject *obj, double *val)
|
|||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
%#ifdef SWIG_PYTHON_CAST_MODE
|
||||
{
|
||||
int dispatch = 0;
|
||||
double d = PyFloat_AsDouble(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (val) *val = d;
|
||||
return SWIG_CastRank(SWIG_OK);
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!dispatch) {
|
||||
long v = PyInt_AsLong(obj);
|
||||
if (!PyErr_Occurred()) {
|
||||
if (val) *val = v;
|
||||
return SWIG_CastRank(SWIG_CastRank(SWIG_OK));
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
%#endif
|
||||
return SWIG_TypeError;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ namespace swig {
|
|||
struct traits_as<Type, value_category> {
|
||||
static Type as(PyObject *obj, bool throw_error) {
|
||||
Type v;
|
||||
if (!obj || (asval(obj, &v) != SWIG_OK)) {
|
||||
if (!obj || !SWIG_IsOK(asval(obj, &v))) {
|
||||
if (!PyErr_Occurred()) {
|
||||
%type_error(swig::type_name<Type>());
|
||||
}
|
||||
|
|
@ -160,7 +160,7 @@ namespace swig {
|
|||
template <class Type>
|
||||
struct traits_check<Type, value_category> {
|
||||
static bool check(PyObject *obj) {
|
||||
return obj && (asval(obj, (Type *)(0)) == SWIG_OK);
|
||||
return obj && SWIG_IsOK(asval(obj, (Type *)(0)));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -12,3 +12,4 @@
|
|||
#define SWIG_AttributeError -11
|
||||
#define SWIG_MemoryError -12
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -58,10 +58,17 @@
|
|||
#define SWIG_ERROR -1
|
||||
|
||||
/* Flags to manage cast and return states */
|
||||
#define SWIG_MAX_CAST_RANK 4
|
||||
#ifndef SWIG_TypeRank
|
||||
# define SWIG_TypeRank unsigned long
|
||||
#endif
|
||||
#ifndef SWIG_MAX_CAST_RANK
|
||||
# define SWIG_MAX_CAST_RANK 2 /* Two cast allowed */
|
||||
#endif
|
||||
#define SWIG_IsOK(r) (r >= 0)
|
||||
#define SWIG_AddCast(r) (SWIG_IsOK(r) ? (r + 1) : r)
|
||||
#define SWIG_GetCastRank(r) (SWIG_IsOK(r) ? ((r < SWIG_MAX_CAST_RANK) ? (r + 1) : 0) : 0)
|
||||
SWIGINTERNINLINE int
|
||||
SWIG_CastRank(int r) {
|
||||
return (SWIG_IsOK(r)) ? ((r < SWIG_MAX_CAST_RANK) ? (r + 1) : SWIG_ERROR) : r;
|
||||
}
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -103,9 +103,9 @@ or you can use the %apply directive :
|
|||
}
|
||||
%typemap(typecheck,noblock=1,precedence=code,fragment=asval_frag) Type *INPUT, Type &INPUT {
|
||||
void *ptr;
|
||||
int res = asval_meth($input, 0);
|
||||
int res = SWIG_CastRank(asval_meth($input, 0));
|
||||
if (SWIG_IsOK(res)) {
|
||||
$1 = SWIG_GetCastRank(res);
|
||||
$1 = res;
|
||||
} else {
|
||||
$1 = %check_input_ptr($input,&ptr,$1_descriptor,0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,6 +197,40 @@ SWIG_AsVal_dec(ptrdiff_t)(SWIG_Object obj, ptrdiff_t *val)
|
|||
}
|
||||
}
|
||||
|
||||
%fragment("SWIG_CanCastAsInteger","header",
|
||||
fragment=SWIG_AsVal_frag(double),
|
||||
fragment="<float.h>",
|
||||
fragment="<math.h>") {
|
||||
SWIGINTERNINLINE int
|
||||
SWIG_CanCastAsInteger(double *d, double min, double max) {
|
||||
double x = *d;
|
||||
if (min <= x && x <= max) {
|
||||
%#ifndef SWIG_HAS_NO_RINT
|
||||
/* Use the python mechanism to round, or so */
|
||||
double rd = (x < 0) ? ceil(x) : floor(x);
|
||||
%#else
|
||||
double rd = rint(x);
|
||||
%#endif
|
||||
if ((errno == EDOM) || (errno == ERANGE)) {
|
||||
errno = 0;
|
||||
} else {
|
||||
if (rd == x) {
|
||||
return 1;
|
||||
} else {
|
||||
double diff = rd - x;
|
||||
double summ = rd + x;
|
||||
double reps = diff/summ;
|
||||
if (fabs(reps) < 8*DBL_EPSILON) {
|
||||
*d = rd;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------
|
||||
* Generate the typemaps for primitive type
|
||||
* ------------------------------------------------------------ */
|
||||
|
|
|
|||
|
|
@ -161,8 +161,8 @@
|
|||
|
||||
%define %value_typecheck_typemap(check,asval_meth,frag,Type...)
|
||||
%typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type, const Type& {
|
||||
int res = asval_meth($input, NULL);
|
||||
$1 = SWIG_GetCastRank(res);
|
||||
int res = SWIG_CastRank(asval_meth($input, NULL));
|
||||
$1 = SWIG_IsOK(res) ? res : 0;
|
||||
}
|
||||
%enddef
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue