LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
stdlib_numeric_sets.c
浏览该文件的文档.
1#include "lmmc/stdlib.h"
2
3#include "memory_bridge.h"
4
5#include "stdlib_internal.h"
6
8{
9 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
10 if (!lmmc_std_real_is_finite(lhs) || !lmmc_std_real_is_finite(rhs)) {
12 }
13 *out = lhs == rhs ? 1 : 0;
14 return LMMC_STATUS_OK;
15}
16
18{
19 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
20 if (!lmmc_std_real_is_finite(value)) {
22 }
23 *out = lmmc_std_real_hash_bits(value);
24 return LMMC_STATUS_OK;
25}
26
27static int lmmc_std_num_set_valid(const lmmc_std_num_set_t* set)
28{
29 return set && (set->size == 0 || set->data);
30}
31
32static lmmc_status_t lmmc_std_num_set_require_finite(
33 const lmmc_std_num_set_t* set)
34{
35 if (!lmmc_std_num_set_valid(set)) { return LMMC_STATUS_INVALID_ARGUMENT; }
36 if (!lmmc_std_real_array_is_finite(set->data, set->size)) {
38 }
39 return LMMC_STATUS_OK;
40}
41
42static int lmmc_std_num_set_contains_value(const lmmc_std_num_set_t* set,
43 lmmc_real_t value)
44{
45 lmmc_real_t key = lmmc_std_num_set_key(value);
46 for (size_t i = 0; i < set->size; ++i) {
47 if (lmmc_std_num_set_key(set->data[i]) == key) { return 1; }
48 }
49 return 0;
50}
51
52static lmmc_status_t lmmc_std_num_set_alloc(size_t capacity,
54{
55 size_t bytes = 0;
56 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
57 out->size = 0;
58 out->data = NULL;
59 out->owns_data = 0;
60 if (capacity == 0) { return LMMC_STATUS_OK; }
61 if (!lmmc_safe_mul_size(capacity, sizeof(lmmc_real_t), &bytes)) {
63 }
64 out->data = (lmmc_real_t*)lmmc_memory_alloc(bytes);
65 if (!out->data) { return LMMC_STATUS_ALLOCATION_FAILED; }
66 out->owns_data = 1;
67 return LMMC_STATUS_OK;
68}
69
70static lmmc_status_t lmmc_std_num_set_append_unique(
72 lmmc_real_t value)
73{
74 if (!set || !lmmc_std_real_is_finite(value)) {
76 }
77 if (lmmc_std_num_set_contains_value(set, value)) { return LMMC_STATUS_OK; }
78 if (!set->data) { return LMMC_STATUS_INVALID_ARGUMENT; }
79 set->data[set->size++] = lmmc_std_num_set_key(value);
80 return LMMC_STATUS_OK;
81}
82
84 size_t count,
86{
87 lmmc_status_t status;
88 if (!out || (count > 0 && !values)) { return LMMC_STATUS_INVALID_ARGUMENT; }
89 if (!lmmc_std_real_array_is_finite(values, count)) {
91 }
92 status = lmmc_std_num_set_alloc(count, out);
93 if (status != LMMC_STATUS_OK) { return status; }
94 for (size_t i = 0; i < count; ++i) {
95 status = lmmc_std_num_set_append_unique(out, values[i]);
96 if (status != LMMC_STATUS_OK) {
98 return status;
99 }
100 }
101 return LMMC_STATUS_OK;
102}
103
105{
106 if (!set) return;
107 if (set->owns_data && set->data) {
109 }
110 set->size = 0;
111 set->data = NULL;
112 set->owns_data = 0;
113}
114
116 lmmc_real_t value,
117 int* out)
118{
119 lmmc_status_t status;
120 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
121 if (!lmmc_std_real_is_finite(value)) {
123 }
124 status = lmmc_std_num_set_require_finite(set);
125 if (status != LMMC_STATUS_OK) { return status; }
126 *out = lmmc_std_num_set_contains_value(set, value);
127 return LMMC_STATUS_OK;
128}
129
131 const lmmc_std_num_set_t* rhs,
132 int* out)
133{
134 lmmc_status_t status;
135 if (!out) { return LMMC_STATUS_INVALID_ARGUMENT; }
136 status = lmmc_std_num_set_require_finite(lhs);
137 if (status != LMMC_STATUS_OK) { return status; }
138 status = lmmc_std_num_set_require_finite(rhs);
139 if (status != LMMC_STATUS_OK) { return status; }
140 for (size_t i = 0; i < lhs->size; ++i) {
141 if (!lmmc_std_num_set_contains_value(rhs, lhs->data[i])) {
142 *out = 0;
143 return LMMC_STATUS_OK;
144 }
145 }
146 *out = 1;
147 return LMMC_STATUS_OK;
148}
149
150static lmmc_status_t lmmc_std_num_set_binary_alloc(
151 const lmmc_std_num_set_t* lhs,
152 const lmmc_std_num_set_t* rhs,
154 size_t* capacity)
155{
156 lmmc_status_t status;
157 if (!out || (const void*)out == (const void*)lhs ||
158 (const void*)out == (const void*)rhs || !capacity) {
160 }
161 status = lmmc_std_num_set_require_finite(lhs);
162 if (status != LMMC_STATUS_OK) { return status; }
163 status = lmmc_std_num_set_require_finite(rhs);
164 if (status != LMMC_STATUS_OK) { return status; }
165 if (lhs->size > ((size_t)-1) - rhs->size) {
167 }
168 *capacity = lhs->size + rhs->size;
169 return lmmc_std_num_set_alloc(*capacity, out);
170}
171
173 const lmmc_std_num_set_t* rhs,
175{
176 size_t capacity = 0;
177 lmmc_status_t status = lmmc_std_num_set_binary_alloc(lhs, rhs, out,
178 &capacity);
179 (void)capacity;
180 if (status != LMMC_STATUS_OK) { return status; }
181 for (size_t i = 0; i < lhs->size; ++i) {
182 status = lmmc_std_num_set_append_unique(out, lhs->data[i]);
183 if (status != LMMC_STATUS_OK) {
184 goto fail;
185 }
186 }
187 for (size_t i = 0; i < rhs->size; ++i) {
188 status = lmmc_std_num_set_append_unique(out, rhs->data[i]);
189 if (status != LMMC_STATUS_OK) {
190 goto fail;
191 }
192 }
193 return LMMC_STATUS_OK;
194fail:
196 return status;
197}
198
200 const lmmc_std_num_set_t* rhs,
202{
203 size_t capacity = 0;
204 lmmc_status_t status = lmmc_std_num_set_binary_alloc(lhs, rhs, out,
205 &capacity);
206 (void)capacity;
207 if (status != LMMC_STATUS_OK) { return status; }
208 for (size_t i = 0; i < lhs->size; ++i) {
209 if (lmmc_std_num_set_contains_value(rhs, lhs->data[i])) {
210 status = lmmc_std_num_set_append_unique(out, lhs->data[i]);
211 if (status != LMMC_STATUS_OK) {
213 return status;
214 }
215 }
216 }
217 return LMMC_STATUS_OK;
218}
219
221 const lmmc_std_num_set_t* rhs,
223{
224 size_t capacity = 0;
225 lmmc_status_t status = lmmc_std_num_set_binary_alloc(lhs, rhs, out,
226 &capacity);
227 (void)capacity;
228 if (status != LMMC_STATUS_OK) { return status; }
229 for (size_t i = 0; i < lhs->size; ++i) {
230 if (!lmmc_std_num_set_contains_value(rhs, lhs->data[i])) {
231 status = lmmc_std_num_set_append_unique(out, lhs->data[i]);
232 if (status != LMMC_STATUS_OK) {
234 return status;
235 }
236 }
237 }
238 return LMMC_STATUS_OK;
239}
240
242 const lmmc_std_num_set_t* lhs,
243 const lmmc_std_num_set_t* rhs,
245{
246 size_t capacity = 0;
247 lmmc_status_t status = lmmc_std_num_set_binary_alloc(lhs, rhs, out,
248 &capacity);
249 (void)capacity;
250 if (status != LMMC_STATUS_OK) { return status; }
251 for (size_t i = 0; i < lhs->size; ++i) {
252 if (!lmmc_std_num_set_contains_value(rhs, lhs->data[i])) {
253 status = lmmc_std_num_set_append_unique(out, lhs->data[i]);
254 if (status != LMMC_STATUS_OK) {
255 goto fail;
256 }
257 }
258 }
259 for (size_t i = 0; i < rhs->size; ++i) {
260 if (!lmmc_std_num_set_contains_value(lhs, rhs->data[i])) {
261 status = lmmc_std_num_set_append_unique(out, rhs->data[i]);
262 if (status != LMMC_STATUS_OK) {
263 goto fail;
264 }
265 }
266 }
267 return LMMC_STATUS_OK;
268fail:
270 return status;
271}
double lmmc_real_t
Public and internal LMMC real type.
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
lmmc_status_t lmmc_std_num_set_symmetric_difference(const lmmc_std_num_set_t *lhs, const lmmc_std_num_set_t *rhs, lmmc_std_num_set_t *out)
lmmc_status_t lmmc_std_num_set_make(const lmmc_real_t *values, size_t count, lmmc_std_num_set_t *out)
构造去重的有限数值集合。
lmmc_status_t lmmc_std_num_hash(lmmc_real_t value, uint64_t *out)
为 LSR 规范的表键计算有限数值哈希。
lmmc_status_t lmmc_std_num_set_difference(const lmmc_std_num_set_t *lhs, const lmmc_std_num_set_t *rhs, lmmc_std_num_set_t *out)
lmmc_status_t lmmc_std_num_set_contains(const lmmc_std_num_set_t *set, lmmc_real_t value, int *out)
lmmc_status_t lmmc_std_num_equal(lmmc_real_t lhs, lmmc_real_t rhs, int *out)
按 LSR 规范的结构键语义比较有限数值。
lmmc_status_t lmmc_std_num_set_subset(const lmmc_std_num_set_t *lhs, const lmmc_std_num_set_t *rhs, int *out)
void lmmc_std_num_set_destroy(lmmc_std_num_set_t *set)
lmmc_status_t lmmc_std_num_set_intersection(const lmmc_std_num_set_t *lhs, const lmmc_std_num_set_t *rhs, lmmc_std_num_set_t *out)
lmmc_status_t lmmc_std_num_set_union(const lmmc_std_num_set_t *lhs, const lmmc_std_num_set_t *rhs, lmmc_std_num_set_t *out)