mirror of
https://github.com/nasa/trick.git
synced 2024-12-21 06:03:10 +00:00
39 lines
1.5 KiB
OpenEdge ABL
39 lines
1.5 KiB
OpenEdge ABL
|
|
||
|
/*
|
||
|
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
|
||
|
|