ae2f_docs
MMap.def.c
Go to the documentation of this file.
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
31ae2f_extern ae2f_SHAREDCALL
33 ae2f_mMMap* const mmap
34 , const size_t dim
35 , const size_t* const lens
36 , ae2f_err_t* const opt_ret_err
37 , size_t* const opt_ret_sz
38 ) noexcept;
39
40
41ae2f_extern ae2f_SHAREDCALL
43 const size_t dim,
44 const size_t* const lens,
45 ae2f_err_t* const opt_ret_err,
46 ae2f_FREE(free, ae2f_mMMapDel) ae2f_mMMap** const ret_mmap
47 ) noexcept;
48
49ae2f_extern ae2f_SHAREDCALL
51 const ae2f_mMMap* const mmap,
52 const size_t dim,
53 const size_t* const idxs,
54 size_t* const ret
55 );
56
57ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapSz(
58 const size_t dim, const size_t* const lens
59 , size_t* const ret);
60
61ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapDel(
62 ae2f_mMMap* mmap
63 );
64
66
67#define ae2f_mMMapInit __ae2f_mMMapInit
68#define ae2f_mMMapMk __ae2f_mMMapMk
69#define ae2f_mMMapDel __ae2f_mMMapDel
70#define ae2f_mMMapSz __ae2f_mMMapSz
71#define ae2f_mMMapFieldIdx __ae2f_mMMapFieldIdx
72
73#include <string.h>
74#include <stdlib.h>
75
76#endif /** Function declarations */
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 ) 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 ) 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_extern
Suggests the existence of external variable or function, in naming of C. [non-mangling].
Definition Cast.h:88
#define ae2f_CmpGetLs(a, b)
Definition Cmp.h:26
#define ae2f_WhenCXX(...)
Appears when the current language is C.
Definition Cxx.h:34
ae2f_float ae2f_float_t
Definition Float.h:38
#define ae2f_FREE(...)
Use this marker to show the desired functions to effectively free the resources.
Definition Guide.h:33
#define ae2f_MAC_BUILD
Definition Util.h:4
#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,...)
Length vector for every dimension index.
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
const size_t const size_t *const lens
Definition MMap.def.c:130
const size_t dim
Definition MMap.def.c:128
ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapMk(const size_t dim, const size_t *const lens, ae2f_err_t *const opt_ret_err, ae2f_FREE(free, ae2f_mMMapDel) ae2f_mMMap **const ret_mmap) noexcept
ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapSz(const size_t dim, const size_t *const lens, size_t *const ret)
Definition MMap.imp.c:9
ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapDel(ae2f_mMMap *mmap)
Definition MMap.imp.c:46
ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapInit(ae2f_mMMap *const mmap, const size_t dim, const size_t *const lens, ae2f_err_t *const opt_ret_err, size_t *const opt_ret_sz) noexcept
Definition MMap.imp.c:23
ae2f_extern ae2f_SHAREDCALL void ae2f_mMMapFieldIdx(const ae2f_mMMap *const mmap, const size_t dim, const size_t *const idxs, size_t *const ret)
Definition MMap.imp.c:14
#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 Mlp.auto.h:2
#define ae2f_MAC()
delta to delta
Definition mac.h:4