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 / ObjectList.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-04  |  3.6 KB  |  87 lines

  1. #ifndef APP_ObjectList_H
  2. #define APP_ObjectList_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: ObjectList.h 1.04 (04.05.94) $
  11.  **    
  12.  ******************************************************************************/
  13.  
  14.  
  15. #include "APlusPlus/exec/PriorityList.h"
  16.  
  17.  
  18. /**********************************************************************************************
  19.          » ReferenceNode class «
  20.  
  21.    uses the NodeC class as storage for a pointer to any type of object. The object address
  22.    will be stored in the name field of NodeC and a type can be given for identifying later.
  23.  **********************************************************************************************/
  24. class ReferenceNode : public PriorityNode
  25. {
  26.    public:
  27.       ReferenceNode(APTR object, UBYTE type = NT_USER) : PriorityNode((UBYTE*)object,type) { };
  28.       virtual ~ReferenceNode() { }
  29.  
  30.       ReferenceNode *succ() { return (ReferenceNode*)PriorityNode::succ(); }
  31.       ReferenceNode *pred() { return (ReferenceNode*)PriorityNode::pred(); }
  32.  
  33.       APTR& object() { return (APTR&)name_ref(); }    // returns the object address as reference!
  34.       BYTEBITS& flags() { return (BYTEBITS)PriorityNode::type_ref(); }
  35. };
  36.  
  37. class ReferenceList : public PriorityList
  38. {
  39.    public:
  40.       ReferenceList(UBYTE type = 0) : PriorityList(type) { };
  41.  
  42.       ReferenceNode *head() { return (ReferenceNode*)PriorityList::head(); }
  43.       ReferenceNode *tail() { return (ReferenceNode*)PriorityList::tail(); }
  44.  
  45.       ReferenceNode *remHead() { return (ReferenceNode*)PriorityList::remHead(); }
  46.       ReferenceNode *remTail() { return (ReferenceNode*)PriorityList::remTail(); }
  47.       ReferenceNode *remove(ReferenceNode *node) { return (ReferenceNode*)PriorityList::remove(node); }
  48.  
  49.       ReferenceNode *findObject(APTR objectptr,UBYTE type = 0);
  50.       /** find the Node with the given address stored in from the given type.
  51.        ** At least one argument must be specified, the other can be null and is not used for the match.
  52.        **/
  53. };
  54.  
  55. /**********************************************************************************************
  56.          » TObjNode class & TObjList class «
  57.  
  58.    uses the Reference classes and have basically the same useability. But the nodes are
  59.    traced from the List and will be deleted when the TObjList is to be deleted.
  60.    Therefore TObjNodes MUST NOT BE CREATED ON STACK but dynamically with the new operator!!
  61.    That makes the virtual TObjNode destructor really important. Own classes can be derived
  62.    with own destructors and the programmer needs not to care about their correct deletion.
  63.    As it is for all Node/MinNode-derived classes a node can be deleted safely with its own
  64.    remove() method, even if it is not linked into a list!
  65.  **********************************************************************************************/
  66.  
  67. class TObjNode : public ReferenceNode
  68. {
  69.    public:
  70.       TObjNode(APTR object, UBYTE type = NT_USER) : ReferenceNode(object,type) {};
  71.       virtual ~TObjNode() { }
  72. };
  73.  
  74. class TObjList : public ReferenceList  // Traced objects list
  75. {
  76.    public:
  77.       TObjList(UBYTE type = 0) : ReferenceList(type) { }
  78.       ~TObjList();   // DELETE all nodes (so nodes MUST be dynamically allocated via new()
  79.  
  80.       TObjNode *findObject(APTR object,UBYTE type = 0)
  81.       { return (TObjNode*)ReferenceList::findObject(object,type); }
  82.  
  83.       void deleteTObj(APTR obj);  // search for a reference to obj and delete the node
  84. };
  85.  
  86. #endif    /* APP_ObjectList_H */
  87.