home *** CD-ROM | disk | FTP | other *** search
- #ifndef CPP_EXEC_LISTS_H
- #define CPP_EXEC_LISTS_H
-
- // Die Exec Listenklassen
- //
- // Es stehen beide Varianten der Exec Listen zur Verfügung: die kleine Liste
- // mit den beiden Verkettungszeigern und die erweiterte Liste mit zusätzlich
- // einem Namens-, Typs- und Prioritätseintrag pro Knoten.
- //
- // Autor: Jochen Becher
- //
- // Historie:
- // Version 1.0 am 25. Juni 94
-
- #ifndef EXEC_NODES_H
- #include <exec/nodes.h>
- #endif
-
- #ifndef EXEC_LISTS_H
- #include <exec/lists.h>
- #endif
-
- class NodeC : private MinNode {
- friend class ListC;
- public:
- NodeC();
- NodeC(const NodeC &);
- ~NodeC();
- NodeC &operator= (const NodeC &);
- VOID remove();
- BOOL isInList() const
- { return (mln_Succ != NULL) && (mln_Pred != NULL); };
- ULONG index() const;
- NodeC *succ() const { return (NodeC *) mln_Succ; };
- NodeC *pred() const { return (NodeC *) mln_Pred; };
- NodeC *next() const;
- NodeC *prev() const;
- };
-
- class ListC : private MinList {
- friend class ListCursorC;
- public:
- ListC();
- ListC(const ListC &);
- ~ListC();
- ListC &operator= (const ListC &);
- // die 'after' Node muss in der Liste sein
- VOID insert(NodeC &node, NodeC *after);
- VOID addHead(NodeC &node);
- VOID addTail(NodeC &node);
- NodeC *remHead();
- NodeC *remTail();
- BOOL isEmpty() const { return IsListEmpty((struct List *) this); };
- ULONG indexOf(const NodeC &node) const;
- ULONG length() const;
- NodeC *find(ULONG index) const;
- NodeC *head() const { return (NodeC *) mlh_Head; };
- NodeC *tail() const { return (NodeC *) mlh_TailPred; };
- NodeC *first() const;
- NodeC *last() const;
- private:
- VOID newList()
- { mlh_Head = (struct MinNode *) &mlh_Tail;
- mlh_Tail = NULL;
- mlh_TailPred = (struct MinNode *) &mlh_Head; };
- };
-
- // Ein typische Schleife sieht etwa so aus:
- // ListC l();
- // ListCursor lc(l);
- // while (!lc.isDone()) {
- // /* hier irgendwas mit lc.item() anstellen */
- // lc.next();
- // };
- //
- class ListCursorC {
- public:
- ListCursorC(const ListC &);
- ListCursorC(const ListCursorC &);
- ListCursorC &operator= (const ListCursorC &);
- VOID first();
- VOID last();
- VOID next();
- VOID prev();
- NodeC *item() const;
- BOOL isDone() const;
- private:
- ListC *list;
- NodeC *pos;
- };
-
- // *************************************************************
-
- class ENodeC : public NodeC {
- friend class EListC;
- private:
- UBYTE ln_Type;
- BYTE ln_Pri;
- STRPTR ln_Name;
- public:
- ENodeC(STRPTR name = NULL, UBYTE type = NT_USER, BYTE pri = 0);
- ENodeC(const ENodeC &);
- ~ENodeC();
- ENodeC &operator= (const ENodeC &);
- VOID setName(STRPTR name) { ln_Name = name; };
- STRPTR name() const { return ln_Name; };
- VOID setType(UBYTE type) { ln_Type = type; };
- UBYTE type() const { return ln_Type; };
- VOID setPri(UBYTE pri) { ln_Pri = pri; };
- BYTE pri() const { return ln_Pri; };
- ENodeC *find(STRPTR name) const;
- };
-
- class EListC : public ListC {
- friend class EListCursorC;
- private:
- UBYTE lh_Type;
- UBYTE lh_pad;
- public:
- EListC(UBYTE type = NT_USER);
- EListC(const EListC &);
- ~EListC();
- EListC &operator= (const EListC &);
- VOID setType(UBYTE type) { lh_Type = type; };
- UBYTE type() const { return lh_Type; };
- VOID insert(ENodeC &node, ENodeC *after)
- { ListC::insert(node,after); };
- VOID addHead(ENodeC &node)
- { ListC::addHead(node) };
- VOID addTail(ENodeC &node)
- { ListC::addTail(node) };
- ENodeC *remHead()
- { return (ENodeC *) ListC::remHead(); };
- ENodeC *remTail()
- { return (ENodeC *) ListC::remTail(); };
- ULONG indexOf(const ENodeC &node) const
- { return ListC::indexOf(node); };
- VOID enqueue(ENodeC &node);
- ENodeC *find(STRPTR name) const;
- ENodeC *find(ULONG index) const
- { return (ENodeC *) ListC::find(index); };
- };
-
- class EListCursorC : public ListCursorC {
- public:
- EListCursorC(const EListC &l) : ListCursorC(l) { };
- EListCursorC(const EListCursorC &lc) : ListCursorC((ListCursorC &) lc) { };
- EListCursorC &operator= (const EListCursorC &);
- ENodeC *item() const { return (ENodeC *) ListCursorC::item(); };
- };
-
- #endif
-