DECLARE_TEST( hashmap, erase ) { hashmap_t* map = hashmap_allocate( 0, 0 ); void* prev = 0; EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 1 ); EXPECT_TRUE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, 0 ); EXPECT_EQ( prev, map ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, 0 ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, 0 ) ); prev = hashmap_erase( map, (hash_t)(uintptr_t)map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 0 ); EXPECT_FALSE( hashmap_has_key( map, (hash_t)(uintptr_t)map ) ); hashmap_deallocate( map ); return 0; }
DECLARE_TEST( hashmap, lookup ) { hashmap_t* map = hashmap_allocate( 31, 0 ); char* value = (void*)(uintptr_t)1234; hash_t key = (hash_t)4321; unsigned int ikey = 0; for( ; ikey < 1024; ++ikey, ++key, ++value ) { void* prev = hashmap_insert( map, key, value ); EXPECT_EQ( prev, 0 ); } for( ikey = 0, key = (hash_t)4321, value = (void*)(uintptr_t)1234; ikey < 1024; ++ikey, ++key, ++value ) { void* prev = hashmap_lookup( map, key ); EXPECT_EQ( prev, value ); EXPECT_TRUE( hashmap_has_key( map, key ) ); hashmap_erase( map, key ); EXPECT_FALSE( hashmap_has_key( map, key ) ); } hashmap_deallocate( map ); return 0; }
DECLARE_TEST(hashmap, allocation) { hashmap_t* map = hashmap_allocate(0, 0); EXPECT_EQ(hashmap_size(map), 0); EXPECT_EQ(hashmap_lookup(map, 0), 0); EXPECT_EQ(hashmap_lookup(map, (hash_t)(uintptr_t)map), 0); hashmap_deallocate(map); map = hashmap_allocate(13, 127); EXPECT_EQ(hashmap_size(map), 0); EXPECT_EQ(hashmap_lookup(map, 0), 0); EXPECT_EQ(hashmap_lookup(map, (hash_t)(uintptr_t)map), 0); hashmap_deallocate(map); return 0; }
void lua_modulemap_finalize(void) { for (size_t ibucket = 0; ibucket < _lua_modulemap->num_buckets; ++ibucket) { hashmap_node_t* bucket = _lua_modulemap->bucket[ibucket]; for (size_t inode = 0, nsize = array_size(bucket); inode < nsize; ++inode) memory_deallocate(bucket[inode].value); } hashmap_deallocate(_lua_modulemap); mutex_deallocate(_lua_modulemap_lock); }
DECLARE_TEST( hashmap, insert ) { hashmap_t* map = hashmap_allocate( 0, 0 ); void* prev = 0; EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, map ); prev = hashmap_insert( map, 0, 0 ); EXPECT_EQ( prev, map ); prev = hashmap_insert( map, 0, map ); EXPECT_EQ( prev, 0 ); prev = hashmap_insert( map, (hash_t)(uintptr_t)map, map ); EXPECT_EQ( prev, 0 ); EXPECT_EQ( hashmap_size( map ), 2 ); EXPECT_EQ( hashmap_lookup( map, 0 ), map ); EXPECT_EQ( hashmap_lookup( map, (hash_t)(uintptr_t)map ), map ); hashmap_insert( map, 0, 0 ); hashmap_insert( map, (hash_t)(uintptr_t)map, 0 ); EXPECT_EQ( hashmap_size( map ), 2 ); EXPECT_EQ( hashmap_lookup( map, 0 ), 0 ); EXPECT_EQ( hashmap_lookup( map, (hash_t)(uintptr_t)map ), 0 ); hashmap_deallocate( map ); return 0; }
void lua_symbol_finalize(void) { hashmap_deallocate(_lua_symbols); }