home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c017 / 7.ddi / GPPLIB.ZIP / DLLIST.H < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-17  |  5.5 KB  |  253 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. /* 
  3. Copyright (C) 1988 Free Software Foundation
  4.     written by Doug Lea (dl@rocky.oswego.edu)
  5.  
  6. This file is part of GNU CC.
  7.  
  8. GNU CC is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY.  No author or distributor
  10. accepts responsibility to anyone for the consequences of using it
  11. or for whether it serves any particular purpose or works at all,
  12. unless he says so in writing.  Refer to the GNU CC General Public
  13. License for full details.
  14.  
  15. Everyone is granted permission to copy, modify and redistribute
  16. GNU CC, but only under the conditions described in the
  17. GNU CC General Public License.   A copy of this license is
  18. supposed to have been given to you along with GNU CC so you
  19. can know your rights and responsibilities.  It should be in a
  20. file named COPYING.  Among other things, the copyright notice
  21. and this notice must be preserved on all copies.  
  22. */
  23.  
  24.  
  25. #ifndef _<T>DLList_h
  26. #define _<T>DLList_h 1
  27.  
  28. #ifndef _<T>DLListNode_h
  29. #define _<T>DLListNode_h 1
  30.  
  31. struct <T>DLListNode
  32. {
  33.   <T>DLListNode*         bk;
  34.   <T>DLListNode*         fd;
  35.   <T>                    hd;
  36.                          <T>DLListNode();
  37.                          <T>DLListNode(<T&> h, 
  38.                                        <T>DLListNode* p = 0,
  39.                                        <T>DLListNode* n = 0);
  40.                          ~<T>DLListNode();
  41. };
  42.  
  43. inline <T>DLListNode::<T>DLListNode() {}
  44.  
  45. inline <T>DLListNode::<T>DLListNode(<T&> h, <T>DLListNode* p = 0,
  46.                                     <T>DLListNode* n = 0)
  47. {
  48.   hd = h;
  49.   bk = p;
  50.   fd = n;
  51. }
  52.  
  53. inline <T>DLListNode::~<T>DLListNode() {}
  54.  
  55. typedef <T>DLListNode* <T>DLListNodePtr;
  56.  
  57. #endif
  58.  
  59. class <T>DLListTrav;
  60.  
  61. class <T>DLList
  62. {
  63.   friend class          <T>DLListTrav;
  64.  
  65.   <T>DLListNode*        h;
  66.  
  67. public:
  68.                         <T>DLList();
  69.                         <T>DLList(<T>DLList& a);
  70.                         ~<T>DLList();
  71.  
  72.   <T>DLList&            operator = (<T>DLList& a);
  73.  
  74.   int                   null();
  75.   int                   empty();
  76.   int                   valid();
  77.   const void*           operator void* ();
  78.   int                   operator ! ();
  79.   int                   length();
  80.   void                  clear();
  81.  
  82.   void                  prepend(<T&> item);
  83.   void                  append(<T&> item);
  84.  
  85.   <T>&                  front();
  86.   <T>                   remove_front();
  87.   void                  del_front();
  88.  
  89.   <T>&                  rear();
  90.   <T>                   remove_rear();
  91.   void                  del_rear();
  92.  
  93.   void                  error(const char* msg);
  94. };
  95.  
  96. class <T>DLListTrav
  97. {
  98.   friend class          <T>DLList;
  99.  
  100.   <T>DLList*            L;
  101.   <T>DLListNode*        current;
  102. public:
  103.                         <T>DLListTrav(<T>DLList& l, int dir = 1);
  104.                         ~<T>DLListTrav();
  105.  
  106.   int                   null();
  107.   int                   valid();
  108.   const void*           operator void* ();
  109.   int                   operator ! ();
  110.  
  111.   void                  advance(int dir = 1);
  112.   <T>&                  get();
  113.   void                  reset(int dir = 1);
  114.   void                  reset(<T>DLList& l, int dir = 1);
  115.   void                  insert_after(<T&>item);
  116.   void                  insert_before(<T&>item);
  117.   void                  del(int dir = 1);
  118. };
  119.  
  120.  
  121. extern void default_<T>DLList_error_handler(char*);
  122. extern one_arg_error_handler_t <T>DLList_error_handler;
  123.  
  124. extern one_arg_error_handler_t 
  125.         set_<T>DLList_error_handler(one_arg_error_handler_t f);
  126.  
  127.  
  128. inline <T>DLList::~<T>DLList()
  129. {
  130.   clear();
  131. }
  132.  
  133. inline <T>DLList::<T>DLList()
  134. {
  135.   h = 0;
  136. }
  137.  
  138.  
  139. inline int <T>DLList::null()
  140. {
  141.   return h == 0;
  142. }
  143.  
  144. inline int <T>DLList::empty()
  145. {
  146.   return h == 0;
  147. }
  148.  
  149. inline int <T>DLList::valid()
  150. {
  151.   return h != 0;
  152. }
  153.  
  154. inline const void* <T>DLList::operator void* ()
  155. {
  156.   return (h == 0)? 0 : this;
  157. }
  158.  
  159. inline int <T>DLList::operator ! ()
  160. {
  161.   return h == 0;
  162. }
  163.  
  164. inline int <T>DLList::length()
  165. {
  166.   if (h == 0)
  167.     return 0;
  168.   else
  169.   {
  170.     int l = 1;
  171.     for (<T>DLListNode* p = h->fd; p != h; p = p->fd) ++l;
  172.     return l;
  173.   }
  174. }
  175.  
  176.  
  177. inline <T>DLListTrav::<T>DLListTrav(<T>DLList& a, int dir = 1)
  178. {
  179.   L = &a; 
  180.   if ((current = L->h) != 0 && dir < 0) current = current->bk;
  181. }
  182.  
  183. inline void <T>DLListTrav::reset(<T>DLList& a, int dir = 1)
  184. {
  185.   L = &a; 
  186.   if ((current = L->h) != 0 && dir < 0) current = current->bk;
  187. }
  188.  
  189. inline void  <T>DLListTrav::reset(int dir = 1)
  190. {
  191.   if ((current = L->h) != 0 && dir < 0) current = current->bk;
  192. }
  193.  
  194. inline <T>DLListTrav::~<T>DLListTrav() {}
  195.  
  196. inline int <T>DLListTrav::null()
  197. {
  198.   return current == 0;
  199. }
  200.  
  201. inline int <T>DLListTrav::valid()
  202. {
  203.   return current != 0;
  204. }
  205.  
  206. inline const void* <T>DLListTrav::operator void* ()
  207. {
  208.   return (current == 0)? 0 : this;
  209. }
  210.  
  211. inline int <T>DLListTrav::operator ! ()
  212. {
  213.   return (current == 0);
  214. }
  215.  
  216. inline void <T>DLListTrav::advance(int dir = 1)
  217. {
  218.   if (current != 0) 
  219.   {
  220.     if (dir < 0)
  221.       current = (current == L->h)? 0 : current->bk;
  222.     else
  223.       current = (current == L->h->bk)? 0 : current->fd;
  224.   }
  225. }
  226.  
  227. inline <T>& <T>DLListTrav::get()
  228. {
  229.   if (current == 0)
  230.     (*<T>DLList_error_handler)("get from null traverser");
  231.   return current->hd;
  232. }
  233.  
  234.  
  235. inline <T>& <T>DLList::front()
  236. {
  237.   if (h == 0)
  238.     error("front: empty list");
  239.   return h->hd;
  240. }
  241.  
  242. inline <T>& <T>DLList::rear()
  243. {
  244.   if (h == 0)
  245.     error("rear: empty list");
  246.   return h->bk->hd;
  247. }
  248.  
  249.  
  250.  
  251.  
  252. #endif
  253.