/*
  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;
}