commit 6fb2707be146908e8d80fe74ed1c55a5ca353171
parent c6ec992e45d19e0aaa02953795bacc144b7b7a12
Author: MikoĊaj Lenczewski <mblenczewski@gmail.com>
Date: Mon, 13 Feb 2023 00:38:15 +0000
Fix inline extern specifiers for riot_intrusive_list(_node) functions
Diffstat:
2 files changed, 56 insertions(+), 25 deletions(-)
diff --git a/libriot/include/libriot.h b/libriot/include/libriot.h
@@ -15,13 +15,56 @@ struct riot_intrusive_list_node {
riot_relptr_t prev, next;
};
-extern inline void
+inline void
riot_intrusive_list_node_link(struct riot_intrusive_list_node *self,
struct riot_intrusive_list_node *prev,
- struct riot_intrusive_list_node *next);
+ struct riot_intrusive_list_node *next) {
+ assert(self);
+ assert(prev);
+ assert(next);
-extern inline void
-riot_intrusive_list_node_snip(struct riot_intrusive_list_node *self);
+ prev->next = RELPTR_ABS2REL(riot_relptr_t, prev, self);
+ self->prev = RELPTR_ABS2REL(riot_relptr_t, self, prev);
+ self->next = RELPTR_ABS2REL(riot_relptr_t, self, next);
+ next->prev = RELPTR_ABS2REL(riot_relptr_t, next, self);
+}
+
+inline void
+riot_intrusive_list_node_snip(struct riot_intrusive_list_node *self) {
+ assert(self);
+
+ struct riot_intrusive_list_node *prev, *next;
+ prev = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, self, self->prev);
+ next = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, self, self->next);
+
+ prev->next = RELPTR_ABS2REL(riot_relptr_t, prev, next);
+ next->prev = RELPTR_ABS2REL(riot_relptr_t, next, prev);
+ self->prev = self->next = RELPTR_NULL;
+}
+
+struct riot_intrusive_list {
+ struct riot_intrusive_list_node root;
+};
+
+inline void
+riot_intrusive_list_init(struct riot_intrusive_list *self) {
+ assert(self);
+
+ self->root.prev = self->root.next = RELPTR_ABS2REL(riot_relptr_t, &self->root, &self->root);
+}
+
+inline void
+riot_intrusive_list_push(struct riot_intrusive_list *self,
+ struct riot_intrusive_list_node *elem) {
+ assert(self);
+ assert(elem);
+
+ struct riot_intrusive_list_node *prev, *next;
+ prev = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, &self->root, self->root.prev);
+ next = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, &self->root, self->root.next);
+
+ riot_intrusive_list_node_link(elem, prev, next);
+}
typedef u32 fnv1a_u32;
typedef u64 xxh64_u64;
diff --git a/libriot/src/libriot.c b/libriot/src/libriot.c
@@ -1,28 +1,16 @@
#include "libriot.h"
-void
+extern inline void
riot_intrusive_list_node_link(struct riot_intrusive_list_node *self,
struct riot_intrusive_list_node *prev,
- struct riot_intrusive_list_node *next) {
- assert(self);
- assert(prev);
- assert(next);
+ struct riot_intrusive_list_node *next);
- prev->next = RELPTR_ABS2REL(riot_relptr_t, prev, self);
- self->prev = RELPTR_ABS2REL(riot_relptr_t, self, prev);
- self->next = RELPTR_ABS2REL(riot_relptr_t, self, next);
- next->prev = RELPTR_ABS2REL(riot_relptr_t, next, self);
-}
+extern inline void
+riot_intrusive_list_node_snip(struct riot_intrusive_list_node *self);
-void
-riot_intrusive_list_node_snip(struct riot_intrusive_list_node *self) {
- assert(self);
+extern inline void
+riot_intrusive_list_init(struct riot_intrusive_list *self);
- struct riot_intrusive_list_node *prev, *next;
- prev = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, self, self->prev);
- next = RELPTR_REL2ABS(struct riot_intrusive_list_node *, riot_relptr_t, self, self->next);
-
- prev->next = RELPTR_ABS2REL(riot_relptr_t, prev, next);
- next->prev = RELPTR_ABS2REL(riot_relptr_t, next, prev);
- self->prev = self->next = RELPTR_NULL;
-}
+extern inline void
+riot_intrusive_list_push(struct riot_intrusive_list *self,
+ struct riot_intrusive_list_node *elem);