Sun, 22 Dec 2024 22:10:04 +0100
don't trust that size_t always has word width
it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | * \file buffer.h |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | * \brief Advanced buffer implementation. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | * Instances of CxBuffer can be used to read from or to write to like one |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | * would do with a stream. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
37 | * Some features for convenient use of the buffer |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | * can be enabled. See the documentation of the macro constants for more |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | * information. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
41 | * \author Mike Becker |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
42 | * \author Olaf Wintermann |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
43 | * \copyright 2-Clause BSD License |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
44 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | #ifndef UCX_BUFFER_H |
484
9e6900b1cf9d
add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents:
483
diff
changeset
|
47 | #define UCX_BUFFER_H |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
48 | |
484
9e6900b1cf9d
add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents:
483
diff
changeset
|
49 | #include "common.h" |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
50 | #include "allocator.h" |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
51 | |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
52 | #ifdef __cplusplus |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
53 | extern "C" { |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
54 | #endif |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
55 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
56 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
57 | * No buffer features enabled (all flags cleared). |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
58 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
59 | #define CX_BUFFER_DEFAULT 0x00 |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
61 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
62 | * If this flag is enabled, the buffer will automatically free its contents when destroyed. |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
63 | * |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
64 | * Do NOT set this flag together with #CX_BUFFER_COPY_ON_WRITE. It will be automatically |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
65 | * set when the copy-on-write operations is performed. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
66 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
67 | #define CX_BUFFER_FREE_CONTENTS 0x01 |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
69 | /** |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
70 | * If this flag is enabled, the buffer will automatically extend its capacity. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
71 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
72 | #define CX_BUFFER_AUTO_EXTEND 0x02 |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
73 | |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
74 | /** |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
75 | * If this flag is enabled, the buffer will allocate new memory when written to. |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
76 | * |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
77 | * The current contents of the buffer will be copied to the new memory and the flag |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
78 | * will be cleared while the #CX_BUFFER_FREE_CONTENTS flag will be set automatically. |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
79 | */ |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
80 | #define CX_BUFFER_COPY_ON_WRITE 0x04 |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
81 | |
1028
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
82 | /** |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
83 | * If this flag is enabled, the buffer will copy its contents to a new memory area on reallocation. |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
84 | * |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
85 | * After performing the copy, the flag is automatically cleared. |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
86 | * This flag has no effect on buffers which do not have #CX_BUFFER_AUTO_EXTEND set, which is why |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
87 | * buffers automatically admit the auto-extend flag when initialized with copy-on-extend enabled. |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
88 | */ |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
89 | #define CX_BUFFER_COPY_ON_EXTEND 0x08 |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
90 | |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
91 | /** Structure for the UCX buffer data. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
92 | typedef struct { |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
93 | /** A pointer to the buffer contents. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
94 | union { |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
95 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
96 | * Data is interpreted as text. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
97 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
98 | char *space; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
99 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
100 | * Data is interpreted as binary. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
101 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
102 | unsigned char *bytes; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
103 | }; |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
104 | /** The allocator to use for automatic memory management. */ |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
761
diff
changeset
|
105 | const CxAllocator *allocator; |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
106 | /** Current position of the buffer. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
107 | size_t pos; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
108 | /** Current capacity (i.e. maximum size) of the buffer. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
109 | size_t capacity; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
110 | /** Current size of the buffer content. */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
111 | size_t size; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
112 | /** |
539
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
113 | * The buffer may not extend beyond this threshold before starting to flush. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
114 | * Default is \c SIZE_MAX (flushing disabled when auto extension is enabled). |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
115 | */ |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
116 | size_t flush_threshold; |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
117 | /** |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
118 | * The block size for the elements to flush. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
119 | * Default is 4096 bytes. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
120 | */ |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
121 | size_t flush_blksize; |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
122 | /** |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
123 | * The maximum number of blocks to flush in one cycle. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
124 | * Zero disables flushing entirely (this is the default). |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
125 | * Set this to \c SIZE_MAX to flush the entire buffer. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
126 | * |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
127 | * @attention if the maximum number of blocks multiplied with the block size |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
128 | * is smaller than the expected contents written to this buffer within one write |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
129 | * operation, multiple flush cycles are performed after that write. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
130 | * That means the total number of blocks flushed after one write to this buffer may |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
131 | * be larger than \c flush_blkmax. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
132 | */ |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
133 | size_t flush_blkmax; |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
134 | |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
135 | /** |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
136 | * The write function used for flushing. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
137 | * If NULL, the flushed content gets discarded. |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
138 | */ |
545
3700ac4bd9a3
#184 #170 first basic flush test
Mike Becker <universe@uap-core.de>
parents:
541
diff
changeset
|
139 | cx_write_func flush_func; |
539
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
140 | |
9cd98da9ee17
#184 start implementation of the flush feature
Mike Becker <universe@uap-core.de>
parents:
537
diff
changeset
|
141 | /** |
541
67e078518935
#170 complete write tests for status quo
Mike Becker <universe@uap-core.de>
parents:
539
diff
changeset
|
142 | * The target for \c flush_func. |
67e078518935
#170 complete write tests for status quo
Mike Becker <universe@uap-core.de>
parents:
539
diff
changeset
|
143 | */ |
67e078518935
#170 complete write tests for status quo
Mike Becker <universe@uap-core.de>
parents:
539
diff
changeset
|
144 | void *flush_target; |
67e078518935
#170 complete write tests for status quo
Mike Becker <universe@uap-core.de>
parents:
539
diff
changeset
|
145 | |
67e078518935
#170 complete write tests for status quo
Mike Becker <universe@uap-core.de>
parents:
539
diff
changeset
|
146 | /** |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
147 | * Flag register for buffer features. |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
148 | * @see #CX_BUFFER_DEFAULT |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
149 | * @see #CX_BUFFER_FREE_CONTENTS |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
150 | * @see #CX_BUFFER_AUTO_EXTEND |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
151 | * @see #CX_BUFFER_COPY_ON_WRITE |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
152 | */ |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
153 | int flags; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
154 | } cx_buffer_s; |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
155 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
156 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
157 | * UCX buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
158 | */ |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
159 | typedef cx_buffer_s CxBuffer; |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
160 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
161 | /** |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
162 | * Initializes a fresh buffer. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
163 | * |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
164 | * You may also provide a read-only \p space, in which case |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
165 | * you will need to cast the pointer, and you should set the |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
166 | * #CX_BUFFER_COPY_ON_WRITE flag. |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
167 | * |
1029
c065d196a2c8
add advice to set the size of a buffer initialized with existing data
Mike Becker <universe@uap-core.de>
parents:
1028
diff
changeset
|
168 | * You need to set the size manually after initialization, if |
c065d196a2c8
add advice to set the size of a buffer initialized with existing data
Mike Becker <universe@uap-core.de>
parents:
1028
diff
changeset
|
169 | * you provide \p space which already contains data. |
c065d196a2c8
add advice to set the size of a buffer initialized with existing data
Mike Becker <universe@uap-core.de>
parents:
1028
diff
changeset
|
170 | * |
1028
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
171 | * When you specify stack memory as \p space and decide to use |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
172 | * the auto-extension feature, you \em must use the |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
173 | * #CX_BUFFER_COPY_ON_EXTEND flag, instead of the |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
174 | * #CX_BUFFER_AUTO_EXTEND flag. |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
175 | * |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
176 | * \note You may provide \c NULL as argument for \p space. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
177 | * Then this function will allocate the space and enforce |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
178 | * the #CX_BUFFER_FREE_CONTENTS flag. In that case, specifying |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
179 | * copy-on-write should be avoided, because the allocated |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
180 | * space will be leaking after the copy-on-write operation. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
181 | * |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
182 | * @param buffer the buffer to initialize |
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
183 | * @param space pointer to the memory area, or \c NULL to allocate |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
184 | * new memory |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
185 | * @param capacity the capacity of the buffer |
673
60fb6aec157d
make allocator in cxBufferInit optional
Mike Becker <universe@uap-core.de>
parents:
628
diff
changeset
|
186 | * @param allocator the allocator this buffer shall use for automatic |
989
8aa57a7fecc4
improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
187 | * memory management |
8aa57a7fecc4
improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
188 | * (if \c NULL, a default stdlib allocator will be used) |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
189 | * @param flags buffer features (see cx_buffer_s.flags) |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
190 | * @return zero on success, non-zero if a required allocation failed |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
191 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
192 | cx_attr_nonnull_arg(1) |
501
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
193 | int cxBufferInit( |
9a08f5e515cc
add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents:
500
diff
changeset
|
194 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
195 | void *space, |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
196 | size_t capacity, |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
761
diff
changeset
|
197 | const CxAllocator *allocator, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
198 | int flags |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
199 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
200 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
201 | /** |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
202 | * Destroys the buffer contents. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
203 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
204 | * Has no effect if the #CX_BUFFER_FREE_CONTENTS feature is not enabled. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
205 | * If you want to free the memory of the entire buffer, use cxBufferFree(). |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
206 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
207 | * @param buffer the buffer which contents shall be destroyed |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
208 | * @see cxBufferInit() |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
209 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
210 | cx_attr_nonnull |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
211 | void cxBufferDestroy(CxBuffer *buffer); |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
212 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
213 | /** |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
214 | * Deallocates the buffer. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
215 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
216 | * If the #CX_BUFFER_FREE_CONTENTS feature is enabled, this function also destroys |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
217 | * the contents. If you \em only want to destroy the contents, use cxBufferDestroy(). |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
218 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
219 | * \remark As with all free() functions, this accepts \c NULL arguments in which |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
220 | * case it does nothing. |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
221 | * |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
222 | * @param buffer the buffer to deallocate |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
223 | * @see cxBufferCreate() |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
224 | */ |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
225 | void cxBufferFree(CxBuffer *buffer); |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
226 | |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
227 | /** |
683
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
228 | * Allocates and initializes a fresh buffer. |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
229 | * |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
230 | * You may also provide a read-only \p space, in which case |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
231 | * you will need to cast the pointer, and you should set the |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
232 | * #CX_BUFFER_COPY_ON_WRITE flag. |
1028
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
233 | * When you specify stack memory as \p space and decide to use |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
234 | * the auto-extension feature, you \em must use the |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
235 | * #CX_BUFFER_COPY_ON_EXTEND flag, instead of the |
3e4905241838
add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents:
1024
diff
changeset
|
236 | * #CX_BUFFER_AUTO_EXTEND flag. |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
237 | * |
683
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
238 | * \note You may provide \c NULL as argument for \p space. |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
239 | * Then this function will allocate the space and enforce |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
240 | * the #CX_BUFFER_FREE_CONTENTS flag. |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
241 | * |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
242 | * @param space pointer to the memory area, or \c NULL to allocate |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
243 | * new memory |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
244 | * @param capacity the capacity of the buffer |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
245 | * @param allocator the allocator to use for allocating the structure and the automatic |
989
8aa57a7fecc4
improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
246 | * memory management within the buffer |
8aa57a7fecc4
improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents:
985
diff
changeset
|
247 | * (if \c NULL, a default stdlib allocator will be used) |
683
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
248 | * @param flags buffer features (see cx_buffer_s.flags) |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
249 | * @return a pointer to the buffer on success, \c NULL if a required allocation failed |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
250 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
251 | cx_attr_malloc |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
252 | cx_attr_dealloc(cxBufferFree, 1) |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
253 | cx_attr_nodiscard |
683
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
254 | CxBuffer *cxBufferCreate( |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
255 | void *space, |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
256 | size_t capacity, |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
761
diff
changeset
|
257 | const CxAllocator *allocator, |
683
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
258 | int flags |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
259 | ); |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
260 | |
aa0d09f2d81c
add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents:
673
diff
changeset
|
261 | /** |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
262 | * Shifts the contents of the buffer by the given offset. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
263 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
264 | * If the offset is positive, the contents are shifted to the right. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
265 | * If auto extension is enabled, the buffer grows, if necessary. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
266 | * In case the auto extension fails, this function returns a non-zero value and |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
267 | * no contents are changed. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
268 | * If auto extension is disabled, the contents that do not fit into the buffer |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
269 | * are discarded. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
270 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
271 | * If the offset is negative, the contents are shifted to the left where the |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
272 | * first \p shift bytes are discarded. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
273 | * The new size of the buffer is the old size minus the absolute shift value. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
274 | * If this value is larger than the buffer size, the buffer is emptied (but |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
275 | * not cleared, see the security note below). |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
276 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
277 | * The buffer position gets shifted alongside with the content but is kept |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
278 | * within the boundaries of the buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
279 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
280 | * \note For situations where \c off_t is not large enough, there are specialized cxBufferShiftLeft() and |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
281 | * cxBufferShiftRight() functions using a \c size_t as parameter type. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
282 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
283 | * \attention |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
284 | * Security Note: The shifting operation does \em not erase the previously occupied memory cells. |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
285 | * But you can easily do that manually, e.g. by calling |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
286 | * <code>memset(buffer->bytes, 0, shift)</code> for a right shift or |
531
1b8624c8448e
fix erroneous doc for cxBufferShift
Mike Becker <universe@uap-core.de>
parents:
530
diff
changeset
|
287 | * <code>memset(buffer->bytes + buffer->size, 0, buffer->capacity - buffer->size)</code> |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
288 | * for a left shift. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
289 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
290 | * @param buffer the buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
291 | * @param shift the shift offset (negative means left shift) |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
292 | * @return 0 on success, non-zero if a required auto-extension or copy-on-write fails |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
293 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
294 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
295 | int cxBufferShift( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
296 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
297 | off_t shift |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
298 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
299 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
300 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
301 | * Shifts the buffer to the right. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
302 | * See cxBufferShift() for details. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
303 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
304 | * @param buffer the buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
305 | * @param shift the shift offset |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
306 | * @return 0 on success, non-zero if a required auto-extension or copy-on-write fails |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
307 | * @see cxBufferShift() |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
308 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
309 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
310 | int cxBufferShiftRight( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
311 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
312 | size_t shift |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
313 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
314 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
315 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
316 | * Shifts the buffer to the left. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
317 | * See cxBufferShift() for details. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
318 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
319 | * @param buffer the buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
320 | * @param shift the positive shift offset |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
321 | * @return usually zero, except the buffer uses copy-on-write and the allocation fails |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
322 | * @see cxBufferShift() |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
323 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
324 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
325 | int cxBufferShiftLeft( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
326 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
327 | size_t shift |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
328 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
329 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
330 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
331 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
332 | * Moves the position of the buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
333 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
334 | * The new position is relative to the \p whence argument. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
335 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
336 | * \li \c SEEK_SET marks the start of the buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
337 | * \li \c SEEK_CUR marks the current position. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
338 | * \li \c SEEK_END marks the end of the buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
339 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
340 | * With an offset of zero, this function sets the buffer position to zero |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
341 | * (\c SEEK_SET), the buffer size (\c SEEK_END) or leaves the buffer position |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
342 | * unchanged (\c SEEK_CUR). |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
343 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
344 | * @param buffer the buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
345 | * @param offset position offset relative to \p whence |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
346 | * @param whence one of \c SEEK_SET, \c SEEK_CUR or \c SEEK_END |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
347 | * @return 0 on success, non-zero if the position is invalid |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
348 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
349 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
350 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
351 | int cxBufferSeek( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
352 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
353 | off_t offset, |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
354 | int whence |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
355 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
356 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
357 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
358 | * Clears the buffer by resetting the position and deleting the data. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
359 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
360 | * The data is deleted by zeroing it with a call to memset(). |
761
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
361 | * If you do not need that, you can use the faster cxBufferReset(). |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
362 | * |
1024
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
363 | * \note If the #CX_BUFFER_COPY_ON_WRITE flag is set, this function |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
364 | * will not erase the data and behave exactly as cxBufferReset(). |
8f99f6c28bd3
add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents:
1016
diff
changeset
|
365 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
366 | * @param buffer the buffer to be cleared |
761
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
367 | * @see cxBufferReset() |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
368 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
369 | cx_attr_nonnull |
529
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
370 | void cxBufferClear(CxBuffer *buffer); |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
371 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
372 | /** |
761
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
373 | * Resets the buffer by resetting the position and size to zero. |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
374 | * |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
375 | * The data in the buffer is not deleted. If you need a safe |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
376 | * reset of the buffer, use cxBufferClear(). |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
377 | * |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
378 | * @param buffer the buffer to be cleared |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
379 | * @see cxBufferClear() |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
380 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
381 | cx_attr_nonnull |
761
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
382 | void cxBufferReset(CxBuffer *buffer); |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
383 | |
61d5197d612b
add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents:
759
diff
changeset
|
384 | /** |
757
49ceea78fce7
fix incorrect documentation of cxBufferEof()
Mike Becker <universe@uap-core.de>
parents:
683
diff
changeset
|
385 | * Tests, if the buffer position has exceeded the buffer size. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
386 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
387 | * @param buffer the buffer to test |
1004
d8044fd5005c
make cxBufferEof() return a bool
Mike Becker <universe@uap-core.de>
parents:
989
diff
changeset
|
388 | * @return true, if the current buffer position has exceeded the last |
757
49ceea78fce7
fix incorrect documentation of cxBufferEof()
Mike Becker <universe@uap-core.de>
parents:
683
diff
changeset
|
389 | * byte of the buffer's contents. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
390 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
391 | cx_attr_nonnull |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
392 | cx_attr_nodiscard |
1004
d8044fd5005c
make cxBufferEof() return a bool
Mike Becker <universe@uap-core.de>
parents:
989
diff
changeset
|
393 | bool cxBufferEof(const CxBuffer *buffer); |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
394 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
395 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
396 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
397 | * Ensures that the buffer has a minimum capacity. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
398 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
399 | * If the current capacity is not sufficient, the buffer will be extended. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
400 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
401 | * @param buffer the buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
402 | * @param capacity the minimum required capacity for this buffer |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
403 | * @return 0 on success or a non-zero value on failure |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
404 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
405 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
406 | int cxBufferMinimumCapacity( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
407 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
408 | size_t capacity |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
409 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
410 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
411 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
412 | * Writes data to a CxBuffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
413 | * |
567
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
414 | * If flushing is enabled and the buffer needs to flush, the data is flushed to |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
415 | * the target until the target signals that it cannot take more data by |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
416 | * returning zero via the respective write function. In that case, the remaining |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
417 | * data in this buffer is shifted to the beginning of this buffer so that the |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
418 | * newly available space can be used to append as much data as possible. This |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
419 | * function only stops writing more elements, when the flush target and this |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
420 | * buffer are both incapable of taking more data or all data has been written. |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
421 | * The number returned by this function is the total number of elements that |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
422 | * could be written during the process. It does not necessarily mean that those |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
423 | * elements are still in this buffer, because some of them could have also be |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
424 | * flushed already. |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
425 | * |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
426 | * If automatic flushing is not enabled, the position of the buffer is increased |
f90a7cfe2480
#184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents:
545
diff
changeset
|
427 | * by the number of bytes written. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
428 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
429 | * \note The signature is compatible with the fwrite() family of functions. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
430 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
431 | * @param ptr a pointer to the memory area containing the bytes to be written |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
432 | * @param size the length of one element |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
433 | * @param nitems the element count |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
434 | * @param buffer the CxBuffer to write to |
537
16219eba3a0a
fix doc error for cxBufferWrite
Mike Becker <universe@uap-core.de>
parents:
531
diff
changeset
|
435 | * @return the total count of elements written |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
436 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
437 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
438 | size_t cxBufferWrite( |
890
54565fd74e74
move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents:
761
diff
changeset
|
439 | const void *ptr, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
440 | size_t size, |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
441 | size_t nitems, |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
442 | CxBuffer *buffer |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
443 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
444 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
445 | /** |
1030
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
446 | * Appends data to a CxBuffer. |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
447 | * |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
448 | * The data is always appended to current data within the buffer, |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
449 | * regardless of the current position. |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
450 | * This is especially useful when the buffer is primarily meant for reading |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
451 | * while additional data is added to the buffer occasionally. |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
452 | * Consequently, the position of the buffer is unchanged after this operation. |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
453 | * |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
454 | * \note The signature is compatible with the fwrite() family of functions. |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
455 | * |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
456 | * @param ptr a pointer to the memory area containing the bytes to be written |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
457 | * @param size the length of one element |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
458 | * @param nitems the element count |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
459 | * @param buffer the CxBuffer to write to |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
460 | * @return the total count of elements written |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
461 | * @see cxBufferWrite() |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
462 | */ |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
463 | cx_attr_nonnull |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
464 | size_t cxBufferAppend( |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
465 | const void *ptr, |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
466 | size_t size, |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
467 | size_t nitems, |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
468 | CxBuffer *buffer |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
469 | ); |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
470 | |
06091e067bee
add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents:
1029
diff
changeset
|
471 | /** |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
472 | * Reads data from a CxBuffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
473 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
474 | * The position of the buffer is increased by the number of bytes read. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
475 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
476 | * \note The signature is compatible with the fread() family of functions. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
477 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
478 | * @param ptr a pointer to the memory area where to store the read data |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
479 | * @param size the length of one element |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
480 | * @param nitems the element count |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
481 | * @param buffer the CxBuffer to read from |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
482 | * @return the total number of elements read |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
483 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
484 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
485 | size_t cxBufferRead( |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
486 | void *ptr, |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
487 | size_t size, |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
488 | size_t nitems, |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
489 | CxBuffer *buffer |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
490 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
491 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
492 | /** |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
493 | * Writes a character to a buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
494 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
495 | * The least significant byte of the argument is written to the buffer. If the |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
496 | * end of the buffer is reached and #CX_BUFFER_AUTO_EXTEND feature is enabled, |
1005
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
497 | * the buffer capacity is extended by cxBufferMinimumCapacity(). If the feature |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
498 | * is disabled or buffer extension fails, \c EOF is returned. |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
499 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
500 | * On successful write, the position of the buffer is increased. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
501 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
502 | * @param buffer the buffer to write to |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
503 | * @param c the character to write |
1005
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
504 | * @return the byte that has been written or \c EOF when the end of the stream is |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
505 | * reached and automatic extension is not enabled or not possible |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
506 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
507 | cx_attr_nonnull |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
508 | int cxBufferPut( |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
509 | CxBuffer *buffer, |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
510 | int c |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
511 | ); |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
512 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
513 | /** |
1005
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
514 | * Writes a terminating zero to a buffer. |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
515 | * |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
516 | * On successful write, \em neither the position \em nor the size of the buffer is |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
517 | * increased. |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
518 | * |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
519 | * The purpose of this function is to have the written data ready to be used as |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
520 | * a C string. |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
521 | * |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
522 | * @param buffer the buffer to write to |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
523 | * @return zero, if the terminator could be written, non-zero otherwise |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
524 | */ |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
525 | cx_attr_nonnull |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
526 | int cxBufferTerminate(CxBuffer *buffer); |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
527 | |
67fa386ce600
add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents:
1004
diff
changeset
|
528 | /** |
529
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
529 | * Writes a string to a buffer. |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
530 | * |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
531 | * @param buffer the buffer |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
532 | * @param str the zero-terminated string |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
533 | * @return the number of bytes written |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
534 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
535 | cx_attr_nonnull |
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
536 | cx_attr_cstr_arg(2) |
529
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
537 | size_t cxBufferPutString( |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
538 | CxBuffer *buffer, |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
539 | const char *str |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
540 | ); |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
541 | |
814d51173f20
#171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents:
501
diff
changeset
|
542 | /** |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
543 | * Gets a character from a buffer. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
544 | * |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
545 | * The current position of the buffer is increased after a successful read. |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
546 | * |
485
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
547 | * @param buffer the buffer to read from |
6a86ad3d8c03
use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents:
484
diff
changeset
|
548 | * @return the character or \c EOF, if the end of the buffer is reached |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
549 | */ |
985
68754c7de906
major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents:
948
diff
changeset
|
550 | cx_attr_nonnull |
500
eb9e7bd40a8e
do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
551 | int cxBufferGet(CxBuffer *buffer); |
483
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
552 | |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
553 | #ifdef __cplusplus |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
554 | } |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
555 | #endif |
929016224c3c
add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
556 | |
628
1e2be40f0cb5
use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents:
567
diff
changeset
|
557 | #endif // UCX_BUFFER_H |