#ifndef ELIST_H
#define ELIST_H

template <class T>
class elistItem
{
 public:
  T value;
  elistItem *next;
  elistItem *prev;
};

template <class T>
class elist
{
 public:
  int count;
  elistItem<T> *first;
  elistItem<T> *last;

  elist();
  ~elist();

  void clear();

  elistItem<T> *add(T value);
  void remove(elistItem<T> *item);
};

template <class T>
elist<T>::elist(): count(0),first(0x00),last(0x00) {}

template <class T>
elist<T>::~elist() { clear(); }

template <class T>
void elist<T>::clear()
{
  while (first) remove(first);
}

template <class T>
elistItem<T> *elist<T>::add(T value)
{
/*
  elistItem *tmpitem;
  for (tmpitem=first; tmpitem!=0x00; tmpitem=tmpitem->next){
    ldieif(tmpitem->value==value,"duplicate values!?!?!: "+estr(value));
  }
*/
  ++count;
  elistItem<T> *newItem=new elistItem<T>;
  if (first) first->prev = newItem;
  if (!last) last=newItem;
  newItem->next = first;
  newItem->prev = 0x00;
  newItem->value=value;
  first=newItem;
  return(first);
}

template <class T>
void elist<T>::remove(elistItem<T> *item)
{
  --count;

  if (item->prev) item->prev->next = item->next;
  else first=item->next;

  if (item->next) item->next->prev = item->prev;
  else last=item->prev;

  delete item;
}

#endif

