/* vim: set expandtab ts=4 sw=4: */ /* * You may redistribute this program and/or modify it under the terms of * the GNU General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "crypto/random/Random.h" #include "memory/Allocator.h" #include "util/Assert.h" #define Map_NAME OfLongsByInteger #define Map_KEY_TYPE uint32_t #define Map_VALUE_TYPE uint64_t #define Map_ENABLE_HANDLES #include "util/Map.h" #include #include #define CYCLES 1 int main() { struct Allocator* mainAlloc = Allocator_new(20000); struct Random* rand = NULL; Err_assert(Random_new(&rand, mainAlloc, NULL)); for (int cycles = 0; cycles < CYCLES; cycles++) { struct Allocator* alloc = Allocator_new(1<<18); struct Map_OfLongsByInteger* map = Map_OfLongsByInteger_new(alloc); uint32_t size; Random_bytes(rand, (uint8_t*) &size, 4); size = (size % 4096) + 101; uint32_t key = 3; uint64_t val = 4; for (uint32_t i = 0; i < size; i++) { Map_OfLongsByInteger_put(&key, &val, map); key += val >> 13 ^ size << 19; val += key >> 19 ^ i << 13; } // If a key is duplicated, the entry will br replaced. size = map->count; for (uint32_t i = size - 1; i > size - 100; i--) { int index = map->keys[i] % size; uint32_t handle = map->handles[index]; if (index != Map_OfLongsByInteger_indexForHandle(handle, map)) { uint32_t num = 0; for (int i = 0; i < (int)map->count; i++) { if (num > map->handles[i]) { Assert_true(!"map out of order"); } num = map->handles[i]; } printf("failed to find the correct index for the handle " "handle[%u], index[%u], indexForHandle[%u]\n", handle, index, Map_OfLongsByInteger_indexForHandle(handle, map)); Assert_true(false); } } Allocator_free(alloc); } Allocator_free(mainAlloc); return 0; }