trick/trick_source/trick_swig/cast_as.i

39 lines
1.5 KiB
OpenEdge ABL
Raw Normal View History

2015-02-26 15:02:31 +00:00
/*
TYPE is the actual type of the variable (int, double, units::values::m)
NAME is the type with ':' substituted with '_' (int, double, units__values__m)
*/
%define %trick_cast_as(TYPE, NAME)
%inline %{
/* caseAs##NAME casts incoming ptrs as the target type. Takes incoming object and tests if it
is a compatible type, a void *, or an integer (raw pointer value). If it is any of these
types it returns the incoming value as a pointer to the outgoing type. The integer
conversion is used by the input processor to associate named allocations in the
memory manager to names in pyton space.
*/
TYPE * castAs##NAME( PyObject * obj1 ) {
void *argp = NULL ;
TYPE * ret = (TYPE *)NULL ;
//std::cout << "calling __cast_as" << std::endl ;
if ( SWIG_IsOK(SWIG_ConvertPtr(obj1,&argp,SWIG_TypeQuery("TYPE *"),SWIG_POINTER_DISOWN)) ) {
//std::cout << "we can cast to TYPE! " << argp << std::endl ;
ret = reinterpret_cast< TYPE *>(argp) ;
} else if (SWIG_IsOK(SWIG_ConvertPtr(obj1, &argp,SWIG_TypeQuery("void *"), 0 ))) {
//std::cout << "we can cast (wrapped void *) to TYPE! " << argp << std::endl ;
ret = reinterpret_cast< TYPE *>(argp) ;
} else if ( PyInt_Check(obj1) ) {
ret = reinterpret_cast< TYPE *>( PyInt_AsLong(obj1) ) ;
//std::cout << "we are using incoming value as address " << PyInt_AsLong(obj1) << std::endl ;
} else {
std::cout << "Cast to TYPE failed." << std::endl ;
}
return ret ;
}
%}
%enddef