mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-06 15:48:47 +00:00
[maps] queues instead of stacks to keep things in order
This commit is contained in:
+9
-2
@@ -398,11 +398,18 @@ struct MD_MapSlot
|
|||||||
void *val;
|
void *val;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct MD_MapBucket MD_MapBucket;
|
||||||
|
struct MD_MapBucket
|
||||||
|
{
|
||||||
|
MD_MapSlot *first;
|
||||||
|
MD_MapSlot *last;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct MD_Map MD_Map;
|
typedef struct MD_Map MD_Map;
|
||||||
struct MD_Map
|
struct MD_Map
|
||||||
{
|
{
|
||||||
MD_u64 table_size;
|
MD_MapBucket *buckets;
|
||||||
MD_MapSlot **table;
|
MD_u64 bucket_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
//~ Token kinds.
|
//~ Token kinds.
|
||||||
|
|||||||
+17
-10
@@ -943,10 +943,10 @@ MD_MapMakeBucketCount(MD_u64 bucket_count){
|
|||||||
// TODO(allen): permanent arena? scratch arena? -- would really
|
// TODO(allen): permanent arena? scratch arena? -- would really
|
||||||
// make most sense with a parameter
|
// make most sense with a parameter
|
||||||
MD_Map result = {0};
|
MD_Map result = {0};
|
||||||
result.table_size = bucket_count;
|
result.bucket_count = bucket_count;
|
||||||
// TODO(allen): push array zero
|
// TODO(allen): push array zero
|
||||||
result.table = MD_PushArray(MD_MapSlot*, bucket_count);
|
result.buckets = MD_PushArray(MD_MapBucket, bucket_count);
|
||||||
memset(result.table, 0, sizeof(*result.table)*bucket_count);
|
memset(result.buckets, 0, sizeof(*result.buckets)*bucket_count);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -983,9 +983,9 @@ MD_MapKeyPtr(void *ptr){
|
|||||||
MD_FUNCTION_IMPL MD_MapSlot*
|
MD_FUNCTION_IMPL MD_MapSlot*
|
||||||
MD_MapLookup(MD_Map *map, MD_MapKey key){
|
MD_MapLookup(MD_Map *map, MD_MapKey key){
|
||||||
MD_MapSlot *result = 0;
|
MD_MapSlot *result = 0;
|
||||||
if (map->table_size > 0){
|
if (map->bucket_count > 0){
|
||||||
MD_u64 index = key.hash%map->table_size;
|
MD_u64 index = key.hash%map->bucket_count;
|
||||||
result = MD_MapScan(map->table[index], key);
|
result = MD_MapScan(map->buckets[index].first, key);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
@@ -1022,14 +1022,21 @@ MD_MapScan(MD_MapSlot *first_slot, MD_MapKey key){
|
|||||||
MD_FUNCTION_IMPL MD_MapSlot*
|
MD_FUNCTION_IMPL MD_MapSlot*
|
||||||
MD_MapInsert(MD_Map *map, MD_MapKey key, void *val){
|
MD_MapInsert(MD_Map *map, MD_MapKey key, void *val){
|
||||||
MD_MapSlot *result = 0;
|
MD_MapSlot *result = 0;
|
||||||
if (map->table_size > 0){
|
if (map->bucket_count > 0){
|
||||||
MD_u64 index = key.hash%map->table_size;
|
MD_u64 index = key.hash%map->bucket_count;
|
||||||
// TODO(allen): again, memory? permanent arena? scratch arena?
|
// TODO(allen): again, memory? permanent arena? scratch arena?
|
||||||
// should definitely match the table's memory "object"
|
// should definitely match the table's memory "object"
|
||||||
MD_MapSlot *slot = MD_PushArray(MD_MapSlot, 1);
|
MD_MapSlot *slot = MD_PushArray(MD_MapSlot, 1);
|
||||||
// TODO(allen): queue push
|
// TODO(allen): queue push
|
||||||
slot->next = map->table[index];
|
MD_MapBucket *bucket = &map->buckets[index];
|
||||||
map->table[index] = slot;
|
if (bucket->first == 0){
|
||||||
|
bucket->first = slot;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
bucket->last->next = slot;
|
||||||
|
}
|
||||||
|
bucket->last = slot;
|
||||||
|
slot->next = 0;
|
||||||
slot->key = key;
|
slot->key = key;
|
||||||
slot->val = val;
|
slot->val = val;
|
||||||
result = slot;
|
result = slot;
|
||||||
|
|||||||
Reference in New Issue
Block a user