From 0f4ff7b99429af7651d3ff593cdba232915d10f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Calixte?= Date: Thu, 6 Dec 2018 12:24:59 -0500 Subject: [PATCH] More number types --- complex.go | 36 +++++++++++++++++++++++++++++++ complex_test.go | 20 ++++++++++++++++++ float.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ float_test.go | 45 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 157 insertions(+) create mode 100644 complex.go create mode 100644 complex_test.go create mode 100644 float.go create mode 100644 float_test.go diff --git a/complex.go b/complex.go new file mode 100644 index 0000000..37e2b29 --- /dev/null +++ b/complex.go @@ -0,0 +1,36 @@ +package python3 + +/* +#include "Python.h" +#include "macro.h" +#include "type.h" +*/ +import "C" + +//Complex : https://docs.python.org/3/c-api/complex.html#c.PyComplex_Type +var Complex = togo(C._go_PyComplex_Type) + +//PyComplex_Check : https://docs.python.org/3/c-api/complex.html#c.PyComplex_Check +func PyComplex_Check(p *PyObject) bool { + return C._go_PyComplex_Check(toc(p)) != 0 +} + +//PyComplex_CheckExact : https://docs.python.org/3/c-api/complex.html#c.PyComplex_CheckExact +func PyComplex_CheckExact(p *PyObject) bool { + return C._go_PyComplex_CheckExact(toc(p)) != 0 +} + +//PyComplex_FromDoubles : https://docs.python.org/3/c-api/complex.html#c.PyComplex_FromDoubles +func PyComplex_FromDoubles(real, imag float64) *PyObject { + return togo(C.PyComplex_FromDoubles(C.double(real), C.double(imag))) +} + +//PyComplex_RealAsDouble : https://docs.python.org/3/c-api/complex.html#c.PyComplex_RealAsDouble +func PyComplex_RealAsDouble(op *PyObject) float64 { + return float64(C.PyComplex_RealAsDouble(toc(op))) +} + +//PyComplex_ImagAsDouble : https://docs.python.org/3/c-api/complex.html#c.PyComplex_ImagAsDouble +func PyComplex_ImagAsDouble(op *PyObject) float64 { + return float64(C.PyComplex_ImagAsDouble(toc(op))) +} diff --git a/complex_test.go b/complex_test.go new file mode 100644 index 0000000..4dea378 --- /dev/null +++ b/complex_test.go @@ -0,0 +1,20 @@ +package python3 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestComplex(t *testing.T) { + real := 2. + imaginary := 5. + + complex := PyComplex_FromDoubles(real, imaginary) + assert.True(t, PyComplex_Check(complex)) + assert.True(t, PyComplex_CheckExact(complex)) + defer complex.DecRef() + + assert.Equal(t, real, PyComplex_RealAsDouble(complex)) + assert.Equal(t, imaginary, PyComplex_ImagAsDouble(complex)) +} diff --git a/float.go b/float.go new file mode 100644 index 0000000..f41ef29 --- /dev/null +++ b/float.go @@ -0,0 +1,56 @@ +package python3 + +/* +#include "Python.h" +#include "macro.h" +#include "type.h" +*/ +import "C" + +//Float : https://docs.python.org/3/c-api/float.html#c.PyFloat_Type +var Float = togo(C._go_PyFloat_Type) + +//PyFloat_Check : https://docs.python.org/3/c-api/float.html#c.PyFloat_Check +func PyFloat_Check(p *PyObject) bool { + return C._go_PyFloat_Check(toc(p)) != 0 +} + +//PyFloat_CheckExact : https://docs.python.org/3/c-api/float.html#c.PyFloat_CheckExact +func PyFloat_CheckExact(p *PyObject) bool { + return C._go_PyFloat_CheckExact(toc(p)) != 0 +} + +//PyFloat_FromDouble : https://docs.python.org/3/c-api/float.html#c.PyFloat_FromDouble +func PyFloat_FromDouble(v float64) *PyObject { + return togo(C.PyFloat_FromDouble(C.double(v))) +} + +//PyFloat_FromString : https://docs.python.org/3/c-api/float.html#c.PyFloat_FromString +func PyFloat_FromString(str *PyObject) *PyObject { + return togo(C.PyFloat_FromString(toc(str))) +} + +//PyFloat_AsDouble : https://docs.python.org/3/c-api/float.html#c.PyFloat_AsDouble +func PyFloat_AsDouble(obj *PyObject) float64 { + return float64(C.PyFloat_AsDouble(toc(obj))) +} + +//PyFloat_GetInfo : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetInfo +func PyFloat_GetInfo() *PyObject { + return togo(C.PyFloat_GetInfo()) +} + +//PyFloat_GetMax : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetMax +func PyFloat_GetMax() float64 { + return float64(C.PyFloat_GetMax()) +} + +//PyFloat_GetMin : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetMin +func PyFloat_GetMin() float64 { + return float64(C.PyFloat_GetMin()) +} + +//PyFloat_ClearFreeList : https://docs.python.org/3/c-api/float.html#c.PyFloat_ClearFreeList +func PyFloat_ClearFreeList() int { + return int(C.PyFloat_ClearFreeList()) +} diff --git a/float_test.go b/float_test.go new file mode 100644 index 0000000..2b3668a --- /dev/null +++ b/float_test.go @@ -0,0 +1,45 @@ +package python3 + +import ( + "math" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPyFloatCheck(t *testing.T) { + Py_Initialize() + + pyFloat := PyFloat_FromDouble(345.) + assert.True(t, PyFloat_Check(pyFloat)) + assert.True(t, PyFloat_CheckExact(pyFloat)) + pyFloat.DecRef() +} + +func TestPyFloatFromAsDouble(t *testing.T) { + Py_Initialize() + v := 2354. + pyFloat := PyFloat_FromDouble(v) + assert.NotNil(t, pyFloat) + assert.Equal(t, v, PyFloat_AsDouble(pyFloat)) + pyFloat.DecRef() +} + +func TestPyFloatFromAsString(t *testing.T) { + Py_Initialize() + pyString := PyUnicode_FromString("2354") + defer pyString.DecRef() + + pyFloat := PyFloat_FromString(pyString) + assert.NotNil(t, pyFloat) + assert.Equal(t, 2354., PyFloat_AsDouble(pyFloat)) + pyFloat.DecRef() +} + +func TestPyFloatMinMax(t *testing.T) { + Py_Initialize() + + assert.Equal(t, math.MaxFloat64, PyFloat_GetMax()) + + assert.Equal(t, 2.2250738585072014e-308, PyFloat_GetMin()) +}