-class kbList
-{
-public:
- /// An iterator class for kbList, just like for the STL classes.
- class iterator
- {
- protected:
- /// the node to which this iterator points
- kbListNode *node;
- friend class kbList;
- public:
- /** Constructor.
- @param n if not NULL, the node to which to point
- */
- iterator(kbListNode *n = NULL);
- /** Dereference operator.
- @return the data pointer of the node belonging to this
- iterator
- */
- void * operator*();
-
- /** This operator allows us to write if(i). It is <em>not</em> a
- dereference operator and the result is always useless apart
- from its logical value!
- */
- operator void*() const { return node == NULL ? (void*)0 : (void*)(-1); }
-
- /** Increment operator - prefix, goes to next node in list.
- @return itself
- */
- iterator & operator++();
-
- /** Decrement operator - prefix, goes to previous node in list.
- @return itself
- */
- iterator & operator--();
-
- /** Increment operator - prefix, goes to next node in list.
- @return itself
- */
- iterator & operator++(int); //postfix
-
- /** Decrement operator - prefix, goes to previous node in list.
- @return itself
- */
- iterator & operator--(int); //postfix
-
- /** Comparison operator.
- @return true if not equal.
- */
- bool operator !=(iterator const &) const;
-
- /* Comparison operator.
- @return true if equal
- */
- bool operator ==(iterator const &) const;
-
- /** Returns a pointer to the node associated with this iterator.
- This function is not for general use and should be
- protected. However, if protected, it cannot be called from
- derived classes' iterators. (Is this a bug in gcc/egcs?)
- @return the node pointer
- */
- inline kbListNode * Node(void) const
- { return node; }
- };
-
- /** Constructor.
- @param ownsEntriesFlag if true, the list owns the entries and
- will issue a delete on each of them when deleting them. If
- false, the entries themselves will not get deleted. Do not use
- this with array types!
- */
- kbList(bool ownsEntriesFlag = true);
-
- /** Destructor.
- If entries are owned, they will all get deleted from here.
- */
- ~kbList();
-
- /** Tell list whether it owns objects. If owned, they can be
- deleted by list. See the constructor for more details.
- @param ownsflag if true, list will own entries
- */
- void ownsObjects(bool ownsflag = true)
- { ownsEntries = ownsflag; }
-
- /** Query whether list owns entries.
- @return true if list owns entries
- */
- bool ownsObjects(void)
- { return ownsEntries; }
-
- /** Add an entry at the end of the list.
- @param element pointer to data
- */
- void push_back(void *element);
-
- /** Add an entry at the head of the list.
- @param element pointer to data
- */
- void push_front(void *element);
-
- /** Get element from end of the list and delete it.
- NOTE: In this case the element's data will not get deleted by
- the list. It is the responsibility of the caller to free it.
- @return the element data
- */
- void *pop_back(void);
-
- /** Get element from head of the list and delete it.
- NOTE: In this case the element's data will not get deleted by
- the list. It is the responsibility of the caller to free it.
- @return the element data
- */
- void *pop_front(void);
-
- /** Insert an element into the list.
- @param i an iterator pointing to the element, before which the new one should be inserted
- @param element the element data
- */
- void insert(iterator & i, void *element);
-
- /** Remove an element from the list _without_ deleting the object.
- @param i iterator pointing to the element to be deleted
- @return the value of the element just removed
- */
- void *remove(iterator& i) { void *p = *i; doErase(i); return p; }
-
- /** Erase an element, move iterator to following element.
- @param i iterator pointing to the element to be deleted
- */
- void erase(iterator & i) { deleteContent(i); doErase(i); }
-
- /* Get head of list.
- @return iterator pointing to head of list
- */
- iterator begin(void) const;
-
- /* Get end of list.
- @return iterator pointing after the end of the list. This is an
- invalid iterator which cannot be dereferenced or decremented. It is
- only of use in comparisons. NOTE: this is different from STL!
- @see tail
- */
- iterator end(void) const;
-
- /* Get last element in list.
- @return iterator pointing to the last element in the list.
- @see end
- */
- iterator tail(void) const;
-
- /* Get the number of elements in the list.
- @return number of elements in the list
- */
- unsigned size(void) const;
-
- /* Query whether list is empty.
- @return true if list is empty
- */
- inline bool empty(void) const
- { return first == NULL ; }
-
-protected:
- /// if true, list owns entries
- bool ownsEntries;
- /// pointer to first element in list
- kbListNode *first;
- /// pointer to last element in list
- kbListNode *last;
-protected:
- /** Erase an element, move iterator to following element.
- @param i iterator pointing to the element to be deleted
- */
- void doErase(iterator & i);
-
- /** Deletes the actual content if ownsflag is set.
- param iterator i
- */
- inline void deleteContent(iterator i)
- { if(ownsEntries) delete *i; }
-
-
-private:
- /// forbid copy construction
- kbList(kbList const &foo);
- /// forbid assignments
- kbList& operator=(const kbList& foo);
-};