static INLINE int32_t SI_compare_by_ord4(SortCollectorIVARS *ivars, uint32_t tick, int32_t a, int32_t b) { void *const ords = ivars->ord_arrays[tick]; int32_t a_ord = NumUtil_u4get(ords, a); int32_t b_ord = NumUtil_u4get(ords, b); return a_ord - b_ord; }
static void test_u4(TestBatch *batch) { size_t count = 128; uint64_t *ints = TestUtils_random_u64s(NULL, count, 0, 16); uint8_t *bits = (uint8_t*)CALLOCATE((count / 2), sizeof(uint8_t)); for (size_t i = 0; i < count; i++) { NumUtil_u4set(bits, i, (uint8_t)ints[i]); } for (size_t i = 0; i < count; i++) { TEST_INT_EQ(batch, NumUtil_u4get(bits, i), (long)ints[i], "u4"); } FREEMEM(bits); FREEMEM(ints); }
int32_t SortCache_Ordinal_IMP(SortCache *self, int32_t doc_id) { SortCacheIVARS *const ivars = SortCache_IVARS(self); if (doc_id > ivars->doc_max || doc_id < 0) { THROW(ERR, "Out of range: %i32 max: %i32", doc_id, ivars->doc_max); } switch (ivars->ord_width) { case 1: return NumUtil_u1get(ivars->ords, (uint32_t)doc_id); case 2: return NumUtil_u2get(ivars->ords, (uint32_t)doc_id); case 4: return NumUtil_u4get(ivars->ords, (uint32_t)doc_id); case 8: { uint8_t *ints = (uint8_t*)ivars->ords; return ints[doc_id]; } case 16: if (ivars->native_ords) { uint16_t *ints = (uint16_t*)ivars->ords; return ints[doc_id]; } else { uint8_t *bytes = (uint8_t*)ivars->ords; bytes += (size_t)doc_id * sizeof(uint16_t); return NumUtil_decode_bigend_u16(bytes); } case 32: if (ivars->native_ords) { int32_t *ints = (int32_t*)ivars->ords; return ints[doc_id]; } else { uint8_t *bytes = (uint8_t*)ivars->ords; bytes += (size_t)doc_id * sizeof(int32_t); return (int32_t)NumUtil_decode_bigend_u32(bytes); } default: { THROW(ERR, "Invalid ord width: %i32", ivars->ord_width); UNREACHABLE_RETURN(int32_t); } } }