home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / df3os2.zip / FAMILY.H < prev    next >
C/C++ Source or Header  |  1993-08-15  |  2KB  |  77 lines

  1. // ------------- family.h
  2.  
  3. // ----- template of single-parent family tree
  4. //
  5. //  parent
  6. //     child1, child2, ... childn
  7. //
  8.  
  9. #ifndef FAMILY_H
  10. #define FAMILY_H
  11.  
  12. template <class T>
  13. class Family {
  14.     T *parent;
  15.     // -------- children
  16.     T *firstchild;
  17.     T *lastchild;
  18.     // -------- siblings
  19.     T *nextsibling;
  20.     T *prevsibling;
  21. public:
  22.     Family();
  23.     void SetParent(T *par)
  24.         { parent = par; }
  25.     T *Parent()        { return parent; }
  26.     T *FirstChild()    { return firstchild; }
  27.     T *LastChild()     { return lastchild; }
  28.     T *NextSibling()   { return nextsibling; }
  29.     T *PrevSibling()   { return prevsibling; }
  30.     void Append(T *child);  // append to parent's child list
  31.     void Remove(T *child);  // remove from  "       "    "
  32. };
  33.  
  34. template <class T>
  35. Family<T>::Family()
  36. {
  37.     parent = 0;
  38.     firstchild = 0;
  39.     lastchild = 0;
  40.     nextsibling = 0;
  41.     prevsibling = 0;
  42. }
  43.  
  44. template <class T>
  45. void Family<T>::Append(T *child)
  46. {
  47.     nextsibling = 0;
  48.     prevsibling = 0;
  49.     if (parent != 0)    {
  50.         if (parent->family.firstchild == 0)
  51.             parent->family.firstchild = child;
  52.         prevsibling = parent->family.lastchild;
  53.         if (prevsibling != 0)
  54.             prevsibling->family.nextsibling = child;
  55.         parent->family.lastchild = child;
  56.     }
  57. }
  58.  
  59. template <class T>
  60. void Family<T>::Remove(T *child)
  61. {
  62.     if (parent != 0)    {
  63.         if (prevsibling != 0)
  64.             prevsibling->family.nextsibling = nextsibling;
  65.         if (nextsibling != 0)
  66.             nextsibling->family.prevsibling = prevsibling;
  67.         if (parent->family.firstchild == child)
  68.             parent->family.firstchild = nextsibling;
  69.         if (parent->family.lastchild == child)
  70.             parent->family.lastchild = prevsibling;
  71.     }
  72.     nextsibling = 0;
  73.     prevsibling = 0;
  74. }
  75.  
  76. #endif
  77.