ooputil.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * category: [data structure]
  3. * apply status: timerqueque
  4. * edit status:
  5. * build status:
  6. * description: object-oriented programming.
  7. */
  8. #ifndef OOPUTIL_H
  9. #define OOPUTIL_H
  10. #pragma once
  11. #include "memutil.h"
  12. /** oop toolkit for c */
  13. #define OOP_MEMBER(tbase) __base__##tbase
  14. #define OOP_EXTENDS(tbase) struct tbase OOP_MEMBER(tbase)
  15. //tderived is no used, return member of <derived_ptr> which type is <tclass> as pointer.
  16. #define OOP_UPCAST(derived_ptr, tclass, tderived) \
  17. (&(derived_ptr)->OOP_MEMBER(tclass))
  18. // get <tderived> type object pointer from its member <base_ptr> which type is <tclass>
  19. #define OOP_DOWNCAST(base_ptr, tclass, tderived) \
  20. container_of(base_ptr, struct tderived, OOP_MEMBER(tclass))
  21. #define OOP_INTERFACE(it) struct it
  22. #define OOP_INTERFACE_MEMBER(it) __vtbl__##it
  23. // oop interface implementation
  24. #define OOP_IMPLEMENTS(it) struct it* OOP_INTERFACE_MEMBER(it)
  25. //get the <tinterface> type member pointer which name is '__vtbl__<tinterface>'
  26. #define OOP_INTERFACE_CAST(derived_ptr, tclass, tinterface) \
  27. ((devrived_ptr)->OOP_INTERFACE_MEMBER(tinterface))
  28. #endif // OOPUTIL_H