move around - flatter.
[profile/ivi/evas.git] / src / lib / data / evas_array.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include "config.h"
7 #endif
8
9 #include <stdlib.h>
10
11 #include "Evas_Data.h"
12 #include "evas_inline_array.x"
13
14 EAPI void
15 evas_array_append(Evas_Array *array, void *data)
16 {
17    _evas_array_append(array, data);
18 }
19
20 EAPI void *
21 evas_array_get(Evas_Array *array, unsigned int index)
22 {
23    return _evas_array_get(array, index);
24 }
25
26 EAPI void
27 evas_array_clean(Evas_Array *array)
28 {
29    array->count = 0;
30 }
31
32 EAPI void
33 evas_array_setup(Evas_Array *array, unsigned int step)
34 {
35    array->step = step;
36 }
37
38 EAPI void
39 evas_array_flush(Evas_Array *array)
40 {
41    array->count = 0;
42    array->total = 0;
43
44    if (array->data) free(array->data);
45    array->data = NULL;
46 }
47
48 EAPI Evas_Array *
49 evas_array_new(unsigned int step)
50 {
51    Evas_Array *array;
52
53    array = malloc(sizeof (Evas_Array));
54    if (!array) return NULL;
55
56    array->data = NULL;
57    array->total = 0;
58    array->count = 0;
59    array->step = step;
60
61    return array;
62 }
63
64 EAPI void
65 evas_array_free(Evas_Array *array)
66 {
67    evas_array_flush(array);
68    free(array);
69 }
70
71 EAPI void
72 evas_array_remove(Evas_Array *array, Evas_Bool (*keep)(void *data, void *gdata), void *gdata)
73 {
74    void **tmp;
75    unsigned int total = 0;
76    unsigned int i;
77
78    if (array->total == 0) return ;
79
80    tmp = malloc(sizeof (void*) * array->total);
81    if (!tmp) return ;
82
83    for (i = 0; i < array->count; i++)
84      {
85         void *data;
86
87         data = _evas_array_get(array, i);
88
89         if (keep(data, gdata))
90           {
91              tmp[total] = data;
92              total++;
93           }
94      }
95
96    free(array->data);
97
98    if (total == 0)
99      {
100         array->total = 0;
101         array->data = NULL;
102         free(tmp);
103      }
104    else
105      {
106         array->data = tmp;
107      }
108
109    array->count = total;
110 }