]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/typerb.h
lib: add const iteration & find to typesafe lists
[mirror_frr.git] / lib / typerb.h
index 2d7b0ba63791f1dd34942aa2e8578852e2c7d1fe..fca45e20d1c6a83f7cb21fa05785f061ba1c80d0 100644 (file)
@@ -45,23 +45,23 @@ struct typed_rb_entry *typed_rb_insert(struct typed_rb_root *rbt,
                        const struct typed_rb_entry *b));
 struct typed_rb_entry *typed_rb_remove(struct typed_rb_root *rbt,
                                       struct typed_rb_entry *rbe);
-struct typed_rb_entry *typed_rb_find(struct typed_rb_root *rbt,
+const struct typed_rb_entry *typed_rb_find(const struct typed_rb_root *rbt,
                const struct typed_rb_entry *rbe,
                int (*cmpfn)(
                        const struct typed_rb_entry *a,
                        const struct typed_rb_entry *b));
-struct typed_rb_entry *typed_rb_find_gteq(struct typed_rb_root *rbt,
+const struct typed_rb_entry *typed_rb_find_gteq(const struct typed_rb_root *rbt,
                const struct typed_rb_entry *rbe,
                int (*cmpfn)(
                        const struct typed_rb_entry *a,
                        const struct typed_rb_entry *b));
-struct typed_rb_entry *typed_rb_find_lt(struct typed_rb_root *rbt,
+const struct typed_rb_entry *typed_rb_find_lt(const struct typed_rb_root *rbt,
                const struct typed_rb_entry *rbe,
                int (*cmpfn)(
                        const struct typed_rb_entry *a,
                        const struct typed_rb_entry *b));
-struct typed_rb_entry *typed_rb_min(struct typed_rb_root *rbt);
-struct typed_rb_entry *typed_rb_next(struct typed_rb_entry *rbe);
+struct typed_rb_entry *typed_rb_min(const struct typed_rb_root *rbt);
+struct typed_rb_entry *typed_rb_next(const struct typed_rb_entry *rbe);
 
 #define _PREDECL_RBTREE(prefix)                                                \
 struct prefix ## _head { struct typed_rb_root rr; };                           \
@@ -86,20 +86,21 @@ macro_inline type *prefix ## _add(struct prefix##_head *h, type *item)         \
        re = typed_rb_insert(&h->rr, &item->field.re, cmpfn_uq);               \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
-macro_inline type *prefix ## _find_gteq(struct prefix##_head *h,               \
-               const type *item)                                              \
+macro_inline const type *prefix ## _const_find_gteq(                           \
+               const struct prefix##_head *h, const type *item)               \
 {                                                                              \
-       struct typed_rb_entry *re;                                             \
+       const struct typed_rb_entry *re;                                       \
        re = typed_rb_find_gteq(&h->rr, &item->field.re, cmpfn_nuq);           \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
-macro_inline type *prefix ## _find_lt(struct prefix##_head *h,                 \
-               const type *item)                                              \
+macro_inline const type *prefix ## _const_find_lt(                             \
+               const struct prefix##_head *h, const type *item)               \
 {                                                                              \
-       struct typed_rb_entry *re;                                             \
+       const struct typed_rb_entry *re;                                       \
        re = typed_rb_find_lt(&h->rr, &item->field.re, cmpfn_nuq);             \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
+TYPESAFE_FIND_CMP(prefix, type)                                                \
 macro_inline type *prefix ## _del(struct prefix##_head *h, type *item)         \
 {                                                                              \
        struct typed_rb_entry *re;                                             \
@@ -115,18 +116,20 @@ macro_inline type *prefix ## _pop(struct prefix##_head *h)                     \
        typed_rb_remove(&h->rr, re);                                           \
        return container_of(re, type, field.re);                               \
 }                                                                              \
-macro_pure type *prefix ## _first(struct prefix##_head *h)                     \
+macro_pure const type *prefix ## _const_first(const struct prefix##_head *h)   \
 {                                                                              \
-       struct typed_rb_entry *re;                                             \
+       const struct typed_rb_entry *re;                                       \
        re = typed_rb_min(&h->rr);                                             \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
-macro_pure type *prefix ## _next(struct prefix##_head *h, type *item)          \
+macro_pure const type *prefix ## _const_next(const struct prefix##_head *h,    \
+                                            const type *item)                 \
 {                                                                              \
-       struct typed_rb_entry *re;                                             \
+       const struct typed_rb_entry *re;                                       \
        re = typed_rb_next(&item->field.re);                                   \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
+TYPESAFE_FIRST_NEXT(prefix, type)                                              \
 macro_pure type *prefix ## _next_safe(struct prefix##_head *h, type *item)     \
 {                                                                              \
        struct typed_rb_entry *re;                                             \
@@ -149,12 +152,14 @@ macro_inline int prefix ## __cmp(const struct typed_rb_entry *a,               \
        return cmpfn(container_of(a, type, field.re),                          \
                        container_of(b, type, field.re));                      \
 }                                                                              \
-macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item)  \
+macro_inline const type *prefix ## _const_find(const struct prefix##_head *h,  \
+                                              const type *item)               \
 {                                                                              \
-       struct typed_rb_entry *re;                                             \
+       const struct typed_rb_entry *re;                                       \
        re = typed_rb_find(&h->rr, &item->field.re, &prefix ## __cmp);         \
        return container_of_null(re, type, field.re);                          \
 }                                                                              \
+TYPESAFE_FIND(prefix, type)                                                    \
                                                                                \
 _DECLARE_RBTREE(prefix, type, field, prefix ## __cmp, prefix ## __cmp)         \
 /* ... */