/* dynVectorTest.c */
/* Compiler invocation: gcc -o dynVectorTest dynVector.c dynVectorTest.c */

#include "dynVector.h"
#include <stdio.h>


typedef struct _Point {
  double x;
  double y;
} Point;


void initPoint(Point *pp, double x, double y) {
  if (!pp) {
    return;
  }
  pp->x = x;
  pp->y = y;
}


void printPoint(Point *pp) {
  if (!pp) {
    printf("Point: NULL\n");
    return;
  }
  printf("Point:\n  x: %.2f  y: %.2f\n", pp->x, pp->y);
}


void printInteger(int *ip) {
  if (!ip) {
    printf("int: NULL\n");
    return;
  }
  printf("int:\n  i: %d\n", *ip);
}



int main() {
  DynVector *q;
  int i;

  Point point;
  DynVector *p = createDynVector(sizeof(Point), 2);
  printDynVector(p, 0, NULL);
  printf("Size: %d\n\n", getSizeDynVector(p));

  initPoint(&point, 11, -22);
  printPoint(&point);
  initPoint(&point, 12345678, -9876543);
  addElDynVector(p, &point);
  printPoint(getElPtrDynVector(p, 0));
  printDynVector(p, 0, printPoint);
  printf("Size: %d\n\n", getSizeDynVector(p));

  initPoint(&point, 44.678, -11.445);
  addElDynVector(p, &point);
  printDynVector(p, 0, printPoint);
  printDynVector(p, 1, printPoint);
  printf("Size: %d\n\n", getSizeDynVector(p));

  initPoint(&point, 4589.8, 996.99);
  addElDynVector(p, &point);
  printDynVector(p, 0, printPoint);
  printDynVector(p, 1, printPoint);
  printDynVector(p, 2, printPoint);
  printf("Size: %d\n\n", getSizeDynVector(p));

  deleteDynVector(p);
  p = NULL;
  printDynVector(p, 0, printPoint);


  q = createDynVector(sizeof(int), 5);
  printDynVector(q, 0, NULL);
  printf("Size: %d\n\n", getSizeDynVector(q));

  for (i = 7; i < 14; i++) {
    addElDynVector(q, &i);
    printDynVector(q, i - 7, printInteger);
    printf("Size: %d\n\n", getSizeDynVector(q));
  }
  deleteDynVector(q);
  q = NULL;

  return 0;
}




/* React on "out of memory condition". */
void onErrorOutOfMemory() {
  puts("onErrorOutOfMemory");
}



/* React on "NULL pointer condition". */
extern void onNullPointer() {
  puts("onNullPointer");
}
