#ifndef KWQ_LIST_IMPL_H
#define KWQ_LIST_IMPL_H
#include "KWQDef.h"
class KWQListNode;
class KWQListIteratorImpl;
class KWQListImpl
{
public:
KWQListImpl(void (*deleteFunc)(void *));
KWQListImpl(const KWQListImpl &impl);
~KWQListImpl();
bool isEmpty() const { return nodeCount == 0; }
uint count() const { return nodeCount; }
void clear(bool deleteItems);
void sort(int (*compareFunc)(void *a, void *b, void *data), void *data);
void *at(uint n);
bool insert(uint n, const void *item);
bool remove(bool deleteItem);
bool remove(uint n, bool deleteItem);
bool remove(const void *item, bool deleteItem, int (*compareFunc)(void *a, void *b, void *data), void *data);
bool removeFirst(bool deleteItem);
bool removeLast(bool deleteItem);
bool removeRef(const void *item, bool deleteItem);
void *getFirst() const;
void *getLast() const;
void *current() const;
void *first();
void *last();
void *next();
void *prev();
void *take(uint n);
void *take();
void append(const void *item);
void prepend(const void *item);
uint containsRef(const void *item) const;
KWQListImpl &assign(const KWQListImpl &impl, bool deleteItems);
private:
KWQListImpl &operator =(const KWQListImpl &impl);
void swap(KWQListImpl &impl);
void addIterator(KWQListIteratorImpl *iter) const;
void removeIterator(KWQListIteratorImpl *iter) const;
KWQListNode *head;
KWQListNode *tail;
KWQListNode *cur;
uint nodeCount;
void (*deleteItem)(void *);
mutable KWQListIteratorImpl *iterators;
friend class KWQListIteratorImpl;
};
class KWQListIteratorImpl {
public:
KWQListIteratorImpl();
KWQListIteratorImpl(const KWQListImpl &impl);
~KWQListIteratorImpl();
KWQListIteratorImpl(const KWQListIteratorImpl &impl);
KWQListIteratorImpl &operator=(const KWQListIteratorImpl &impl);
uint count() const;
void *toFirst();
void *toLast();
void *current() const;
void *operator--();
void *operator++();
private:
const KWQListImpl *list;
KWQListNode *node;
KWQListIteratorImpl *next;
KWQListIteratorImpl *prev;
friend class KWQListImpl;
};
#endif