gcd
=
_mod.gcd
gcd.argtypes
=
(ctypes.c_int, ctypes.c_int)
gcd.restype
=
ctypes.c_int
_divide
=
_mod.divide
_divide.argtypes
=
(ctypes.c_int, ctypes.c_int,
ctypes.POINTER(ctypes.c_int))
_divide.restype
=
ctypes.c_int
def
divide(x, y):
rem
=
ctypes.c_int()
quot
=
_divide(x, y, rem)
return
quot, rem.value
class
DoubleArrayType:
def
from_param(
self
, param):
typename
=
type
(param).__name__
if
hasattr
(
self
,
'from_'
+
typename):
return
getattr
(
self
,
'from_'
+
typename)(param)
elif
isinstance
(param, ctypes.Array):
return
param
else
:
raise
TypeError(
"Can't convert % s"
%
typename)
def
from_array(
self
, param):
if
param.typecode !
=
'd'
:
raise
TypeError(
'must be an array of doubles'
)
ptr, _
=
param.buffer_info()
return
ctypes.cast(ptr, ctypes.POINTER(ctypes.c_double))
def
from_list(
self
, param):
val
=
((ctypes.c_double)
*
len
(param))(
*
param)
return
val
from_tuple
=
from_list
def
from_ndarray(
self
, param):
return
param.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
DoubleArray
=
DoubleArrayType()
_avg
=
_mod.avg
_avg.argtypes
=
(DoubleArray, ctypes.c_int)
_avg.restype
=
ctypes.c_double
def
avg(values):
return
_avg(values,
len
(values))
class
Point(ctypes.Structure):
_fields_
=
[(
'x'
, ctypes.c_double), (
'y'
, ctypes.c_double)]
distance
=
_mod.distance
distance.argtypes
=
(ctypes.POINTER(Point), ctypes.POINTER(Point))
distance.restype
=
ctypes.c_double