Advertisement
ItzBreakfast

c generic

Oct 5th, 2022 (edited)
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.60 KB | Source Code | 0 0
  1. #include <stdlib.h>
  2. #include <memory.h>
  3.  
  4. #if defined Array || defined __cplusplus
  5. #else
  6. #define Array(T) Array__##T
  7. #define PArray(T) PArray__##T
  8. #define array(T) array__##T
  9.    
  10. #define Array__new(T) Array__new__##T
  11. #define Array__delete(T) Array__delete__##T
  12. #define Array__set(T) Array__set__##T
  13. #define Array__get(T) Array__get__##T
  14. #define Array__size(T) Array__size__##T
  15.    
  16. #define Array__GENERATE(T) \
  17.     Array__DEFINE(T) \
  18.     Array__IMPLEMENT(T)
  19.    
  20. #ifdef Array__OPTION__ALLOW__BROKEN
  21.     #define Array__DEFINE__BROKEN(T) \
  22.     void Array__set(T)(PArray(T) *, size_t, T);
  23. #else
  24.     #define Array__DEFINE__BROKEN(T) \
  25.     void Array__set(T)();
  26. #endif
  27. #define Array__DEFINE(T) \
  28. typedef struct Array(T) Array(T); \
  29. struct Array(T) { \
  30.     Array(T) *(*new)(); \
  31.     void (*delete)(void *); \
  32.     \
  33.     T (*get)(void *, size_t); \
  34.     void (*set)(void *, size_t, T); \
  35.     size_t (*size)(void *); \
  36. } __attribute__((visibility("default"))); \
  37.     \
  38. typedef struct PArray(T) PArray(T); \
  39. struct PArray(T) { \
  40.     Array(T) pub; \
  41.     \
  42.     T *array; \
  43.     size_t size; \
  44. } __attribute__((visibility("hidden"))); \
  45.     \
  46.     Array(T) *Array__new(T)(); \
  47.     void Array__delete(T)(); \
  48.     T Array__get(T)(); \
  49.     size_t Array__size(T)(); \
  50.     Array__DEFINE__BROKEN(T) \
  51.     \
  52. extern const Array(T) array(T); \
  53. const Array(T) array(T) = { \
  54.     Array__new(T), Array__delete(T), \
  55.     Array__get(T), Array__set(T), Array__size(T) \
  56. };
  57. #endif
  58.  
  59. #if defined Array__IMPLEMENT || !defined Array
  60. #else
  61.     #define Array__IMPLEMENT(T) \
  62.     Array(T) *Array__new(T)() \
  63.     { \
  64.         PArray(T) *self = memcpy(malloc(sizeof (PArray(T))), &(PArray(T)) { \
  65.             .pub = array(T), \
  66.             \
  67.             .array = malloc(sizeof (T)), \
  68.             .size = 1 \
  69.         }, sizeof (PArray(T))); \
  70.         return &self->pub; \
  71.     } \
  72.     \
  73.     void Array__delete(T)(PArray(T) *self) \
  74.     { \
  75.         free(self->array); \
  76.         free(self); \
  77.     } \
  78.     \
  79.     T Array__get(T)(PArray(T) *self, size_t index) \
  80.     { \
  81.         if (index < self->size) \
  82.             return self->array[index]; \
  83.         /** TODO: Make Result like Rust */ \
  84.         return 0; \
  85.     } \
  86.     \
  87.     void Array__set(T)(PArray(T) *self, size_t index, T value) \
  88.     { \
  89.         if (index + 1 > self->size) { \
  90.             self->size = index + 1; \
  91.             self->array = realloc(self->array, sizeof (T) * self->size); \
  92.         } \
  93.         self->array[index] = value; \
  94.     } \
  95.     \
  96.     size_t Array__size(T)(PArray(T) *self) \
  97.     { \
  98.         return self->size; \
  99.     }
  100. #endif
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement