home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / aplusplus-1.01-src.lha / APlusPlus-1.01 / include / APlusPlus / exec / PriorityList.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-10  |  3.2 KB  |  93 lines

  1. #ifndef APP_PriorityList_H
  2. #define APP_PriorityList_H
  3. /******************************************************************************
  4.  **
  5.  **    C++ Class Library for the Amiga© system software.
  6.  **
  7.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  8.  **    All Rights Reserved.
  9.  **
  10.  **    $VER: apphome:APlusPlus/exec/PriorityList.h 1.04 (04.05.94) $
  11.  **    
  12.  ******************************************************************************/
  13.  
  14.  
  15. #include <APlusPlus/exec/List.h>
  16.  
  17.  
  18. /**********************************************************************************************
  19.       » PriorityNode class «
  20.    is derived from NodeC but hides direct priority setting to prevent from messing up the
  21.    integrity of the PriorityList.
  22.  **********************************************************************************************/
  23. class PriorityList;
  24.  
  25. class PriorityNode : private NodeC
  26. {
  27.    friend class PriorityList;
  28.  
  29.    protected:
  30.       NodeC::name_ref;
  31.  
  32.    public:
  33.       PriorityNode(const UBYTE* name = 0,UBYTE type = NT_USER) : NodeC(name,type) { };
  34.       // virtual ~PriorityNode();
  35.  
  36.       PriorityNode *succ() { return (PriorityNode*)NodeC::succ(); }
  37.       PriorityNode *pred() { return (PriorityNode*)NodeC::pred(); }
  38.          // make selected private NodeC::functions public again
  39.       NodeC::name;
  40.       NodeC::setName;
  41.       NodeC::type;
  42.       NodeC::setType;
  43.       NodeC::type_ref;
  44.       NodeC::priority;
  45.       NodeC::applyNodeC;
  46.       NodeC::remove;
  47.       NodeC::isLonelyNode;
  48. };
  49.  
  50. /**********************************************************************************************
  51.       » PriorityList class «
  52.    hides the ListC methods which could mess up the sorting
  53.  **********************************************************************************************/
  54. class PriorityList : private ListC
  55. {
  56.    friend PriorityNode;
  57.    private:
  58.       BYTE internalEnqueue(PriorityNode *node,BYTE pri);
  59.       BYTE internalChangePri(PriorityNode *node,BYTE pri);
  60.    public:
  61.       PriorityList(UBYTE type = 0) : ListC(type) { }
  62.  
  63.       PriorityNode *head() { return (PriorityNode*)ListC::head(); }
  64.       PriorityNode *tail() { return (PriorityNode*)ListC::tail(); }
  65.  
  66.       PriorityNode *remHead() { return (PriorityNode*)ListC::remHead(); }
  67.       PriorityNode *remTail() { return (PriorityNode*)ListC::remTail(); }
  68.       PriorityNode *remove(PriorityNode *node) { return (PriorityNode*)ListC::remove(node); }
  69.  
  70.       ListC::apply;
  71.       ListC::empty;
  72.       ListC::isEmpty;
  73.  
  74.       BOOL member(PriorityNode *node) { return ListC::member((NodeC*)node); }
  75.  
  76.       //void enqueue(PriorityNode *node,BYTE pri=0);  //!!! (..,BYTE pri = 0) crashes with gcc!!!!!!!!
  77.       void enqueue(PriorityNode *node,BYTE pri);
  78.  
  79.       PriorityNode *findName(const UBYTE* name) { return (PriorityNode*)ListC::findName(name); }
  80.       BYTE changePri(PriorityNode *node,BYTE pri) // change node priority and eventual place
  81.             { if (member(node)) return internalChangePri(node,pri); else return 0; }
  82. };
  83.  
  84.  
  85. inline void PriorityList::enqueue(PriorityNode *node,BYTE pri)
  86. {
  87.    if (member(node))   // must not enqueue already enqueued node
  88.       internalChangePri(node,pri);  // dequeue member, then enqueue again
  89.    else
  90.       internalEnqueue(node,pri);
  91. }
  92.  
  93. #endif    /* APP_PriorityList_H */