docs/Writerside/topics/mempool.h.md

Fri, 11 Apr 2025 13:20:07 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 11 Apr 2025 13:20:07 +0200
changeset 1281
45746a08c59e
parent 1174
ee473780cc0d
child 1282
0c8077f67e54
permissions
-rw-r--r--

add cxMempoolTransfer() - partially resolves #640

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Memory Pool
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 A memory pool is providing an allocator implementation that automatically deallocates the memory upon its destruction.
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 It also allows you to register destructor functions for the allocated memory, which are automatically called before
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 the memory is deallocated.
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
6
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
7 Additionally, you may also register _independent_ destructor functions.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
8 This can be useful, for example, when some library allocates memory that you wish to destroy when the memory pool gets destroyed.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
9
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
10 A memory pool can be used with all UCX features that support the use of an [allocator](allocator.h.md).
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
11 For example, the UCX [string](string.h.md) functions provide several variants suffixed with `_a` for that purpose.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
12
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
13 ## Basic Memory Management
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
14
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
15 ```C
1174
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1168
diff changeset
16 #include <cx/mempool.h>
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1168
diff changeset
17
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
18 CxMempool *cxMempoolCreate(size_t capacity, cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
19
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
20 CxMempool *cxMempoolCreateSimple(size_t capacity);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
21
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
22 void cxMempoolFree(CxMempool *pool);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
23
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
24 void cxMempoolSetDestructor(void *memory, cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
25
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
26 void cxMempoolRemoveDestructor(void *memory);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
27
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
28 int cxMempoolRegister(CxMempool *pool, void *memory,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
29 cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
30 ```
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
31
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
32 A memory pool is created with the `cxMempoolCreate()` function with a default `capacity`
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
33 and an optional default destructor function `fnc`.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
34 If specified, the default destructor function is registered for all freshly allocated memory within the pool,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
35 as if `cxMempoolSetDestructor()` was called immediately after allocation.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
36 When you set `fnc` is to `NULL` during pool creation, or use `cxMempoolCreateSimple`, no default destructor is registered.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
37
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38 After creating a memory pool `CxMempool *mpool`, you can access the provided allocator via `mpool->allocator`.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
39
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40 The functions `cxMempoolSetDestructor()` and `cxMempoolRemoveDestructor()` can be used to assign a specific destructor
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
41 function to an allocated object or remove any assigned destructor function, respectively.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42 The `memory` pointer points to the allocated object, which must have been allocated by any `CxMempool`'s provided allocator.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
44 The `cxMempoolRegister()` function allocates a new wrapper object for `memory` with `pool`'s allocator that
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
45 will call the specified destructor function when destroyed.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
46 Usually this function returns zero except for platforms where memory allocations are likely to fail,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
47 in which case a non-zero value is returned.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
48
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
49 ### Order of Destruction
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
50
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
51 When you call `cxMempoolFree()` the following actions are performed:
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
52
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
53 1. In any order, for each object in the pool
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
54 1. the destructor function assigned to that object is called
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
55 2. the object's memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
56 2. The pool memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
57 3. The pool structure is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
58
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
59 ## Transfer Memory
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
60
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
61 ```C
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
62 #include <cx/mempool.h>
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
63
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
64 int cxMempoolTransfer(CxMempool *source, CxMempool *dest);
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
65 ```
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
66
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
67 Memory managed by a pool can be transferred to another pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
68
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
69 The function `cxMempoolTransfer()` transfers all memory managed and/or registered with the `source` pool to the `dest` pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
70 It also registers its allocator with the `dest` pool and creates a new allocator for the `source` pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
71 That means, that all references to the allocator of the `source` pool remain valid and continue to work with the `dest` pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
72 The transferred allocator will be destroyed when the `dest` pool gets destroyed.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
73
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
74 The function returns zero when the transfer was successful and non-zero if a necessary memory allocation was not possible,
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
75 or the `source` and `dest` pointers point to the same pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
76 In case of an error, no memory is transferred and both pools are in a valid state.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
77
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
78 > Although the allocator from the `source` pool remains valid for the already allocated objects,
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
79 > it is **not** valid to use that allocator to allocate new objects in the `dest` pool.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
80 > It may only be used to free or reallocate the memory of the existing objects.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
81 >
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
82 > The reason is, that the allocator will be destroyed after destroying all objects from the `source` pool and
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
83 > _before_ destroying objects in the `dest` pool which were allocated after the transfer.
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
84 >{style="warning"}
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
85
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1174
diff changeset
86
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
87 ## Example
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
88
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
89 The following code illustrates how the contents of a CSV file are read into pooled memory.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 ```C
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 #include <stdio.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 #include <cx/mempool.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 #include <cx/linked_list.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 #include <cx/string.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 #include <cx/buffer.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 #include <cx/utils.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 typedef struct {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 cxstring column_a;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 cxstring column_b;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 cxstring column_c;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 } CSVData;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 int main(void) {
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
105 // create a simple pool for various different objects
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
106 CxMempool* pool = cxMempoolCreateSimple(128);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 FILE *f = fopen("test.csv", "r");
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
109 if (f == NULL) {
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 perror("Cannot open file");
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 // close the file automatically at pool destruction
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 cxMempoolRegister(pool, f, (cx_destructor_func) fclose);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 // create a buffer using the memory pool for destruction
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
117 CxBuffer *content = cxBufferCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
118 NULL, 256, pool->allocator, CX_BUFFER_AUTO_EXTEND
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
119 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 // read the file into the buffer and turn it into a string
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
122 cx_stream_copy(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
123 f, content, (cx_read_func) fread, cxBufferWriteFunc
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
124 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 fclose(f);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 cxstring contentstr = cx_strn(content->space, content->size);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
128 // split the string into lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
129 // use the memory pool to allocate the target array
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 cxstring* lines;
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
131 size_t lc = cx_strsplit_a(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
132 pool->allocator, contentstr, cx_str("\n"), SIZE_MAX, &lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
133 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 // skip the header and parse the remaining data into a linked list
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
136 // the nodes of the list shall also be allocated by the pool
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
137 CxList* datalist = cxLinkedListCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
138 pool->allocator, NULL, sizeof(CSVData)
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
139 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 for (size_t i = 1 ; i < lc ; i++) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 if (lines[i].length == 0) continue;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 cxstring fields[3];
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
143 size_t fc = cx_strsplit(lines[i], cx_str(";"), 3, fields);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 if (fc != 3) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 fprintf(stderr, "Syntax error in line %zu.\n", i);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149 CSVData data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150 data.column_a = fields[0];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151 data.column_b = fields[1];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152 data.column_c = fields[2];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
153 cxListAdd(datalist, &data);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
154 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
155
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156 // iterate through the list and output the data
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 CxIterator iter = cxListIterator(datalist);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 cx_foreach(CSVData*, data, iter) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 printf("Column A: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 "Column B: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 "Column C: %.*s\n",
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 (int)data->column_a.length, data->column_a.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 (int)data->column_b.length, data->column_b.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 (int)data->column_c.length, data->column_c.ptr
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
165 );
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
168 // cleanup everything, no manual free() needed
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
169 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171 return 0;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
172 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 ```
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
175 <seealso>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
176 <category ref="apidoc">
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
177 <a href="https://ucx.sourceforge.io/api/mempool_8h.html">mempool.h</a>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
178 </category>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
179 </seealso>

mercurial