/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
1
/* c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil
2
 * vi: set shiftwidth=2 tabstop=2 expandtab:
3
 * :indentSize=2:tabSize=2:noTabs=true:
4
 */
5
6
/*
5.2.9 by Gustav Hartvigsson
* Added license to files
7
Copyright (c) 2013-2014 Gustav Hartvigsson
8
9
Permission is hereby granted, free of charge, to any person obtaining a copy
10
of this software and associated documentation files (the "Software"), to deal
11
in the Software without restriction, including without limitation the rights
12
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
copies of the Software, and to permit persons to whom the Software is
14
furnished to do so, subject to the following conditions:
15
16
The above copyright notice and this permission notice shall be included in
17
all copies or substantial portions of the Software.
18
19
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
THE SOFTWARE.
26
*/
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
27
30 by Gustav Hartvigsson
* Made the code compile using CMake.
28
#include "DynamicArray.h"
29
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
30
struct
31
SDynamicArray {
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
32
  FreeFunc free_func;
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
33
  FuncPointer to_json;
34
  FuncPointer from_json;
35
  size_t max_size;
36
  size_t last_item;
30 by Gustav Hartvigsson
* Made the code compile using CMake.
37
  spointer * array;
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
38
};
39
61 by Gustav Hartvigsson
* Made the code more easy to read.
40
void
41
_private_for_each_item_free (SDynamicArray * self, spointer item,
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
42
                             spointer data);
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
43
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
44
SDynamicArray *
109.1.5 by Gustav Hartvigsson
* Getting closer to fixing the callbacks...
45
s_dynamic_array_new_full (size_t len,
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
46
                          FreeFunc free_func,
47
                          FuncPointer to_json,
48
                          FuncPointer from_json) {
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
49
  SDynamicArray * self = s_malloc (sizeof(SDynamicArray));
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
50
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
51
  self->max_size = len;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
52
48 by Gustav Hartvigsson
* Finnished SLinkedList.
53
  self->last_item = 0;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
54
108 by Gustav Hartvigsson
libssts:
55
56
  if (free_func == NULL) {
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
57
    self->free_func = s_free;
108 by Gustav Hartvigsson
libssts:
58
  } else {
59
    self->free_func = free_func;
60
  }
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
61
  self->to_json = to_json;
62
  self->from_json = from_json;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
63
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
64
  self->array = s_calloc (len ,sizeof (spointer));
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
65
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
66
  return self;
67
}
68
69
SDynamicArray *
70
s_dynamic_array_new (size_t len,
71
                     FreeFunc free_func) {
104 by Gustav Hartvigsson
* Passing arguments can not be initialised from within a function...
72
109.1.5 by Gustav Hartvigsson
* Getting closer to fixing the callbacks...
73
  SDynamicArray * self = s_dynamic_array_new_full (len, free_func, NULL, NULL);
104 by Gustav Hartvigsson
* Passing arguments can not be initialised from within a function...
74
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
75
  return self;
76
}
77
78
SDynamicArray *
79
s_dynamic_array_new_json (size_t len,
80
                          FreeFunc free_func,
81
                          FuncPointer to_json,
82
                          FuncPointer from_json) {
109.1.5 by Gustav Hartvigsson
* Getting closer to fixing the callbacks...
83
  SDynamicArray * self = s_dynamic_array_new_full (len, free_func, to_json, from_json);
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
84
  return self;
85
}
86
61 by Gustav Hartvigsson
* Made the code more easy to read.
87
void
88
s_dynamic_array_free (SDynamicArray * self, sboolean free_data) {
48 by Gustav Hartvigsson
* Finnished SLinkedList.
89
  if (free_data) {
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
90
    if (self->free_func != NULL) {
109.1.1 by Gustav Hartvigsson
* SMap seems to be broken... Or could it be SObject's Callback stuff? Or SLinkedList?
91
      s_dbg_print ("SDynamicArray: free data.");
107 by Gustav Hartvigsson
* Removed depricaded functions from SObject code.
92
      s_dynamic_array_for_each (self,
93
                                FOREACHFUNC (_private_for_each_item_free),
94
                                NULL);
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
95
    }
96
  }
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
97
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
98
  s_free (self->array);
99
  s_free (self);
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
100
}
101
61 by Gustav Hartvigsson
* Made the code more easy to read.
102
spointer
103
s_dynamic_array_get (SDynamicArray * self, size_t index) {
109.1.1 by Gustav Hartvigsson
* SMap seems to be broken... Or could it be SObject's Callback stuff? Or SLinkedList?
104
  if (index > self->max_size) {
105
    s_err_print ("Index out of range:\n\tMax index: %zd requested index:%zd",
106
                 self->max_size, index);
107
    return NULL;
108
  }
109
  if (self->max_size < 1) {
110
    return NULL;
111
  }
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
112
  return self->array[index];
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
113
}
114
61 by Gustav Hartvigsson
* Made the code more easy to read.
115
void
116
s_dynamic_array_set (SDynamicArray * self, size_t index, spointer item) {
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
117
  if (self->max_size <= index) {
118
    size_t new_size = round_up (index + ARRAY_PADDING, ARRAY_PADDING) + 1;
48 by Gustav Hartvigsson
* Finnished SLinkedList.
119
    s_dbg_print ("Index: %zu current array size: %zu new array size: %zu ",
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
120
      index, self->max_size, new_size);
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
121
122
    size_t old_size = self->max_size;
123
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
124
    self->max_size = new_size;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
125
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
126
    self->array = s_realloc (self->array,
108 by Gustav Hartvigsson
libssts:
127
                          (sizeof (spointer) * (self->max_size)));
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
128
    /* Zero new momery */
108 by Gustav Hartvigsson
libssts:
129
    for (size_t i = old_size; i < new_size; i++) {
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
130
      self->array[i] = NULL;
131
    }
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
132
  }
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
133
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
134
  if (self->last_item < index) {
135
    self->last_item = index;
136
  }
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
137
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
138
  self->array[index] = item;
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
139
}
140
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
141
void
142
s_dynamic_array_append (SDynamicArray * self,
143
                        spointer item) {
144
  size_t next_pos = s_dynamic_array_last_item (self) + 1;
145
  s_dynamic_array_set (self, next_pos, item);
146
}
147
61 by Gustav Hartvigsson
* Made the code more easy to read.
148
size_t
149
s_dynamic_array_size (SDynamicArray * self) {
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
150
  return self->max_size;
151
}
152
61 by Gustav Hartvigsson
* Made the code more easy to read.
153
size_t
154
s_dynamic_array_last_item (SDynamicArray * self) {
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
155
  return self->last_item;
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
156
}
157
61 by Gustav Hartvigsson
* Made the code more easy to read.
158
spointer *
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
159
s_dynamic_array_dump_array (SDynamicArray * self, size_t * out_size) {
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
160
  spointer * ret_val = s_calloc (self->last_item + 1, sizeof (* self->array));
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
161
  
162
  for (size_t i = 0; i <= self->last_item; i++) {
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
163
    ret_val[i] = self->array[i];
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
164
  }
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
165
  *out_size = self->last_item + 1;
166
  ret_val[*out_size] = NULL;
167
  ret_val = s_realloc (ret_val, *out_size * sizeof (* self->array));
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
168
  return ret_val;
169
}
170
61 by Gustav Hartvigsson
* Made the code more easy to read.
171
void
172
s_dynamic_array_for_each (SDynamicArray * self, ForEachFunc func,
30 by Gustav Hartvigsson
* Made the code compile using CMake.
173
                             spointer data) {
109.1.1 by Gustav Hartvigsson
* SMap seems to be broken... Or could it be SObject's Callback stuff? Or SLinkedList?
174
  s_dbg_print ("Size: %zd", self->max_size);
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
175
  for (int i = 0; i < self->max_size && i <= self->last_item; i++) {
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
176
    spointer item = self->array[i];
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
177
    if (item) {
109.1.1 by Gustav Hartvigsson
* SMap seems to be broken... Or could it be SObject's Callback stuff? Or SLinkedList?
178
      s_dbg_print ("Item Found.");
47 by Gustav Hartvigsson
* Added a few skeletal functions to Callback.h
179
      func (self, item, data);
180
    }
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
181
  }
182
}
183
184
61 by Gustav Hartvigsson
* Made the code more easy to read.
185
void
186
_private_for_each_item_free (SDynamicArray * self, spointer item,
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
187
                             spointer data) {
104 by Gustav Hartvigsson
* Passing arguments can not be initialised from within a function...
188
  s_dbg_print ("Removing item from array");
68 by Gustav Hartvigsson
* Hid internals of SDynamicArray.
189
  FreeFunc func = self->free_func;
109.1.7 by Gustav Hartvigsson
* Fixed SMap, for the time being...
190
  if (func) {
191
    func (item);
192
  }
5.2.8 by Gustav Hartvigsson
* Copied over LinkedList and DynamicArray from c_sdl_js
193
}
194