diff options
-rw-r--r-- | src/cobj.h | 121 | ||||
-rw-r--r-- | src/main.c | 5 | ||||
-rw-r--r-- | src/teams.c | 84 | ||||
-rw-r--r-- | src/teams.h | 5 |
4 files changed, 120 insertions, 95 deletions
@@ -1,56 +1,43 @@ -#ifndef __COBJ_IMPLS_H__ -# define __COBJ_IMPLS_H__ +#if defined(__COBJ_PUB__) && defined(__COBJ_DECL__) || defined(__COBJ_IMPL__) && defined(__COBJ_H__) +# undef Atom +# undef Attr +# undef Call +# undef Class +# undef DefaultDelete +# undef Define +# undef Del +# undef DelF +# undef Func +# undef GET +# undef Get +# undef List +# undef New +# undef Prop +# undef Self +# undef Set +# undef TYPE +# undef UNUSED +# undef __COBJ_DECL__ +# undef __COBJ_PUB__ +#endif + + +#if ! defined(__COBJ_H__) && ! defined(__COBJ_IMPL__) && ! defined(__COBJ_DECL__) # define Get(instance, field, ...) \ (instance)->get_##field(instance, ## __VA_ARGS__) # define Set(instance, field, ...) \ (instance)->set_##field(instance, ## __VA_ARGS__) # define Call(instance, fun, ...) \ (instance)->fun(instance, ## __VA_ARGS__) -# define New(klass, ...) klass##_new(__VA_ARGS__) -# define Del(klass, ...) klass##_del(__VA_ARGS__) -#endif /* __COBJ_IMPLS_H__ */ - -#if defined(__USE_C_OBJSYS__) -# undef New -# undef Del -# undef __USE_C_OBJSYS__ -#elif defined(__COBJ_PRIV_IMPLS_H__) -# define UNUSED(arg) while(0 && (arg)) -# define TYPE(klass) \ - struct __ ## klass ## _impl -# define GETTER(klass, field, type, body, ...) \ - type klass##_get_##field(klass self, ## __VA_ARGS__) \ - body -# define SETTER(klass, field, type, body, ...) \ - bool klass##_set_##field(klass self, ## __VA_ARGS__, type value) \ - body -# define DEFINE(klass, name, type, body, ...) \ - type klass##_##name(klass self, ## __VA_ARGS__) \ - body -# define NEW(klass, body, ...) \ - klass klass ## _new(__VA_ARGS__) \ - body -# define DEL(klass, body, ...) \ - void klass ## _del(klass self, ## __VA_ARGS__) \ - body - -# define Property(klass, name) \ - (self->get_ ## name) = (& klass ## _ ## get_ ## name), \ - (self->set_ ## name) = (& klass ## _ ## set_ ## name) - -# define Callable(klass, name) \ - (self->name) = (& klass ## _ ## name) - -# define SELF(name) \ - self->_property_ ## name -# define GET(obj, name) \ - (obj)->_property_ ## name - -#else +# define New(klass, ...) \ + klass##_new(__VA_ARGS__) +# define Del(instance) \ + (instance)->destroy((instance)), instance = NULL +#elif defined(__COBJ_DECL__) # define Class(klass, data, ...) \ typedef struct __##klass##_impl * klass; \ klass klass ## _new(__VA_ARGS__); \ - void klass ## _delete(); \ + void klass ## _delete(klass); \ struct __##klass##_impl data # define List(klass, field, type, dim, ...) \ @@ -65,7 +52,49 @@ # define Func(klass, name, type, ...) \ type (*name)(klass, ## __VA_ARGS__) -# define Del (klass) \ + +# define Del(klass) \ void (*destroy)(klass) -# define __USE_C_OBJSYS__ +#elif defined(__COBJ_IMPL__) +# define UNUSED(arg) while(0 && (arg)) +# define TYPE(klass) \ + struct __ ## klass ## _impl +# define Get(klass, field, type, body, ...) \ + type klass##_get_##field(klass self, ## __VA_ARGS__) \ + body +# define Set(klass, field, type, body, ...) \ + bool klass##_set_##field(klass self, ## __VA_ARGS__, type value) \ + body +# define Def(klass, name, type, body, ...) \ + type klass##_##name(klass self, ## __VA_ARGS__) \ + body +# define New(klass, body, ...) \ + klass klass ## _new(__VA_ARGS__) { \ + klass self = (klass)malloc(sizeof(TYPE(klass))); \ + if(self != NULL) body; \ + return self; \ + } + +# define Del(klass, body, ...) \ + void klass ## _delete(klass self, ## __VA_ARGS__) \ + body + +# define Prop(klass, name) \ + (self->get_ ## name) = (& klass ## _ ## get_ ## name), \ + (self->set_ ## name) = (& klass ## _ ## set_ ## name) + +# define Func(klass, name) \ + (self->name) = (& klass ## _ ## name) +# define DelF(klass) \ + (self->destroy) = (&klass ## _delete) + +# define Self(name) \ + self->_property_ ## name +# define Attr(instance, name) \ + (instance)->_property_ ## name +# define Call(instance, fun, ...) \ + (instance)->fun(instance, ## __VA_ARGS__) +# define DefaultDelete { \ + if(self != NULL) free(self); \ + } #endif @@ -2,8 +2,9 @@ #include <string.h> #include <stdlib.h> -#include "teams.h" #include "common.h" +#include "teams.h" + // ref(type) -> const ref to const data // mut(type) -> const ref to mut data @@ -59,7 +60,7 @@ int main() team champion = Call(dref(teams), find_champion, teams, num); Call(champion, printf); - while(num --) Del(team, teams[num]); + while(num --) Del(teams[num]); free(teams); return 0; diff --git a/src/teams.c b/src/teams.c index bebb786..b0233f5 100644 --- a/src/teams.c +++ b/src/teams.c @@ -2,61 +2,60 @@ #include <stdlib.h> #include <string.h> +#define __COBJ_IMPL__ #include "teams.h" -#define __COBJ_PRIV_IMPLS_H__ -#include "cobj.h" // Setter definitions // @set char[]: TEAM.name -> bool -Setter(team, name, ref(char), { - return !(strncpy(SELF(name), value, 255) == NULL); +Set(team, name, ref(char), { + return !(strncpy(Self(name), value, 255) == NULL); }) // @set char[]: TEAM.institution -> bool -Setter(team, institution, ref(char), { - return !(strncpy(SELF(institution), value, 255) == NULL); +Set(team, institution, ref(char), { + return !(strncpy(Self(institution), value, 255) == NULL); }) // @set char[]: TEAM.member_name, int: id -> bool -Setter(team, member_name, ref(char), { - return (id > 0 && id < 4 && !(strncpy(SELF(member_name)[id-1], value, 255) == NULL)); +Set(team, member_name, ref(char), { + return (id > 0 && id < 4 && !(strncpy(Self(member_name)[id-1], value, 255) == NULL)); }, int id) // @set int: TEAM.solved -> bool -Setter(team, solved, uint8_t, { +Set(team, solved, uint8_t, { if (value <= 10) - SELF(solved) = value; + Self(solved) = value; return (value <= 10); }) // Getter definitions // @get TEAM.name -> char[] -Getter(team, name, ptr(char), { - return SELF(name); +Get(team, name, ptr(char), { + return Self(name); }) // @get TEAM.institution -> char[] -Getter(team, institution, ptr(char), { - return SELF(institution); +Get(team, institution, ptr(char), { + return Self(institution); }) // @get TEAM.solved -> int -Getter(team, solved, uint8_t, { - return SELF(solved); +Get(team, solved, uint8_t, { + return Self(solved); }) -static char* const _id_error = (char *)"(incorrect id)"; // C++ fix // @get TEAM.member_name, id -> char[] -Getter(team, member_name, ptr(char), { - return (id > 0 && id < 4)? SELF(member_name)[id - 1] : _id_error; +static char* const _id_error = (char *)"(incorrect id)"; // C++ fix +Get(team, member_name, ptr(char), { + return (id > 0 && id < 4)? Self(member_name)[id - 1] : _id_error; }, int id) -Define(team, printf, int, { - return call(self, fprintf, stdout); +Def(team, printf, int, { + return Call(self, fprintf, stdout); }) -Define(team, fprintf, int, { +Def(team, fprintf, int, { return fprintf(file, "Team name : %s\n" "Institution: %s\n" @@ -64,41 +63,34 @@ Define(team, fprintf, int, { " Member 1: %s\n" " Member 2: %s\n" " Member 3: %s\n", - SELF(name), - SELF(institution), - SELF(solved), - SELF(member_name)[0], - SELF(member_name)[1], - SELF(member_name)[2]); + Self(name), + Self(institution), + Self(solved), + Self(member_name)[0], + Self(member_name)[1], + Self(member_name)[2]); }, ptr(FILE) file) -Define(team, find_champion, team, { +Def(team, find_champion, team, { UNUSED(self); team champion = teams[num - 1]; while(num --) - if (GET(teams[num], solved) > GET(champion, solved) ) + if (Attr(teams[num], solved) > Attr(champion, solved) ) champion = teams[num]; return champion; }, ptr(team) teams, size_t num) +Del(team, DefaultDelete) // base functions New(team, { - team self = (team)malloc(sizeof(TYPE(team))); - if (self) - { - PROPERTY(team, name); - PROPERTY(team, member_name); - PROPERTY(team, institution); - PROPERTY(team, solved); - CALLABLE(team, printf); - CALLABLE(team, fprintf); - CALLABLE(team, find_champion); - } - return self; -}) - -Del(team, { - if(self) free(self); + Prop(team, name); + Prop(team, member_name); + Prop(team, institution); + Prop(team, solved); + Func(team, printf); + Func(team, fprintf); + Func(team, find_champion); + DelF(team); }) diff --git a/src/teams.h b/src/teams.h index 98fb6f3..62ca7f2 100644 --- a/src/teams.h +++ b/src/teams.h @@ -2,9 +2,10 @@ # define __TEAMS_H__ # include <stdint.h> # include <stdbool.h> -# include "cobj.h" # include "common.h" +# define __COBJ_DECL__ +# include "cobj.h" // Type definition Class(team, { List(team, name, char, [255]); @@ -16,6 +17,8 @@ Class(team, { Func(team, find_champion, team, ptr(team), size_t); Del (team); }); + +# define __COBJ_PUB__ # include "cobj.h" #endif /* __TEAMS_H__ */ /* vim: ts=8 */ |