Skip to content
This repository was archived by the owner on Aug 10, 2022. It is now read-only.

Commit 0f4ff7b

Browse files
committed
More number types
1 parent d7e8062 commit 0f4ff7b

File tree

4 files changed

+157
-0
lines changed

4 files changed

+157
-0
lines changed

complex.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package python3
2+
3+
/*
4+
#include "Python.h"
5+
#include "macro.h"
6+
#include "type.h"
7+
*/
8+
import "C"
9+
10+
//Complex : https://docs.python.org/3/c-api/complex.html#c.PyComplex_Type
11+
var Complex = togo(C._go_PyComplex_Type)
12+
13+
//PyComplex_Check : https://docs.python.org/3/c-api/complex.html#c.PyComplex_Check
14+
func PyComplex_Check(p *PyObject) bool {
15+
return C._go_PyComplex_Check(toc(p)) != 0
16+
}
17+
18+
//PyComplex_CheckExact : https://docs.python.org/3/c-api/complex.html#c.PyComplex_CheckExact
19+
func PyComplex_CheckExact(p *PyObject) bool {
20+
return C._go_PyComplex_CheckExact(toc(p)) != 0
21+
}
22+
23+
//PyComplex_FromDoubles : https://docs.python.org/3/c-api/complex.html#c.PyComplex_FromDoubles
24+
func PyComplex_FromDoubles(real, imag float64) *PyObject {
25+
return togo(C.PyComplex_FromDoubles(C.double(real), C.double(imag)))
26+
}
27+
28+
//PyComplex_RealAsDouble : https://docs.python.org/3/c-api/complex.html#c.PyComplex_RealAsDouble
29+
func PyComplex_RealAsDouble(op *PyObject) float64 {
30+
return float64(C.PyComplex_RealAsDouble(toc(op)))
31+
}
32+
33+
//PyComplex_ImagAsDouble : https://docs.python.org/3/c-api/complex.html#c.PyComplex_ImagAsDouble
34+
func PyComplex_ImagAsDouble(op *PyObject) float64 {
35+
return float64(C.PyComplex_ImagAsDouble(toc(op)))
36+
}

complex_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package python3
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestComplex(t *testing.T) {
10+
real := 2.
11+
imaginary := 5.
12+
13+
complex := PyComplex_FromDoubles(real, imaginary)
14+
assert.True(t, PyComplex_Check(complex))
15+
assert.True(t, PyComplex_CheckExact(complex))
16+
defer complex.DecRef()
17+
18+
assert.Equal(t, real, PyComplex_RealAsDouble(complex))
19+
assert.Equal(t, imaginary, PyComplex_ImagAsDouble(complex))
20+
}

float.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package python3
2+
3+
/*
4+
#include "Python.h"
5+
#include "macro.h"
6+
#include "type.h"
7+
*/
8+
import "C"
9+
10+
//Float : https://docs.python.org/3/c-api/float.html#c.PyFloat_Type
11+
var Float = togo(C._go_PyFloat_Type)
12+
13+
//PyFloat_Check : https://docs.python.org/3/c-api/float.html#c.PyFloat_Check
14+
func PyFloat_Check(p *PyObject) bool {
15+
return C._go_PyFloat_Check(toc(p)) != 0
16+
}
17+
18+
//PyFloat_CheckExact : https://docs.python.org/3/c-api/float.html#c.PyFloat_CheckExact
19+
func PyFloat_CheckExact(p *PyObject) bool {
20+
return C._go_PyFloat_CheckExact(toc(p)) != 0
21+
}
22+
23+
//PyFloat_FromDouble : https://docs.python.org/3/c-api/float.html#c.PyFloat_FromDouble
24+
func PyFloat_FromDouble(v float64) *PyObject {
25+
return togo(C.PyFloat_FromDouble(C.double(v)))
26+
}
27+
28+
//PyFloat_FromString : https://docs.python.org/3/c-api/float.html#c.PyFloat_FromString
29+
func PyFloat_FromString(str *PyObject) *PyObject {
30+
return togo(C.PyFloat_FromString(toc(str)))
31+
}
32+
33+
//PyFloat_AsDouble : https://docs.python.org/3/c-api/float.html#c.PyFloat_AsDouble
34+
func PyFloat_AsDouble(obj *PyObject) float64 {
35+
return float64(C.PyFloat_AsDouble(toc(obj)))
36+
}
37+
38+
//PyFloat_GetInfo : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetInfo
39+
func PyFloat_GetInfo() *PyObject {
40+
return togo(C.PyFloat_GetInfo())
41+
}
42+
43+
//PyFloat_GetMax : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetMax
44+
func PyFloat_GetMax() float64 {
45+
return float64(C.PyFloat_GetMax())
46+
}
47+
48+
//PyFloat_GetMin : https://docs.python.org/3/c-api/float.html#c.PyFloat_GetMin
49+
func PyFloat_GetMin() float64 {
50+
return float64(C.PyFloat_GetMin())
51+
}
52+
53+
//PyFloat_ClearFreeList : https://docs.python.org/3/c-api/float.html#c.PyFloat_ClearFreeList
54+
func PyFloat_ClearFreeList() int {
55+
return int(C.PyFloat_ClearFreeList())
56+
}

float_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package python3
2+
3+
import (
4+
"math"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestPyFloatCheck(t *testing.T) {
11+
Py_Initialize()
12+
13+
pyFloat := PyFloat_FromDouble(345.)
14+
assert.True(t, PyFloat_Check(pyFloat))
15+
assert.True(t, PyFloat_CheckExact(pyFloat))
16+
pyFloat.DecRef()
17+
}
18+
19+
func TestPyFloatFromAsDouble(t *testing.T) {
20+
Py_Initialize()
21+
v := 2354.
22+
pyFloat := PyFloat_FromDouble(v)
23+
assert.NotNil(t, pyFloat)
24+
assert.Equal(t, v, PyFloat_AsDouble(pyFloat))
25+
pyFloat.DecRef()
26+
}
27+
28+
func TestPyFloatFromAsString(t *testing.T) {
29+
Py_Initialize()
30+
pyString := PyUnicode_FromString("2354")
31+
defer pyString.DecRef()
32+
33+
pyFloat := PyFloat_FromString(pyString)
34+
assert.NotNil(t, pyFloat)
35+
assert.Equal(t, 2354., PyFloat_AsDouble(pyFloat))
36+
pyFloat.DecRef()
37+
}
38+
39+
func TestPyFloatMinMax(t *testing.T) {
40+
Py_Initialize()
41+
42+
assert.Equal(t, math.MaxFloat64, PyFloat_GetMax())
43+
44+
assert.Equal(t, 2.2250738585072014e-308, PyFloat_GetMin())
45+
}

0 commit comments

Comments
 (0)