
template <class T, int max, class T empty, class T deleted>
bag<T, max, empty, deleted>::bag(void)
{
  size = 0;
  cursor = 0;
  data = new T[max];
  int i = 0;
  for( i; i < max; i++ )
    data[i] = empty;
}

template <class T, int max, class T empty, class T deleted>
bag<T, max, empty, deleted>::~bag(void)
{
  delete data;
}

template <class T, int max, class T empty, class T deleted>
int bag<T, max, empty, deleted>::count(void)
{
  return size;
}

template <class T, int max, class T empty, class T deleted>
int bag<T, max, empty, deleted>::full(void)
{
  return ( size == ( max - 1 ));
}

template <class T, int max, class T empty, class T deleted>
int bag<T, max, empty, deleted>::empty(void)
{
  return ( size == 0 );
}

template <class T, int max, class T empty, class T deleted>
void bag<T, max, empty, deleted>::insert(T x, int h)
{
  int slot = ( h % max );
  int skip = ( 1 + ( h % ( max - 1 ))); 
  while(1)
  {
    if( data[slot] == empty || data[slot] == deleted )
    {
      data[slot] = x;
      return;
    }
    else
      slot = (( slot + skip ) % max );
  }
}

template <class T, int max, class T empty, class T deleted>
void bag<T, max, empty, deleted>::remove(T x, int h)
{
  int slot = ( h % max );
  int skip = ( 1 + ( h % ( max - 1 )));
  while( data[slot] != x )
  {
    if( data[slot] == empty )
      return;
    slot = (( slot + skip ) % max );
  }
  data[slot] = ( deleted );
}

template <class T, int max, class T empty, class T deleted>
int bag<T, max, empty, deleted>::has(T x, int h)
{
  int slot = ( h % max );
  int skip = ( 1 + ( h % ( max - 1 )));
  while( data[slot] != x )
  {
    if( data[slot] == empty )
      return 0;
    slot = (( slot + skip ) % max );
  }
  cursor = slot;
  return 1;
}

template <class T, int max, class T empty, class T deleted>
T * bag<T, max, empty, deleted>::next(void)
{
  if (cursor < size)
    return & data[cursor++];
else
  return NULL;
}

template <class T, int max, class T empty, class T deleted>
void bag<T, max, empty, deleted>::resetcursor(void)
{
  cursor = 0;
}
