def _long_impl(val): # This function assumes val came from a long int repr with val being a # uint64_t this means having to split the input into PyLong_SHIFT size # chunks in an unsigned hash wide type, max numba can handle is a 64bit int # mask to select low _PyLong_SHIFT bits _tmp_shift = 32 - _PyLong_SHIFT mask_shift = (~types.uint32(0x0)) >> _tmp_shift # a 64bit wide max means Numba only needs 3 x 30 bit values max, # or 5 x 15 bit values max on 32bit platforms i = (64 // _PyLong_SHIFT) + 1 # alg as per hash_long x = 0 p3 = (_PyHASH_BITS - _PyLong_SHIFT) for idx in range(i - 1, -1, -1): p1 = x << _PyLong_SHIFT p2 = p1 & _PyHASH_MODULUS p4 = x >> p3 x = p2 | p4 # the shift and mask splits out the `ob_digit` parts of a Long repr x += types.uint32((val >> idx * _PyLong_SHIFT) & mask_shift) if x >= _PyHASH_MODULUS: x -= _PyHASH_MODULUS return _Py_hash_t(x)
def test_unsigned_access(self): L = List.empty_list(int32) ui32_0 = types.uint32(0) ui32_1 = types.uint32(1) ui32_2 = types.uint32(2) # insert L.append(types.uint32(10)) L.append(types.uint32(11)) L.append(types.uint32(12)) self.assertEqual(len(L), 3) # getitem self.assertEqual(L[ui32_0], 10) self.assertEqual(L[ui32_1], 11) self.assertEqual(L[ui32_2], 12) # setitem L[ui32_0] = 123 L[ui32_1] = 456 L[ui32_2] = 789 self.assertEqual(L[ui32_0], 123) self.assertEqual(L[ui32_1], 456) self.assertEqual(L[ui32_2], 789) # index ui32_123 = types.uint32(123) ui32_456 = types.uint32(456) ui32_789 = types.uint32(789) self.assertEqual(L.index(ui32_123), 0) self.assertEqual(L.index(ui32_456), 1) self.assertEqual(L.index(ui32_789), 2) # delitem L.__delitem__(ui32_2) del L[ui32_1] self.assertEqual(len(L), 1) self.assertEqual(L[ui32_0], 123) # pop L.append(2) L.append(3) L.append(4) self.assertEqual(len(L), 4) self.assertEqual(L.pop(), 4) self.assertEqual(L.pop(ui32_2), 3) self.assertEqual(L.pop(ui32_1), 2) self.assertEqual(L.pop(ui32_0), 123)
def float_to_unsigned(x): return types.uint32(x)
def to_uint32(x): return types.uint32(x)
def deref_uint32(typingctx, data, offset): sig = types.uint32(data, types.intp) return sig, make_deref_codegen(32)