summaryrefslogtreecommitdiff
path: root/src/data
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-09-16 17:05:51 +0000
committerPaul Buetow <paul@buetow.org>2008-09-16 17:05:51 +0000
commit71185ab0ab0b08b4d5bb2e750ff85e11f105a453 (patch)
treea6ad933176f92b60d2f1560d2f1bac46ec6b9566 /src/data
parent8b31b18a43dea55489e70d5b2ea6fc183cc67533 (diff)
array progress
Diffstat (limited to 'src/data')
-rw-r--r--src/data/array.c50
-rw-r--r--src/data/array.h2
2 files changed, 37 insertions, 15 deletions
diff --git a/src/data/array.c b/src/data/array.c
index 2ae4ece..da5bee8 100644
--- a/src/data/array.c
+++ b/src/data/array.c
@@ -41,7 +41,7 @@ array_new() {
p_array->i_size = 0;
p_array->pp_ae = NULL;
- return p_array;
+ return (p_array);
}
@@ -92,7 +92,7 @@ array_insert(Array *p_array, int i_index, void *p_val) {
void*
array_remove(Array *p_array, int i_index) {
if (p_array->i_size <= i_index)
- return NULL;
+ return (NULL);
ArrayElement *p_ae = p_array->pp_ae[i_index];
void *p_ret = p_ae->p_val;
@@ -105,7 +105,7 @@ array_remove(Array *p_array, int i_index) {
array_resize(p_array, p_array->i_size - 1);
- return p_ret;
+ return (p_ret);
}
void
@@ -147,17 +147,17 @@ array_resize(Array *p_array, int i_size) {
void*
array_get(Array *p_array, int i_index) {
if (p_array->i_size > i_index)
- return p_array->pp_ae[i_index]->p_val;
+ return (p_array->pp_ae[i_index]->p_val);
- return NULL;
+ return (NULL);
}
_Bool
array_defined(Array *p_array, int i_index) {
if (i_index >= p_array->i_size)
- return false;
+ return (false);
- return p_array->pp_ae[i_index]->p_val != NULL;
+ return (p_array->pp_ae[i_index]->p_val != NULL);
}
void
@@ -222,7 +222,7 @@ arrayelement_new(void *p_val) {
p_ae->p_val = p_val;
- return p_ae;
+ return (p_ae);
}
void
@@ -235,14 +235,27 @@ arrayelement_delete(ArrayElement *p_ae) {
ArrayIterator*
arrayiterator_new(Array *p_array) {
- if (!p_array)
- return NULL;
+ if (p_array == NULL)
+ return (NULL);
ArrayIterator *p_arrayiterator = malloc(sizeof(ArrayIterator));
p_arrayiterator->p_array = p_array;
p_arrayiterator->i_cur_pos = 0;
+ p_arrayiterator->b_is_reverse = false;
+
+ return (p_arrayiterator);
+}
+
+ArrayIterator*
+arrayiterator_new_reverse(Array *p_array) {
+ ArrayIterator *p_arrayiterator = arrayiterator_new(p_array);
+ if (p_arrayiterator == NULL)
+ return (NULL);
+
+ p_arrayiterator->b_is_reverse = true;
+ p_arrayiterator->i_cur_pos = p_array->i_size;
- return p_arrayiterator;
+ return (p_arrayiterator);
}
void
@@ -253,14 +266,21 @@ arrayiterator_delete(ArrayIterator *p_arrayiterator) {
_Bool
arrayiterator_has_next(ArrayIterator *p_arrayiterator) {
- return p_arrayiterator->i_cur_pos <
- array_get_size(p_arrayiterator->p_array);
+ if (p_arrayiterator->b_is_reverse)
+ return (p_arrayiterator->i_cur_pos >= 0);
+
+ return (p_arrayiterator->i_cur_pos <
+ array_get_size(p_arrayiterator->p_array));
}
void*
arrayiterator_next(ArrayIterator *p_arrayiterator) {
if (!arrayiterator_has_next(p_arrayiterator))
- return NULL;
+ return (NULL);
+
+ if (p_arrayiterator->b_is_reverse)
+ return (array_get(p_arrayiterator->p_array,
+ p_arrayiterator->i_cur_pos--));
- return array_get(p_arrayiterator->p_array, p_arrayiterator->i_cur_pos++);
+ return (array_get(p_arrayiterator->p_array, p_arrayiterator->i_cur_pos++));
}
diff --git a/src/data/array.h b/src/data/array.h
index b343521..6170c29 100644
--- a/src/data/array.h
+++ b/src/data/array.h
@@ -58,6 +58,7 @@ typedef struct {
typedef struct {
Array *p_array;
int i_cur_pos;
+ _Bool b_is_reverse;
} ArrayIterator;
Array *array_new();
@@ -80,6 +81,7 @@ ArrayElement *arrayelement_new(void *p_val);
void arrayelement_delete(ArrayElement *p_ae);
ArrayIterator *arrayiterator_new(Array *p_array);
+ArrayIterator *arrayiterator_new_reverse(Array *p_array);
void arrayiterator_delete(ArrayIterator *p_arrayiterator);
_Bool arrayiterator_has_next(ArrayIterator *p_arrayiterator);
void *arrayiterator_next(ArrayIterator *p_arrayiterator);