From 75c1b74ce14b3147f6d69b2ae45f8683876a1521 Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 9 Sep 2024 17:54:24 +0300 Subject: [PATCH] ARR_BPTR_NEVER --- src/README.md | 3 +++ src/core/arrFns.h | 22 +++++++++++++--------- src/utils/mut.c | 4 +++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/README.md b/src/README.md index 779a896d..8ca3288e 100644 --- a/src/README.md +++ b/src/README.md @@ -330,6 +330,9 @@ if (TI(x,elType)!=el_B) void* xp = tyany_ptr(x); // alternative equivalent check if (TY(x)==t_harr) B* xp = harr_ptr(x); // similarly, hslice_ptr, fillarrv_ptr, fillslicev_ptr for specific types B* xp = arr_bptr(x); // will return NULL if the array isn't backed by a contiguous B* // while currently there are no types with eltype el_B for which arr_bptr isn't NULL, that could change in the future and so should still be handled +// testable with f=-DARR_BPTR_NEVER, which makes arr_bptr + +// most arr_* fns have a arrv_* variant that takes an untagged pointer instead of B // functions to convert arrays to a specific type array: (all consume their argument, and assume that the elements losslessly fit in the desired type) I8Arr* a = toI8Arr(x); // convert x to an I8Arr instance (returns the argument if it already is) diff --git a/src/core/arrFns.h b/src/core/arrFns.h index 22c7ee19..4ef67eb8 100644 --- a/src/core/arrFns.h +++ b/src/core/arrFns.h @@ -1,17 +1,21 @@ #pragma once static B* arr_bptr(B x) { assert(isArr(x)); - if (TY(x)==t_harr) return harr_ptr(x); - if (TY(x)==t_fillarr) return fillarrv_ptr(a(x)); - if (TY(x)==t_hslice) return hslice_ptr(x); - if (TY(x)==t_fillslice) return fillslicev_ptr(a(x)); + #if !ARR_BPTR_NEVER + if (TY(x)==t_harr) return harr_ptr(x); + if (TY(x)==t_fillarr) return fillarrv_ptr(a(x)); + if (TY(x)==t_hslice) return hslice_ptr(x); + if (TY(x)==t_fillslice) return fillslicev_ptr(a(x)); + #endif return NULL; } -static B* arrV_bptr(Arr* x) { - if (PTY(x)==t_harr) return harrv_ptr(x); - if (PTY(x)==t_fillarr) return fillarrv_ptr(x); - if (PTY(x)==t_hslice) return hslicev_ptr(x); - if (PTY(x)==t_fillslice) return fillslicev_ptr(x); +static B* arrv_bptr(Arr* x) { + #if !ARR_BPTR_NEVER + if (PTY(x)==t_harr) return harrv_ptr(x); + if (PTY(x)==t_fillarr) return fillarrv_ptr(x); + if (PTY(x)==t_hslice) return hslicev_ptr(x); + if (PTY(x)==t_fillslice) return fillslicev_ptr(x); + #endif return NULL; } diff --git a/src/utils/mut.c b/src/utils/mut.c index 9b91a15f..eb884b67 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -295,11 +295,13 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x case t_c8arr: case t_c8slice: { u8* xp = c8any_ptr (x); vfor (usz i = 0; i < l; i++) mpo[i] = m_c32(xp[i+xs]); return; } case t_c16arr: case t_c16slice: { u16* xp = c16any_ptr(x); vfor (usz i = 0; i < l; i++) mpo[i] = m_c32(xp[i+xs]); return; } case t_c32arr: case t_c32slice: { u32* xp = c32any_ptr(x); vfor (usz i = 0; i < l; i++) mpo[i] = m_c32(xp[i+xs]); return; } + #if !ARR_BPTR_NEVER case t_harr: case t_hslice: case t_fillarr: case t_fillslice:; B* xp = arr_bptr(x)+xs; for (usz i = 0; i < l; i++) inc(xp[i]); memcpy(mpo, xp, l*sizeof(B)); return; + #endif case t_f64arr: case t_f64slice: assert(sizeof(B)==sizeof(f64)); memcpy(mpo, f64any_ptr(x)+xs, l*sizeof(B)); @@ -327,7 +329,7 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x for (usz i=0; i