// C++ code Copyright (C) David R. Evans G4AMJ/NQ0I

#ifndef LISTH
#define LISTH

class link
{ friend class glist;
  link *previous, *next;
  void *data;
};

class glist
{ link *first, *last, *recent;
  int index, list_length;

public:
  glist();
  ~glist();
  inline int length(void) const { return list_length; } ;
  void operator+=(void*);
  void* operator[](const int);
  void operator-=(void*);
  void operator=(glist&);
  void clear(void);
  void clear_and_destroy(void);
};

// make it all type safe (except on the Mac)
#ifndef macintosh
template <class T> class list
{ glist _list;
  
public:
  inline int length(void) const 
    { return _list.length(); }
  inline void operator+=(const T& new_entry)
    { _list += (void*)(T*)&new_entry; }
  inline T& operator[](const int n)
    { return *(T*)_list[n]; }
  inline void operator-=(const T& old_entry)
    { _list -= (void*)(T*)&old_entry; }
  inline void operator=(list& old_list)
    { _list = old_list._list; }
};
#endif

#endif
