// FILE: table.h

// Submitted by: (name and email address)

// TEMPLATE CLASS PROVIDED: Table<RecordType>
//   This class is a container template class for a Table of records.
//   The template parameter, RecordType, is the data type of the records in the
//   Table. It may any type with a default constructor, a copy constructor,
//   an assignment operator, and an integer member variable called key.
//
// CONSTRUCTOR for the Table<RecordType> template class:
//   Table( )
//     Postcondition: The Table has been initialized as an empty Table.
//
// MODIFICATION MEMBER FUNCTIONS for the Table<RecordType> class:
//   void insert(const RecordType& entry)
//     Precondition: entry.key >= 0.
//     Postcondition: If the table already had a record with a key equal to
//     entry.key, then that record is replaced by entry. Otherwise, entry has
//     been added as a new record of the Table.
//
//   void remove(int key)
//     Postcondition: If a record was in the Table with the specified key, then
//     that record has been removed; otherwise the table is unchanged.
//
// CONSTANT MEMBER FUNCTIONS for the Table<RecordType> class:
//   bool is_present(int key) const
//     Postcondition: The return value is true if there is a record in the
//     Table with the specified key. Otherwise, the return value is false.
//
//   void find(int key, bool& found, RecordType& result) const
//     Postcondition: If a record is in the Table with the specified key, then
//     found is true and result is set to a copy of the record with that key.
//     Otherwise found is false and the result contains garbage.
//
//   size_t size( ) const
//     Postcondition: Return value is the total number of records in the
//     Table.
//
// VALUE SEMANTICS for the Table<RecordType> template class:
//   Assignments and the copy constructor may be used with Table objects.
//
// DYNAMIC MEMORY USAGE by the Table<RecordType> template class:
//   If there is insufficient dynamic memory, then the following functions
//   can call new_handler: the copy constructor, insert, the assignment
//   operator.

#ifndef TABLE_H
#define TABLE_H

#include "link.h"
#include <stdlib.h>    // Provides size_t

template <class RecordType>
class Table {
  public:
    static const size_t TABLE_SIZE = 811;
    Table( );
    Table(const Table& source);
    ~Table( );
    void insert(const RecordType& entry);
    void remove(int key);
    void operator =(const Table& source);
    void find(int key, bool& found, RecordType& result) const;
    bool is_present(int key) const;
    size_t size( ) const {
      return total_records; }
  private:
    Node<RecordType> *chain[TABLE_SIZE];
    size_t total_records;
    size_t hash(int key) const;
    Node<RecordType>* find_node(int key) const;
};

#include "table.cpp" // Include the implementation

#endif