HashSet no longer depends on ITER

This commit is contained in:
Leonardo Vencovsky committed 2020-07-06 22:38:15 -03:00
1 parent f1ab010701
commit b6343b4857
4 files changed
+98 -61

No files matched your search

+4
View File
@@ -487,6 +487,8 @@
*key = max_key; \
if (value) \
*value = max_val; \
\
_map_->flag = CMC_FLAG_OK; \
\
CMC_CALLBACKS_CALL(_map_, read); \
\
@@ -527,6 +529,8 @@
*key = min_key; \
if (value) \
*value = min_val; \
\
_map_->flag = CMC_FLAG_OK; \
\
CMC_CALLBACKS_CALL(_map_, read); \
\
+47 -34
View File
@@ -378,19 +378,23 @@
return false; \
} \
\
bool first = true; \
V max_val = (V){ 0 }; \
struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
\
/* TODO turn this into a normal loop */ \
for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
for (size_t i = 0; i < _set_->capacity; i++) \
{ \
V result = CMC_(PFX, _iter_value)(&iter); \
size_t index = CMC_(PFX, _iter_index)(&iter); \
\
if (index == 0) \
max_val = result; \
else if (_set_->f_val->cmp(result, max_val) > 0) \
max_val = result; \
if (_set_->buffer[i].state == CMC_ES_FILLED) \
{ \
if (first) \
{ \
max_val = _set_->buffer[i].value; \
first = false; \
} \
else if (_set_->f_val->cmp(_set_->buffer[i].value, max_val) > 0) \
{ \
max_val = _set_->buffer[i].value; \
} \
} \
} \
\
if (value) \
@@ -411,19 +415,23 @@
return false; \
} \
\
bool first = true; \
V min_val = (V){ 0 }; \
struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
\
/* TODO turn this into a normal loop */ \
for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
for (size_t i = 0; i < _set_->capacity; i++) \
{ \
V result = CMC_(PFX, _iter_value)(&iter); \
size_t index = CMC_(PFX, _iter_index)(&iter); \
\
if (index == 0) \
min_val = result; \
else if (_set_->f_val->cmp(result, min_val) < 0) \
min_val = result; \
if (_set_->buffer[i].state == CMC_ES_FILLED) \
{ \
if (first) \
{ \
min_val = _set_->buffer[i].value; \
first = false; \
} \
else if (_set_->f_val->cmp(_set_->buffer[i].value, min_val) < 0) \
{ \
min_val = _set_->buffer[i].value; \
} \
} \
} \
\
if (value) \
@@ -513,15 +521,15 @@
return false; \
} \
\
struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set_); \
\
/* TODO turn this into a normal loop */ \
for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
for (size_t i = 0; i < _set_->capacity; i++) \
{ \
V value = CMC_(PFX, _iter_value)(&iter); \
if (_set_->buffer[i].state == CMC_ES_FILLED) \
{ \
V value = _set_->buffer[i].value; \
\
/* TODO check for error */ \
CMC_(PFX, _insert)(_new_set_, value); \
/* TODO check this for possible errors */ \
CMC_(PFX, _insert)(_new_set_, value); \
} \
} \
\
/* Unlikely */ \
@@ -606,16 +614,21 @@
if (_set1_->count != _set2_->count) \
return false; \
\
if (_set1_->count == 0) \
return true; \
/* Optimize loop using the smallest hashtable */ \
struct SNAME *_set_a_; \
struct SNAME *_set_b_; \
\
struct CMC_DEF_ITER(SNAME) iter = CMC_(PFX, _iter_start)(_set1_); \
_set_a_ = _set1_->capacity < _set2_->capacity ? _set1_ : _set2_; \
_set_b_ = _set_a_ == _set1_ ? _set2_ : _set1_; \
\
/* TODO optimize this loop */ \
for (; !CMC_(PFX, _iter_at_end)(&iter); CMC_(PFX, _iter_next)(&iter)) \
for (size_t i = 0; i < _set_a_->capacity; i++) \
{ \
if (CMC_(PFX, _impl_get_entry)(_set2_, CMC_(PFX, _iter_value)(&iter)) == NULL) \
return false; \
if (_set_a_->buffer[i].state == CMC_ES_FILLED) \
{ \
\
if (!CMC_(PFX, _impl_get_entry)(_set_b_, _set_a_->buffer[i].value))\
return false;\
} \
} \
\
return true; \