// TREE.HPP - interface definition for in-memory balanced binary trees

#ifndef _TREE_HPP
#define _TREE_HPP

#include <stddef.h>

class TREE
   {
private:
   struct NODE	
      {
      struct node *left, *right;
      unsigned int balance;
      size_t dsize;                 // size of the data area
      void *data;
      } NODE;

   typedef enum tree_err
      {
      OK,
      MEM_ALLOC_FAIL,
      NO_DUPES,
      TREE_EMPTY,
      NO_SUCH_NODE
      } TREE_ERR;

   NODE *head;
   NODE *current;
   TREE_ERR errval;              // error value produced by last operation

   void delete_subtree(NODE *nodeptr);
   void rebalance(NODE *parent);
   int  addnode(NODE *parent, NODE *newnode);
   NODE *findnode(NODE *currnode, void *key);
   int remove_node(NODE *currnode, void *key);
   int getnext(NODE *currnode);
   int getprev(NODE *currnode);
protected:
   virtual void alloc_data(NODE *nptr);
   virtual void copy_data(NODE *to, void *from);
   virtual void delete_data(NODE *nptr);
   virtual int compare(void *data1, void *data2, size_t size);
public:
   TREE(void);
   ~TREE(void);
   add(void *data, size_t size);
   remove(void *data);
   void *find(void *data);
   void *findfirst(void);
   void *findnext(void);
   void *findlast(void);
   void *findprev(void);
   void *findcurr(void) {return current->data;}
   void print_tree(void);
   TREE_ERR last_error(void)  {return errval;}
   };

#endif   // ifndef _TREE_HPP
