update document for utils
This commit is contained in:
parent
c261ff9287
commit
603b991a67
24
util/array.h
24
util/array.h
@ -1,16 +1,10 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
#pragma once
|
//
|
||||||
|
// Array util is a template macro of an array type.
|
||||||
#include <assert.h>
|
//
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "util/malloc.h"
|
|
||||||
|
|
||||||
|
|
||||||
// HOW TO USE
|
// HOW TO USE
|
||||||
// To use an array, you must prepare an array struct, and use its functions for
|
// To use an array, you must prepare an array struct, and use its functions
|
||||||
// any operations to the array.
|
// for any operations to the array.
|
||||||
//
|
//
|
||||||
// When you need an array of integers, the following array structs are
|
// When you need an array of integers, the following array structs are
|
||||||
// available:
|
// available:
|
||||||
@ -32,6 +26,14 @@
|
|||||||
// You can see declarations of the functions on a definition of
|
// You can see declarations of the functions on a definition of
|
||||||
// NF7UTIL_ARRAY_DECL macro. They all are prefixed by a name of your array
|
// NF7UTIL_ARRAY_DECL macro. They all are prefixed by a name of your array
|
||||||
// struct.
|
// struct.
|
||||||
|
//
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "util/malloc.h"
|
||||||
|
|
||||||
|
|
||||||
#define NF7UTIL_ARRAY_TYPE(PREFIX, T) \
|
#define NF7UTIL_ARRAY_TYPE(PREFIX, T) \
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
|
//
|
||||||
|
// nf7util_buffer is a generic buffer object which can be shared between
|
||||||
|
// multiple owners. Only a unique owner can modify the buffer contents.
|
||||||
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -8,9 +12,6 @@
|
|||||||
#include "util/refcnt.h"
|
#include "util/refcnt.h"
|
||||||
|
|
||||||
|
|
||||||
// nf7util_buffer is a generic buffer object which can be shared between
|
|
||||||
// multiple owners. Only a unique owner can modify the buffer contents.
|
|
||||||
|
|
||||||
struct nf7util_buffer {
|
struct nf7util_buffer {
|
||||||
struct nf7util_malloc* malloc;
|
struct nf7util_malloc* malloc;
|
||||||
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
|
//
|
||||||
|
// functions macros for logging
|
||||||
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
|
//
|
||||||
|
// nf7util_malloc is a general purpose memory allocator
|
||||||
|
// The current implementation is just a wrapper of malloc/free.
|
||||||
|
// All methods are thread-safe.
|
||||||
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -7,9 +12,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
// ---- General Purpose Memory Allocator
|
|
||||||
// The current implementation is just a wrap of malloc/free.
|
|
||||||
// All methods are thread-safe.
|
|
||||||
struct nf7util_malloc { atomic_uint_least64_t count; };
|
struct nf7util_malloc { atomic_uint_least64_t count; };
|
||||||
|
|
||||||
static inline void* nf7util_malloc_alloc(struct nf7util_malloc* this, uint64_t n) {
|
static inline void* nf7util_malloc_alloc(struct nf7util_malloc* this, uint64_t n) {
|
||||||
|
@ -1,4 +1,26 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
|
//
|
||||||
|
// Refcnt util is a template macro of reference counting logic.
|
||||||
|
//
|
||||||
|
// HOW TO USE
|
||||||
|
// 1. Define your struct whose instance is managed by reference couting.
|
||||||
|
// The struct must have an integer field named `refcnt`
|
||||||
|
//
|
||||||
|
// 2. Expand `NF7UTIL_REFCNT_DECL` in your header to declare ref/unref
|
||||||
|
// functions.
|
||||||
|
// - ATTR parameter is a space-separated list of attributes for them
|
||||||
|
// - T is a name of struct without `struct` keyword
|
||||||
|
// - e.g.) NF7UTIL_REFCNT_DECL(, mystruct);
|
||||||
|
//
|
||||||
|
// 3. Expand `NF7UTIL_REFCNT_IMPL` in your source to define the functions.
|
||||||
|
// DELETER parameter is a code block executed at all ownership is released.
|
||||||
|
// - A variable `T* this;` is available in the DELETER
|
||||||
|
// - e.g.) NF7UTIL_REFCNT_IMPL(, mystruct, {free(this);});
|
||||||
|
//
|
||||||
|
// If you want functions inline, NF7UTIL_REFCNT_DECL is unnecessary, and just
|
||||||
|
// expand `NF7UTIL_REFCNT_IMPL` in your header like this:
|
||||||
|
// - e.g.) NF7UTIL_REFCNT_IMPL(static inline, mystruct, {free(this);})
|
||||||
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
// No copyright
|
// No copyright
|
||||||
|
//
|
||||||
|
// nf7util_signal is an emitter, and nf7util_signal_recv is its receiver.
|
||||||
|
// When nf7util_signal emits, all of corresponding nf7util_signal_recv receive
|
||||||
|
// and call their callbacks.
|
||||||
|
//
|
||||||
|
// This is useful to implement an observer pattern.
|
||||||
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "util/array.h"
|
#include "util/array.h"
|
||||||
@ -24,7 +31,8 @@ struct nf7util_signal_recv {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static inline void nf7util_signal_init(struct nf7util_signal* this, struct nf7util_malloc* malloc) {
|
static inline void nf7util_signal_init(
|
||||||
|
struct nf7util_signal* this, struct nf7util_malloc* malloc) {
|
||||||
assert(nullptr != this);
|
assert(nullptr != this);
|
||||||
nf7util_signal_recvs_init(&this->recvs, malloc);
|
nf7util_signal_recvs_init(&this->recvs, malloc);
|
||||||
}
|
}
|
||||||
@ -47,7 +55,7 @@ static inline void nf7util_signal_emit(struct nf7util_signal* this) {
|
|||||||
this->emitting = false;
|
this->emitting = false;
|
||||||
|
|
||||||
// remove nullptr in recvs because a removed receiver replaces their pointer
|
// remove nullptr in recvs because a removed receiver replaces their pointer
|
||||||
// to nullptr in `recvs` while `this->emitting` is true
|
// in 'recvs' to nullptr while `this->emitting` is true
|
||||||
uint64_t lead_index = 0;
|
uint64_t lead_index = 0;
|
||||||
uint64_t follow_index = 0;
|
uint64_t follow_index = 0;
|
||||||
for (; lead_index < recvs->n; ++lead_index) {
|
for (; lead_index < recvs->n; ++lead_index) {
|
||||||
@ -71,7 +79,7 @@ static inline void nf7util_signal_recv_unset(struct nf7util_signal_recv* this) {
|
|||||||
if (!signal->emitting) {
|
if (!signal->emitting) {
|
||||||
nf7util_signal_recvs_find_and_remove(&signal->recvs, this);
|
nf7util_signal_recvs_find_and_remove(&signal->recvs, this);
|
||||||
} else {
|
} else {
|
||||||
// replace myself to nullptr in `signal->recvs`
|
// replace myself `signal->recvs` to nullptr in
|
||||||
// because the array is being iterated while `signal->emitting` is true
|
// because the array is being iterated while `signal->emitting` is true
|
||||||
uint64_t index;
|
uint64_t index;
|
||||||
if (nf7util_signal_recvs_find(&signal->recvs, &index, this)) {
|
if (nf7util_signal_recvs_find(&signal->recvs, &index, this)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user