summaryrefslogtreecommitdiffhomepage
path: root/include/stc/cmap.h
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-01-03 17:22:47 +0100
committerTyge Løvset <[email protected]>2023-01-03 17:22:47 +0100
commitbb754d1e0e728c6b0f41efff16e512af04a0b3b8 (patch)
treee5ef7293059aee287d3513593fb93c9fadda9a16 /include/stc/cmap.h
parent611b45c379af5d690b3a01d1847950411ebce2bd (diff)
downloadSTC-modified-bb754d1e0e728c6b0f41efff16e512af04a0b3b8.tar.gz
STC-modified-bb754d1e0e728c6b0f41efff16e512af04a0b3b8.zip
- Removed nomem_error member in csmap and cmap_X_result; test for res.ref == NULL instead!
- Corrected handling of malloc/realloc failure in both csmap/cmap.
Diffstat (limited to 'include/stc/cmap.h')
-rw-r--r--include/stc/cmap.h23
1 files changed, 14 insertions, 9 deletions
diff --git a/include/stc/cmap.h b/include/stc/cmap.h
index 1d0583f4..86f551aa 100644
--- a/include/stc/cmap.h
+++ b/include/stc/cmap.h
@@ -312,11 +312,12 @@ STC_DEF void _cx_memb(_clear)(_cx_self* self) {
STC_DEF _cx_result
_cx_memb(_insert_or_assign)(_cx_self* self, i_key _key, i_val _mapped) {
_cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto((&_key)));
+ _cx_mapped* _mp = _res.ref ? &_res.ref->second : &_mapped;
if (_res.inserted)
_res.ref->first = _key;
- else
- { i_keydrop((&_key)); i_valdrop((&_res.ref->second)); }
- _res.ref->second = _mapped;
+ else
+ { i_keydrop((&_key)); i_valdrop(_mp); }
+ *_mp = _mapped;
return _res;
}
@@ -326,8 +327,10 @@ STC_DEF void _cx_memb(_clear)(_cx_self* self) {
_cx_result _res = _cx_memb(_insert_entry_)(self, rkey);
if (_res.inserted)
_res.ref->first = i_keyfrom(rkey);
- else
- { i_valdrop((&_res.ref->second)); }
+ else {
+ if (!_res.ref) return _res;
+ i_valdrop((&_res.ref->second));
+ }
_res.ref->second = i_valfrom(rmapped);
return _res;
}
@@ -354,12 +357,14 @@ _cx_memb(_bucket_)(const _cx_self* self, const _cx_rawkey* rkeyptr) {
STC_DEF _cx_result
_cx_memb(_insert_entry_)(_cx_self* self, _cx_rawkey rkey) {
- bool nomem = false;
+ _cx_result res = {NULL};
if (self->size + 2 > (i_size)((float)self->bucket_count * (i_max_load_factor)))
- nomem = !_cx_memb(_reserve)(self, self->size*3/2);
+ if (!_cx_memb(_reserve)(self, self->size*3/2))
+ return res;
+
chash_bucket_t b = _cx_memb(_bucket_)(self, &rkey);
- _cx_result res = {&self->table[b.idx], !self->_hashx[b.idx], nomem};
- if (res.inserted) {
+ res.ref = &self->table[b.idx];
+ if ((res.inserted = !self->_hashx[b.idx])) {
self->_hashx[b.idx] = b.hx;
++self->size;
}