/* * category: [data structure] * apply status: timerqueque * edit status: * build status: * description: object-oriented programming. */ #ifndef OOPUTIL_H #define OOPUTIL_H #pragma once #include "memutil.h" /** oop toolkit for c */ #define OOP_MEMBER(tbase) __base__##tbase #define OOP_EXTENDS(tbase) struct tbase OOP_MEMBER(tbase) //tderived is no used, return member of which type is as pointer. #define OOP_UPCAST(derived_ptr, tclass, tderived) \ (&(derived_ptr)->OOP_MEMBER(tclass)) // get type object pointer from its member which type is #define OOP_DOWNCAST(base_ptr, tclass, tderived) \ container_of(base_ptr, struct tderived, OOP_MEMBER(tclass)) #define OOP_INTERFACE(it) struct it #define OOP_INTERFACE_MEMBER(it) __vtbl__##it // oop interface implementation #define OOP_IMPLEMENTS(it) struct it* OOP_INTERFACE_MEMBER(it) //get the type member pointer which name is '__vtbl__' #define OOP_INTERFACE_CAST(derived_ptr, tclass, tinterface) \ ((devrived_ptr)->OOP_INTERFACE_MEMBER(tinterface)) #endif // OOPUTIL_H