hashtable.h: Add compatibility with VS10 and MinGW, remove trailing whitespaces
This commit is contained in:
parent
8b3583e7b5
commit
acf06a5e40
@ -404,12 +404,13 @@ static HASHTABLE_U32 hashtable_internal_pow2ceil( HASHTABLE_U32 v )
|
||||
|
||||
void hashtable_init( hashtable_t* table, int item_size, int initial_capacity, void* memctx )
|
||||
{
|
||||
int slots_size;
|
||||
initial_capacity = (int)hashtable_internal_pow2ceil( initial_capacity >=0 ? (HASHTABLE_U32) initial_capacity : 32U );
|
||||
table->memctx = memctx;
|
||||
table->count = 0;
|
||||
table->item_size = item_size;
|
||||
table->slot_capacity = (int) hashtable_internal_pow2ceil( (HASHTABLE_U32) ( initial_capacity + initial_capacity / 2 ) );
|
||||
int slots_size = (int)( table->slot_capacity * sizeof( *table->slots ) );
|
||||
slots_size = (int)( table->slot_capacity * sizeof( *table->slots ) );
|
||||
table->slots = (struct hashtable_internal_slot_t*) HASHTABLE_MALLOC( table->memctx, (HASHTABLE_SIZE_T) slots_size );
|
||||
HASHTABLE_ASSERT( table->slots );
|
||||
HASHTABLE_MEMSET( table->slots, 0, (HASHTABLE_SIZE_T) slots_size );
|
||||
@ -419,7 +420,7 @@ void hashtable_init( hashtable_t* table, int item_size, int initial_capacity, vo
|
||||
HASHTABLE_ASSERT( table->items_key );
|
||||
table->items_slot = (int*)( table->items_key + table->item_capacity );
|
||||
table->items_data = (void*)( table->items_slot + table->item_capacity );
|
||||
table->swap_temp = (void*)( ( (uintptr_t) table->items_data ) + table->item_size * table->item_capacity );
|
||||
table->swap_temp = (void*)( ( (size_t) table->items_data ) + table->item_size * table->item_capacity );
|
||||
}
|
||||
|
||||
|
||||
@ -478,26 +479,28 @@ static void hashtable_internal_expand_slots( hashtable_t* table )
|
||||
{
|
||||
int const old_capacity = table->slot_capacity;
|
||||
struct hashtable_internal_slot_t* old_slots = table->slots;
|
||||
int slot_mask, size, i;
|
||||
|
||||
table->slot_capacity *= 2;
|
||||
int const slot_mask = table->slot_capacity - 1;
|
||||
slot_mask = table->slot_capacity - 1;
|
||||
|
||||
int const size = (int)( table->slot_capacity * sizeof( *table->slots ) );
|
||||
size = (int)( table->slot_capacity * sizeof( *table->slots ) );
|
||||
table->slots = (struct hashtable_internal_slot_t*) HASHTABLE_MALLOC( table->memctx, (HASHTABLE_SIZE_T) size );
|
||||
HASHTABLE_ASSERT( table->slots );
|
||||
HASHTABLE_MEMSET( table->slots, 0, (HASHTABLE_SIZE_T) size );
|
||||
|
||||
for( int i = 0; i < old_capacity; ++i )
|
||||
for( i = 0; i < old_capacity; ++i )
|
||||
{
|
||||
HASHTABLE_U32 const hash = old_slots[ i ].key_hash;
|
||||
if( hash )
|
||||
{
|
||||
int item_index;
|
||||
int const base_slot = (int)( hash & (HASHTABLE_U32)slot_mask );
|
||||
int slot = base_slot;
|
||||
while( table->slots[ slot ].key_hash )
|
||||
slot = ( slot + 1 ) & slot_mask;
|
||||
table->slots[ slot ].key_hash = hash;
|
||||
int item_index = old_slots[ i ].item_index;
|
||||
item_index = old_slots[ i ].item_index;
|
||||
table->slots[ slot ].item_index = item_index;
|
||||
table->items_slot[ item_index ] = slot;
|
||||
++table->slots[ base_slot ].base_count;
|
||||
@ -510,15 +513,19 @@ static void hashtable_internal_expand_slots( hashtable_t* table )
|
||||
|
||||
static int hashtable_internal_expand_items( hashtable_t* table )
|
||||
{
|
||||
HASHTABLE_U64* new_items_key;
|
||||
int* new_items_slot;
|
||||
void* new_items_data, * new_swap_temp;
|
||||
|
||||
table->item_capacity *= 2;
|
||||
HASHTABLE_U64* const new_items_key = (HASHTABLE_U64*) HASHTABLE_MALLOC( table->memctx,
|
||||
new_items_key = (HASHTABLE_U64*) HASHTABLE_MALLOC( table->memctx,
|
||||
table->item_capacity * ( sizeof( *table->items_key ) + sizeof( *table->items_slot ) + table->item_size ) + table->item_size);
|
||||
if( new_items_key == NULL )
|
||||
return 0;
|
||||
|
||||
int* const new_items_slot = (int*)( new_items_key + table->item_capacity );
|
||||
void* const new_items_data = (void*)( new_items_slot + table->item_capacity );
|
||||
void* const new_swap_temp = (void*)( ( (uintptr_t) new_items_data ) + table->item_size * table->item_capacity );
|
||||
new_items_slot = (int*)( new_items_key + table->item_capacity );
|
||||
new_items_data = (void*)( new_items_slot + table->item_capacity );
|
||||
new_swap_temp = (void*)( ( (size_t) new_items_data ) + table->item_size * table->item_capacity );
|
||||
|
||||
HASHTABLE_MEMCPY( new_items_key, table->items_key, table->count * sizeof( *table->items_key ) );
|
||||
HASHTABLE_MEMCPY( new_items_slot, table->items_slot, table->count * sizeof( *table->items_key ) );
|
||||
@ -537,23 +544,29 @@ static int hashtable_internal_expand_items( hashtable_t* table )
|
||||
|
||||
int hashtable_insert( hashtable_t* table, HASHTABLE_U64 key, void const* item )
|
||||
{
|
||||
int slot_mask, base_slot;
|
||||
int base_count, slot, first_free;
|
||||
void* dest_item;
|
||||
HASHTABLE_U32 hash;
|
||||
|
||||
HASHTABLE_ASSERT( hashtable_internal_find_slot( table, key ) < 0 );
|
||||
|
||||
if( table->count >= ( table->slot_capacity - table->slot_capacity / 3 ) )
|
||||
hashtable_internal_expand_slots( table );
|
||||
|
||||
int const slot_mask = table->slot_capacity - 1;
|
||||
HASHTABLE_U32 const hash = hashtable_internal_calculate_hash( key );
|
||||
slot_mask = table->slot_capacity - 1;
|
||||
hash = hashtable_internal_calculate_hash( key );
|
||||
|
||||
int const base_slot = (int)( hash & (HASHTABLE_U32)slot_mask );
|
||||
int base_count = table->slots[ base_slot ].base_count;
|
||||
int slot = base_slot;
|
||||
int first_free = slot;
|
||||
base_slot = (int)( hash & (HASHTABLE_U32)slot_mask );
|
||||
base_count = table->slots[ base_slot ].base_count;
|
||||
slot = base_slot;
|
||||
first_free = slot;
|
||||
while( base_count )
|
||||
{
|
||||
int slot_base;
|
||||
HASHTABLE_U32 const slot_hash = table->slots[ slot ].key_hash;
|
||||
if( slot_hash == 0 && table->slots[ first_free ].key_hash != 0 ) first_free = slot;
|
||||
int slot_base = (int)( slot_hash & (HASHTABLE_U32)slot_mask );
|
||||
slot_base = (int)( slot_hash & (HASHTABLE_U32)slot_mask );
|
||||
if( slot_base == base_slot )
|
||||
--base_count;
|
||||
slot = ( slot + 1 ) & slot_mask;
|
||||
@ -574,7 +587,7 @@ int hashtable_insert( hashtable_t* table, HASHTABLE_U64 key, void const* item )
|
||||
++table->slots[ base_slot ].base_count;
|
||||
|
||||
|
||||
void* dest_item = (void*)( ( (uintptr_t) table->items_data ) + table->count * table->item_size );
|
||||
dest_item = (void*)( ( (size_t) table->items_data ) + table->count * table->item_size );
|
||||
memcpy( dest_item, item, (HASHTABLE_SIZE_T) table->item_size );
|
||||
table->items_key[ table->count ] = key;
|
||||
table->items_slot[ table->count ] = slot;
|
||||
@ -586,24 +599,28 @@ int hashtable_insert( hashtable_t* table, HASHTABLE_U64 key, void const* item )
|
||||
|
||||
void hashtable_remove( hashtable_t* table, HASHTABLE_U64 key )
|
||||
{
|
||||
int const slot = hashtable_internal_find_slot( table, key );
|
||||
int slot, slot_mask, base_slot, index, last_index;
|
||||
HASHTABLE_U32 hash;
|
||||
|
||||
slot = hashtable_internal_find_slot( table, key );
|
||||
HASHTABLE_ASSERT( slot >= 0 );
|
||||
|
||||
int const slot_mask = table->slot_capacity - 1;
|
||||
HASHTABLE_U32 const hash = table->slots[ slot ].key_hash;
|
||||
int const base_slot = (int)( hash & (HASHTABLE_U32) slot_mask );
|
||||
slot_mask = table->slot_capacity - 1;
|
||||
hash = table->slots[ slot ].key_hash;
|
||||
base_slot = (int)( hash & (HASHTABLE_U32) slot_mask );
|
||||
HASHTABLE_ASSERT( hash );
|
||||
--table->slots[ base_slot ].base_count;
|
||||
table->slots[ slot ].key_hash = 0;
|
||||
|
||||
int index = table->slots[ slot ].item_index;
|
||||
int last_index = table->count - 1;
|
||||
index = table->slots[ slot ].item_index;
|
||||
last_index = table->count - 1;
|
||||
if( index != last_index )
|
||||
{
|
||||
void* src_item, * dst_item;
|
||||
table->items_key[ index ] = table->items_key[ last_index ];
|
||||
table->items_slot[ index ] = table->items_slot[ last_index ];
|
||||
void* dst_item = (void*)( ( (uintptr_t) table->items_data ) + index * table->item_size );
|
||||
void* src_item = (void*)( ( (uintptr_t) table->items_data ) + last_index * table->item_size );
|
||||
dst_item = (void*)( ( (size_t) table->items_data ) + index * table->item_size );
|
||||
src_item = (void*)( ( (size_t) table->items_data ) + last_index * table->item_size );
|
||||
HASHTABLE_MEMCPY( dst_item, src_item, (HASHTABLE_SIZE_T) table->item_size );
|
||||
table->slots[ table->items_slot[ last_index ] ].item_index = index;
|
||||
}
|
||||
@ -620,11 +637,14 @@ void hashtable_clear( hashtable_t* table )
|
||||
|
||||
void* hashtable_find( hashtable_t const* table, HASHTABLE_U64 key )
|
||||
{
|
||||
int const slot = hashtable_internal_find_slot( table, key );
|
||||
int slot, index;
|
||||
void* item;
|
||||
|
||||
slot = hashtable_internal_find_slot( table, key );
|
||||
if( slot < 0 ) return 0;
|
||||
|
||||
int const index = table->slots[ slot ].item_index;
|
||||
void* const item = (void*)( ( (uintptr_t) table->items_data ) + index * table->item_size );
|
||||
index = table->slots[ slot ].item_index;
|
||||
item = (void*)( ( (size_t) table->items_data ) + index * table->item_size );
|
||||
return item;
|
||||
}
|
||||
|
||||
@ -649,20 +669,24 @@ HASHTABLE_U64 const* hashtable_keys( hashtable_t const* table )
|
||||
|
||||
void hashtable_swap( hashtable_t* table, int index_a, int index_b )
|
||||
{
|
||||
int slot_a, slot_b;
|
||||
void* item_a, *item_b;
|
||||
HASHTABLE_U64 temp_key;
|
||||
|
||||
if( index_a < 0 || index_a >= table->count || index_b < 0 || index_b >= table->count ) return;
|
||||
|
||||
int slot_a = table->items_slot[ index_a ];
|
||||
int slot_b = table->items_slot[ index_b ];
|
||||
slot_a = table->items_slot[ index_a ];
|
||||
slot_b = table->items_slot[ index_b ];
|
||||
|
||||
table->items_slot[ index_a ] = slot_b;
|
||||
table->items_slot[ index_b ] = slot_a;
|
||||
|
||||
HASHTABLE_U64 temp_key = table->items_key[ index_a ];
|
||||
temp_key = table->items_key[ index_a ];
|
||||
table->items_key[ index_a ] = table->items_key[ index_b ];
|
||||
table->items_key[ index_b ] = temp_key;
|
||||
|
||||
void* item_a = (void*)( ( (uintptr_t) table->items_data ) + index_a * table->item_size );
|
||||
void* item_b = (void*)( ( (uintptr_t) table->items_data ) + index_b * table->item_size );
|
||||
item_a = (void*)( ( (size_t) table->items_data ) + index_a * table->item_size );
|
||||
item_b = (void*)( ( (size_t) table->items_data ) + index_b * table->item_size );
|
||||
HASHTABLE_MEMCPY( table->swap_temp, item_a, table->item_size );
|
||||
HASHTABLE_MEMCPY( item_a, item_b, table->item_size );
|
||||
HASHTABLE_MEMCPY( item_b, table->swap_temp, table->item_size );
|
||||
|
Loading…
x
Reference in New Issue
Block a user