12
STypeSystem * _type_system_object = NULL;
14
#define _INIT_TYPE_SYSTEM() {\
15
if (_type_system_object == NULL) { \
16
_s_internal_type_system_init();\
21
_s_internal_type_system_init () {
22
_type_system_object = s_malloc (sizeof (STypeSystem));
24
STypeInfo** type_map = _type_system_object->type_map =
25
s_calloc (S_TYPE_MAX, sizeof (spointer));
27
for (sint i; i < S_TYPE_MAX; i++) {
30
/* The first time we run this we must make sure that we fill out the
31
* fundamental types correctly */
32
for (sint i = 0; i < S_TYPE_LAST_PREDEFINED; i++) {
33
schar * name = STypeName[i];
34
STypeInfo * ti = s_malloc (sizeof(STypeInfo));
35
ti->name = s_string_new (name);
42
s_type_info_free (STypeInfo * ti) {
50
s_type_register_return_type_info (schar * name, SType parent) {
53
STypeInfo** type_map = _type_system_object->type_map;
55
hash_t k = s_hash (name) % S_TYPE_MAX;
57
if (k < S_TYPE_LAST_PREDEFINED) { /* Push it up a bit... */
58
k += S_TYPE_LAST_PREDEFINED;
62
/* See if we have anyhing in that possision, if not, we just add it to that
65
* If the taken we look up through the array for a free spot.
69
if (s_string_is_equal (type_map[k]->name, name)) {
76
STypeInfo * ti = s_malloc (sizeof (STypeInfo));
84
* Check if we are out-of-bounds and reallocs the array.
86
if (_type_system_object->len < k) {
87
/* new size is k + 11, cus' why not? */
88
_type_system_object->len = k + 11;
89
type_map = s_realloc (type_map, _type_system_object->len);
94
if (_type_system_object->last_item < k) {
95
_type_system_object->last_item = k;
102
s_type_register (schar * name, SType parent) {
103
return s_type_register_return_type_info (name, parent)->id;
107
s_type_get_name (SType k) {
110
if (k < S_TYPE_LAST_PREDEFINED) {
111
return s_string_new(STypeName[k]);
114
if (!_type_system_object) {
115
s_warn_print ("Typesystem not initialised.\n Returning.\n");
119
STypeInfo** type_map = _type_system_object->type_map;
121
return s_string_new (type_map[k]->name);
129
s_type_get_type (schar * name) {
132
* First do a dumb check if names are in the list of predefined.
134
for (size_t i; i < S_TYPE_LAST_PREDEFINED; i++) {
135
if (s_string_is_equal (STypeName[i], name)) {
140
hash_t k = s_hash (name) % S_TYPE_MAX;
142
STypeInfo ** type_map = _type_system_object->type_map;
145
while (type_map[k]) {
146
if (s_string_is_equal (type_map[k]->name, name)) {
147
return type_map[k]->id;
158
s_type_get_parent (SType type) {
160
if (type < S_TYPE_LAST_PREDEFINED) {
164
if (_type_system_object->type_map[type]) {
165
return _type_system_object->type_map[type]->parent;
173
s_type_get_array_of_parents (SType type, size_t * out_size) {
176
/* The array will hopefully not me longer than this... */
177
SType * array = s_calloc (sizeof (SType), S_TYPE_MAX);
179
STypeInfo ** type_map = _type_system_object->type_map;
186
new_k = type_map[k]->parent;
193
if (k == S_TYPE_NONE || k == S_TYPE_INVALID) {
206
array = s_realloc (array, sizeof(SType) * len);
213
s_type_system_teardown () {
214
if (!_type_system_object) {
218
STypeInfo** type_map = _type_system_object->type_map;
220
for (sint i = 0; i < _type_system_object->len; i++ ) {
222
s_free (type_map[i]);
225
s_free (_type_system_object);