/*
  Seeing how to pass around function pointers, do type-casting for different
  pointers...
 */

#include <stdio.h>
#include <stdlib.h>

//typedef enum {INT_T, CHAR_T, DOUBLE_T} type_t;

typedef struct DATA {
  void *d;
  int size;
  //  type_t dataType;
  void (* print) (void *, int );
} data_t;

void print_int(void *d, int size) {
  // suppose d points to an int

  // type-cast d to be an int *
  int *p_i = (int *)d;

  printf("%d\n", *p_i);
}

void print_char(void *d, int size) {
  char *p_c = (char *)d;

  printf("%c\n", *p_c);
}

void print_double(void *d, int size) {
  double *p_d = (double *)d;

  printf("%lf\n", *p_d);
}

int main(int argc, char * argv[]) {

  int x = 42;
  //print_int(&x, sizeof(x));

  char c = 'A';
  //print_char(&c, sizeof(c));

  double d = 3.14;
  //print_double(&d, sizeof(d));

  data_t A[5];

  // set A[0] to be x.
  A[0].d = &x;
  A[0].size = sizeof(x);
  A[0].print = print_int;
  //  A[0].type_t = INT;
  //A[0].print(A[0].d, A[0].size);

  // set A[1] to be c
  A[1].d = &c;
  A[1].size = sizeof(c);
  A[1].print = print_char;
  //A[1].print(A[1].d, A[1].size);
    
  // set A[2] to be d
  A[2].d = &d;
  A[2].size = sizeof(d);
  A[2].print = print_double;
  //A[2].print(A[2].d, A[2].size);

  for(int i=0; i <= 2; i++) {
    A[i].print(A[i].d, A[i].size);
    if (A[i].print == print_int) printf("  integer\n");
  }
  
  return 0;
}