Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C by quaternary ( 16 years ago )
#include <stdio.h>
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////
// mock level structure
typedef struct {
int data;
} level;
level *create_level(int data) {
level *lvl = malloc(sizeof(level));
lvl->data = data;
return lvl;
}
void remove_level(level *lvl) {
free(lvl);
}
////////////////////////////////////////////////////////////////////////////////
// level_generator interface
typedef struct {
level *(*generate)(void *this);
void (*destroy)(void *this);
const char *name;
} level_generator;
level *generate_level(level_generator *lvlgen) {
return (*lvlgen->generate)(lvlgen);
}
void remove_generator(level_generator *lvlgen) {
(*lvlgen->destroy)(lvlgen);
}
////////////////////////////////////////////////////////////////////////////////
// lvlgen_static example implementation using the interface
typedef struct {
level_generator interface;
int data;
} lvlgen_static;
static void remove_lvlgen_static(void *this) {
lvlgen_static *lvlgen = (lvlgen_static*)this;
free(this);
}
static level *lvlgen_static_generate(void *this) {
lvlgen_static *lvlgen = (lvlgen_static*)this;
return create_level(lvlgen->data);
}
level_generator *create_lvlgen_static(int data) {
lvlgen_static *lvlgen = malloc(sizeof(lvlgen_static));
lvlgen->interface.generate = lvlgen_static_generate;
lvlgen->interface.destroy = remove_lvlgen_static;
lvlgen->interface.name = "static level generator example";
lvlgen->data = data;
return (level_generator*)lvlgen;
}
////////////////////////////////////////////////////////////////////////////////
// lvlgen_random example implementation using the interface
typedef level_generator lvlgen_random;
static level *lvlgen_random_generate(void *this) {
(void)this;
return create_level(rand());
}
static void remove_lvlgen_random(void *this) {
lvlgen_random *lvlgen = (lvlgen_random*)this;
free(this);
}
level_generator *create_lvlgen_random() {
lvlgen_random *lvlgen = malloc(sizeof(lvlgen_random));
lvlgen->generate = lvlgen_random_generate;
lvlgen->destroy = remove_lvlgen_random;
lvlgen->name = "random level generator example";
return lvlgen;
}
////////////////////////////////////////////////////////////////////////////////
// usage example
void test_generator(level_generator *lvlgen) {
level *lvl = generate_level(lvlgen);
printf("Level data: d \t(%s)\n", lvl->data, lvlgen->name);
remove_level(lvl);
remove_generator(lvlgen);
}
int main() {
srand(time(0));
test_generator(create_lvlgen_static(5));
test_generator(create_lvlgen_static(123));
test_generator(create_lvlgen_static(234234));
test_generator(create_lvlgen_random());
test_generator(create_lvlgen_random());
}
////////////////////////////////////////////////////////////////////////////////
// results
/*
$ ./a.out
Level data: 5 (static level generator example)
Level data: 123 (static level generator example)
Level data: 234234 (static level generator example)
Level data: 1548400748 (random level generator example)
Level data: 1479527085 (random level generator example)
*/
Revise this Paste