// ----------------------------------------------------------------------
//
// File: list.h
//
// This module implements a List class for integers.
// The module is inteded for CTA++ demonstation purposes only.
// Copyright (c) 1998-2002 Testwell Oy
//
// Last edited: 12.12.2002
//
// ----------------------------------------------------------------------

// ----------------------------------------------------------------------
// First some exception classes
// ----------------------------------------------------------------------

class Exception {};
class ExceptionEmptyList : public Exception {};

class ExceptionIteratorOutOfBounds : public Exception {
public:
    ExceptionIteratorOutOfBounds(const char* msg) : message(msg) {}
    const char* getMsg() const { return message; }
private:
    const char* message;
};

class ExceptionItemNotFound : public Exception {};
class ExceptionOutOfMemory  : public Exception {};

// a couple of forward declarations
class List_iterator;
class List_reverse_iterator;

// the initial size of the list
const int LIST_STEP = 16;

// ----------------------------------------------------------------------
// Class List
// ----------------------------------------------------------------------

class List {
public:
                           List();
                           ~List();
    void                   insert(int t);
    int                    extract();
    void                   remove(int t);
    List_iterator          begin() const ;
    List_iterator          last() const ;
    List_reverse_iterator  rbegin() const;
    bool                   empty() const;
    int                    itemCount() const;

private:

    int*                   last_element;
    int*                   the_list;
    int                    item_count;
    int                    list_size;
    
    friend class           List_iterator;
    friend class           List_reverse_iterator;

}; // class List


// ----------------------------------------------------------------------
// An iterator class to the actual List class
// ----------------------------------------------------------------------

class List_iterator {
public:
    // public methods of the class
                    List_iterator(const List* l);
                    List_iterator(const List* l, int* iter);
    bool            end() const;
    int             operator*();
    List_iterator&  operator++();

private:

    int*            iter_list;
    const List*     list;
};


// ----------------------------------------------------------------------
// A reverse iterator class to the actual List class
// ----------------------------------------------------------------------

class List_reverse_iterator {
public:
                            List_reverse_iterator(const List* l);
                            List_reverse_iterator(const List* l, int* iter);
    bool                    rend();
    int                     operator*();
    List_reverse_iterator&  operator--();

private:

    const List*             list;
    int*                    iter_list;
};

// EOF