Added callbacks to multimap and multiset, removed enabled flag and more
The enabled flag from the previous commit was removed because it seemed pointless PFX##_customize functions were changed, now callbacks can be NULL but not allloc_node Added more code to callback test Added some missing functions and changed some others Added more TODO comments of missing code checks or possible improvements Added more callback guards for set functions
This commit is contained in:
1 parent
fcb8f3a005
commit
2c732dbadf
27 files changed
+1703
-1209
No files matched your search
+16
-24
@@ -411,11 +411,12 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
void PFX##_customize(struct SNAME *_map_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_map_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_map_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_map_->callbacks = callbacks; \
|
||||
_map_->callbacks = callbacks; \
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -459,8 +460,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
_map_->count++; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->create) \
|
||||
if (_map_->callbacks && _map_->callbacks->create) \
|
||||
_map_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -518,8 +518,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->update) \
|
||||
if (_map_->callbacks && _map_->callbacks->update) \
|
||||
_map_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -578,8 +577,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->update) \
|
||||
if (_map_->callbacks && _map_->callbacks->update) \
|
||||
_map_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -626,8 +624,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
_map_->count--; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->delete) \
|
||||
if (_map_->callbacks && _map_->callbacks->delete) \
|
||||
_map_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -674,8 +671,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
_map_->count--; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->delete) \
|
||||
if (_map_->callbacks && _map_->callbacks->delete) \
|
||||
_map_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -694,8 +690,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->read) \
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return (*entry)->key; \
|
||||
@@ -714,8 +709,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->read) \
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return (*entry)->value; \
|
||||
@@ -727,8 +721,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
bool result = PFX##_impl_get_entry_by_key(_map_, key) != NULL; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->read) \
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -740,8 +733,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
bool result = PFX##_impl_get_entry_by_val(_map_, val) != NULL; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->read) \
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -804,9 +796,10 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
/* No callbacks since _new_map_ is just a temporary hashtable */ \
|
||||
struct SNAME *_new_map_ = \
|
||||
PFX##_new_custom(capacity, _map_->load, _map_->f_key, \
|
||||
_map_->f_val, _map_->alloc, _map_->callbacks); \
|
||||
_map_->f_val, _map_->alloc, NULL); \
|
||||
\
|
||||
if (!_new_map_) \
|
||||
{ \
|
||||
@@ -859,8 +852,7 @@ static const char *cmc_string_fmt_bidimap = "struct %s<%s, %s> "
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->enabled && \
|
||||
_map_->callbacks->resize) \
|
||||
if (_map_->callbacks && _map_->callbacks->resize) \
|
||||
_map_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
|
||||
+12
-19
@@ -324,11 +324,12 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_deque_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_deque_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_deque_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_deque_->callbacks = callbacks; \
|
||||
_deque_->callbacks = callbacks; \
|
||||
\
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -349,8 +350,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
_deque_->count++; \
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->create) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->create) \
|
||||
_deque_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -372,8 +372,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
_deque_->count++; \
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->create) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->create) \
|
||||
_deque_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -396,8 +395,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
_deque_->count--; \
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->delete) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->delete) \
|
||||
_deque_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -419,8 +417,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
_deque_->count--; \
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->delete) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->delete) \
|
||||
_deque_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -436,8 +433,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
\
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->read) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->read) \
|
||||
_deque_->callbacks->read(); \
|
||||
\
|
||||
return _deque_->buffer[_deque_->front]; \
|
||||
@@ -453,8 +449,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
\
|
||||
_deque_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->read) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->read) \
|
||||
_deque_->callbacks->read(); \
|
||||
\
|
||||
return _deque_->buffer[(_deque_->back == 0) ? _deque_->capacity - 1 \
|
||||
@@ -478,8 +473,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
i = (i + 1) % _deque_->capacity; \
|
||||
} \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->read) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->read) \
|
||||
_deque_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -547,8 +541,7 @@ static const char *cmc_string_fmt_deque = "struct %s<%s> "
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_deque_->callbacks && _deque_->callbacks->enabled && \
|
||||
_deque_->callbacks->resize) \
|
||||
if (_deque_->callbacks && _deque_->callbacks->resize) \
|
||||
_deque_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
|
||||
+933
-957
File diff suppressed because it is too large.
Load diff
+30
-50
@@ -367,11 +367,12 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_set_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_set_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_set_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_set_->callbacks = callbacks; \
|
||||
_set_->callbacks = callbacks; \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -435,8 +436,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
_set_->count++; \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->create) \
|
||||
if (_set_->callbacks && _set_->callbacks->create) \
|
||||
_set_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -465,8 +465,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
_set_->count--; \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->delete) \
|
||||
if (_set_->callbacks && _set_->callbacks->delete) \
|
||||
_set_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -501,8 +500,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->read) \
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -537,8 +535,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->read) \
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -550,8 +547,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
bool result = PFX##_impl_get_entry(_set_, element) != NULL; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->read) \
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -614,9 +610,9 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *_new_set_ = \
|
||||
PFX##_new_custom(capacity, _set_->load, _set_->f_val, \
|
||||
_set_->alloc, _set_->callbacks); \
|
||||
/* No callbacks since _new_set_ is just a temporary hashtable */ \
|
||||
struct SNAME *_new_set_ = PFX##_new_custom( \
|
||||
capacity, _set_->load, _set_->f_val, _set_->alloc, NULL); \
|
||||
\
|
||||
if (!_new_set_) \
|
||||
{ \
|
||||
@@ -626,9 +622,6 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
struct SNAME##_iter iter; \
|
||||
\
|
||||
if (_set_->callbacks) \
|
||||
_set_->callbacks->enabled = false; \
|
||||
\
|
||||
/* TODO turn this into a normal loop */ \
|
||||
for (PFX##_iter_init(&iter, _set_); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
@@ -639,12 +632,12 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_insert(_new_set_, value); \
|
||||
} \
|
||||
\
|
||||
if (_set_->callbacks) \
|
||||
_set_->callbacks->enabled = true; \
|
||||
\
|
||||
/* Unlikely */ \
|
||||
if (_set_->count != _new_set_->count) \
|
||||
{ \
|
||||
PFX##_free(_new_set_); \
|
||||
\
|
||||
_set_->flag = cmc_flags.ERROR; \
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
@@ -660,8 +653,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->enabled && \
|
||||
_set_->callbacks->resize) \
|
||||
if (_set_->callbacks && _set_->callbacks->resize) \
|
||||
_set_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -768,9 +760,10 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
\
|
||||
struct SNAME *PFX##_union(struct SNAME *_set1_, struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
{ \
|
||||
@@ -783,9 +776,6 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_iter_init(&iter1, _set1_); \
|
||||
PFX##_iter_init(&iter2, _set2_); \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = false; \
|
||||
\
|
||||
/* TODO turn this into a normal loop and check for errors */ \
|
||||
for (PFX##_iter_to_start(&iter1); !PFX##_iter_end(&iter1); \
|
||||
PFX##_iter_next(&iter1)) \
|
||||
@@ -799,8 +789,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_insert(_set_r_, PFX##_iter_value(&iter2)); \
|
||||
} \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = true; \
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
@@ -808,9 +797,10 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
struct SNAME *PFX##_intersection(struct SNAME *_set1_, \
|
||||
struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
{ \
|
||||
@@ -826,9 +816,6 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
struct SNAME##_iter iter; \
|
||||
PFX##_iter_init(&iter, _set_A_); \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = false; \
|
||||
\
|
||||
for (PFX##_iter_to_start(&iter); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -838,17 +825,17 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_insert(_set_r_, value); \
|
||||
} \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = true; \
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_difference(struct SNAME *_set1_, struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
{ \
|
||||
@@ -860,9 +847,6 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
struct SNAME##_iter iter; \
|
||||
PFX##_iter_init(&iter, _set1_); \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = false; \
|
||||
\
|
||||
for (PFX##_iter_to_start(&iter); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -872,8 +856,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_insert(_set_r_, value); \
|
||||
} \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = true; \
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
@@ -881,11 +864,10 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
struct SNAME *PFX##_symmetric_difference(struct SNAME *_set1_, \
|
||||
struct SNAME *_set2_) \
|
||||
{ \
|
||||
struct SNAME##_iter iter1, iter2; \
|
||||
\
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
{ \
|
||||
@@ -894,12 +876,11 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
return NULL; \
|
||||
} \
|
||||
\
|
||||
struct SNAME##_iter iter1, iter2; \
|
||||
\
|
||||
PFX##_iter_init(&iter1, _set1_); \
|
||||
PFX##_iter_init(&iter2, _set2_); \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = false; \
|
||||
\
|
||||
for (PFX##_iter_to_start(&iter1); !PFX##_iter_end(&iter1); \
|
||||
PFX##_iter_next(&iter1)) \
|
||||
{ \
|
||||
@@ -918,8 +899,7 @@ static const char *cmc_string_fmt_hashset = "struct %s<%s> "
|
||||
PFX##_insert(_set_r_, value); \
|
||||
} \
|
||||
\
|
||||
if (_set_r_->callbacks) \
|
||||
_set_r_->callbacks->enabled = true; \
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
|
||||
+9
-13
@@ -333,11 +333,12 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_heap_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_heap_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_heap_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_heap_->callbacks = callbacks; \
|
||||
_heap_->callbacks = callbacks; \
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -359,8 +360,7 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->create) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->create) \
|
||||
_heap_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -383,8 +383,7 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->delete) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->delete) \
|
||||
_heap_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -400,8 +399,7 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->read) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->read) \
|
||||
_heap_->callbacks->read(); \
|
||||
\
|
||||
return _heap_->buffer[0]; \
|
||||
@@ -422,8 +420,7 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->read) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->read) \
|
||||
_heap_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -483,8 +480,7 @@ static const char *cmc_string_fmt_heap = "struct %s<%s> "
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->resize) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->resize) \
|
||||
_heap_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
|
||||
+13
-21
@@ -325,11 +325,12 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_heap_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_heap_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_heap_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_heap_->callbacks = callbacks; \
|
||||
_heap_->callbacks = callbacks; \
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -385,8 +386,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
/* else no float up required */ \
|
||||
} \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->create) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->create) \
|
||||
_heap_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -439,8 +439,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->delete) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->delete) \
|
||||
_heap_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -493,8 +492,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->delete) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->delete) \
|
||||
_heap_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -531,8 +529,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->update) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->update) \
|
||||
_heap_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -569,8 +566,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->update) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->update) \
|
||||
_heap_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -586,8 +582,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->read) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->read) \
|
||||
_heap_->callbacks->read(); \
|
||||
\
|
||||
/* If there is only one element, then the maximum element is the */ \
|
||||
@@ -608,8 +603,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->read) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->read) \
|
||||
_heap_->callbacks->read(); \
|
||||
\
|
||||
return _heap_->buffer[0].data[0]; \
|
||||
@@ -631,8 +625,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->read) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->read) \
|
||||
_heap_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -707,8 +700,7 @@ static const char *cmc_string_fmt_intervalheap = "struct %s<%s> "
|
||||
\
|
||||
_heap_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_heap_->callbacks && _heap_->callbacks->enabled && \
|
||||
_heap_->callbacks->resize) \
|
||||
if (_heap_->callbacks && _heap_->callbacks->resize) \
|
||||
_heap_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
|
||||
+15
-25
@@ -320,11 +320,12 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_list_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_list_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_list_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_list_->callbacks = callbacks; \
|
||||
_list_->callbacks = callbacks; \
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -351,8 +352,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count++; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -390,8 +390,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count++; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -419,8 +418,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count++; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -447,8 +445,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count--; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -490,8 +487,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count--; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -518,8 +514,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
_list_->count--; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -535,8 +530,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return _list_->head->value; \
|
||||
@@ -561,8 +555,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
if (scan == NULL) \
|
||||
return (V){ 0 }; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return scan->value; \
|
||||
@@ -587,8 +580,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
if (scan == NULL) \
|
||||
return NULL; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return &(scan->value); \
|
||||
@@ -604,8 +596,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return _list_->tail->value; \
|
||||
@@ -630,8 +621,7 @@ static const char *cmc_string_fmt_linkedlist = "struct %s<%s> "
|
||||
scan = scan->next; \
|
||||
} \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
|
||||
+22
-39
@@ -323,11 +323,12 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_list_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_list_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_list_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_list_->callbacks = callbacks; \
|
||||
_list_->callbacks = callbacks; \
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -351,8 +352,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count++; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -379,8 +379,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count++; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -397,8 +396,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->buffer[_list_->count++] = element; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -418,8 +416,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->buffer[--_list_->count] = (V){ 0 }; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -445,8 +442,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->buffer[--_list_->count] = (V){ 0 }; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -460,8 +456,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->buffer[--_list_->count] = (V){ 0 }; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -489,8 +484,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count += size; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -530,8 +524,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count += size; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -556,8 +549,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count += size; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->create) \
|
||||
if (_list_->callbacks && _list_->callbacks->create) \
|
||||
_list_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
@@ -588,8 +580,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->count -= to - from + 1; \
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
@@ -634,8 +625,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->enabled && _list_->callbacks->delete) \
|
||||
if (_list_->callbacks && _list_->callbacks->delete) \
|
||||
_list_->callbacks->delete (); \
|
||||
\
|
||||
return result; \
|
||||
@@ -651,8 +641,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return _list_->buffer[0]; \
|
||||
@@ -674,8 +663,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return _list_->buffer[index]; \
|
||||
@@ -697,8 +685,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return &(_list_->buffer[index]); \
|
||||
@@ -714,8 +701,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return _list_->buffer[_list_->count - 1]; \
|
||||
@@ -750,8 +736,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -772,8 +757,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->read) \
|
||||
if (_list_->callbacks && _list_->callbacks->read) \
|
||||
_list_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
@@ -836,8 +820,7 @@ static const char *cmc_string_fmt_list = "struct %s<%s> "
|
||||
_list_->buffer = new_buffer; \
|
||||
_list_->capacity = capacity; \
|
||||
\
|
||||
if (_list_->callbacks && _list_->callbacks->enabled && \
|
||||
_list_->callbacks->resize) \
|
||||
if (_list_->callbacks && _list_->callbacks->resize) \
|
||||
_list_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
|
||||
+58
-10
@@ -456,11 +456,12 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
void PFX##_customize(struct SNAME *_map_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_map_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_map_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_map_->callbacks = callbacks; \
|
||||
_map_->callbacks = callbacks; \
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -494,6 +495,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
_map_->count++; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->create) \
|
||||
_map_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -520,6 +524,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->update) \
|
||||
_map_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -580,6 +587,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->update) \
|
||||
_map_->callbacks->update(); \
|
||||
\
|
||||
return index; \
|
||||
} \
|
||||
\
|
||||
@@ -663,6 +673,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
_map_->count--; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->delete) \
|
||||
_map_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -754,6 +767,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
_map_->count -= index; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->delete) \
|
||||
_map_->callbacks->delete (); \
|
||||
\
|
||||
return index; \
|
||||
} \
|
||||
\
|
||||
@@ -770,6 +786,7 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
struct SNAME##_iter iter; \
|
||||
\
|
||||
/* TODO Turn this into a normal loop */ \
|
||||
for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -796,6 +813,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -812,6 +832,7 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
struct SNAME##_iter iter; \
|
||||
\
|
||||
/* TODO Turn this into a normal loop */ \
|
||||
for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -838,6 +859,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -859,6 +883,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return entry->value; \
|
||||
} \
|
||||
\
|
||||
@@ -880,6 +907,9 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return &(entry->value); \
|
||||
} \
|
||||
\
|
||||
@@ -887,7 +917,12 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
{ \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
return PFX##_impl_get_entry(_map_, key) != NULL; \
|
||||
bool result = PFX##_impl_get_entry(_map_, key) != NULL; \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->read) \
|
||||
_map_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
} \
|
||||
\
|
||||
bool PFX##_empty(struct SNAME *_map_) \
|
||||
@@ -930,10 +965,10 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_map_->capacity == capacity) \
|
||||
return true; \
|
||||
goto success; \
|
||||
\
|
||||
if (_map_->capacity > capacity / _map_->load) \
|
||||
return true; \
|
||||
goto success; \
|
||||
\
|
||||
/* Prevent integer overflow */ \
|
||||
if (capacity >= UINTMAX_MAX * _map_->load) \
|
||||
@@ -952,9 +987,10 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
/* No callbacks since _new_map_ is just a temporary hashtable */ \
|
||||
struct SNAME *_new_map_ = \
|
||||
PFX##_new_custom(capacity, _map_->load, _map_->f_key, \
|
||||
_map_->f_val, _map_->alloc, _map_->callbacks); \
|
||||
_map_->f_val, _map_->alloc, NULL); \
|
||||
\
|
||||
if (!_new_map_) \
|
||||
{ \
|
||||
@@ -964,12 +1000,14 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
struct SNAME##_iter iter; \
|
||||
\
|
||||
/* TODO Turn this into a normal loop */ \
|
||||
for (PFX##_iter_init(&iter, _map_); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
K key = PFX##_iter_key(&iter); \
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
/* TODO check for errors */ \
|
||||
PFX##_insert(_new_map_, key, value); \
|
||||
} \
|
||||
\
|
||||
@@ -991,14 +1029,20 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
PFX##_free(_new_map_); \
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_map_->callbacks && _map_->callbacks->resize) \
|
||||
_map_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_copy_of(struct SNAME *_map_) \
|
||||
{ \
|
||||
struct SNAME *result = PFX##_new_custom( \
|
||||
_map_->capacity * _map_->load, _map_->load, _map_->f_key, \
|
||||
_map_->f_val, _map_->alloc, _map_->callbacks); \
|
||||
/* Callback will be added later */ \
|
||||
struct SNAME *result = \
|
||||
PFX##_new_custom(_map_->capacity * _map_->load, _map_->load, \
|
||||
_map_->f_key, _map_->f_val, _map_->alloc, NULL); \
|
||||
\
|
||||
if (!result) \
|
||||
{ \
|
||||
@@ -1011,6 +1055,7 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
\
|
||||
if (!PFX##_empty(_map_)) \
|
||||
{ \
|
||||
/* TODO Turn this into a normal loop */ \
|
||||
for (PFX##_iter_to_start(&iter); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -1022,10 +1067,12 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
if (_map_->f_val->cpy) \
|
||||
value = _map_->f_val->cpy(value); \
|
||||
\
|
||||
/* TODO check for errors */ \
|
||||
PFX##_insert(result, key, value); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
result->callbacks = _map_->callbacks; \
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
\
|
||||
return result; \
|
||||
@@ -1042,6 +1089,7 @@ static const char *cmc_string_fmt_multimap = "struct %s<%s, %s> "
|
||||
struct SNAME##_iter iter; \
|
||||
PFX##_iter_init(&iter, _map1_); \
|
||||
\
|
||||
/* TODO Turn this into a normal loop */ \
|
||||
for (PFX##_iter_to_start(&iter); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
|
||||
+98
-34
@@ -243,6 +243,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
#define CMC_GENERATE_MULTISET_SOURCE(PFX, SNAME, V) \
|
||||
\
|
||||
/* Implementation Detail Functions */ \
|
||||
static size_t PFX##_impl_multiplicity_of(struct SNAME *_set_, V element); \
|
||||
static struct SNAME##_entry *PFX##_impl_insert_and_return( \
|
||||
struct SNAME *_set_, V element, bool *new_node); \
|
||||
static struct SNAME##_entry *PFX##_impl_get_entry(struct SNAME *_set_, \
|
||||
@@ -387,11 +388,12 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_set_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_set_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_set_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_set_->callbacks = callbacks; \
|
||||
_set_->callbacks = callbacks; \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
@@ -415,16 +417,16 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
_set_->cardinality++; \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->create) \
|
||||
_set_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
bool PFX##_insert_many(struct SNAME *_set_, V element, size_t count) \
|
||||
{ \
|
||||
if (count == 0) \
|
||||
{ \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
return true; \
|
||||
} \
|
||||
goto success; \
|
||||
\
|
||||
bool new_node; \
|
||||
\
|
||||
@@ -443,8 +445,14 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
entry->multiplicity += count; \
|
||||
\
|
||||
_set_->cardinality += count; \
|
||||
\
|
||||
success: \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->create) \
|
||||
_set_->callbacks->create(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -456,11 +464,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
struct SNAME##_entry *result = \
|
||||
PFX##_impl_get_entry(_set_, element); \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (!result) \
|
||||
/* If no entry was found then its multiplicity is already 0 */ \
|
||||
return true; \
|
||||
goto success; \
|
||||
\
|
||||
_set_->count--; \
|
||||
_set_->cardinality -= result->multiplicity; \
|
||||
@@ -470,7 +476,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
result->dist = 0; \
|
||||
result->state = CMC_ES_DELETED; \
|
||||
\
|
||||
return true; \
|
||||
goto success; \
|
||||
} \
|
||||
\
|
||||
bool new_node; \
|
||||
@@ -489,8 +495,13 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
entry->multiplicity = multiplicity; \
|
||||
\
|
||||
success: \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->update) \
|
||||
_set_->callbacks->update(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -525,6 +536,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
_set_->cardinality--; \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->delete) \
|
||||
_set_->callbacks->delete (); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -555,6 +569,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
_set_->cardinality -= removed; \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->delete) \
|
||||
_set_->callbacks->delete (); \
|
||||
\
|
||||
return removed; \
|
||||
} \
|
||||
\
|
||||
@@ -587,6 +604,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -619,6 +639,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -628,6 +651,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
if (!entry) \
|
||||
return 0; \
|
||||
\
|
||||
@@ -638,7 +664,12 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
{ \
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
return PFX##_impl_get_entry(_set_, element) != NULL; \
|
||||
bool result = PFX##_impl_get_entry(_set_, element) != NULL; \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->read) \
|
||||
_set_->callbacks->read(); \
|
||||
\
|
||||
return result; \
|
||||
} \
|
||||
\
|
||||
bool PFX##_empty(struct SNAME *_set_) \
|
||||
@@ -681,10 +712,10 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
\
|
||||
if (_set_->capacity == capacity) \
|
||||
return true; \
|
||||
goto success; \
|
||||
\
|
||||
if (_set_->capacity > capacity / _set_->load) \
|
||||
return true; \
|
||||
goto success; \
|
||||
\
|
||||
/* Prevent integer overflow */ \
|
||||
if (capacity >= UINTMAX_MAX * _set_->load) \
|
||||
@@ -703,9 +734,9 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *_new_set_ = \
|
||||
PFX##_new_custom(capacity, _set_->load, _set_->f_val, \
|
||||
_set_->alloc, _set_->callbacks); \
|
||||
/* No callbacks since _new_set_ is just a temporary hashtable */ \
|
||||
struct SNAME *_new_set_ = PFX##_new_custom( \
|
||||
capacity, _set_->load, _set_->f_val, _set_->alloc, NULL); \
|
||||
\
|
||||
if (!_new_set_) \
|
||||
{ \
|
||||
@@ -715,6 +746,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
struct SNAME##_iter iter; \
|
||||
\
|
||||
/* TODO transform this into a normal loop */ \
|
||||
for (PFX##_iter_init(&iter, _set_); !PFX##_iter_end(&iter); \
|
||||
PFX##_iter_next(&iter)) \
|
||||
{ \
|
||||
@@ -725,6 +757,8 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
if (_set_->count != _new_set_->count) \
|
||||
{ \
|
||||
PFX##_free(_new_set_); \
|
||||
\
|
||||
_set_->flag = cmc_flags.ERROR; \
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
@@ -738,6 +772,11 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
PFX##_free(_new_set_); \
|
||||
\
|
||||
success: \
|
||||
\
|
||||
if (_set_->callbacks && _set_->callbacks->resize) \
|
||||
_set_->callbacks->resize(); \
|
||||
\
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
@@ -811,7 +850,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
struct SNAME##_entry *entry = \
|
||||
PFX##_impl_get_entry(_set2_, PFX##_iter_value(&iter)); \
|
||||
\
|
||||
if (entry == NULL) \
|
||||
if (!entry) \
|
||||
return false; \
|
||||
\
|
||||
if (entry->multiplicity != PFX##_iter_multiplicity(&iter)) \
|
||||
@@ -852,9 +891,10 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
\
|
||||
struct SNAME *PFX##_union(struct SNAME *_set1_, struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
return NULL; \
|
||||
@@ -869,7 +909,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter1); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter1); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set2_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set2_, value); \
|
||||
size_t max_ = m1 > m2 ? m1 : m2; \
|
||||
\
|
||||
PFX##_update(_set_r_, value, max_); \
|
||||
@@ -880,22 +920,25 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
{ \
|
||||
V value = PFX##_iter_value(&iter2); \
|
||||
\
|
||||
size_t m1 = PFX##_multiplicity_of(_set1_, value); \
|
||||
size_t m1 = PFX##_impl_multiplicity_of(_set1_, value); \
|
||||
size_t m2 = PFX##_iter_multiplicity(&iter2); \
|
||||
size_t max_ = m1 > m2 ? m1 : m2; \
|
||||
\
|
||||
PFX##_update(_set_r_, value, max_); \
|
||||
} \
|
||||
\
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_intersection(struct SNAME *_set1_, \
|
||||
struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
return NULL; \
|
||||
@@ -913,20 +956,23 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set_B_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set_B_, value); \
|
||||
size_t max_ = m1 < m2 ? m1 : m2; \
|
||||
\
|
||||
PFX##_update(_set_r_, value, max_); \
|
||||
} \
|
||||
\
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_difference(struct SNAME *_set1_, struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
return NULL; \
|
||||
@@ -940,20 +986,23 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set2_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set2_, value); \
|
||||
\
|
||||
if (m1 > m2) \
|
||||
PFX##_update(_set_r_, value, m1 - m2); \
|
||||
} \
|
||||
\
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_summation(struct SNAME *_set1_, struct SNAME *_set2_) \
|
||||
{ \
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
return NULL; \
|
||||
@@ -976,21 +1025,24 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
PFX##_iter_multiplicity(&iter2)); \
|
||||
} \
|
||||
\
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
struct SNAME *PFX##_symmetric_difference(struct SNAME *_set1_, \
|
||||
struct SNAME *_set2_) \
|
||||
{ \
|
||||
struct SNAME##_iter iter1, iter2; \
|
||||
\
|
||||
/* Callbacks are added later */ \
|
||||
struct SNAME *_set_r_ = \
|
||||
PFX##_new_custom(_set1_->capacity, _set1_->load, _set1_->f_val, \
|
||||
_set1_->alloc, _set1_->callbacks); \
|
||||
_set1_->alloc, NULL); \
|
||||
\
|
||||
if (!_set_r_) \
|
||||
return NULL; \
|
||||
\
|
||||
struct SNAME##_iter iter1, iter2; \
|
||||
\
|
||||
PFX##_iter_init(&iter1, _set1_); \
|
||||
PFX##_iter_init(&iter2, _set2_); \
|
||||
\
|
||||
@@ -1000,7 +1052,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter1); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter1); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set2_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set2_, value); \
|
||||
\
|
||||
if (m1 != m2) \
|
||||
{ \
|
||||
@@ -1016,7 +1068,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
{ \
|
||||
V value = PFX##_iter_value(&iter2); \
|
||||
\
|
||||
size_t m1 = PFX##_multiplicity_of(_set1_, value); \
|
||||
size_t m1 = PFX##_impl_multiplicity_of(_set1_, value); \
|
||||
size_t m2 = PFX##_iter_multiplicity(&iter2); \
|
||||
\
|
||||
if (m1 != m2) \
|
||||
@@ -1028,6 +1080,8 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
} \
|
||||
} \
|
||||
\
|
||||
_set_r_->callbacks = _set1_->callbacks; \
|
||||
\
|
||||
return _set_r_; \
|
||||
} \
|
||||
\
|
||||
@@ -1049,7 +1103,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set2_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set2_, value); \
|
||||
\
|
||||
if (m1 > m2) \
|
||||
return false; \
|
||||
@@ -1086,7 +1140,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
size_t m1 = PFX##_iter_multiplicity(&iter); \
|
||||
size_t m2 = PFX##_multiplicity_of(_set2_, value); \
|
||||
size_t m2 = PFX##_impl_multiplicity_of(_set2_, value); \
|
||||
\
|
||||
if (m1 >= m2) \
|
||||
return false; \
|
||||
@@ -1114,7 +1168,7 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
{ \
|
||||
V value = PFX##_iter_value(&iter); \
|
||||
\
|
||||
if (PFX##_contains(_set2_, value)) \
|
||||
if (PFX##_impl_get_entry(_set2_, value) != NULL) \
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
@@ -1339,6 +1393,16 @@ static const char *cmc_string_fmt_multiset = "struct %s<%s> "
|
||||
return iter->index; \
|
||||
} \
|
||||
\
|
||||
static size_t PFX##_impl_multiplicity_of(struct SNAME *_set_, V element) \
|
||||
{ \
|
||||
struct SNAME##_entry *entry = PFX##_impl_get_entry(_set_, element); \
|
||||
\
|
||||
if (!entry) \
|
||||
return 0; \
|
||||
\
|
||||
return entry->multiplicity; \
|
||||
} \
|
||||
\
|
||||
static struct SNAME##_entry *PFX##_impl_insert_and_return( \
|
||||
struct SNAME *_set_, V element, bool *new_node) \
|
||||
{ \
|
||||
|
||||
+4
-3
@@ -334,11 +334,12 @@ static const char *cmc_string_fmt_queue = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_queue_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_queue_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_queue_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_queue_->callbacks = callbacks; \
|
||||
_queue_->callbacks = callbacks; \
|
||||
\
|
||||
_queue_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
|
||||
@@ -302,11 +302,12 @@ static const char *cmc_string_fmt_sortedlist = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_list_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_list_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_list_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_list_->callbacks = callbacks; \
|
||||
_list_->callbacks = callbacks; \
|
||||
\
|
||||
_list_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
|
||||
+4
-3
@@ -293,11 +293,12 @@ static const char *cmc_string_fmt_stack = "struct %s<%s> "
|
||||
void PFX##_customize(struct SNAME *_stack_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (alloc) \
|
||||
if (!alloc) \
|
||||
_stack_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_stack_->alloc = alloc; \
|
||||
\
|
||||
if (callbacks) \
|
||||
_stack_->callbacks = callbacks; \
|
||||
_stack_->callbacks = callbacks; \
|
||||
\
|
||||
_stack_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
|
||||
@@ -374,6 +374,18 @@ static const char *cmc_string_fmt_treemap = "struct %s<%s, %s> "
|
||||
PFX##_clear(_map_); \
|
||||
\
|
||||
_map_->alloc->free(_map_); \
|
||||
} \
|
||||
void PFX##_customize(struct SNAME *_map_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (!alloc) \
|
||||
_map_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_map_->alloc = alloc; \
|
||||
\
|
||||
_map_->callbacks = callbacks; \
|
||||
\
|
||||
_map_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
\
|
||||
bool PFX##_insert(struct SNAME *_map_, K key, V value) \
|
||||
|
||||
@@ -358,6 +358,19 @@ static const char *cmc_string_fmt_treeset = "struct %s<%s> "
|
||||
_set_->alloc->free(_set_); \
|
||||
} \
|
||||
\
|
||||
void PFX##_customize(struct SNAME *_set_, struct cmc_alloc_node *alloc, \
|
||||
struct cmc_callbacks *callbacks) \
|
||||
{ \
|
||||
if (!alloc) \
|
||||
_set_->alloc = &cmc_alloc_node_default; \
|
||||
else \
|
||||
_set_->alloc = alloc; \
|
||||
\
|
||||
_set_->callbacks = callbacks; \
|
||||
\
|
||||
_set_->flag = cmc_flags.OK; \
|
||||
} \
|
||||
\
|
||||
bool PFX##_insert(struct SNAME *_set_, V element) \
|
||||
{ \
|
||||
if (PFX##_empty(_set_)) \
|
||||
|
||||
@@ -62,12 +62,9 @@ static struct cmc_alloc_node
|
||||
* - update : an element in the collection was successfully updated
|
||||
* - delete : an element was successfully removed from the collection
|
||||
* - resize : the collection was full and successfully resized
|
||||
*
|
||||
* enabled : if true, callbacks will be called.
|
||||
*/
|
||||
struct cmc_callbacks
|
||||
{
|
||||
bool enabled;
|
||||
void (*create)(void);
|
||||
void (*read)(void);
|
||||
void (*update)(void);
|
||||
|
||||
@@ -543,6 +543,8 @@ CMC_CREATE_UNIT(bidimap_test, true, {
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
|
||||
cmc_assert(bm_insert(map, 1, 2));
|
||||
cmc_assert_equals(int32_t, 3, total_create);
|
||||
|
||||
cmc_assert_equals(size_t, 1, bm_get_key(map, 2));
|
||||
cmc_assert_equals(int32_t, 1, total_read);
|
||||
|
||||
@@ -561,6 +563,39 @@ CMC_CREATE_UNIT(bidimap_test, true, {
|
||||
cmc_assert(bm_contains_val(map, 2));
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
|
||||
cmc_assert_equals(int32_t, 3, total_create);
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
bm_customize(map, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
bm_clear(map);
|
||||
cmc_assert(bm_insert(map, 10, 10));
|
||||
cmc_assert(bm_update_key(map, 10, 5));
|
||||
cmc_assert(bm_update_val(map, 5, 5));
|
||||
cmc_assert(bm_insert(map, 10, 10));
|
||||
cmc_assert(bm_remove_by_key(map, 5, NULL, NULL));
|
||||
cmc_assert(bm_remove_by_val(map, 10, NULL, NULL));
|
||||
cmc_assert(bm_insert(map, 1, 2));
|
||||
cmc_assert_equals(size_t, 1, bm_get_key(map, 2));
|
||||
cmc_assert_equals(size_t, 2, bm_get_val(map, 1));
|
||||
cmc_assert(bm_resize(map, 1000));
|
||||
cmc_assert(bm_resize(map, 200));
|
||||
cmc_assert(bm_contains_key(map, 1));
|
||||
cmc_assert(bm_contains_val(map, 2));
|
||||
|
||||
cmc_assert_equals(int32_t, 3, total_create);
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
bm_free(map);
|
||||
});
|
||||
});
|
||||
@@ -772,6 +772,44 @@ CMC_CREATE_UNIT(deque_test, true, {
|
||||
cmc_assert(!d_contains(d, 1));
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
|
||||
cmc_assert(d_resize(d, 1000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(d_resize(d, 10));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
d_customize(d, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, d->callbacks);
|
||||
|
||||
d_clear(d);
|
||||
cmc_assert(d_push_front(d, 10));
|
||||
cmc_assert(d_push_back(d, 10));
|
||||
cmc_assert(d_pop_front(d));
|
||||
cmc_assert(d_pop_back(d));
|
||||
cmc_assert(d_push_front(d, 10));
|
||||
cmc_assert(d_push_front(d, 5));
|
||||
cmc_assert_equals(size_t, 5, d_front(d));
|
||||
cmc_assert_equals(size_t, 10, d_back(d));
|
||||
cmc_assert(d_contains(d, 10));
|
||||
cmc_assert(!d_contains(d, 1));
|
||||
cmc_assert(d_resize(d, 1000));
|
||||
cmc_assert(d_resize(d, 10));
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, d->callbacks);
|
||||
|
||||
d_free(d);
|
||||
});
|
||||
});
|
||||
@@ -640,6 +640,43 @@ CMC_CREATE_UNIT(hashmap_test, true, {
|
||||
cmc_assert(hm_contains(map, 1));
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
|
||||
cmc_assert(hm_resize(map, 10000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(hm_resize(map, 500));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 1, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
hm_customize(map, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
hm_clear(map);
|
||||
cmc_assert(hm_insert(map, 1, 2));
|
||||
cmc_assert(hm_update(map, 1, 10, NULL));
|
||||
cmc_assert(hm_remove(map, 1, NULL));
|
||||
cmc_assert(hm_insert(map, 1, 2));
|
||||
cmc_assert(hm_max(map, NULL, NULL));
|
||||
cmc_assert(hm_min(map, NULL, NULL));
|
||||
cmc_assert_equals(size_t, 2, hm_get(map, 1));
|
||||
cmc_assert_not_equals(ptr, NULL, hm_get_ref(map, 1));
|
||||
cmc_assert(hm_contains(map, 1));
|
||||
cmc_assert(hm_resize(map, 10000));
|
||||
cmc_assert(hm_resize(map, 500));
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 1, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
hm_free(map);
|
||||
});
|
||||
});
|
||||
@@ -510,6 +510,40 @@ CMC_CREATE_UNIT(hashset_test, true, {
|
||||
cmc_assert(hs_contains(set, 1));
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
|
||||
cmc_assert(hs_resize(set, 10000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(hs_resize(set, 500));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
hs_customize(set, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, set->callbacks);
|
||||
|
||||
hs_clear(set);
|
||||
cmc_assert(hs_resize(set, 10000));
|
||||
cmc_assert(hs_resize(set, 500));
|
||||
cmc_assert(hs_insert(set, 1));
|
||||
cmc_assert(hs_remove(set, 1));
|
||||
cmc_assert(hs_insert(set, 1));
|
||||
cmc_assert(hs_max(set, NULL));
|
||||
cmc_assert(hs_min(set, NULL));
|
||||
cmc_assert(hs_contains(set, 1));
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, set->callbacks);
|
||||
|
||||
hs_free(set);
|
||||
});
|
||||
});
|
||||
@@ -255,6 +255,33 @@ CMC_CREATE_UNIT(heap_test, true, {
|
||||
cmc_assert(h_resize(h, 100));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 2, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
h_customize(h, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, h->callbacks);
|
||||
|
||||
h_clear(h);
|
||||
cmc_assert(h_insert(h, 10));
|
||||
cmc_assert(h_remove(h));
|
||||
cmc_assert(h_insert(h, 10));
|
||||
cmc_assert_equals(size_t, 10, h_peek(h));
|
||||
cmc_assert(h_contains(h, 10));
|
||||
cmc_assert(h_resize(h, 1000));
|
||||
cmc_assert(h_resize(h, 100));
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 2, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, h->callbacks);
|
||||
|
||||
h_free(h);
|
||||
});
|
||||
});
|
||||
@@ -308,6 +308,39 @@ CMC_CREATE_UNIT(intervalheap_test, true, {
|
||||
cmc_assert(ih_resize(ih, 50));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
ih_customize(ih, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, ih->callbacks);
|
||||
|
||||
ih_clear(ih);
|
||||
cmc_assert(ih_insert(ih, 10));
|
||||
cmc_assert(ih_remove_max(ih));
|
||||
cmc_assert(ih_insert(ih, 10));
|
||||
cmc_assert(ih_remove_min(ih));
|
||||
cmc_assert(ih_insert(ih, 1));
|
||||
cmc_assert(ih_insert(ih, 2));
|
||||
cmc_assert(ih_update_max(ih, 1));
|
||||
cmc_assert(ih_update_min(ih, 2));
|
||||
cmc_assert_equals(size_t, 2, ih_max(ih));
|
||||
cmc_assert_equals(size_t, 1, ih_min(ih));
|
||||
cmc_assert(ih_contains(ih, 1));
|
||||
cmc_assert(ih_resize(ih, 1000));
|
||||
cmc_assert(ih_resize(ih, 50));
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, ih->callbacks);
|
||||
|
||||
ih_free(ih);
|
||||
});
|
||||
});
|
||||
@@ -302,6 +302,38 @@ CMC_CREATE_UNIT(linkedlist_test, true, {
|
||||
cmc_assert(ll_contains(ll, 10));
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 3, total_delete);
|
||||
cmc_assert_equals(int32_t, 0, total_resize);
|
||||
|
||||
ll_customize(ll, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, ll->callbacks);
|
||||
|
||||
ll_clear(ll);
|
||||
cmc_assert(ll_push_front(ll, 10));
|
||||
cmc_assert(ll_push_back(ll, 10));
|
||||
cmc_assert(ll_push_at(ll, 10, 1));
|
||||
cmc_assert(ll_pop_at(ll, 1));
|
||||
cmc_assert(ll_pop_front(ll));
|
||||
cmc_assert(ll_pop_back(ll));
|
||||
cmc_assert(ll_push_back(ll, 10));
|
||||
cmc_assert_equals(size_t, 10, ll_front(ll));
|
||||
cmc_assert_equals(size_t, 10, ll_back(ll));
|
||||
cmc_assert_equals(size_t, 10, ll_get(ll, 0));
|
||||
cmc_assert_not_equals(ptr, NULL, ll_get_ref(ll, 0));
|
||||
cmc_assert(ll_contains(ll, 10));
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 3, total_delete);
|
||||
cmc_assert_equals(int32_t, 0, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, ll->callbacks);
|
||||
|
||||
ll_free(ll);
|
||||
});
|
||||
});
|
||||
+49
-3
@@ -542,13 +542,13 @@ CMC_CREATE_UNIT(list_test, true, {
|
||||
cmc_assert(l_contains(l, 10));
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
|
||||
cmc_assert(l_seq_push_front(l, (size_t[]) {7, 8, 9}, 3));
|
||||
cmc_assert(l_seq_push_front(l, (size_t[]){ 7, 8, 9 }, 3));
|
||||
cmc_assert_equals(int32_t, 5, total_create);
|
||||
|
||||
cmc_assert(l_seq_push_back(l, (size_t[]) {14, 15, 16}, 3));
|
||||
cmc_assert(l_seq_push_back(l, (size_t[]){ 14, 15, 16 }, 3));
|
||||
cmc_assert_equals(int32_t, 6, total_create);
|
||||
|
||||
cmc_assert(l_seq_push_at(l, (size_t[]) {11, 12, 13}, 3, 4));
|
||||
cmc_assert(l_seq_push_at(l, (size_t[]){ 11, 12, 13 }, 3, 4));
|
||||
cmc_assert_equals(int32_t, 7, total_create);
|
||||
|
||||
cmc_assert(l_seq_pop_at(l, 1, 4));
|
||||
@@ -557,7 +557,53 @@ CMC_CREATE_UNIT(list_test, true, {
|
||||
struct list *l2 = l_seq_sublist(l, 0, 4);
|
||||
cmc_assert_equals(int32_t, 5, total_delete);
|
||||
|
||||
cmc_assert(l_resize(l, 1000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(l_resize(l2, 1000));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 7, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 5, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
l_customize(l, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, l->callbacks);
|
||||
|
||||
l_clear(l);
|
||||
cmc_assert(l_push_front(l, 10));
|
||||
cmc_assert(l_push_back(l, 10));
|
||||
cmc_assert(l_push_at(l, 10, 1));
|
||||
cmc_assert(l_pop_at(l, 1));
|
||||
cmc_assert(l_pop_front(l));
|
||||
cmc_assert(l_pop_back(l));
|
||||
cmc_assert(l_push_back(l, 10));
|
||||
cmc_assert_equals(size_t, 10, l_front(l));
|
||||
cmc_assert_equals(size_t, 10, l_back(l));
|
||||
cmc_assert_equals(size_t, 10, l_get(l, 0));
|
||||
cmc_assert_not_equals(ptr, NULL, l_get_ref(l, 0));
|
||||
cmc_assert(l_contains(l, 10));
|
||||
cmc_assert(l_seq_push_front(l, (size_t[]){ 7, 8, 9 }, 3));
|
||||
cmc_assert(l_seq_push_back(l, (size_t[]){ 14, 15, 16 }, 3));
|
||||
cmc_assert(l_seq_push_at(l, (size_t[]){ 11, 12, 13 }, 3, 4));
|
||||
cmc_assert(l_seq_pop_at(l, 1, 4));
|
||||
struct list *l3 = l_seq_sublist(l, 0, 4);
|
||||
cmc_assert(l_resize(l, 1000));
|
||||
cmc_assert(l_resize(l3, 1000));
|
||||
|
||||
cmc_assert_equals(int32_t, 7, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 0, total_update);
|
||||
cmc_assert_equals(int32_t, 5, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, l->callbacks);
|
||||
|
||||
l_free(l);
|
||||
l_free(l2);
|
||||
l_free(l3);
|
||||
});
|
||||
})
|
||||
@@ -272,4 +272,97 @@ CMC_CREATE_UNIT(multimap_test, true, {
|
||||
mm_free(map);
|
||||
mm_free(map2);
|
||||
});
|
||||
|
||||
CMC_CREATE_TEST(callbacks, {
|
||||
struct multimap *map =
|
||||
mm_new_custom(100, 0.8, mm_ftab_key, mm_ftab_val, NULL, callbacks);
|
||||
|
||||
total_create = 0;
|
||||
total_read = 0;
|
||||
total_update = 0;
|
||||
total_delete = 0;
|
||||
total_resize = 0;
|
||||
|
||||
cmc_assert(mm_insert(map, 1, 1));
|
||||
cmc_assert_equals(int32_t, 1, total_create);
|
||||
|
||||
cmc_assert(mm_update(map, 1, 2, NULL));
|
||||
cmc_assert_equals(int32_t, 1, total_update);
|
||||
|
||||
cmc_assert(mm_insert(map, 1, 1));
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
|
||||
cmc_assert_equals(size_t, 2, mm_update_all(map, 1, 3, NULL));
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
|
||||
cmc_assert(mm_remove(map, 1, NULL));
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
|
||||
cmc_assert(mm_insert(map, 1, 2));
|
||||
cmc_assert_equals(int32_t, 3, total_create);
|
||||
|
||||
cmc_assert_equals(size_t, 2, mm_remove_all(map, 1, NULL));
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
|
||||
cmc_assert(mm_insert(map, 1, 2));
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
|
||||
cmc_assert(mm_max(map, NULL, NULL));
|
||||
cmc_assert_equals(int32_t, 1, total_read);
|
||||
|
||||
cmc_assert(mm_min(map, NULL, NULL));
|
||||
cmc_assert_equals(int32_t, 2, total_read);
|
||||
|
||||
cmc_assert_equals(size_t, 2, mm_get(map, 1));
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
|
||||
cmc_assert_not_equals(ptr, NULL, mm_get_ref(map, 1));
|
||||
cmc_assert_equals(int32_t, 4, total_read);
|
||||
|
||||
cmc_assert(mm_contains(map, 1));
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
|
||||
cmc_assert(mm_resize(map, 1000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(mm_resize(map, 100));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
mm_customize(map, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
mm_clear(map);
|
||||
cmc_assert(mm_insert(map, 1, 1));
|
||||
cmc_assert(mm_update(map, 1, 2, NULL));
|
||||
cmc_assert(mm_insert(map, 1, 1));
|
||||
cmc_assert_equals(size_t, 2, mm_update_all(map, 1, 3, NULL));
|
||||
cmc_assert(mm_remove(map, 1, NULL));
|
||||
cmc_assert(mm_insert(map, 1, 2));
|
||||
cmc_assert_equals(size_t, 2, mm_remove_all(map, 1, NULL));
|
||||
cmc_assert(mm_insert(map, 1, 2));
|
||||
cmc_assert(mm_max(map, NULL, NULL));
|
||||
cmc_assert(mm_min(map, NULL, NULL));
|
||||
cmc_assert_equals(size_t, 2, mm_get(map, 1));
|
||||
cmc_assert_not_equals(ptr, NULL, mm_get_ref(map, 1));
|
||||
cmc_assert(mm_contains(map, 1));
|
||||
cmc_assert(mm_resize(map, 1000));
|
||||
cmc_assert(mm_resize(map, 100));
|
||||
|
||||
cmc_assert_equals(int32_t, 4, total_create);
|
||||
cmc_assert_equals(int32_t, 5, total_read);
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, map->callbacks);
|
||||
|
||||
mm_free(map);
|
||||
});
|
||||
});
|
||||
@@ -262,4 +262,85 @@ CMC_CREATE_UNIT(multiset_test, true, {
|
||||
ms_free(set);
|
||||
ms_free(set2);
|
||||
});
|
||||
|
||||
CMC_CREATE_TEST(callbacks, {
|
||||
struct multiset *set =
|
||||
ms_new_custom(100, 0.8, ms_ftab_val, NULL, callbacks);
|
||||
|
||||
total_create = 0;
|
||||
total_read = 0;
|
||||
total_update = 0;
|
||||
total_delete = 0;
|
||||
total_resize = 0;
|
||||
|
||||
cmc_assert(ms_insert(set, 1));
|
||||
cmc_assert_equals(int32_t, 1, total_create);
|
||||
|
||||
cmc_assert(ms_insert_many(set, 1, 3));
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
|
||||
cmc_assert(ms_update(set, 1, 0));
|
||||
cmc_assert_equals(int32_t, 1, total_update);
|
||||
|
||||
cmc_assert(ms_update(set, 1, 10));
|
||||
cmc_assert_equals(int32_t, 2, total_update);
|
||||
|
||||
cmc_assert(ms_remove(set, 1));
|
||||
cmc_assert_equals(int32_t, 1, total_delete);
|
||||
|
||||
cmc_assert(ms_remove_all(set, 1));
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
|
||||
cmc_assert(ms_update(set, 1, 10));
|
||||
cmc_assert_equals(int32_t, 3, total_update);
|
||||
|
||||
cmc_assert(ms_max(set, NULL));
|
||||
cmc_assert_equals(int32_t, 1, total_read);
|
||||
|
||||
cmc_assert(ms_min(set, NULL));
|
||||
cmc_assert_equals(int32_t, 2, total_read);
|
||||
|
||||
cmc_assert(ms_contains(set, 1));
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
|
||||
cmc_assert(ms_resize(set, 1000));
|
||||
cmc_assert_equals(int32_t, 1, total_resize);
|
||||
|
||||
cmc_assert(ms_resize(set, 100));
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 3, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
ms_customize(set, NULL, NULL);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, set->callbacks);
|
||||
|
||||
ms_clear(set);
|
||||
cmc_assert(ms_insert(set, 1));
|
||||
cmc_assert(ms_insert_many(set, 1, 3));
|
||||
cmc_assert(ms_update(set, 1, 0));
|
||||
cmc_assert(ms_update(set, 1, 10));
|
||||
cmc_assert(ms_remove(set, 1));
|
||||
cmc_assert(ms_remove_all(set, 1));
|
||||
cmc_assert(ms_update(set, 1, 10));
|
||||
cmc_assert(ms_max(set, NULL));
|
||||
cmc_assert(ms_min(set, NULL));
|
||||
cmc_assert(ms_contains(set, 1));
|
||||
cmc_assert(ms_resize(set, 1000));
|
||||
cmc_assert(ms_resize(set, 100));
|
||||
|
||||
cmc_assert_equals(int32_t, 2, total_create);
|
||||
cmc_assert_equals(int32_t, 3, total_read);
|
||||
cmc_assert_equals(int32_t, 3, total_update);
|
||||
cmc_assert_equals(int32_t, 2, total_delete);
|
||||
cmc_assert_equals(int32_t, 2, total_resize);
|
||||
|
||||
cmc_assert_equals(ptr, NULL, set->callbacks);
|
||||
|
||||
ms_free(set);
|
||||
});
|
||||
});
|
||||
@@ -99,8 +99,7 @@ void callback_resize(void)
|
||||
}
|
||||
|
||||
struct cmc_callbacks *callbacks =
|
||||
&(struct cmc_callbacks){ .enabled = true,
|
||||
.create = callback_create,
|
||||
&(struct cmc_callbacks){ .create = callback_create,
|
||||
.read = callback_read,
|
||||
.update = callback_update,
|
||||
.delete = callback_delete,
|
||||
|
||||
Reference in new issue
Block a user