#include "btree_key.h"
#include "btypes.h"
#include <string.h>
int 
compareKeyNull(void *, void *) {
  return 0;
} // compareKeyNull
int 
compareKeyString(void *, void *) { 
  return 0;
} // compareKeyString
int 
compareKeyPChar(void * key1, void * key2) {
  const char * charKey1 = static_cast<const char *>(key1);
  const char * charKey2 = static_cast<const char *>(key2);
  return strcmp(charKey1, charKey2);
} // compareKeyPChar
int 
compareKeySingle(void * key1, void * key2) {
  if ((key1 == NULL) || (key2 == NULL)) return 0;
  const float * floatKey1 = static_cast<const float *>(key1);
  const float * floatKey2 = static_cast<const float *>(key2);
  if (*floatKey1 < *floatKey2) return -1;
  else if (*floatKey1 > *floatKey2) return 1;
  return 0;
} // compareKeySingle
int 
compareKeyDouble(void * key1, void * key2) {
  if ((key1 == NULL) || (key2 == NULL)) return 0;
  const double * doubleKey1 = static_cast<const double *>(key1);
  const double * doubleKey2 = static_cast<const double *>(key2);
  if (*doubleKey1 < *doubleKey2) return -1;
  else if (*doubleKey1 > *doubleKey2) return 1;
  
  return 0;
} // compareKeyDouble
int 
compareKeyInt32(void * key1, void * key2) {
  if ((key1 == NULL) || (key2 == NULL)) return 0;
  const int32 * int32Key1 = static_cast<const int32 *>(key1);
  const int32 * int32Key2 = static_cast<const int32 *>(key2);
  if (*int32Key1 < *int32Key2) return -1;
  else if (*int32Key1 > *int32Key2) return 1;
 
  return 0;
} // compareKeyInt32
int 
compareKeyInt64(void * key1, void * key2) {
  if ((key1 == NULL) || (key2 == NULL)) return 0;
  const int64 * int64Key1 = static_cast<const int64 *>(key1);
  const int64 * int64Key2 = static_cast<const int64 *>(key2);
  if (*int64Key1 < *int64Key2) return -1;
  else if (*int64Key1 > *int64Key2) return 1;
  return 0;
} // compareKeyInt64
/*
 *  CopyKey functions
 */
void 
copyKeyNull(void *, void *) {
  return;
} // copyKeyNull
void 
copyKeyString(void *, void *) {
} // copyKeyString
void 
copyKeyPChar(void * srcKey, void * destKey) {
  const char * charSrcKey = static_cast<const char *>(srcKey);
  char * charDestKey = static_cast<char *>(destKey);
  strcpy(charDestKey, charSrcKey);
} // copyKeyPChar
void 
copyKeySingle(void * srcKey, void * destKey) {
  if ((srcKey == NULL) || (destKey == NULL)) return;
  *(float *)destKey = *(float *)srcKey;
} // copyKeySingle
void 
copyKeyDouble(void * srcKey, void * destKey) {
  if ((srcKey == NULL) || (destKey == NULL)) return;
  *(double *)destKey = *(double *)srcKey;
} // copyKeyDouble
void 
copyKeyInt32(void * srcKey, void * destKey) {
  if ((srcKey == NULL) || (destKey == NULL)) return;
  *(int32 *)destKey = *(int32 *)srcKey;
} // copyKeyInt32
void 
copyKeyInt64(void * srcKey, void * destKey) {
  if ((srcKey == NULL) || (destKey == NULL)) return;
  *(int64 *)destKey = *(int64 *)srcKey;
} // copyKeyInt64
/* 
 *  KeySize functions
 */
int 
keySizeNull(void *) {
  return 0;
} // keySizeNull
int 
keySizeString(void * key) {
  const char * charKey = static_cast<const char *>(key);
  if (charKey == NULL) return 0;
  return ((int)charKey[0]+1);
} // keySizeString
int 
keySizePChar(void * key) {
  const char * charKey = static_cast<const char *>(key);
  if (charKey == NULL) return 0;
  return (strlen(charKey)+1);
} // keySizePChar
int 
keySizeSingle(void *) {
  return sizeof(float);
} // keySizeSingle
int 
keySizeDouble(void *) {
  return sizeof(double);
}
int 
keySizeInt32(void *) {
  return sizeof(int32);
}
int 
keySizeInt64(void *) {
  return sizeof(int64); 
}