Advertisement
enfiskutensykkel

C with object inheritance

Feb 10th, 2017
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.19 KB | None | 0 0
  1. #include <stddef.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5.  
  6. struct __attribute__((packed)) class_object
  7. {
  8.     void                        *handle;
  9.     void                        *super;
  10.     void                        (*destructor)(void*);
  11.     size_t                      data_size;
  12.     void                        *data_ptr;
  13. };
  14.  
  15. #define object_reference(object)                                    \
  16.     ((struct class_object*) (((char*) object) - sizeof(struct class_object)))
  17.  
  18. #define handle(object)                                              \
  19.     (object_reference(object)->handle)
  20.  
  21.  
  22. void __delete_object(void *object)
  23. {
  24.     free(((struct class_object*) object)->handle);
  25. }
  26.  
  27.  
  28. void __create_object(void *object, void *handle)
  29. {
  30.     struct class_object *this = object;
  31.     this->handle = handle;
  32.     this->super = object;
  33.     this->destructor = __delete_object;
  34.     this->data_size = 0;
  35.     this->data_ptr = NULL;
  36. }
  37.  
  38.  
  39. #define define_class(name, base, type)                              \
  40.     struct class_##name                                             \
  41.     {                                                               \
  42.         struct class_object     header;                             \
  43.         type                    data;                               \
  44.         struct class_##base     base_type;                          \
  45.     }
  46.  
  47.  
  48. #define class(name, base, type)                                     \
  49.     struct class_##name;                                            \
  50.                                                                     \
  51.     void __delete_##name(void *object)                              \
  52.     {                                                               \
  53.         struct class_object *this = object;                         \
  54.         delete_##name(this->data_ptr);                              \
  55.         __delete_##base(this->super);                               \
  56.     }                                                               \
  57.                                                                     \
  58.     type * __create_##name(void *object, void *handle)              \
  59.     {                                                               \
  60.         size_t class_size = sizeof(type);                           \
  61.         size_t class_offset = sizeof(struct class_object);          \
  62.         struct class_object *this = object;                         \
  63.                                                                     \
  64.         if (this == NULL)                                           \
  65.         {                                                           \
  66.             this = object = handle;                                 \
  67.         }                                                           \
  68.                                                                     \
  69.         if (object == NULL)                                         \
  70.         {                                                           \
  71.             return NULL;                                            \
  72.         }                                                           \
  73.                                                                     \
  74.         this->handle = handle;                                      \
  75.         this->super = ((char*) object) + class_offset + class_size; \
  76.         this->destructor = __delete_##name;                         \
  77.         this->data_size = class_size;                               \
  78.         this->data_ptr = ((char*) object) + class_offset;           \
  79.                                                                     \
  80.         __create_##base(this->super, handle);                       \
  81.                                                                     \
  82.         create_##name(this->data_ptr);                              \
  83.                                                                     \
  84.         return this->data_ptr;                                      \
  85.     }                                                               \
  86.                                                                     \
  87.     define_class(name, base, type)
  88.  
  89.  
  90. #define new(name)                                                   \
  91.     __create_##name(NULL, malloc(sizeof(struct class_##name)))
  92.  
  93.  
  94. #define del(object)                                                 \
  95.     object_reference(object)->destructor(object_reference(object))
  96.  
  97.  
  98. #define super(type, object)                                         \
  99.     ((type *) ((struct class_object*) (object_reference(object)->super))->data_ptr)
  100.  
  101.  
  102. struct A
  103. {
  104.     int member;
  105. };
  106.  
  107. void create_A(struct A *this)
  108. {
  109.     this->member = 2;
  110.     printf("A's ctor, member=%d\n", this->member);
  111. }
  112.  
  113. void delete_A(struct A *this)
  114. {
  115.     printf("A's dtor, member=%d\n", this->member);
  116. }
  117.  
  118. class(A, object, struct A);
  119.  
  120.  
  121. struct B
  122. {
  123.     int member;
  124. };
  125.  
  126. void create_B(struct B *this)
  127. {
  128.     super(struct A, this)->member = this->member = 3;
  129. }
  130.  
  131. void delete_B(struct B *this)
  132. {
  133.     printf("B's dtor, B::member=%d A::member=%d\n", this->member, super(struct A, this)->member);
  134. }
  135.  
  136. class(B, A, struct B);
  137.  
  138.  
  139. int main()
  140. {
  141.     struct B *b = new(B);
  142.     b->member = 5;
  143.  
  144.     del(b);
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement