mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-07-02 18:00:49 +02:00
new alternate array implementation that prioritizes access time over sparse arrays; selectable via configure
This commit is contained in:
@@ -32,27 +32,52 @@ enum atype {array_indexed, array_assoc}; /* not used */
|
||||
typedef struct array {
|
||||
arrayind_t max_index;
|
||||
arrayind_t num_elements;
|
||||
#ifdef ALT_ARRAY_IMPLEMENTATION
|
||||
arrayind_t first_index;
|
||||
arrayind_t alloc_size;
|
||||
struct array_element **elements;
|
||||
#else
|
||||
struct array_element *head;
|
||||
struct array_element *lastref;
|
||||
#endif
|
||||
} ARRAY;
|
||||
|
||||
typedef struct array_element {
|
||||
arrayind_t ind;
|
||||
char *value;
|
||||
#ifndef ALT_ARRAY_IMPLEMENTATION
|
||||
struct array_element *next, *prev;
|
||||
#endif
|
||||
} ARRAY_ELEMENT;
|
||||
|
||||
#define ARRAY_DEFAULT_SIZE 1024
|
||||
|
||||
typedef int sh_ae_map_func_t PARAMS((ARRAY_ELEMENT *, void *));
|
||||
|
||||
/* Basic operations on entire arrays */
|
||||
#ifdef ALT_ARRAY_IMPLEMENTATION
|
||||
extern void array_alloc PARAMS((ARRAY *, arrayind_t));
|
||||
extern void array_resize PARAMS((ARRAY *, arrayind_t));
|
||||
extern void array_expand PARAMS((ARRAY *, arrayind_t));
|
||||
extern void array_dispose_elements PARAMS((ARRAY_ELEMENT **));
|
||||
#endif
|
||||
extern ARRAY *array_create PARAMS((void));
|
||||
extern void array_flush PARAMS((ARRAY *));
|
||||
extern void array_dispose PARAMS((ARRAY *));
|
||||
extern ARRAY *array_copy PARAMS((ARRAY *));
|
||||
#ifndef ALT_ARRAY_IMPLEMENTATION
|
||||
extern ARRAY *array_slice PARAMS((ARRAY *, ARRAY_ELEMENT *, ARRAY_ELEMENT *));
|
||||
#else
|
||||
extern ARRAY *array_slice PARAMS((ARRAY *, arrayind_t, arrayind_t));
|
||||
#endif
|
||||
|
||||
extern void array_walk PARAMS((ARRAY *, sh_ae_map_func_t *, void *));
|
||||
|
||||
#ifndef ALT_ARRAY_IMPLEMENTATION
|
||||
extern ARRAY_ELEMENT *array_shift PARAMS((ARRAY *, int, int));
|
||||
#else
|
||||
extern ARRAY_ELEMENT **array_shift PARAMS((ARRAY *, int, int));
|
||||
#endif
|
||||
extern int array_rshift PARAMS((ARRAY *, int, char *));
|
||||
extern ARRAY_ELEMENT *array_unshift_element PARAMS((ARRAY *));
|
||||
extern int array_shift_element PARAMS((ARRAY *, char *));
|
||||
@@ -97,17 +122,34 @@ extern ARRAY *array_from_string PARAMS((char *, char *));
|
||||
|
||||
#define array_num_elements(a) ((a)->num_elements)
|
||||
#define array_max_index(a) ((a)->max_index)
|
||||
#ifndef ALT_ARRAY_IMPLEMENTATION
|
||||
#define array_first_index(a) ((a)->head->next->ind)
|
||||
#define array_head(a) ((a)->head)
|
||||
#define array_alloc_size(a) ((a)->alloc_size)
|
||||
#else
|
||||
#define array_first_index(a) ((a)->first_index)
|
||||
#define array_head(a) ((a)->elements)
|
||||
#endif
|
||||
#define array_empty(a) ((a)->num_elements == 0)
|
||||
|
||||
#define element_value(ae) ((ae)->value)
|
||||
#define element_index(ae) ((ae)->ind)
|
||||
|
||||
#ifndef ALT_ARRAY_IMPLEMENTATION
|
||||
#define element_forw(ae) ((ae)->next)
|
||||
#define element_back(ae) ((ae)->prev)
|
||||
#else
|
||||
extern arrayind_t element_forw PARAMS((ARRAY *, arrayind_t));
|
||||
extern arrayind_t element_back PARAMS((ARRAY *, arrayind_t));
|
||||
#endif
|
||||
|
||||
|
||||
#define set_element_value(ae, val) ((ae)->value = (val))
|
||||
|
||||
#ifdef ALT_ARRAY_IMPLEMENTATION
|
||||
#define set_first_index(a, i) ((a)->first_index = (i))
|
||||
#endif
|
||||
|
||||
#define set_max_index(a, i) ((a)->max_index = (i))
|
||||
#define set_num_elements(a, n) ((a)->num_elements = (n))
|
||||
|
||||
@@ -129,6 +171,11 @@ extern ARRAY *array_from_string PARAMS((char *, char *));
|
||||
(ae)->value = (v); \
|
||||
} while (0)
|
||||
|
||||
#ifdef ALT_ARRAY_IMPLEMENTATION
|
||||
#define ARRAY_VALUE_REPLACE(a, i, v) \
|
||||
ARRAY_ELEMENT_REPLACE((a)->elements[(i)], (v))
|
||||
#endif
|
||||
|
||||
#define ALL_ELEMENT_SUB(c) ((c) == '@' || (c) == '*')
|
||||
|
||||
/* In eval.c, but uses ARRAY * */
|
||||
|
||||
Reference in New Issue
Block a user