From 85180f17da3ea3d1cebc30d42560fb12a997aabf Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Thu, 5 May 2022 15:45:01 +0200 Subject: Swapped two arguments in c_find_if/c_find_it. Changed c_container_of(). --- docs/ccommon_api.md | 12 +++++++----- include/stc/ccommon.h | 14 +++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md index ab4a89d9..ef0ae621 100644 --- a/docs/ccommon_api.md +++ b/docs/ccommon_api.md @@ -177,17 +177,19 @@ c_apply(v, cmap_i_insert(&map, c_pair(v)), cmap_i_raw, { {4, 5}, {6, 7} }); int arr[] = {1, 2, 3}; c_apply_arr(v, cvec_i_push_back(&vec, v), int, arr, c_arraylen(arr)); - -// find_if, find_it: linear search +``` +**c_find_if**, **c_find_it** searches linearily in containers using a predicate +``` int* v; -c_find_if (v, cvec_i, vec, *v == 2); +c_find_if (cvec_i, vec, v, *v == 2); if (v) printf("%d\n", *v); -c_find_if (v, cvec_i, vec, index == 2); // index is internal in find_if. +c_find_if (cvec_i, vec, v, index == 2); // index is internal in find_if. if (v) printf("%d\n", *v); // 3 +// use iterator: cvec_i_iter it; -c_find_it (it, cvec_i, vec, *it.ref == 2); +c_find_it (cvec_i, vec, it, *it.ref == 2); cvec_i_erase_at(&vec, it); // assume found ``` diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index b96cf547..f05bc040 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -57,12 +57,12 @@ typedef char c_paste(_static_assert_line_, __LINE__)[(cond) ? 1 : -1] #define c_unchecked_container_of(ptr, type, member) \ ((type *)((char *)(ptr) - offsetof(type, member))) -#if defined _MSC_VER && __STDC_VERSION__ < 202300L -# define c_container_of(p,t,m) c_unchecked_container_of(p,t,m) -#else +#if __STDC_VERSION__ >= 202300L || defined STC_CHECKED_CONTAINER_OF # define c_container_of(ptr, type, member) \ - ((typeof(ptr))0 == (typeof(&((type *)0)->member))0, \ - ((type *)((char *)(ptr) - offsetof(type, member)))) + (((type *)((char *)(ptr) - offsetof(type, member))) + \ + ((typeof(ptr))0 != (typeof(&((type *)0)->member))0)) +#else +# define c_container_of(p,t,m) c_unchecked_container_of(p,t,m) #endif #ifndef __cplusplus # define c_alloc(T) c_malloc(sizeof(T)) @@ -212,14 +212,14 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, size_t slen, cons } while (0) #define c_pair(v) (v).first, (v).second -#define c_find_it(it, C, cnt, pred) do { \ +#define c_find_it(C, cnt, it, pred) do { \ size_t index = 0; \ C##_iter _end = C##_end(&cnt); \ for (it = C##_begin(&cnt); it.ref != _end.ref && !(pred); C##_next(&it)) \ ++index; \ } while (0) -#define c_find_if(vp, C, cnt, pred) do { \ +#define c_find_if(C, cnt, vp, pred) do { \ size_t index = 0; \ C##_iter _it = C##_begin(&cnt), _end = C##_end(&cnt); \ for (; vp = _it.ref, vp != _end.ref && !(pred); C##_next(&_it)) \ -- cgit v1.2.3