Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <memory.h>
- #if defined Array || defined __cplusplus
- #else
- #define Array(T) Array__##T
- #define PArray(T) PArray__##T
- #define array(T) array__##T
- #define Array__new(T) Array__new__##T
- #define Array__delete(T) Array__delete__##T
- #define Array__set(T) Array__set__##T
- #define Array__get(T) Array__get__##T
- #define Array__size(T) Array__size__##T
- #define Array__GENERATE(T) \
- Array__DEFINE(T) \
- Array__IMPLEMENT(T)
- #ifdef Array__OPTION__ALLOW__BROKEN
- #define Array__DEFINE__BROKEN(T) \
- void Array__set(T)(PArray(T) *, size_t, T);
- #else
- #define Array__DEFINE__BROKEN(T) \
- void Array__set(T)();
- #endif
- #define Array__DEFINE(T) \
- typedef struct Array(T) Array(T); \
- struct Array(T) { \
- Array(T) *(*new)(); \
- void (*delete)(void *); \
- \
- T (*get)(void *, size_t); \
- void (*set)(void *, size_t, T); \
- size_t (*size)(void *); \
- } __attribute__((visibility("default"))); \
- \
- typedef struct PArray(T) PArray(T); \
- struct PArray(T) { \
- Array(T) pub; \
- \
- T *array; \
- size_t size; \
- } __attribute__((visibility("hidden"))); \
- \
- Array(T) *Array__new(T)(); \
- void Array__delete(T)(); \
- T Array__get(T)(); \
- size_t Array__size(T)(); \
- Array__DEFINE__BROKEN(T) \
- \
- extern const Array(T) array(T); \
- const Array(T) array(T) = { \
- Array__new(T), Array__delete(T), \
- Array__get(T), Array__set(T), Array__size(T) \
- };
- #endif
- #if defined Array__IMPLEMENT || !defined Array
- #else
- #define Array__IMPLEMENT(T) \
- Array(T) *Array__new(T)() \
- { \
- PArray(T) *self = memcpy(malloc(sizeof (PArray(T))), &(PArray(T)) { \
- .pub = array(T), \
- \
- .array = malloc(sizeof (T)), \
- .size = 1 \
- }, sizeof (PArray(T))); \
- return &self->pub; \
- } \
- \
- void Array__delete(T)(PArray(T) *self) \
- { \
- free(self->array); \
- free(self); \
- } \
- \
- T Array__get(T)(PArray(T) *self, size_t index) \
- { \
- if (index < self->size) \
- return self->array[index]; \
- /** TODO: Make Result like Rust */ \
- return 0; \
- } \
- \
- void Array__set(T)(PArray(T) *self, size_t index, T value) \
- { \
- if (index + 1 > self->size) { \
- self->size = index + 1; \
- self->array = realloc(self->array, sizeof (T) * self->size); \
- } \
- self->array[index] = value; \
- } \
- \
- size_t Array__size(T)(PArray(T) *self) \
- { \
- return self->size; \
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement