Skip to content

Commit e3539f9

Browse files
committed
Simplify float, double, and int32 decoding
It isn't clear that this is faster, but it makes the code easier to follow and removes a few unnecessary operations.
1 parent 2a4eb44 commit e3539f9

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

maxminddb/decoder.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,30 @@ def _decode_bytes(self, size, offset):
4141
new_offset = offset + size
4242
return self._buffer[offset:new_offset], new_offset
4343

44-
# pylint: disable=no-self-argument
45-
# |-> I am open to better ways of doing this as long as it doesn't involve
46-
# lots of code duplication.
47-
def _decode_packed_type(type_code, type_size, pad=False):
48-
# pylint: disable=protected-access, missing-docstring
49-
def unpack_type(self, size, offset):
50-
if not pad:
51-
self._verify_size(size, type_size)
52-
new_offset = offset + size
53-
packed_bytes = self._buffer[offset:new_offset]
54-
if pad:
55-
packed_bytes = packed_bytes.rjust(type_size, b'\x00')
56-
(value, ) = struct.unpack(type_code, packed_bytes)
57-
return value, new_offset
58-
59-
return unpack_type
44+
def _decode_double(self, size, offset):
45+
self._verify_size(size, 8)
46+
new_offset = offset + size
47+
packed_bytes = self._buffer[offset:new_offset]
48+
(value, ) = struct.unpack(b'!d', packed_bytes)
49+
return value, new_offset
50+
51+
def _decode_float(self, size, offset):
52+
self._verify_size(size, 4)
53+
new_offset = offset + size
54+
packed_bytes = self._buffer[offset:new_offset]
55+
(value, ) = struct.unpack(b'!f', packed_bytes)
56+
return value, new_offset
57+
58+
def _decode_int32(self, size, offset):
59+
if size == 0:
60+
return 0, offset
61+
new_offset = offset + size
62+
packed_bytes = self._buffer[offset:new_offset]
63+
64+
if size != 4:
65+
packed_bytes = packed_bytes.rjust(4, b'\x00')
66+
(value, ) = struct.unpack(b'!i', packed_bytes)
67+
return value, new_offset
6068

6169
def _decode_map(self, size, offset):
6270
container = {}
@@ -99,17 +107,17 @@ def _decode_utf8_string(self, size, offset):
99107
_type_decoder = {
100108
1: _decode_pointer,
101109
2: _decode_utf8_string,
102-
3: _decode_packed_type(b'!d', 8), # double,
110+
3: _decode_double,
103111
4: _decode_bytes,
104112
5: _decode_uint, # uint16
105113
6: _decode_uint, # uint32
106114
7: _decode_map,
107-
8: _decode_packed_type(b'!i', 4, pad=True), # int32
115+
8: _decode_int32,
108116
9: _decode_uint, # uint64
109117
10: _decode_uint, # uint128
110118
11: _decode_array,
111119
14: _decode_boolean,
112-
15: _decode_packed_type(b'!f', 4), # float,
120+
15: _decode_float,
113121
}
114122

115123
def decode(self, offset):

0 commit comments

Comments
 (0)