ae2f_docs
MMap.def.c
1#ifndef ae2f_MMap_h
2#define ae2f_MMap_h
3
4#include <ae2f/Call.h>
5#include <ae2f/Cast.h>
6#include <ae2f/Float.h>
7#include <ae2f/errGlob.h>
8#include <ae2f/Cmp.h>
9
10#include <ae2f/Pack/Beg.h>
11#include <ae2f/Macro.h>
12#include <ae2f/Guide.h>
13
14#include <assert.h>
15
16/** @brief
17 * Multilinear map, or tensor.
18 *
19 *
20 * */
21ae2f_structdef_v(struct, ae2f_mMMap, ae2f_mMMap)
22{
23 /** @brief aka dimension count */
24 size_t m_dim;
25};
26
27ae2f_structdef(struct, ae2f_MMap) {
28 ae2f_mMMap mmap;
29};
30
31#if 0
32ae2f_extern ae2f_SHAREDCALL
33void ae2f_mMMapInit(
34 ae2f_mMMap* const mmap
35 , const size_t dim
36 , const size_t* const lenS
37 , ae2f_err_t* const opt_ret_err
38 , size_t* const opt_ret_sz
39 ) ae2f_noexcept;
40
41
42ae2f_extern ae2f_SHAREDCALL
43void ae2f_mMMapMk(
44 const size_t dim,
45 const size_t* const lens,
46 ae2f_err_t* const opt_ret_err,
47 ae2f_FREE(free, ae2f_mMMapDel) ae2f_mMMap** const ret_mmap
48 ) ae2f_noexcept;
49
50ae2f_extern ae2f_SHAREDCALL
51void ae2f_mMMapFieldIdx(
52 const ae2f_mMMap* const mmap,
53 const size_t dim,
54 const size_t* const idxs,
55 size_t* const ret
56 );
57
58ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapSz(
59 const size_t dim, const size_t* const lens
60 , size_t* const ret);
61
62ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapDel(
63 ae2f_mMMap* mmap
64 );
65#endif
66
67
68#define ae2f_mMMapInit __ae2f_mMMapInit
69#define ae2f_mMMapMk __ae2f_mMMapMk
70#define ae2f_mMMapDel __ae2f_mMMapDel
71#define ae2f_mMMapSz __ae2f_mMMapSz
72#define ae2f_mMMapFieldIdx __ae2f_mMMapFieldIdx
73
74#include <string.h>
75#include <stdlib.h>
76
77
78
79/** @brief Length vector for every dimension index. */
80#define ae2f_mMMapDimLen(mmap, ...)
81 ae2f_reinterpret_cast(__VA_ARGS__ size_t*, ((mmap) + 1))
82
83/** @breif Memory field. Indexer needed. */
84#define ae2f_mMMapField(mmap, ...)
85 ae2f_reinterpret_cast(__VA_ARGS__ ae2f_float_t*, ae2f_mMMapDimLen(mmap, __VA_ARGS__) + (mmap)->m_dim)
86
87
88ae2f_structdef(struct, ae2f_mMMapSz_t) {
89 /** @brief output */
90 size_t m_ret;
91 size_t m_dim;
92};
93
94ae2f_structdef(struct, ae2f_mMMapFieldIdx_t) {
95 size_t m_ret;
96 size_t m_i;
97 size_t m_dim;
98
99 size_t m_L, m_I;
100};
101
102ae2f_structdef(struct, ae2f_mMMapInit_t) {
103 size_t m_i, m_ret;
104};
105
106ae2f_structdef(struct, ae2f_mMMapMk_t) {
107 ae2f_mMMap* m_ptr;
108 ae2f_mMMapInit_t m_initstack;
109};
110
111#include <ae2f/Pack/End.h>
112
113#endif
114
115
116#ifndef ae2f_MMap_c
117
119#include <ae2f/MMap/MMap.h>
120#endif
121
122#define ae2f_MMap_c
123
124
125ae2f_MAC() _ae2f_mMMapSz_imp(
126 ae2f_mMMapSz_t v_mapsz
127 , const size_t dim
128 , const size_t* const lens
129 )
130{
131 assert(dim);
132 assert(lens);
133
134 v_mapsz.m_ret = 1;
135 v_mapsz.m_dim = (dim);
136
137 while(v_mapsz.m_dim--) {
138 v_mapsz.m_ret *= (lens)[(v_mapsz).m_dim];
139 }
140
141 assert(v_mapsz.m_dim == -1);
142
143 v_mapsz.m_ret =
144 v_mapsz.m_ret * sizeof(ae2f_float_t)
145 + ((dim)) * sizeof(size_t)
146 + sizeof(ae2f_MMap);
147
148
149}
150
151ae2f_MAC() _ae2f_mMMapSz(const size_t dim, const size_t* const lens
152 , size_t* const ret)
153{
154 unless(lens) {
155 assert(0 && "lens is not good");
156 (ret) && (*(ret) = -1);
157 } else {
158 ae2f_mMMapSz_t v_sz;
159 __ae2f_mMMapSz_imp(v_sz, dim, lens);
160 (ret) && (*(ret) = v_sz.m_ret);
161 }
162}
163
164#if ae2f_WhenCXX(!)0
165/**
166 * @brief
167 * Calculates the memory length needed in bytes.
168 *
169 * @param dim
170 * Dimension, aka length of lens.
171 *
172 * @param lens
173 * Length vector.
174 *
175 * */
176constextendedfun size_t _ae2f_mMMapSz(
177 size_t dim,
178 const size_t* lens
179 ) ae2f_noexcept
180{
181 if(!(lens)) {
182 return -1;
183 }
184
185 ae2f_mMMapSz_t v_sz;
186 __ae2f_mMMapSz_imp(v_sz, dim, lens);
187 return v_sz.m_ret;
188}
189
190#endif
191
192
193ae2f_MAC() _ae2f_mMMapFieldIdx_imp(
194 ae2f_mMMapFieldIdx_t v_fidx,
195 const ae2f_mMMap* const mmap,
196 const size_t dim,
197 const size_t* const idxs
198 )
199{
200 assert((mmap) && "mmap is null");
201 assert((idxs));
202
203 v_fidx.m_L = 1;
204 v_fidx.m_dim = ae2f_CmpGetLs(dim, (mmap)->m_dim);
205 v_fidx.m_ret = 0;
206
207 for(v_fidx.m_i = 0; v_fidx.m_i < v_fidx.m_dim - 1 && v_fidx.m_L; v_fidx.m_i++) {
208 v_fidx.m_L = ae2f_mMMapDimLen(mmap)[v_fidx.m_dim - v_fidx.m_i - 1];
209 v_fidx.m_I = (idxs)[v_fidx.m_dim - 1 - v_fidx.m_i] % v_fidx.m_L;
210 v_fidx.m_ret += v_fidx.m_I;
211 v_fidx.m_ret *= v_fidx.m_L;
212 }
213
214 if(v_fidx.m_i < v_fidx.m_dim - 1)
215 {
216 assert(0 && "who are you");
217 v_fidx.m_ret = -1;
218 }
219
220 else {
221 v_fidx.m_ret += (idxs)[(dim) - 1 - v_fidx.m_i] % ae2f_mMMapDimLen(mmap)[
222 v_fidx.m_dim
223 - v_fidx.m_i
224 - 1
225 ];
226
227 v_fidx.m_dim = (mmap)->m_dim;
228
229 for(; v_fidx.m_i < v_fidx.m_dim - 1; v_fidx.m_i++) {
230 v_fidx.m_ret *= ae2f_mMMapDimLen(mmap)[v_fidx.m_dim - 1 - v_fidx.m_i];
231 }
232 }
233}
234
235ae2f_MAC() _ae2f_mMMapFieldIdx(
236 const ae2f_mMMap* const mmap,
237 const size_t dim,
238 const size_t* const idxs,
239 size_t* const ret
240 )
241{
242 unless(ret)
243 ;
244 unless((idxs) && (mmap)) {
245 assert(0 && "nullptr from __ae2f_mMMapFieldIdx");
246 *(ret) = -1;
247 }
248 else {
249 ae2f_mMMapFieldIdx_t v_idx;
250 __ae2f_mMMapFieldIdx_imp(v_idx, mmap, dim, idxs);
251 *(ret) = v_idx.m_ret;
252 }
253}
254
255
256#if ae2f_WhenCXX(!)0
257
258// 1, 2, ..... n
259constextendedfun size_t _ae2f_mMMapFieldIdx(
260 const ae2f_mMMap* mmap,
261 size_t dim,
262 const size_t* idxs
263 ) ae2f_noexcept
264{
265 if(!idxs) return -1;
266 if(!mmap) return -1;
267
268 ae2f_mMMapFieldIdx_t v_idx;
269 __ae2f_mMMapFieldIdx_imp(v_idx, mmap, dim, idxs);
270
271 return v_idx.m_ret; // / lens[i - 1];
272}
273
274#endif
275
276ae2f_MAC() _ae2f_mMMapInit_imp(
277 ae2f_mMMapInit_t v_init,
278 struct ae2f_mMMap* const mmap,
279 const size_t dim,
280 const size_t* const lens
281 )
282{
283 (mmap)->m_dim = (dim);
284 for(v_init.m_i = 0; v_init.m_i < (dim); v_init.m_i++)
285 ae2f_mMMapDimLen(mmap)[v_init.m_i] = (lens)[v_init.m_i];
286
287 memcpy(ae2f_mMMapDimLen(mmap), lens, (dim) * sizeof(size_t));
288 __ae2f_mMMapSz((dim), lens, &v_init.m_ret);
289}
290
291ae2f_MAC() _ae2f_mMMapInit(
292 struct ae2f_mMMap* const mmap,
293 const size_t dim,
294 const size_t* const lens,
295 ae2f_err_t* const ret_e,
296 size_t* const opt_sz
297 )
298{
299 if((ret_e) && *(ret_e))
300 ;
301 else unless((mmap) && (lens))
302 (ret_e) && (*(ret_e) |= ae2f_errGlob_PTR_IS_NULL);
303 else {
304 ae2f_mMMapInit_t v_init;
305 __ae2f_mMMapInit_imp(v_init, mmap, dim, lens);
306 (opt_sz) && (*(opt_sz) = v_init.m_ret);
307 }
308}
309
310ae2f_MAC() _ae2f_mMMapMk_imp(ae2f_mMMapMk_t v_mk, const size_t dim, const size_t* const lens) {
311 assert((lens) && "lens is null");
312 __ae2f_mMMapSz((dim), (lens), (&v_mk.m_initstack.m_ret));
313
314 assert((v_mk.m_initstack.m_ret != -1) && "Sz has failed.");
315 assert((v_mk.m_initstack.m_ret > sizeof(ae2f_mMMap)) && "Sz is fishy.");
316
317
318 if((v_mk.m_ptr = calloc(1, v_mk.m_initstack.m_ret))) {
319 __ae2f_mMMapInit_imp(v_mk.m_initstack, (v_mk.m_ptr), dim, lens);
320 } else {
321 assert(0 && "allocation has failed");
322 }
323}
324
325ae2f_MAC() _ae2f_mMMapMk(
326 const size_t dim,
327 const size_t* const lens,
328 ae2f_err_t* const opt_ret_err,
329 ae2f_mMMap** const ret_mmap
330 )
331{
332 if(opt_ret_err && *(opt_ret_err));
333 else unless((lens) && (ret_mmap))
334 (opt_ret_err) && (*(opt_ret_err) |= ae2f_errGlob_PTR_IS_NULL);
335 else {
336 ae2f_mMMapMk_t v_mk;
337 __ae2f_mMMapMk_imp(v_mk, dim, lens);
338
339 assert(v_mk.m_ptr);
340 unless(v_mk.m_ptr) {
341 (opt_ret_err) && (*(opt_ret_err) |= ae2f_errGlob_ALLOC_FAILED);
342 }
343
344 *(ret_mmap) = v_mk.m_ptr;
345 }
346}
347
348ae2f_MAC() _ae2f_mMMapDel(void* a) {
349 free(a);
350}
351
352#endif
#define ae2f_structdef(key, name)
Definition Cast.h:110
#define ae2f_structdef_v(key, name,...)
Definition Cast.h:105
#define ae2f_reinterpret_cast(t, v)
Definition Cast.h:52
#define unless(...)
Invokes when condition is false.
Definition Cast.h:103
#define ae2f_CmpGetLs(a, b)
Definition Cmp.h:26
#define ae2f_WhenCXX(...)
Appears when the current language is C.
Definition Cxx.h:37
#define ae2f_errGlob_ALLOC_FAILED
stdlib allocating functions (malloc, calloc, realloc) has been failed.
Definition errGlob.h:40
uint8_t ae2f_err_t
Informs that this number represents the error.
Definition errGlob.h:19
#define ae2f_errGlob_PTR_IS_NULL
Failed to refer the pointer either l-value inside the function.
Definition errGlob.h:32
#define __ae2f_MACRO_GENERATED
Definition Conv.auto.h:2
#define __ae2f_mMMapFieldIdx(mmap, dim, idxs, ret)
Definition MMap.auto.h:278
#define __ae2f_mMMapDel(a)
Definition MMap.auto.h:415
#define __ae2f_mMMapSz_imp(v_mapsz, dim, lens)
Definition MMap.auto.h:153
#define ae2f_mMMapDimLen(mmap,...)
Definition MMap.auto.h:104
#define __ae2f_mMMapMk_imp(v_mk, dim, lens)
Definition MMap.auto.h:365
#define __ae2f_mMMapInit(mmap, dim, lens, ret_e, opt_sz)
Definition MMap.auto.h:342
#define __ae2f_mMMapMk(dim, lens, opt_ret_err, ret_mmap)
Definition MMap.auto.h:388
#define __ae2f_mMMapSz(dim, lens, ret)
Definition MMap.auto.h:183
#define __ae2f_mMMapInit_imp(v_init, mmap, dim, lens)
Definition MMap.auto.h:323
#define __ae2f_mMMapFieldIdx_imp(v_fidx, mmap, dim, idxs)
Definition MMap.auto.h:232
#define ae2f_MAC(...)
Definition mac.h:28