server 0.0.1
basicserverinfrastructure

include/class.h File Reference

#include <stdarg.h>
#include <sys/types.h>
#include <string.h>
#include <assert.h>
#include "interface.h"
Include dependency graph for class.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  class

Defines

#define _ISOC99_SOURCE
#define CLASS_MAGIC   0xFEFE
#define CLASS(name)
#define EXTENDS(parent)   const char _[sizeof(struct c_##parent)]
#define _NULL   NULL
#define CREATE_CLASS(name, _parent,...)
#define _CALL(object, _iface, method,...)
#define CALL(object, _iface, method,...)
#define RETCALL(object, _iface, method, ret,...)
#define IFACE_GET(class, iface)   (interfaceGet(&((class)->impl),(iface)))
#define IFACE_EXISTS(class, iface)   (NULL != IFACE_GET((class),(iface)))
#define HAS_PARENT(class)   (NULL != ((class)->parent))

Typedefs

typedef void(* fptr_classInit )(void)
typedef struct classclass_ptr

Functions

void * class_getInterface (class_ptr *, iface_ptr)
class_ptr class_getClass (void *)

Define Documentation

#define _CALL (   object,
  _iface,
  method,
  ... 
)
Value:
class_ptr           class = class_getClass((object));                     \
        struct i_##_iface * iface;                                                \
        if (class->init)        class->init();                                        \
        iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface);     \
        while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) {   \
                class = class->parent;                                                \
                if (class->init)        class->init();                                    \
                iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \
        };                                                                        \
        assert(NULL != iface->method);

: actually i use gcc feature ## for variadoc... think about a way to make this standard.

Definition at line 43 of file class.h.

#define _ISOC99_SOURCE

Definition at line 11 of file class.h.

#define _NULL   NULL

Definition at line 24 of file class.h.

#define CALL (   object,
  _iface,
  method,
  ... 
)
Value:
do {                                             \
                _CALL(object, _iface, method, ##__VA_ARGS__); \
                iface->method(object, ##__VA_ARGS__);        \
        } while(0)

Definition at line 55 of file class.h.

#define CLASS (   name)
Value:
struct c_##name;                   \
        typedef struct c_##name * name;    \
        extern struct class * const _##name; \
        struct c_##name

Definition at line 15 of file class.h.

#define CLASS_MAGIC   0xFEFE

Definition at line 13 of file class.h.

#define CREATE_CLASS (   name,
  _parent,
  ... 
)
Value:
static struct class c_##name;      \
        static void _classInit_(void) {    \
                c_##name.parent = _##_parent;  \
                c_##name.init   = NULL;        \
        }                                  \
        static struct class c_##name = {   \
                CLASS_MAGIC,                   \
                NULL,                          \
                sizeof(struct c_##name),       \
                _classInit_,                   \
                INIT_IMPL(__VA_ARGS__)         \
        }; struct class * const _##name = &c_##name

Definition at line 25 of file class.h.

#define EXTENDS (   parent)    const char _[sizeof(struct c_##parent)]

Definition at line 21 of file class.h.

#define HAS_PARENT (   class)    (NULL != ((class)->parent))

Definition at line 71 of file class.h.

#define IFACE_EXISTS (   class,
  iface 
)    (NULL != IFACE_GET((class),(iface)))

Definition at line 69 of file class.h.

#define IFACE_GET (   class,
  iface 
)    (interfaceGet(&((class)->impl),(iface)))

Definition at line 68 of file class.h.

#define RETCALL (   object,
  _iface,
  method,
  ret,
  ... 
)
Value:
do {                                             \
                _CALL(object, _iface, method, ##__VA_ARGS__); \
                ret = iface->method(object, ##__VA_ARGS__);  \
        } while(0)

Definition at line 61 of file class.h.


Typedef Documentation

typedef struct class* class_ptr

Definition at line 76 of file class.h.

typedef void(* fptr_classInit)(void)

Definition at line 73 of file class.h.


Function Documentation

class_ptr class_getClass ( void *  )

Definition at line 21 of file class.c.

{
        return *(class_ptr *)(object - sizeof(void*));
}

Here is the caller graph for this function:

void* class_getInterface ( class_ptr ,
iface_ptr   
)

Definition at line 8 of file class.c.

{
        void * iface = (void *)IFACE_GET(*class, _iface);

        while(NULL == iface && HAS_PARENT(*class)) {
                *class = (*class)->parent;
                iface = (void *)IFACE_GET(*class, _iface);
        }

        return iface;
}
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines