hlswmaster-ng/list.h

144 lines
3.0 KiB
C
Raw Normal View History

2006-02-02 16:55:44 +01:00
#ifndef _LIST_H_
#define _LIST_H_
#include "mutex.h"
2006-03-06 20:13:26 +01:00
class IteratorBase {
2006-02-02 16:55:44 +01:00
public:
2006-03-06 20:13:26 +01:00
virtual ~IteratorBase() {}
2006-02-05 16:44:38 +01:00
virtual bool hasNext() =0;
2006-03-06 20:13:26 +01:00
virtual void* next() =0;
virtual void remove() =0;
2006-02-05 16:44:38 +01:00
virtual void reset() =0;
2006-02-02 16:55:44 +01:00
protected:
2006-03-06 20:13:26 +01:00
IteratorBase() {}
IteratorBase(const IteratorBase& it);
IteratorBase& operator=(const IteratorBase& it);
};
class ListBase {
public:
ListBase();
~ListBase();
void add(const void* part);
void addTail(const void* part);
void* get();
void* getTail();
bool isEmpty() const;
IteratorBase* createIterator();
protected:
ListBase(const ListBase& l);
ListBase& operator=(const ListBase& l);
class ListEntryBase {
public:
ListEntryBase(const void* part = 0);
~ListEntryBase();
void add(ListEntryBase* prev, ListEntryBase* next);
void del();
bool isEmpty() const;
void* getPart() const;
ListEntryBase* getPrev() const;
ListEntryBase* getNext() const;
protected:
ListEntryBase(const ListEntryBase& l);
ListEntryBase& operator=(const ListEntryBase& l);
private:
ListEntryBase* prev;
ListEntryBase* next;
const void* part;
};
class ListIteratorBase : public IteratorBase {
public:
ListIteratorBase(ListBase* list);
~ListIteratorBase();
bool hasNext();
void* next();
void remove();
void reset();
private:
ListBase* list;
ListEntryBase* pos;
};
private:
ListEntryBase head;
Mutex mutex;
2006-03-07 20:30:11 +01:00
friend class ListIteratorBase;
2006-02-02 16:55:44 +01:00
};
2006-02-05 16:44:38 +01:00
template <class T>
2006-03-06 20:13:26 +01:00
class Iterator : public IteratorBase {
2006-02-05 16:44:38 +01:00
public:
2006-03-06 20:13:26 +01:00
virtual T* next() =0;
2006-02-05 16:44:38 +01:00
};
2006-03-06 20:13:26 +01:00
template <class T>
class NullIterator : public Iterator<T> {
public:
NullIterator() {}
~NullIterator() {}
bool hasNext() { return false; }
T* next() { return NULL; }
void remove() {}
void reset() {}
};
2006-02-05 16:44:38 +01:00
2006-02-02 16:55:44 +01:00
template <class T>
2006-03-07 20:30:11 +01:00
class List : public ListBase {
2006-02-02 16:55:44 +01:00
public:
List() {}
2006-03-06 20:13:26 +01:00
~List() {}
2006-02-02 16:55:44 +01:00
2006-03-06 20:13:26 +01:00
void add(const T* part) { ListBase::add(part); }
void addTail(const T* part) { ListBase::addTail(part); }
T* get() { return (T*)ListBase::get(); }
T* getTail() { return (T*)ListBase::getTail(); }
bool isEmpty() const { return ListBase::isEmpty(); }
2006-02-02 16:55:44 +01:00
2006-03-06 20:13:26 +01:00
Iterator<T>* createIterator() const { return new ListIteratorRO<T>(this); }
Iterator<T>* createIteratorRW() { return new ListIteratorRW<T>(this); }
2006-02-02 16:55:44 +01:00
private:
template <class TT>
2006-03-06 20:13:26 +01:00
class ListIteratorRO : public Iterator<TT>, private ListIteratorBase {
2006-02-02 16:55:44 +01:00
public:
2006-03-06 20:13:26 +01:00
ListIteratorRO(const List<TT>* list) : ListIteratorBase((ListBase*)list) {}
~ListIteratorRO() {}
bool hasNext() { return ListIteratorBase::hasNext(); }
TT* next() { return (TT*)ListIteratorBase::next(); }
void remove() {}
void reset() { ListIteratorBase::reset(); }
2006-02-02 16:55:44 +01:00
};
template <class TT>
2006-03-06 20:13:26 +01:00
class ListIteratorRW : public Iterator<TT>, private ListIteratorBase {
2006-02-02 16:55:44 +01:00
public:
2006-03-06 20:13:26 +01:00
ListIteratorRW(List<TT>* list) : ListIteratorBase(list) {}
~ListIteratorRW() {}
bool hasNext() { return ListIteratorBase::hasNext(); }
TT* next() { return (TT*)ListIteratorBase::next(); }
void remove() { ListIteratorBase::remove(); }
void reset() { ListIteratorBase::reset(); }
2006-02-02 16:55:44 +01:00
};
2006-03-06 20:13:26 +01:00
};
2006-02-02 16:55:44 +01:00
#endif //_LIST_H_