21#if !defined(__RLIB_H_INCLUDE_GUARD__) && !defined(RLIB_COMPILATION)
22#error "#include <rlib.h> only please."
58#define RQueue RQueueList
60#define R_QUEUE_INIT R_QUEUE_LIST_INIT
62#define r_queue_new r_queue_list_new
64#define r_queue_free r_queue_list_free
66#define r_queue_init r_queue_list_init
68#define r_queue_clear r_queue_list_clear
70#define r_queue_push r_queue_list_push
72#define r_queue_pop r_queue_list_pop
74#define r_queue_peek r_queue_list_peek
76#define r_queue_remove_link r_queue_list_remove_link
78#define r_queue_size r_queue_list_size
80#define r_queue_is_empty r_queue_list_is_empty
100#define R_QUEUE_LIST_INIT { NULL, NULL, 0 }
118#define r_queue_list_size(q) (q)->size
120#define r_queue_list_is_empty(q) ((q)->size == 0)
167#define r_cbqueue_size(q) (q)->size
169#define r_cbqueue_is_empty(q) ((q)->size == 0)
188#define r_queue_ring_ref r_ref_ref
190#define r_queue_ring_unref r_ref_unref
234 RList * head = q->
head;
236 r_list_destroy_full (head, notify);
240 RList * ret = r_list_alloc_copy (item);
279 q->
head = r_list_destroy_link (q->
head, link);
300 RCBList * head = q->
head;
302 r_cblist_destroy (head);
344 q->
head = r_cblist_destroy_link (q->
head, link);
355 RCBList * lst = q->
head;
358 r_cblist_destroy (lst);
363 if (dst->
size > 0 && src->
size > 0) {
369 }
else if (dst->
size == 0) {
RCBList * r_cblist_alloc_full(RFunc cb, rpointer data, RDestroyNotify datanotify, rpointer user, RDestroyNotify usernotify)
Allocate a standalone callback node with full ownership wiring.
rsize r_cblist_call(RCBList *head)
Invoke every callback in the list in order; returns the number called.
#define NULL
Null pointer constant (defined only if absent).
Definition rmacros.h:126
#define R_ATTR_WARN_UNUSED_RESULT
Warn if a function's return value is ignored.
Definition rmacros.h:278
#define R_API
Public-API decoration: resolves to R_API_EXPORT while building rlib and R_API_IMPORT for consumers.
Definition rmacros.h:115
#define R_BEGIN_DECLS
Open an extern "C" block under C++ (no-op in C).
Definition rmacros.h:196
static rpointer r_memset(rpointer a, int v, rsize size)
Fill size bytes at a with byte value v.
Definition rmemops.h:97
static rpointer r_memcpy(void *R_ATTR_RESTRICT dst, const void *R_ATTR_RESTRICT src, rsize size)
Copy size bytes from src to dst.
Definition rmemops.h:121
#define r_mem_new0(type)
Allocate a single zeroed instance of type.
Definition rmem.h:193
void r_free(rpointer ptr)
Release a heap allocation obtained from r_malloc / r_malloc0 / r_calloc / r_realloc.
static void r_cbqueue_clear(RCBQueue *q)
Drop all callbacks, running destroy notifiers.
Definition rqueue.h:298
static RList * r_queue_list_push(RQueueList *q, rpointer item)
Append item to the tail; returns the new list node.
Definition rqueue.h:238
rpointer r_queue_ring_peek(RQueueRing *q)
Peek at the head item without removing it.
static RCBList * r_cbqueue_pop(RCBQueue *q)
Detach and return the head node; caller is responsible for invoking / freeing.
Definition rqueue.h:318
static rsize r_cbqueue_call_pop(RCBQueue *q)
Atomically detach + invoke + drop the queue's callbacks.
Definition rqueue.h:352
static void r_cbqueue_merge(RCBQueue *dst, RCBQueue *src)
Concatenate src onto dst; src ends up empty.
Definition rqueue.h:361
struct RQueueRing RQueueRing
Opaque, refcounted ring-buffer queue.
Definition rqueue.h:184
static RCBList * r_cbqueue_peek(const RCBQueue *q)
Peek at the head node.
Definition rqueue.h:336
static rsize r_cbqueue_call(RCBQueue *q)
Invoke every callback currently queued; returns the number called.
Definition rqueue.h:347
static RCBList * r_cbqueue_push(RCBQueue *q, RFunc cb, rpointer data, RDestroyNotify datanotify, rpointer user, RDestroyNotify usernotify)
Append a callback to the tail; returns the new node.
Definition rqueue.h:304
static void r_queue_list_free(RQueueList *q, RDestroyNotify notify)
Free a heap-allocated queue, calling notify on each item.
Definition rqueue.h:225
static RCBQueue * r_cbqueue_new(void)
Heap-allocate an empty RCBQueue.
Definition rqueue.h:283
static rpointer r_queue_list_peek(const RQueueList *q)
Peek at the head item without removing it.
Definition rqueue.h:271
static RQueueList * r_queue_list_new(void)
Heap-allocate an empty RQueueList.
Definition rqueue.h:217
RQueueRing * r_queue_ring_new(rsize size)
Construct a ring queue with capacity size (rounded up to a power of 2).
rboolean r_queue_ring_is_empty(RQueueRing *q)
TRUE iff q has no items.
static void r_cbqueue_free(RCBQueue *q)
Free a heap-allocated callback queue; runs each callback's destroy notifiers.
Definition rqueue.h:291
static rpointer r_queue_list_pop(RQueueList *q)
Remove and return the head item, or NULL when empty.
Definition rqueue.h:251
static void r_cbqueue_init(RCBQueue *q)
Initialise a stack-allocated RCBQueue.
Definition rqueue.h:287
static void r_queue_list_init(RQueueList *q)
Initialise a stack-allocated RQueueList.
Definition rqueue.h:221
rsize r_queue_ring_size(RQueueRing *q)
Number of items currently in q.
static void r_queue_list_clear(RQueueList *q, RDestroyNotify notify)
Drop every item from q, calling notify on each.
Definition rqueue.h:232
rboolean r_queue_ring_push(RQueueRing *q, rpointer item) R_ATTR_WARN_UNUSED_RESULT
Push item onto the tail.
rpointer r_queue_ring_pop(RQueueRing *q)
Remove and return the head item, or NULL when empty.
void r_queue_ring_clear(RQueueRing *q, RDestroyNotify notify)
Drop every item, calling notify on each.
static void r_queue_list_remove_link(RQueueList *q, RList *link)
Remove an arbitrary link from q.
Definition rqueue.h:275
static void r_cbqueue_remove_link(RCBQueue *q, RCBList *link)
Remove an arbitrary link from q.
Definition rqueue.h:340
int rboolean
Boolean type (typedef'd to int).
Definition rtypes.h:59
void(* RFunc)(rpointer data, rpointer user)
Generic iteration callback over (data, user) pairs.
Definition rtypes.h:403
void(* RDestroyNotify)(rpointer ptr)
Destructor callback: free / release the value at ptr.
Definition rtypes.h:401
void * rpointer
Generic pointer (alias for void *).
Definition rtypes.h:327
unsigned long rsize
Unsigned pointer-sized size type (like size_t).
Definition rtypes.h:290
Linked-list types: doubly / singly linked plus the callback-flavoured specialisations.
Refcount base struct shared by every refcounted type in rlib.
Foundational type aliases used by every rlib header.
List-backed queue of RFuncCallbackCtx entries.
Definition rqueue.h:132
RCBList * head
Definition rqueue.h:133
RCBList * tail
Definition rqueue.h:134
rsize size
Definition rqueue.h:135
List-backed FIFO / deque.
Definition rqueue.h:93
rsize size
Definition rqueue.h:96
RList * tail
Definition rqueue.h:95
RList * head
Definition rqueue.h:94