/** * \file * cclass.h: basic "class-like" handling of code and data structures * Copyright (C) 2011 Georg Hopp * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CCLASS_H__ #define __CCLASS_H__ #include #include #include #define CCLASS_MAGIC 0xFEFE typedef void (* ctor)(void *, va_list *); typedef void (* clr)(void *); typedef void (* dtor)(void *); typedef void (* jCtor)(void *, struct json_object *); typedef void (* jTo)(void *, struct json_object **); typedef struct _CCLASS { const int magic; size_t size; ctor __construct; clr __clear; dtor __destruct; jCtor __jsonConst; jTo __toJson; } * CCLASS; #define CCLASS_SIZE sizeof(struct _CCLASS) #define CCLASS_PTR_SIZE sizeof(CCLASS) #define __construct(_class) \ static void __construct(_class this, va_list * params) #define __clear(_class) \ static void __clear(_class this) #define __destruct(_class) \ static void __destruct(_class this) #define __jsonConst(_class) \ static void __jsonConst(_class this, struct json_object * json) #define __toJson(_class) \ static void __toJson(_class this, struct json_object ** json) #define CLASS(_class) \ struct _##_class; \ typedef struct _##_class * _class; \ extern const CCLASS const __##_class; \ struct _##_class #define INIT_CLASS(_class) \ __construct(_class); \ __clear(_class); \ __destruct(_class); \ __jsonConst(_class); \ __toJson(_class); \ static const struct _CCLASS _cclass = { \ CCLASS_MAGIC, \ sizeof(struct _##_class), \ (ctor)__construct, \ (clr)__clear, \ (dtor)__destruct, \ (jCtor)__jsonConst, \ (jTo)__toJson \ }; const CCLASS __##_class = (const CCLASS)&_cclass void * _new(const CCLASS _class, ...); #define new(_class, ...) _new((__##_class), __VA_ARGS__) void * _newFromJson(const CCLASS _class, struct json_object * json); #define newFromJson(_class, json) _newFromJson((__##_class), (json)) int _instanceOf(const CCLASS _class, void * _object); #define instanceOf(_class, object) _instanceOf((__##_class), (object)) void clear(void * _object); void delete(void * _object); void toJson(void * _object, struct json_object ** json); int isObject(void * _object); #endif//__CCLASS_H__ // vim: set et ts=4 sw=4: