diff options
| author | Paul Buetow <paul@buetow.org> | 2008-11-07 22:11:06 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-11-07 22:11:06 +0000 |
| commit | a46655f67043af257e70715903badf9d4321c4de (patch) | |
| tree | 556997ba868ac106c6f92703e6e35875e4872dc2 /src/data | |
| parent | fbff89d91c2a13155423bd83d2bbefd5d6891e23 (diff) | |
one step further for arrays.
Diffstat (limited to 'src/data')
| -rw-r--r-- | src/data/array.c | 34 | ||||
| -rw-r--r-- | src/data/array.h | 3 | ||||
| -rw-r--r-- | src/data/stack.c | 8 | ||||
| -rw-r--r-- | src/data/stack.h | 3 |
4 files changed, 37 insertions, 11 deletions
diff --git a/src/data/array.c b/src/data/array.c index 9bd0101..ba9cf2a 100644 --- a/src/data/array.c +++ b/src/data/array.c @@ -40,16 +40,15 @@ array_new() { p_array->i_size = 0; p_array->pp_ae = NULL; + array_set_used(p_array, 0); return (p_array); } Array* array_new_size(int i_size) { - Array *p_array = malloc(sizeof(Array)); + Array *p_array = array_new(); - p_array->i_size = 0; - p_array->pp_ae = NULL; array_resize(p_array, i_size); return (p_array); @@ -109,9 +108,19 @@ array_set(Array *p_array, int i_index, void *p_val) { array_resize(p_array, i_index + 1); p_array->pp_ae[i_index]->p_val = p_val; } + + if (p_array->i_used < i_index) + array_set_used(p_array, i_index); } void +array_set_used(Array *p_array, int i_used) { + //printf("foo %d",i_used); + p_array->i_used = i_used; +} + + +void array_insert(Array *p_array, int i_index, void *p_val) { if (p_array->i_size <= i_index) { array_set(p_array, i_index, p_val); @@ -127,6 +136,9 @@ array_insert(Array *p_array, int i_index, void *p_val) { p_array->pp_ae[i] = p_ae; p_ae->p_val = p_val; } + + if (p_array->i_used < i_index) + array_set_used(p_array, i_index); } void* @@ -144,7 +156,6 @@ array_remove(Array *p_array, int i_index) { p_array->pp_ae[i-1] = p_ae; array_resize(p_array, p_array->i_size - 1); - return (p_ret); } @@ -182,6 +193,9 @@ array_resize(Array *p_array, int i_size) { p_array->pp_ae[i] = arrayelement_new(NULL); p_array->i_size = i_size; + //printf("[%d > %d]", p_array->i_used, i_size); + if (p_array->i_used > i_size) + array_set_used(p_array, i_size); } void* @@ -223,8 +237,9 @@ array_splice(Array *p_array, int i_index, Array *p_array2) { void array_unshift(Array *p_array, void *p_void) { - int i_size = array_get_size(p_array); - array_set(p_array, i_size, p_void); + int i_used = array_get_used(p_array); + array_set(p_array, i_used, p_void); + array_set_used(p_array, 1+i_used); } void @@ -250,7 +265,7 @@ array_iterate(Array *p_array, void (*func)(void *)) { if (!p_array) return; - for (int i = 0; i < array_get_size(p_array); ++i) + for (int i = 0; i < array_get_used(p_array); ++i) (*func) (array_get(p_array, i)); } @@ -259,7 +274,7 @@ array_iterate2(Array *p_array, void (*func)(void *, void *), void *p_void) { if (!p_array) return; - for (int i = 0; i < array_get_size(p_array); ++i) + for (int i = 0; i < array_get_used(p_array); ++i) (*func) (array_get(p_array, i), p_void); } @@ -300,8 +315,9 @@ arrayiterator_delete(ArrayIterator *p_arrayiterator) { _Bool arrayiterator_has_next(ArrayIterator *p_arrayiterator) { + //printf("[%d]", p_arrayiterator->p_array->i_used); return (p_arrayiterator->i_cur_pos < - array_get_size(p_arrayiterator->p_array)); + array_get_used(p_arrayiterator->p_array)); } void* diff --git a/src/data/array.h b/src/data/array.h index a6648bf..eb935e9 100644 --- a/src/data/array.h +++ b/src/data/array.h @@ -41,6 +41,7 @@ #include "../defines.h" #define array_get_size(a) a->i_size +#define array_get_used(a) a->i_used #define array_empty(a) a->i_size == 0 #define array_clear(a) array_resize(a, 0) #define array_get_first(a) array_get(a, 0) @@ -52,6 +53,7 @@ typedef struct { typedef struct { ArrayElement **pp_ae; + int i_used; int i_size; } Array; @@ -79,6 +81,7 @@ void array_unshift(Array *p_array, void *p_void); void array_iterate(Array *p_array, void (*func)(void *)); void array_iterate2(Array *p_array, void (*func)(void *, void *), void *p_void); +void array_set_used(Array *p_array, int i_used); ArrayElement *arrayelement_new(void *p_val); void arrayelement_delete(ArrayElement *p_ae); diff --git a/src/data/stack.c b/src/data/stack.c index f1da22a..00d5d88 100644 --- a/src/data/stack.c +++ b/src/data/stack.c @@ -93,6 +93,14 @@ stack_pop(Stack *p_stack) { return (p_val); } +void* +stack_top(Stack *p_stack) { + if (stack_empty(p_stack)) + return (NULL); + + return (p_stack->p_first->p_val); +} + void stack_clear(Stack *p_stack) { for (;!stack_empty(p_stack); stack_pop(p_stack)); diff --git a/src/data/stack.h b/src/data/stack.h index 6d42d87..4468bbe 100644 --- a/src/data/stack.h +++ b/src/data/stack.h @@ -35,8 +35,6 @@ #ifndef STACK_H #define STACK_H -#define stack_top(s) s->p_first->p_val; - #include <stdlib.h> typedef struct StackElem_ { @@ -65,6 +63,7 @@ void stack_iterate_level(Stack *p_stack, void (*func)(void *p_void, int i_level)); void stack_push(Stack *p_stack, void *p_val); void *stack_pop(Stack *p_stack); +void *stack_top(Stack *p_stack); void stack_clear(Stack *p_stack); void stack_delete(Stack *p_stack); void stack_delete_and_free(Stack *p_stack); |
