#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "tree.h"


Tree::Tree() { rootPtr = 0; }

Tree::~Tree()
{
   Leaf *currentPtr = rootPtr,
	*tempPtr;

   while(currentPtr->downPtr != 0)
      currentPtr = currentPtr->downPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->downPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr->diagPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   currentPtr = currentPtr->parentPtr;
   tempPtr = currentPtr->downPtr;
//   currentPtr->downPtr = 0;
   delete tempPtr;

   while(currentPtr->diagPtr != 0)
      currentPtr = currentPtr->diagPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->downPtr = 0;
   delete tempPtr;

   while(currentPtr->diagPtr != 0)
      currentPtr = currentPtr->diagPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr->acrossPtr;
//   currentPtr->acrossPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   while(currentPtr->acrossPtr != 0)
      currentPtr = currentPtr->acrossPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->acrossPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->acrossPtr = 0;
   delete tempPtr;

   tempPtr = currentPtr;
   currentPtr = currentPtr->parentPtr;
//   currentPtr->diagPtr = 0;
   delete tempPtr;

   while(currentPtr->acrossPtr != 0)
      currentPtr = currentPtr->acrossPtr;

   while(currentPtr != rootPtr)
   {
      tempPtr = currentPtr;
      currentPtr = currentPtr->parentPtr;
//      currentPtr->acrossPtr = 0;
      delete tempPtr;
   }

   tempPtr = rootPtr;
   delete tempPtr;

   tempPtr = rootPtr = currentPtr = 0;
}

int Tree::setPiece(const char piece, int col, int row)
{
   Leaf *currentPtr = rootPtr;

   while(currentPtr->downPtr != 0)
      currentPtr = currentPtr->downPtr;

   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   currentPtr = currentPtr->diagPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;

   while(currentPtr->diagPtr != 0)
      currentPtr = currentPtr->diagPtr;

   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;

   while(currentPtr->diagPtr != 0)
      currentPtr = currentPtr->diagPtr;

   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   currentPtr = currentPtr->acrossPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   while(currentPtr->acrossPtr != 0)
      currentPtr = currentPtr->acrossPtr;

   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;

   while(currentPtr->acrossPtr != 0)
      currentPtr = currentPtr->acrossPtr;

   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   currentPtr = currentPtr->parentPtr;
   if(currentPtr->col == col &&
      currentPtr->row == row)
   {
      currentPtr->piece = piece;
      return 1;
   }

   return 0;
}
