cclass.h 3.07 KB
/**
 * 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 <http://www.gnu.org/licenses/>.
 */
#ifndef __CCLASS_H__
#define __CCLASS_H__

#include <stdarg.h>
#include <sys/types.h>
#include <json/json.h>

#define SWAP(a, b)  a ^= b; b ^= a; a ^= b; 

#define CCLASS_MAGIC    0xFEFE

#define CLASS(_class) \
    struct _##_class; \
    typedef struct _##_class * _class; \
    extern const _CCLASS const __##_class; \
    struct _##_class

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;
    void (* __construct)(void * _this, va_list * params);
    void (* __clear)(void * _this);
    void (* __destruct)(void * _this);
    void (* __jsonConst)(void * _this, struct json_object * json);
    void (* __toJson)(void * _this, struct json_object ** json);
} * _CCLASS;
#define _CCLASS_SIZE    sizeof(_CCLASS)
#define CCLASS_SIZE     sizeof(struct 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 INIT_CCLASS(class) \
    __construct(class); \
    __clear(class); \
    __destruct(class); \
    __jsonConst(class); \
    __toJson(class); \
    static const struct CCLASS _class = { \
        CCLASS_MAGIC, \
        sizeof(struct _##class), \
        (ctor)__construct, \
        (clr)__clear, \
        (dtor)__destruct, \
        (jCtor)__jsonConst, \
        (jTo)__toJson \
    }; const _CCLASS __##class = (const _CCLASS)&_class

void * _new(const _CCLASS _class, ...);
void * _newFromJson(const _CCLASS _class, struct json_object * json);
void   clear(void * _object);
void   delete(void * _object);
void   toJson(void * _object, struct json_object ** json);
int    isObject(void * _object);
int    _instanceOf(const _CCLASS _class, void * _object);

#define new(class, ...) _new((__##class), __VA_ARGS__)
#define newFromJson(class, json) _newFromJson((__##class), (json))
#define instanceOf(class, object) _instanceOf((__##class), (object))

#endif//__CCLASS_H__

// vim: set et ts=4 sw=4: