Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: