18
18
#include "baseobject.h"
19
19
#include <stdlib.h>
21
typedef struct _BaseObjectClass {
22
// BaseObjectInstance * (* initize)(BaseObjectInstance *);
23
void (*deinitize)(BaseObjectInstance *);
24
int (*ref)(BaseObjectInstance *);
25
int (*unref)(BaseObjectInstance *);
26
int (*get_refcount)(BaseObjectInstance *);
27
char * (*to_string)(BaseObjectInstance *);
30
typedef struct _BaseObjectInstance {
31
BaseObjectClass * base_class;
32
unsigned int refcount;
35
24
/* ---------------------------
36
25
* Concrete method definitions
38
27
* ---------------------------
41
// BaseObjectInstance * method_base_init (BaseObjectInstance * self);
43
void method_base_deinit (BaseObjectInstance * self);
45
int method_base_ref (BaseObjectInstance * self);
47
int method_base_unref (BaseObjectInstance * self);
49
int method_base_get_refcount (BaseObjectInstance * self);
51
char * method_base_to_string (BaseObjectInstance * self);
30
// SBaseObjectInstance * method_base_init (SBaseObjectInstance * self);
32
void method_base_deinit (SBaseObjectInstance * self);
34
int method_base_ref (SBaseObjectInstance * self);
36
int method_base_unref (SBaseObjectInstance * self);
38
int method_base_get_refcount (SBaseObjectInstance * self);
40
char * method_base_to_string (SBaseObjectInstance * self);
53
42
/* -----------------
54
43
* Helper functions...
61
50
* This has no use, rely...(?)
63
void base_object_set_init_method (BaseObjectInstance * self, BaseObjectInstance * (* method)(* BaseObjectInstance)) {
64
BaseObjectClass * klass = base_object_get_class (self);
52
void s_base_object_set_init_method (SBaseObjectInstance * self, SBaseObjectInstance * (* method)(* SBaseObjectInstance)) {
53
SBaseObjectClass * klass = s_base_object_get_class (self);
65
54
klass->initize = method;
72
61
* set it to a method that deinitize your object.
74
void base_object_set_deinit_method (BaseObjectInstance * self, void (* method)(BaseObjectInstance *)) {
75
BaseObjectClass * klass = base_object_get_class (self);
63
void s_base_object_set_deinit_method (SBaseObjectInstance * self, void (* method)(SBaseObjectInstance *)) {
64
SBaseObjectClass * klass = s_base_object_get_class (self);
76
65
klass->deinitize = method;
92
81
* DO NOT USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.
94
void base_object_set_unref_method (BaseObjectInstance * self, int (* method)(BaseObjectInstance *)) {
95
BaseObjectClass * klass = base_object_get_class (self);
83
void s_base_object_set_unref_method (SBaseObjectInstance * self, int (* method)(SBaseObjectInstance *)) {
84
SBaseObjectClass * klass = s_base_object_get_class (self);
96
85
klass->unref = method;
100
89
* This fuction is used to set the to_string method.
102
void base_object_set_to_string_method (BaseObjectInstance * self, char * (*method)(BaseObjectInstance *)) {
103
BaseObjectClass * klass = base_object_get_class (self);
91
void s_base_object_set_to_string_method (SBaseObjectInstance * self, char * (*method)(SBaseObjectInstance *)) {
92
SBaseObjectClass * klass = s_base_object_get_class (self);
104
93
klass->to_string = method;
113
102
* This function initizes an intance of the BaseObject, it also sets the methods
114
103
* to be used with the object and sets the refrence count to one.
116
void base_object_initize (BaseObjectInstance * self) {
105
void s_base_object_initize (SBaseObjectInstance * self) {
117
106
self->refcount = 1;
118
// base_object_set_init_method (self, method_base_init);
119
base_object_set_deinit_method (self, method_base_deinit);
120
base_object_set_ref_method (self, method_base_ref);
121
base_object_set_unref_method (self, method_base_unref);
122
base_object_set_get_refcount_method (self, method_base_get_refcount);
123
base_object_set_to_string_method (self, method_base_to_string);
107
// s_base_object_set_init_method (self, method_base_init);
108
s_base_object_set_deinit_method (self, method_base_deinit);
109
s_base_object_set_ref_method (self, method_base_ref);
110
s_base_object_set_unref_method (self, method_base_unref);
111
s_base_object_set_get_refcount_method (self, method_base_get_refcount);
112
s_base_object_set_to_string_method (self, method_base_to_string);
127
116
* This function creates a new base object.
129
BaseObjectInstance * base_object_new () {
130
BaseObjectInstance * self = malloc (sizeof (BaseObjectInstance) + 1);
118
SBaseObjectInstance * s_base_object_new () {
119
SBaseObjectInstance * self = malloc (sizeof (SBaseObjectInstance) + 1);
131
120
//allocate the class definition of the object.
132
self->base_class = malloc (sizeof(BaseObjectClass));
121
self->base_class = malloc (sizeof(SBaseObjectClass));
134
base_object_initize (self);
123
s_base_object_initize (self);
139
128
* This function deinitizes/frees an object even if it is still referenced.
140
* This is usualy a bad idea, use base_object_unref instead.
129
* This is usualy a bad idea, use s_base_object_unref instead.
142
void base_object_free (BaseObjectInstance * self) {
143
BaseObjectClass * klass = base_object_get_class (self);
131
void s_base_object_free (SBaseObjectInstance * self) {
132
SBaseObjectClass * klass = s_base_object_get_class (self);
144
133
klass->deinitize (self);
148
137
* This function gets the class (which hold the object methods).
150
BaseObjectClass * base_object_get_class (BaseObjectInstance * self) {
139
void * s_base_object_get_class (SBaseObjectInstance * self) {
151
140
return self->base_class;
155
144
* This function sets the instance class of an object.
157
void base_object_set_class (BaseObjectInstance * self, BaseObjectClass * klass) {
146
void s_base_object_set_class (SBaseObjectInstance * self, SBaseObjectClass * klass) {
158
147
self->base_class = klass;
175
164
* Returns the current reference count.
177
int base_object_ref (BaseObjectInstance * self) {
166
int s_base_object_ref (SBaseObjectInstance * self) {
178
167
return self->base_class->ref (self);
182
171
* This function returns the current reference count without chaning it.
184
int base_object_get_refcount (BaseObjectInstance * self) {
173
int s_base_object_get_refcount (SBaseObjectInstance * self) {
185
174
return self->base_class->get_refcount (self);
189
178
* This function returns a textual (string) that represesnts the object.
190
* The method can be set using base_object_set_to_string_method.
179
* The method can be set using s_base_object_set_to_string_method.
192
181
* Note: The string that is returned must be freed.
194
char * base_object_to_string (BaseObjectInstance * self) {
183
char * s_base_object_to_string (SBaseObjectInstance * self) {
195
184
return self->base_class->to_string (self);
204
// BaseObjectInstance * method_base_init (BaseObjectInstance * self) { }
193
// SBaseObjectInstance * method_base_init (SBaseObjectInstance * self) { }
206
void method_base_deinit (BaseObjectInstance * self) {
195
void method_base_deinit (SBaseObjectInstance * self) {
207
196
free (self->base_class);
211
int method_base_ref (BaseObjectInstance * self) {
200
int method_base_ref (SBaseObjectInstance * self) {
212
201
self->refcount = self->refcount + 1;
213
202
return self->refcount;
216
int method_base_unref (BaseObjectInstance * self) {
205
int method_base_unref (SBaseObjectInstance * self) {
217
206
self->refcount = self->refcount - 1;
218
207
if (self->refcount <= 0) {
219
208
self->base_class->deinitize (self);
222
211
return self->refcount;
225
int method_base_get_refcount (BaseObjectInstance * self) {
214
int method_base_get_refcount (SBaseObjectInstance * self) {
226
215
return self->refcount;
229
char * method_base_to_string (BaseObjectInstance * self) {
218
char * method_base_to_string (SBaseObjectInstance * self) {
230
219
char * ret_string = malloc (sizeof (char) * 32); // I am bad with maths..
231
snprintf (ret_string, "References: %d ", self->base_class->get_refcount(self));
220
sprintf (ret_string, "References: %d ", self->base_class->get_refcount(self));
232
221
return ret_string;