1
1
import binascii
2
2
from io import BytesIO
3
3
import struct
4
+ from cpython cimport bool
4
5
5
6
6
7
class Typed (type ):
@@ -20,17 +21,23 @@ def __call__(cls, *args, **kwargs):
20
21
return super ().__call__(* args, ** kwargs)
21
22
22
23
23
- class Reader :
24
+ cdef class Reader:
24
25
25
- __slots__ = ['stream' , 'endianness' , 'has_z' , 'has_m' ]
26
+ cdef object stream
27
+ cdef bytes endianness
28
+ cdef public bool has_z
29
+ cdef public bool has_m
26
30
27
- def __init__ (self , stream ):
31
+ def __cinit__ (self , stream: object ):
28
32
self .stream = stream
29
33
30
- def clone (self ):
34
+ cpdef clone(self ):
31
35
return type (self )(self .stream)
32
36
33
- def read (self ):
37
+ cpdef read(self ):
38
+ return self ._read()
39
+
40
+ cdef _read(self ):
34
41
# https://en.wikipedia.org/wiki/Well-known_text#Well-known_binary
35
42
byte_order = self .stream.read(1 )
36
43
if byte_order == b' \x00 ' :
@@ -53,22 +60,22 @@ def read(self):
53
60
else :
54
61
return class_.from_ewkb_body(self , srid)
55
62
56
- def read_int (self ):
63
+ cpdef read_int(self ):
57
64
return struct .unpack(self .endianness + b' I' , self .stream.read(4 ))[0 ]
58
65
59
- def read_double (self ):
66
+ cpdef read_double(self ):
60
67
return struct .unpack(self .endianness + b' d' , self .stream.read(8 ))[0 ]
61
68
62
- @ classmethod
63
- def from_hex ( cls , value ):
64
- return cls (BytesIO (binascii .a2b_hex (value ))).read ()
69
+
70
+ def read ( value: bytes ):
71
+ return Reader (BytesIO(binascii.a2b_hex(value))).read()
65
72
66
73
67
- class Writer :
74
+ cdef class Writer:
68
75
69
- __slots__ = [ ' stream' ]
76
+ cdef object stream
70
77
71
- def __init__ (self , geometry , stream = None ):
78
+ def __cinit__ (self , geometry: object , stream: object = None ):
72
79
self .stream = stream or BytesIO()
73
80
try :
74
81
type_ = geometry.TYPE
@@ -85,17 +92,17 @@ def __init__(self, geometry, stream=None):
85
92
if geometry.has_srid:
86
93
self .write_int(geometry.srid)
87
94
88
- def write_int (self , value ):
95
+ cpdef write_int(self , value):
89
96
self .stream.write(struct .pack(b' <I' , value))
90
97
91
- def write_double (self , value ):
98
+ cpdef write_double(self , value):
92
99
self .stream.write(struct .pack(b' <d' , value))
93
100
94
- def clone (self , geometry ):
101
+ cpdef clone(self , geometry):
95
102
return type (self )(geometry, self .stream)
96
103
97
- @ classmethod
98
- def to_hex ( cls , value ):
99
- writer = cls (value )
100
- value .write_ewkb_body (writer )
101
- return binascii .b2a_hex (writer .stream .getvalue ()).upper ()
104
+
105
+ def write ( value ):
106
+ writer = Writer (value)
107
+ value.write_ewkb_body(writer)
108
+ return binascii.b2a_hex(writer.stream.getvalue()).upper()
0 commit comments