00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _OBJECT_H_
00024 #define _OBJECT_H_
00025
00026 #include <stdlib.h>
00027
00028 struct _aspi_object;
00029
00071 typedef struct _aspi_class
00072 {
00073 int id;
00074 struct _aspi_class * parent;
00075 int size;
00076 void (* dtor) (struct _aspi_object * object);
00077 struct _aspi_object * (* dup) (struct _aspi_object * object);
00078 } aspi_class_t;
00079
00080
00098 typedef struct _aspi_object {
00099 aspi_class_t * klass;
00100 int reference_count;
00101 } aspi_object_t;
00102
00103
00104 aspi_object_t * aspi_object_init (aspi_object_t * object);
00105 aspi_class_t * aspi_object (void);
00106 void aspi_object_dtor (aspi_object_t * object);
00107 aspi_object_t * aspi_object_dup (aspi_object_t * object);
00108
00109
00110 void aspi_object_retain (aspi_object_t * object);
00111 void aspi_object_release (aspi_object_t * object);
00112 void aspi_object_free (aspi_object_t * object);
00113 aspi_object_t * aspi_object_copy (aspi_object_t * object);
00114 int aspi_object_is_a (void * object, aspi_class_t * klass);
00115 int aspi_class_is_a (void * klass1, aspi_class_t * klass2);
00116 void aspi_object_check (void * object, aspi_class_t * klass);
00117 void aspi_class_check (void * klass1, aspi_class_t * klass2);
00118
00119
00120 void aspi_class_register (aspi_class_t * klass, aspi_class_t * parent, int size, void (* dtor) (aspi_object_t * object));
00121 aspi_object_t * aspi_class_instantiate (aspi_class_t * klass);
00122
00123
00124
00125 #define ASPI_OBJECT(x) (aspi_object_check (x, aspi_object ()), ((aspi_object_t *) x))
00126 #define ASPI_CLASS(x) (aspi_class_check (x, aspi_object ()), ((aspi_class_t * ) x))
00127
00128
00131 #endif