Changed how _update works and added _set
_update: retrieves old value _set: ignores old value
This commit is contained in:
1 parent
f74ce7519a
commit
613392ae76
4 files changed
+105
-25
No files matched your search
@@ -13,6 +13,7 @@ TODO
|
||||
[ ] Add TreeHashMap
|
||||
[ ] Add functions
|
||||
[X] update {hashmap, treemap, multimap}
|
||||
[X] set {hashmap, treemap, multimap}
|
||||
[/] to_string {all}
|
||||
[ ] iter_advance {all} (iterators)
|
||||
[ ] iter_rewind {all} (iterators)
|
||||
|
||||
+16
-2
@@ -161,7 +161,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
FMOD void PFX##_free(SNAME *_map_); \
|
||||
/* Collection Input and Output */ \
|
||||
FMOD bool PFX##_insert(SNAME *_map_, K key, V value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value); \
|
||||
FMOD bool PFX##_remove(SNAME *_map_, K key, V *value); \
|
||||
/* Conditional Input and Output */ \
|
||||
FMOD bool PFX##_insert_if(SNAME *_map_, K key, V value, bool condition); \
|
||||
@@ -171,6 +171,7 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
FMOD bool PFX##_min(SNAME *_map_, K *key, V *value); \
|
||||
FMOD V PFX##_get(SNAME *_map_, K key); \
|
||||
FMOD V *PFX##_get_ref(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value); \
|
||||
/* Collection State */ \
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_empty(SNAME *_map_); \
|
||||
@@ -342,13 +343,14 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value) \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value) \
|
||||
{ \
|
||||
SNAME##_entry *entry = PFX##_impl_get_entry(_map_, key); \
|
||||
\
|
||||
if (!entry) \
|
||||
return false; \
|
||||
\
|
||||
*old_value = entry->value; \
|
||||
entry->value = new_value; \
|
||||
\
|
||||
return true; \
|
||||
@@ -465,6 +467,18 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
return &(entry->value); \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value) \
|
||||
{ \
|
||||
SNAME##_entry *entry = PFX##_impl_get_entry(_map_, key); \
|
||||
\
|
||||
if (!entry) \
|
||||
return false; \
|
||||
\
|
||||
entry->value = new_value; \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key) \
|
||||
{ \
|
||||
return PFX##_impl_get_entry(_map_, key) != NULL; \
|
||||
|
||||
+16
-2
@@ -114,7 +114,7 @@
|
||||
FMOD void PFX##_free(SNAME *_map_); \
|
||||
/* Collection Input and Output */ \
|
||||
FMOD bool PFX##_insert(SNAME *_map_, K key, V value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value); \
|
||||
FMOD bool PFX##_remove(SNAME *_map_, K key, V *value); \
|
||||
/* Conditional Input and Output */ \
|
||||
FMOD bool PFX##_insert_if(SNAME *_map_, K key, V value, bool condition); \
|
||||
@@ -124,6 +124,7 @@
|
||||
FMOD bool PFX##_min(SNAME *_map_, K *key, V *value); \
|
||||
FMOD V PFX##_get(SNAME *_map_, K key); \
|
||||
FMOD V *PFX##_get_ref(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value); \
|
||||
/* Collection State */ \
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_empty(SNAME *_map_); \
|
||||
@@ -321,13 +322,14 @@
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value) \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value) \
|
||||
{ \
|
||||
SNAME##_node *node = PFX##_impl_get_node(_map_, key); \
|
||||
\
|
||||
if (!node) \
|
||||
return false; \
|
||||
\
|
||||
*old_value = node->value; \
|
||||
node->value = new_value; \
|
||||
\
|
||||
return true; \
|
||||
@@ -526,6 +528,18 @@
|
||||
return &(node->value); \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value) \
|
||||
{ \
|
||||
SNAME##_node *node = PFX##_impl_get_node(_map_, key); \
|
||||
\
|
||||
if (!node) \
|
||||
return false; \
|
||||
\
|
||||
node->value = new_value; \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key) \
|
||||
{ \
|
||||
SNAME##_node *scan = _map_->root; \
|
||||
|
||||
+72
-21
@@ -179,8 +179,8 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
FMOD void PFX##_free(SNAME *_map_); \
|
||||
/* Collection Input and Output */ \
|
||||
FMOD bool PFX##_insert(SNAME *_map_, K key, V value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value); \
|
||||
FMOD size_t PFX##_update_all(SNAME *_map_, K key, V new_value); \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value); \
|
||||
FMOD size_t PFX##_update_all(SNAME *_map_, K key, V new_value, V **old_values); \
|
||||
FMOD bool PFX##_remove(SNAME *_map_, K key, V *value); \
|
||||
FMOD size_t PFX##_remove_all(SNAME *_map_, K key); \
|
||||
/* Conditional Input and Output */ \
|
||||
@@ -191,6 +191,8 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
FMOD bool PFX##_min(SNAME *_map_, K *key, V *value); \
|
||||
FMOD V PFX##_get(SNAME *_map_, K key); \
|
||||
FMOD V *PFX##_get_ref(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value); \
|
||||
FMOD size_t PFX##_set_all(SNAME *_map_, K key, V new_value); \
|
||||
/* Collection State */ \
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key); \
|
||||
FMOD bool PFX##_empty(SNAME *_map_); \
|
||||
@@ -356,43 +358,57 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value) \
|
||||
FMOD bool PFX##_update(SNAME *_map_, K key, V new_value, V *old_value) \
|
||||
{ \
|
||||
size_t hash = _map_->hash(key); \
|
||||
SNAME##_entry *entry = PFX##_impl_get_entry(_map_, key); \
|
||||
\
|
||||
SNAME##_entry *entry = _map_->buffer[hash % _map_->capacity][0]; \
|
||||
if (!entry) \
|
||||
return false; \
|
||||
\
|
||||
while (entry != NULL) \
|
||||
{ \
|
||||
if (_map_->cmp(entry->key, key) == 0) \
|
||||
{ \
|
||||
entry->value = new_value; \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
entry = entry->next; \
|
||||
} \
|
||||
*old_value = entry->value; \
|
||||
entry->value = new_value; \
|
||||
\
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
FMOD size_t PFX##_update_all(SNAME *_map_, K key, V new_value) \
|
||||
FMOD size_t PFX##_update_all(SNAME *_map_, K key, V new_value, V **old_values) \
|
||||
{ \
|
||||
size_t hash = _map_->hash(key); \
|
||||
\
|
||||
SNAME##_entry *entry = _map_->buffer[hash % _map_->capacity][0]; \
|
||||
SNAME##_entry *bucket = _map_->buffer[hash % _map_->capacity][0]; \
|
||||
SNAME##_entry *entry = bucket; \
|
||||
\
|
||||
size_t total = 0; \
|
||||
\
|
||||
while (entry != NULL) \
|
||||
{ \
|
||||
if (_map_->cmp(entry->key, key) == 0) \
|
||||
{ \
|
||||
entry->value = new_value; \
|
||||
\
|
||||
total++; \
|
||||
\
|
||||
entry = entry->next; \
|
||||
} \
|
||||
\
|
||||
if (total == 0) \
|
||||
return total; \
|
||||
\
|
||||
*old_values = malloc(sizeof(V) * total); \
|
||||
\
|
||||
if (!(*old_values)) \
|
||||
return false; \
|
||||
\
|
||||
entry = bucket; \
|
||||
size_t index = 0; \
|
||||
\
|
||||
while (entry != NULL) \
|
||||
{ \
|
||||
if (_map_->cmp(entry->key, key) == 0) \
|
||||
{ \
|
||||
(*old_values)[index++] = entry->value; \
|
||||
\
|
||||
entry->value = new_value; \
|
||||
} \
|
||||
\
|
||||
entry = entry->next; \
|
||||
} \
|
||||
\
|
||||
return total; \
|
||||
@@ -607,6 +623,41 @@ static const size_t cmc_hashtable_primes[] = {53, 97, 191, 383, 769, 1531,
|
||||
return &(entry->value); \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_set(SNAME *_map_, K key, V new_value) \
|
||||
{ \
|
||||
SNAME##_entry *entry = PFX##_impl_get_entry(_map_, key); \
|
||||
\
|
||||
if (!entry) \
|
||||
return false; \
|
||||
\
|
||||
entry->value = new_value; \
|
||||
\
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
FMOD size_t PFX##_set_all(SNAME *_map_, K key, V new_value) \
|
||||
{ \
|
||||
size_t hash = _map_->hash(key); \
|
||||
\
|
||||
SNAME##_entry *entry = _map_->buffer[hash % _map_->capacity][0]; \
|
||||
\
|
||||
size_t total = 0; \
|
||||
\
|
||||
while (entry != NULL) \
|
||||
{ \
|
||||
if (_map_->cmp(entry->key, key) == 0) \
|
||||
{ \
|
||||
entry->value = new_value; \
|
||||
\
|
||||
total++; \
|
||||
} \
|
||||
\
|
||||
entry = entry->next; \
|
||||
} \
|
||||
\
|
||||
return total; \
|
||||
} \
|
||||
\
|
||||
FMOD bool PFX##_contains(SNAME *_map_, K key) \
|
||||
{ \
|
||||
return PFX##_impl_get_entry(_map_, key) != NULL; \
|
||||
|
||||
Reference in new issue
Block a user