LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
stdlib_boolean_sets.c
浏览该文件的文档.
1#include "lmmc/stdlib.h"
2
3#include "memory_bridge.h"
4
5#include "stdlib_internal.h"
6
7lmmc_status_t lmmc_std_bool_equal(int lhs, int rhs, int* out)
8{
9 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
10 if (!lmmc_std_bool_is_valid(lhs) || !lmmc_std_bool_is_valid(rhs)) {
12 }
13 *out = lhs == rhs ? 1 : 0;
14 return LMMC_STATUS_OK;
15}
16
17lmmc_status_t lmmc_std_bool_hash(int value, uint64_t* out)
18{
19 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
20 if (!lmmc_std_bool_is_valid(value)) {
22 }
23 *out = lmmc_std_hash_mix64(value ? UINT64_C(1) : UINT64_C(0));
24 return LMMC_STATUS_OK;
25}
26
27static int lmmc_std_bool_set_valid(const lmmc_std_bool_set_t* set)
28{
29 return set && set->size <= 2 && (set->size == 0 || set->data);
30}
31
32static lmmc_status_t lmmc_std_bool_set_require_valid(
33 const lmmc_std_bool_set_t* set)
34{
35 if (!lmmc_std_bool_set_valid(set)) { return LMMC_STATUS_INVALID_ARGUMENT; }
36 for (size_t i = 0; i < set->size; ++i) {
37 if (!lmmc_std_bool_is_valid(set->data[i])) {
39 }
40 }
41 return LMMC_STATUS_OK;
42}
43
44static int lmmc_std_bool_set_contains_value(const lmmc_std_bool_set_t* set,
45 int value)
46{
47 uint8_t key = value ? 1u : 0u;
48 for (size_t i = 0; i < set->size; ++i) {
49 if (set->data[i] == key) { return 1; }
50 }
51 return 0;
52}
53
54static lmmc_status_t lmmc_std_bool_set_alloc(size_t capacity,
56{
57 if (!out || capacity > 2) { return LMMC_STATUS_INVALID_ARGUMENT; }
58 out->size = 0;
59 out->data = NULL;
60 out->owns_data = 0;
61 if (capacity == 0) { return LMMC_STATUS_OK; }
62 out->data = (uint8_t*)lmmc_memory_alloc_array(capacity, sizeof(uint8_t));
63 if (!out->data) { return LMMC_STATUS_ALLOCATION_FAILED; }
64 out->owns_data = 1;
65 return LMMC_STATUS_OK;
66}
67
68static lmmc_status_t lmmc_std_bool_set_append_unique(
70 int value)
71{
72 if (!set || !lmmc_std_bool_is_valid(value)) {
74 }
75 if (lmmc_std_bool_set_contains_value(set, value)) { return LMMC_STATUS_OK; }
76 if (set->size >= 2) { return LMMC_STATUS_INVALID_ARGUMENT; }
77 set->data[set->size++] = value ? 1u : 0u;
78 return LMMC_STATUS_OK;
79}
80
82 size_t count,
84{
85 lmmc_status_t status;
86 if (!out || (count > 0 && !values)) { return LMMC_STATUS_INVALID_ARGUMENT; }
87 status = lmmc_std_bool_set_alloc(count > 2 ? 2 : count, out);
88 if (status != LMMC_STATUS_OK) { return status; }
89 for (size_t i = 0; i < count; ++i) {
90 status = lmmc_std_bool_set_append_unique(out, values[i]);
91 if (status != LMMC_STATUS_OK) {
93 return status;
94 }
95 }
96 return LMMC_STATUS_OK;
97}
98
100{
101 if (!set) return;
102 if (set->owns_data && set->data) {
104 }
105 set->size = 0;
106 set->data = NULL;
107 set->owns_data = 0;
108}
109
111 int value,
112 int* out)
113{
114 lmmc_status_t status;
115 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
116 if (!lmmc_std_bool_is_valid(value)) { return LMMC_STATUS_INVALID_ARGUMENT; }
117 status = lmmc_std_bool_set_require_valid(set);
118 if (status != LMMC_STATUS_OK) { return status; }
119 *out = lmmc_std_bool_set_contains_value(set, value);
120 return LMMC_STATUS_OK;
121}
122
124 const lmmc_std_bool_set_t* rhs,
125 int* out)
126{
127 lmmc_status_t status;
128 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
129 status = lmmc_std_bool_set_require_valid(lhs);
130 if (status != LMMC_STATUS_OK) { return status; }
131 status = lmmc_std_bool_set_require_valid(rhs);
132 if (status != LMMC_STATUS_OK) { return status; }
133 for (size_t i = 0; i < lhs->size; ++i) {
134 if (!lmmc_std_bool_set_contains_value(rhs, lhs->data[i])) {
135 *out = 0;
136 return LMMC_STATUS_OK;
137 }
138 }
139 *out = 1;
140 return LMMC_STATUS_OK;
141}
142
143static lmmc_status_t lmmc_std_bool_set_binary_alloc(
144 const lmmc_std_bool_set_t* lhs,
145 const lmmc_std_bool_set_t* rhs,
147{
148 lmmc_status_t status;
149 if (!out || (const void*)out == (const void*)lhs ||
150 (const void*)out == (const void*)rhs) {
152 }
153 status = lmmc_std_bool_set_require_valid(lhs);
154 if (status != LMMC_STATUS_OK) { return status; }
155 status = lmmc_std_bool_set_require_valid(rhs);
156 if (status != LMMC_STATUS_OK) { return status; }
157 return lmmc_std_bool_set_alloc(2, out);
158}
159
161 const lmmc_std_bool_set_t* rhs,
163{
164 lmmc_status_t status = lmmc_std_bool_set_binary_alloc(lhs, rhs, out);
165 if (status != LMMC_STATUS_OK) { return status; }
166 for (size_t i = 0; i < lhs->size; ++i) {
167 status = lmmc_std_bool_set_append_unique(out, lhs->data[i]);
168 if (status != LMMC_STATUS_OK) {
169 goto fail;
170 }
171 }
172 for (size_t i = 0; i < rhs->size; ++i) {
173 status = lmmc_std_bool_set_append_unique(out, rhs->data[i]);
174 if (status != LMMC_STATUS_OK) {
175 goto fail;
176 }
177 }
178 return LMMC_STATUS_OK;
179fail:
181 return status;
182}
183
185 const lmmc_std_bool_set_t* rhs,
187{
188 lmmc_status_t status = lmmc_std_bool_set_binary_alloc(lhs, rhs, out);
189 if (status != LMMC_STATUS_OK) { return status; }
190 for (size_t i = 0; i < lhs->size; ++i) {
191 if (lmmc_std_bool_set_contains_value(rhs, lhs->data[i])) {
192 status = lmmc_std_bool_set_append_unique(out, lhs->data[i]);
193 if (status != LMMC_STATUS_OK) {
194 goto fail;
195 }
196 }
197 }
198 return LMMC_STATUS_OK;
199fail:
201 return status;
202}
203
205 const lmmc_std_bool_set_t* rhs,
207{
208 lmmc_status_t status = lmmc_std_bool_set_binary_alloc(lhs, rhs, out);
209 if (status != LMMC_STATUS_OK) { return status; }
210 for (size_t i = 0; i < lhs->size; ++i) {
211 if (!lmmc_std_bool_set_contains_value(rhs, lhs->data[i])) {
212 status = lmmc_std_bool_set_append_unique(out, lhs->data[i]);
213 if (status != LMMC_STATUS_OK) {
214 goto fail;
215 }
216 }
217 }
218 return LMMC_STATUS_OK;
219fail:
221 return status;
222}
223
225 const lmmc_std_bool_set_t* lhs,
226 const lmmc_std_bool_set_t* rhs,
228{
229 lmmc_status_t status = lmmc_std_bool_set_binary_alloc(lhs, rhs, out);
230 if (status != LMMC_STATUS_OK) { return status; }
231 for (size_t i = 0; i < lhs->size; ++i) {
232 if (!lmmc_std_bool_set_contains_value(rhs, lhs->data[i])) {
233 status = lmmc_std_bool_set_append_unique(out, lhs->data[i]);
234 if (status != LMMC_STATUS_OK) {
235 goto fail;
236 }
237 }
238 }
239 for (size_t i = 0; i < rhs->size; ++i) {
240 if (!lmmc_std_bool_set_contains_value(lhs, rhs->data[i])) {
241 status = lmmc_std_bool_set_append_unique(out, rhs->data[i]);
242 if (status != LMMC_STATUS_OK) {
243 goto fail;
244 }
245 }
246 }
247 return LMMC_STATUS_OK;
248fail:
250 return status;
251}
void * lmmc_memory_alloc_array(size_t count, size_t element_size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_std_bool_set_intersection(const lmmc_std_bool_set_t *lhs, const lmmc_std_bool_set_t *rhs, lmmc_std_bool_set_t *out)
lmmc_status_t lmmc_std_bool_set_contains(const lmmc_std_bool_set_t *set, int value, int *out)
lmmc_status_t lmmc_std_bool_set_make(const int *values, size_t count, lmmc_std_bool_set_t *out)
构造去重的 bool 集合。
lmmc_status_t lmmc_std_bool_set_symmetric_difference(const lmmc_std_bool_set_t *lhs, const lmmc_std_bool_set_t *rhs, lmmc_std_bool_set_t *out)
lmmc_status_t lmmc_std_bool_set_difference(const lmmc_std_bool_set_t *lhs, const lmmc_std_bool_set_t *rhs, lmmc_std_bool_set_t *out)
lmmc_status_t lmmc_std_bool_set_subset(const lmmc_std_bool_set_t *lhs, const lmmc_std_bool_set_t *rhs, int *out)
void lmmc_std_bool_set_destroy(lmmc_std_bool_set_t *set)
lmmc_status_t lmmc_std_bool_equal(int lhs, int rhs, int *out)
按 LSR 规范的表键语义比较 bool 值。
lmmc_status_t lmmc_std_bool_set_union(const lmmc_std_bool_set_t *lhs, const lmmc_std_bool_set_t *rhs, lmmc_std_bool_set_t *out)
lmmc_status_t lmmc_std_bool_hash(int value, uint64_t *out)
为 LSR 规范的表键计算 bool 哈希。