src/chain.h
author Tero Marttila <terom@fixme.fi>
Thu, 12 Mar 2009 18:07:47 +0200
changeset 35 3715247e8f5a
child 69 6f298b6e0d5f
permissions -rw-r--r--
add a kind of semi-generic chain-list implementation
35
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef CHAIN_H
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define CHAIN_H
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * Defines a generalized "chain of things" behaviour.
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 *
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * The structure of this is a CHAIN_LIST, which contains a number of CHAIN_HEAD items, which then contain a number of
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 * induvidual items.
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include "error.h"
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include <sys/queue.h>
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
 * The chain header.
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
struct chain_head {
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    const void *chain;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    void *arg;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    STAILQ_ENTRY(chain_head) node;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
};
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
 * @struct chain_list
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
 *
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
 * The chain list
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
STAILQ_HEAD(chain_list, chain_head);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
 * Initialize a `struct chain_list`
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
#define CHAIN_INIT(list_ptr) STAILQ_INIT(list_ptr)
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
 * Add an item onto the end of a chain_list
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
err_t chain_add (struct chain_list *list, const void *chain, void *arg);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
 * Iterate over the contents of a chain_list
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
 *
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
 * struct chain_list *list = ...;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
 * struct chain_head *head;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
 * struct foo *foo;
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
 *
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
 *  CHAIN_FOREACH(list, head) {
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
 *      for (foo = head->chain; foo->bar; foo++) {
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
 *          foo->bar(foo, head->arg);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 *      }
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
 *  }
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
#define CHAIN_FOREACH(list_ptr, head_ptr) STAILQ_FOREACH(head_ptr, list_ptr, node)
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
/**
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
 * Free a chain_list
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
 */
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
void chain_free (struct chain_list *list);
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
3715247e8f5a add a kind of semi-generic chain-list implementation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
#endif