From 2420b7bd6b04fae98bea9204389872185b87fc7b Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Fri, 10 Jun 2022 12:22:20 +0300 Subject: [PATCH] Update array slice --- include/array.h | 4 ++-- src/array/base-copy.c | 52 ++++++++++++++++++++++++++++++++++++----- src/array/slice.c | 54 ------------------------------------------- 3 files changed, 48 insertions(+), 62 deletions(-) delete mode 100644 src/array/slice.c diff --git a/include/array.h b/include/array.h index 05042f0..397f5a6 100644 --- a/include/array.h +++ b/include/array.h @@ -11,8 +11,8 @@ extern void array_init(vtype_array* x, vtype type) LIBCDSB_nt__ LIBCDSB_nn1__; -extern void* array_at(const vtype_array* s, ssize_t index) LIBCDSB_nt__ LIBCDSB_nn1__; -extern _Bool array_slice(vtype_array* x, vtype_array* src, ssize_t index, size_t count, _Bool cut) LIBCDSB_nt__ LIBCDSB_nn1__; +extern void* array_at(const vtype_array* s, ssize_t index) LIBCDSB_nt__ LIBCDSB_nn1__; +extern size_t array_slice(vtype_array* x, vtype_array* src, ssize_t index, size_t count, _Bool cut) LIBCDSB_nt__ LIBCDSB_nn1__; extern void array_sort (vtype_array* x) LIBCDSB_nt__ LIBCDSB_nn1__; extern void array_reverse(vtype_array* x) LIBCDSB_nt__ LIBCDSB_nn1__; diff --git a/src/array/base-copy.c b/src/array/base-copy.c index fe4dbcf..967e74e 100644 --- a/src/array/base-copy.c +++ b/src/array/base-copy.c @@ -4,12 +4,11 @@ #include "include.h" #include "../__internal/assert.h" + arr_t array_copy(const arr_t* s) { arr_t x = { .mem = 0, .size = 0, .type = 0 }; if (s->size > 0) { - assert(!is_null(s->mem)); - x.type = s->type; x.size = s->size; @@ -41,12 +40,11 @@ arr_t array_copy(const arr_t* s) { return x; } + arr_t* array_duplicate(const arr_t* s) { arr_t* x = malloc(sizeof(*x)); if (s->size > 0) { - assert(!is_null(s->mem)); - x->type = s->type; x->size = s->size; @@ -78,10 +76,9 @@ arr_t* array_duplicate(const arr_t* s) { return x; } + void array_copy_init(arr_t* x, const arr_t* s) { if (s->size > 0) { - assert(!is_null(s->mem)); - x->type = s->type; x->size = s->size; @@ -110,3 +107,46 @@ void array_copy_init(arr_t* x, const arr_t* s) { } else x->mem = memndup(s->mem, x->size*vtype_size(x->type)); } else memset(x, 0, sizeof(*x)); } + + +size_t array_slice(arr_t* x, arr_t* s, ssize_t i, size_t n, _Bool cut) { + + if (!n || !s->size) { + memset(x, 0, sizeof(*x)); + return 0; + } + + if (i < 0 && (i += s->size) < 0) i = 0; + if (i + n > s->size) n = s->size - (i + 1); + + x->type = s->type; + x->size = n; + x->mem = malloc(x->size*vtype_size(x->type)); + + if (!cut && s->type >= VTYPE_STRING) { + void *p, *v, *e; + void (*init)(void*, const void*); + + p = x->mem; + v = array_internal_at(s, i); + e = array_internal_at(x, n); + + switch (s->type) { default: abort(); + case VTYPE_STRING: init = (void*)string_copy_init; break; + case VTYPE_ARRAY: init = (void*) array_copy_init; break; + case VTYPE_LIST: init = (void*) list_copy_init; break; + case VTYPE_MAP: init = (void*) map_copy_init; break; + case VTYPE_SET: init = (void*) vset_copy_init; break; + } + + do { + init(p, v); + p += vtype_size(x->type); + v += vtype_size(x->type); + } while (p < e); + } else memcpy(x->mem, array_internal_at(s, i), n*vtype_size(x->type)); + + if (cut) array_cut(s, i, n); + + return n; +} diff --git a/src/array/slice.c b/src/array/slice.c deleted file mode 100644 index 00c9549..0000000 --- a/src/array/slice.c +++ /dev/null @@ -1,54 +0,0 @@ -/* This software is licensed by the MIT License, see LICENSE file */ -/* Copyright © 2022 Gregory Lirent */ - -#include "include.h" -#include "../__internal/assert.h" -#include "../__internal/vnode.h" - -_Bool array_slice(arr_t* x, arr_t* s, ssize_t i, size_t n, _Bool cut) { - if (n && s->size) { - assert(!is_null(s->mem)); - - if (i < 0 && (i += s->size) < 0) i = 0; - - if (i + n > s->size) { - memset(x, 0, sizeof(*x)); - return false; - } - - x->type = s->type; - x->size = n; - x->mem = malloc(x->size*vtype_size(x->type)); - - if (!cut && s->type >= VTYPE_STRING) { - void *p, *v, *e; - void (*init)(void*, const void*); - - p = x->mem; - v = array_internal_at(s, i); - e = array_internal_at(x, n); - - switch (s->type) { default: abort(); - case VTYPE_STRING: init = (void*)string_copy_init; break; - case VTYPE_ARRAY: init = (void*) array_copy_init; break; - case VTYPE_LIST: init = (void*) list_copy_init; break; - case VTYPE_MAP: init = (void*) map_copy_init; break; - case VTYPE_SET: init = (void*) vset_copy_init; break; - } - - do { - init(p, v); - p += vtype_size(x->type); - v += vtype_size(x->type); - } while (p < e); - } else memcpy(x->mem, array_internal_at(s, i), n*vtype_size(x->type)); - - if (cut) array_cut(s, i, n); - } else { - memset(x, 0, sizeof(*x)); - - if (n && !s->size) return false; - } - - return true; -}