Merge branch 'release/1.3'
[reservoir_sample] / reservoir.h
1 #ifndef RESERVOIR_H_MZSA8WJ3
2 #define RESERVOIR_H_MZSA8WJ3
3
4 #include <stdlib.h>
5
6 #include "buf.h"
7
8 #ifndef NDEBUG
9 #include "notify.h"
10 #endif /* NDEBUG */
11
12 /*
13 A size-limited pool of buf_t entries. When the reservoir is filled with
14 more entries than there is room for, some spill away and are lost.
15 */
16
17 typedef struct reservoir_ {
18 size_t reservoir_sz; /* allocated slots */
19 size_t reservoir_used; /* slots filled */
20 unsigned long reservoir_tally; /* total number of items remembered */
21 buf_t reservoir[];
22 } *reservoir_t;
23
24 #ifndef NDEBUG
25 /* For debugging, dump an entire reservoir's contents. */
26 #define D_RESERVOIR(__r__) do {\
27 size_t i;\
28 NOTIFY_DEBUG("reservoir:%p sz: %zu used:%zu tally:%zu", (__r__), (__r__)->reservoir_sz, (__r__)->reservoir_used, (__r__)->reservoir_tally);\
29 for (i = 0; i < (__r__)->reservoir_sz; i++) {\
30 D_BUF("reservoir[%zu] ", (__r__)->reservoir[i], i);\
31 }\
32 } while (0)
33 #else /* NDEBUG */
34 #define D_RESERVOIR(...)
35 #endif /* NDEBUG */
36
37 /* reservoir_new
38 Allocate and return a new reservoir capable of holding #sz buf_t
39 entries.
40 */
41 reservoir_t reservoir_new(size_t sz);
42
43 /* reservoir_del
44 Deallocate the reservoir pointed to by #preservoir.
45 */
46 void reservoir_del(reservoir_t *preservoir);
47
48 /* reservoir_grow
49 Increase the storage capacity of the reservoir pointed to by
50 #preservoir by #growby entries.
51 */
52 int reservoir_grow(reservoir_t *preservoir, size_t growby);
53
54 /* reservoir_remember
55 Remember #buf, forgetting (and freeing) another buf_t chosen at random
56 if the reservoir pointed to by #preservoir is already full to capacity.
57 */
58 void reservoir_remember(reservoir_t reservoir, buf_t buf);
59
60 /* reservoir_write
61 Write the contents of the buf_t entries within #reservoir to #fd, each
62 with a trailing #delim character.
63 */
64 int reservoir_write(int fd, reservoir_t reservoir, char delim);
65
66 /* reservoir_write_meta
67 Write metadata about #reservoir and #samples to fd.
68 */
69 int reservoir_write_meta(int fd, reservoir_t reservoir, unsigned long samples, char delim);
70
71 #endif /* RESERVOIR_H_MZSA8WJ3 */