1234567891011121314151617181920212223242526272829303132333435363738394041 |
- /*
- * 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 <derived_ptr> which type is <tclass> as pointer.
- #define OOP_UPCAST(derived_ptr, tclass, tderived) \
- (&(derived_ptr)->OOP_MEMBER(tclass))
- // get <tderived> type object pointer from its member <base_ptr> which type is <tclass>
- #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 <tinterface> type member pointer which name is '__vtbl__<tinterface>'
- #define OOP_INTERFACE_CAST(derived_ptr, tclass, tinterface) \
- ((devrived_ptr)->OOP_INTERFACE_MEMBER(tinterface))
- #endif // OOPUTIL_H
|