void BBSortEx_flush(BBSortEx *self) { u32_t cache_count = self->cache_max - self->cache_tick; VArray *elems; BBSortExRun *run; u32_t i; if (!cache_count) return; else elems = VA_new(cache_count); /* Sort, then create a new run. */ BBSortEx_Sort_Cache(self); for (i = self->cache_tick; i < self->cache_max; i++) { VA_Push(elems, self->cache[i]); } run = BBSortExRun_new(elems); DECREF(elems); BBSortEx_Add_Run(self, (SortExRun*)run); DECREF(run); /* Blank the cache vars. */ self->cache_tick += cache_count; SortEx_Clear_Cache(self); }
void SortEx_Destroy_IMP(SortExternal *self) { SortExternalIVARS *const ivars = SortEx_IVARS(self); FREEMEM(ivars->scratch); FREEMEM(ivars->slice_sizes); FREEMEM(ivars->slice_starts); if (ivars->cache) { SortEx_Clear_Cache(self); FREEMEM(ivars->cache); } DECREF(ivars->runs); SUPER_DESTROY(self, SORTEXTERNAL); }
static void S_refill_cache(SortExternal *self, SortExternalIVARS *ivars) { // Reset cache vars. SortEx_Clear_Cache(self); // Make sure all runs have at least one item in the cache. uint32_t i = 0; while (i < VA_Get_Size(ivars->runs)) { SortExternal *const run = (SortExternal*)VA_Fetch(ivars->runs, i); if (SortEx_Cache_Count(run) > 0 || SortEx_Refill(run) > 0) { i++; // Run has some elements, so keep. } else { VA_Excise(ivars->runs, i, 1); } } // Absorb as many elems as possible from all runs into main cache. if (VA_Get_Size(ivars->runs)) { uint8_t *endpost = S_find_endpost(self, ivars); S_absorb_slices(self, ivars, endpost); } }