summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLibravatar Mubashshir <ahmubashshir@gmail.com>2025-05-22 17:49:46 +0600
committerLibravatar Mubashshir <ahmubashshir@gmail.com>2025-05-22 17:49:46 +0600
commitcefb440148fd80cac7537b3743dd0e018df3a797 (patch)
tree33ad297fd7226d4ef74678194cce444ba0d7cf90 /src
parentff1ba1e770b4205c2cc367ff513325e5f22c73e8 (diff)
downloadc-obp-example-cefb440148fd80cac7537b3743dd0e018df3a797.tar.gz
c-obp-example-cefb440148fd80cac7537b3743dd0e018df3a797.zip
Rework class template
Signed-off-by: Mubashshir <ahmubashshir@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cobj.h44
-rw-r--r--src/main.c16
-rw-r--r--src/teams.c26
-rw-r--r--src/teams.h17
4 files changed, 50 insertions, 53 deletions
diff --git a/src/cobj.h b/src/cobj.h
index 736170b..c12181b 100644
--- a/src/cobj.h
+++ b/src/cobj.h
@@ -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
diff --git a/src/main.c b/src/main.c
index 650cf05..ecb1e65 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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__ */