summaryrefslogtreecommitdiff
path: root/src/data
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-11-07 22:11:06 +0000
committerPaul Buetow <paul@buetow.org>2008-11-07 22:11:06 +0000
commita46655f67043af257e70715903badf9d4321c4de (patch)
tree556997ba868ac106c6f92703e6e35875e4872dc2 /src/data
parentfbff89d91c2a13155423bd83d2bbefd5d6891e23 (diff)
one step further for arrays.
Diffstat (limited to 'src/data')
-rw-r--r--src/data/array.c34
-rw-r--r--src/data/array.h3
-rw-r--r--src/data/stack.c8
-rw-r--r--src/data/stack.h3
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);