⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cplus.h

📁 这是状态机的一个框架结构的例子,可以作为状态机的基本架构
💻 H
字号:
/******************************************************************** 
 * "C+" -- Portable Object-Oriented Extension to C
 * Copyright (c) 2002 Miro Samek, Palo Alto, CA.
 * All Rights Reserved.
 *******************************************************************/
#ifndef cplus_h
#define cplus_h

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Macros for declaring simple classes (without polymorphism)
 */
#define CLASS(name_)          \
   typedef struct name_ name_;\
   struct name_ {
#define METHODS };
#define END_CLASS

/**
 * Abstract base class 'Object', root of all classes with
 * polymorphism
 */
CLASS(Object) 
   struct ObjectVTABLE *vptr__;         /* private virtual pointer */
METHODS
                              /* protected constructor 'inline'... */
#  define ObjectCtor_(me_) ((me_)->vptr__ = &theObjectVTABLE, (me_))
                               /* protected destructor 'inline'... */
#  define ObjectXtor_(me_) ((void)0)
                      /* dummy implementation for abstract methods */
    void ObjectAbstract(void);
                                                           /* RTTI */
#   define ObjectIS_KIND_OF(me_, class_) \
        ObjectIsKindOf__((Object *)(me_), &the##class_##VTABLE)
    int ObjectIsKindOf__(Object *me, void *class);
END_CLASS

CLASS(ObjectVTABLE)
   ObjectVTABLE *super__;           /* pointer to superclass' VTBL */
   void (*xtor)(Object *);            /* public virtual destructor */
METHODS
END_CLASS

extern ObjectVTABLE theObjectVTABLE;    /* Object class descriptor */

/**
 * Macros for declaring subclasses
 */
#define SUBCLASS(class_, superclass_) \
   CLASS(class_)                      \
      superclass_ super_;

/**
 * Macros for defining VTABLEs and binding virtual functions
 */
#define VTABLE(class_, superclass_) };          \
   typedef struct class_##VTABLE class_##VTABLE;\
   extern class_##VTABLE the##class_##VTABLE;   \
   struct class_##VTABLE {                      \
      superclass_##VTABLE super_;

#define BEGIN_VTABLE(class_, superclass_)                  \
   class_##VTABLE the##class_##VTABLE;                     \
   static ObjectVTABLE *class_##VTABLECtor(class_ *t) {    \
      register class_##VTABLE *me = &the##class_##VTABLE;  \
      *(superclass_##VTABLE *)me =                         \
          *(superclass_##VTABLE *)((Object *)t)->vptr__;

#define VMETHOD(class_, meth_) ((class_##VTABLE *)me)->meth_

#define END_VTABLE\
      ((ObjectVTABLE*)me)->super__ = ((Object*)t)->vptr__; \
      return (ObjectVTABLE *)me;                           \
   }

/**
 * Macro to hook virtual pointer used in constructors
 */
#define VHOOK(class_)                                      \
   if (((ObjectVTABLE *)&the##class_##VTABLE)->super__== 0)\
       ((Object *)me)->vptr__ = class_##VTABLECtor(me);    \
   else                                                    \
       ((Object *)me)->vptr__ =                            \
                  (ObjectVTABLE *)&the##class_##VTABLE

/**
 * Macro to access v-pointer
 */
#define VPTR(class_, obj_) \
    ((class_##VTABLE *)(((Object *)(obj_))->vptr__)) 

/**
 * Macro for invoking virtual class methods
 * and macro for invoking interface methods.
 */
#define VCALL(class_, meth_, obj_)\
   (*VPTR(class_, obj_)->meth_)((class_*)(obj_)
#define END_CALL )

/**
 * Find an offset of a member into its class
 */
#define OFFSET_OF(class_, attr_) \
   ((unsigned)&((class_ *)0)->attr_)

#ifdef __cplusplus
}
#endif

#endif                                                  /* cplus_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -