From 00b324bfc162030b575e03795dcfcaac56bd0b4d Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Wed, 5 Dec 2012 15:12:20 +0000 Subject: Changes in object model: separate class objects to store vtable. Also, nicer UTF-8 display of big numbers. --- Object.h | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) (limited to 'Object.h') diff --git a/Object.h b/Object.h index 8ebc1d50..bfabe6f8 100644 --- a/Object.h +++ b/Object.h @@ -4,41 +4,48 @@ #define HEADER_Object /* htop - Object.h -(C) 2004-2011 Hisham H. Muhammad +(C) 2004-2012 Hisham H. Muhammad Released under the GNU GPL, see the COPYING file in the source distribution for its full text. */ #include "RichString.h" -#ifndef DEBUG -#define Object_setClass(obj, class) -#endif - typedef struct Object_ Object; typedef void(*Object_Display)(Object*, RichString*); typedef int(*Object_Compare)(const void*, const void*); typedef void(*Object_Delete)(Object*); +#define Object_getClass(obj_) ((Object*)(obj_))->klass +#define Object_setClass(obj_, class_) Object_getClass(obj_) = (ObjectClass*) class_ + +#define Object_delete(obj_) Object_getClass(obj_)->delete((Object*)(obj_)) +#define Object_displayFn(obj_) Object_getClass(obj_)->display +#define Object_display(obj_, str_) Object_getClass(obj_)->display((Object*)(obj_), str_) +#define Object_compare(obj_, other_) Object_getClass(obj_)->compare((const void*)(obj_), other_) + +#define Class(class_) ((ObjectClass*)(&(class_ ## _class))) + +#define AllocThis(class_) (class_*) malloc(sizeof(class_)); Object_setClass(this, Class(class_)); + +typedef struct ObjectClass_ { + const void* extends; + const Object_Display display; + const Object_Delete delete; + const Object_Compare compare; +} ObjectClass; + struct Object_ { - #ifdef DEBUG - char* class; - #endif - Object_Display display; - Object_Delete delete; + ObjectClass* klass; }; -#ifdef DEBUG -extern char* OBJECT_CLASS; -#else -#define OBJECT_CLASS NULL -#endif +extern ObjectClass Object_class; #ifdef DEBUG -void Object_setClass(void* this, char* class); +bool Object_isA(Object* o, const ObjectClass* klass); #endif -- cgit v1.2.3