diff options
author | 2025-05-22 17:49:46 +0600 | |
---|---|---|
committer | 2025-05-22 17:49:46 +0600 | |
commit | cefb440148fd80cac7537b3743dd0e018df3a797 (patch) | |
tree | 33ad297fd7226d4ef74678194cce444ba0d7cf90 | |
parent | ff1ba1e770b4205c2cc367ff513325e5f22c73e8 (diff) | |
download | c-obp-example-cefb440148fd80cac7537b3743dd0e018df3a797.tar.gz c-obp-example-cefb440148fd80cac7537b3743dd0e018df3a797.zip |
Rework class template
Signed-off-by: Mubashshir <ahmubashshir@gmail.com>
-rw-r--r-- | src/cobj.h | 44 | ||||
-rw-r--r-- | src/main.c | 16 | ||||
-rw-r--r-- | src/teams.c | 26 | ||||
-rw-r--r-- | src/teams.h | 17 |
4 files changed, 50 insertions, 53 deletions
@@ -1,22 +1,18 @@ #ifndef __COBJ_IMPLS_H__ # define __COBJ_IMPLS_H__ -# define get(instance, field, ...) \ +# define Get(instance, field, ...) \ (instance)->get_##field(instance, ## __VA_ARGS__) -# define set(instance, field, ...) \ +# define Set(instance, field, ...) \ (instance)->set_##field(instance, ## __VA_ARGS__) -# define call(instance, fun, ...) \ +# define Call(instance, fun, ...) \ (instance)->fun(instance, ## __VA_ARGS__) -# define new(klass, ...) klass##_new(__VA_ARGS__) -# define del(klass, ...) klass##_del(__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 CLASS -# undef GETTER -# undef SETTER -# undef DEFINE -# undef NEW -# undef DEL +# undef New +# undef Del # undef __USE_C_OBJSYS__ #elif defined(__COBJ_PRIV_IMPLS_H__) # define UNUSED(arg) while(0 && (arg)) @@ -38,38 +34,38 @@ 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 CLASS(klass, data, ...) \ +# define Class(klass, data, ...) \ typedef struct __##klass##_impl * klass; \ klass klass ## _new(__VA_ARGS__); \ void klass ## _delete(); \ struct __##klass##_impl data -# define LIST(klass, field, type, dim, ...) \ +# define List(klass, field, type, dim, ...) \ type _property_ ## field dim; \ type* (*get_ ## field)(klass, ## __VA_ARGS__); \ bool (*set_ ## field)(klass, ## __VA_ARGS__, const type * const) -# define ATOM(klass, field, type, ...) \ +# define Atom(klass, field, type, ...) \ type _property_ ## field; \ type (*get_ ## field)(klass, ## __VA_ARGS__);\ bool (*set_ ## field)(klass, ## __VA_ARGS__, type) -# define FUNC(klass, name, type, ...) \ +# define Func(klass, name, type, ...) \ type (*name)(klass, ## __VA_ARGS__) - -# 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 DEL() void (*del)(klass self) +# define Del (klass) \ + void (*destroy)(klass) # define __USE_C_OBJSYS__ #endif @@ -13,19 +13,19 @@ void process(ref(char) line, unsigned idx, team obj) unsigned s; switch(idx) { case 1: - set(obj, name, line); + Set(obj, name, line); break; case 2: - set(obj, institution, line); + Set(obj, institution, line); break; case 3: sscanf(line, "%u", &s); - set(obj, solved, s); + Set(obj, solved, s); break; case 4: // falls through case 5: // falls through case 6: - set(obj, member_name, idx - 3, line); + Set(obj, member_name, idx - 3, line); break; default: break; @@ -48,7 +48,7 @@ int main() } for(i = 0; i < num; i++) { - teams[i] = new(team); + teams[i] = New(team); unsigned idx = 0; while (idx ++ < 6) { getline(line, 255, stdin); @@ -56,10 +56,10 @@ int main() } } - team champion = call(dref(teams), find_champion, teams, num); - call(champion, printf); + team champion = Call(dref(teams), find_champion, teams, num); + Call(champion, printf); - while(num --) del(team, teams[num]); + while(num --) Del(team, teams[num]); free(teams); return 0; diff --git a/src/teams.c b/src/teams.c index 46c566c..bebb786 100644 --- a/src/teams.c +++ b/src/teams.c @@ -9,22 +9,22 @@ // Setter definitions // @set char[]: TEAM.name -> bool -SETTER(team, name, ref(char), { +Setter(team, name, ref(char), { return !(strncpy(SELF(name), value, 255) == NULL); }) // @set char[]: TEAM.institution -> bool -SETTER(team, institution, ref(char), { +Setter(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), { +Setter(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, { +Setter(team, solved, uint8_t, { if (value <= 10) SELF(solved) = value; return (value <= 10); @@ -32,31 +32,31 @@ SETTER(team, solved, uint8_t, { // Getter definitions // @get TEAM.name -> char[] -GETTER(team, name, ptr(char), { +Getter(team, name, ptr(char), { return SELF(name); }) // @get TEAM.institution -> char[] -GETTER(team, institution, ptr(char), { +Getter(team, institution, ptr(char), { return SELF(institution); }) // @get TEAM.solved -> int -GETTER(team, solved, uint8_t, { +Getter(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), { +Getter(team, member_name, ptr(char), { return (id > 0 && id < 4)? SELF(member_name)[id - 1] : _id_error; }, int id) -DEFINE(team, printf, int, { +Define(team, printf, int, { return call(self, fprintf, stdout); }) -DEFINE(team, fprintf, int, { +Define(team, fprintf, int, { return fprintf(file, "Team name : %s\n" "Institution: %s\n" @@ -72,7 +72,7 @@ DEFINE(team, fprintf, int, { SELF(member_name)[2]); }, ptr(FILE) file) -DEFINE(team, find_champion, team, { +Define(team, find_champion, team, { UNUSED(self); team champion = teams[num - 1]; @@ -84,7 +84,7 @@ DEFINE(team, find_champion, team, { // base functions -NEW(team, { +New(team, { team self = (team)malloc(sizeof(TYPE(team))); if (self) { @@ -99,6 +99,6 @@ NEW(team, { return self; }) -DEL(team, { +Del(team, { if(self) free(self); }) diff --git a/src/teams.h b/src/teams.h index c65bad3..98fb6f3 100644 --- a/src/teams.h +++ b/src/teams.h @@ -6,14 +6,15 @@ # include "common.h" // Type definition -CLASS( team, { - LIST(team, name, char, [255]); - LIST(team, member_name, char, [3][255], int); - LIST(team, institution, char, [255]); - ATOM(team, solved, uint8_t); - FUNC(team, printf, int); - FUNC(team, fprintf, int, FILE *); - FUNC(team, find_champion, team, ptr(team), size_t); +Class(team, { + List(team, name, char, [255]); + List(team, member_name, char, [3][255], int); + List(team, institution, char, [255]); + Atom(team, solved, uint8_t); + Func(team, printf, int); + Func(team, fprintf, int, FILE *); + Func(team, find_champion, team, ptr(team), size_t); + Del (team); }); # include "cobj.h" #endif /* __TEAMS_H__ */ |