home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / Map.h < prev    next >
C/C++ Source or Header  |  1998-11-23  |  5KB  |  274 lines

  1. // $Id: Map.h,v 1.14 1998/11/23 17:43:29 zeller Exp $
  2. // Map template
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Dorothea Luetkehaus <luetke@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. //-----------------------------------------------------------------------------
  30. // A Map Template
  31. // The Key should not be 0, since this value has special meaning for
  32. // first() and next().  Also, '==' must be defined for Key.
  33. //-----------------------------------------------------------------------------
  34.  
  35. //-----------------------------------------------------------------------------
  36. #ifndef _DDD_Map_h
  37. #define _DDD_Map_h
  38.  
  39. #if defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 5)
  40. #pragma interface
  41. #endif
  42.  
  43. #include "bool.h"
  44. #include "assert.h"
  45.  
  46. typedef void *MapRef;
  47.  
  48. template <class Key, class Contents>
  49. class Map {
  50.     // Internal list node
  51.     struct MapNode {
  52.     Key key;
  53.     Contents *cont;
  54.     MapNode *_next;
  55.     };
  56.  
  57. private:
  58.     MapNode *_first;
  59.     int _length;
  60.  
  61.     // Search K; return 0 if not found
  62.     MapNode *search(Key k) const
  63.     {
  64.     MapNode *ln;
  65.     
  66.     ln = _first;
  67.     while (ln != 0 && !(ln->key == k)) 
  68.         ln = ln->_next;
  69.     return ln;
  70.     }
  71.  
  72. public:
  73.     // Create empty map
  74.     Map()
  75.     : _first(0), _length(0) 
  76.     {}
  77.  
  78.     // Remove all elements
  79.     void clear()
  80.     {
  81.     MapNode *ln;
  82.     MapNode *prev;
  83.  
  84.     ln = _first;
  85.     while (ln != 0) {
  86.         prev = ln;
  87.         ln = ln->_next;
  88.         delete prev;
  89.     }
  90.     _first = 0;
  91.     _length = 0;
  92.     }
  93.  
  94.     // Remove all elements, delete'ing each content
  95.     void delete_all_contents()
  96.     {
  97.     MapNode *ln   = _first;
  98.     MapNode *prev = 0;
  99.     while (ln != 0)
  100.     {
  101.         prev = ln;
  102.         ln = ln->_next;
  103.         delete prev->cont;
  104.         delete prev;
  105.     }
  106.     _first = 0;
  107.     _length = 0;
  108.     }
  109.  
  110.     
  111.     // Destructor
  112.     ~Map()
  113.     {
  114.     clear();
  115.     }
  116.     
  117.     // Insert or overwrite
  118.     int insert(Key k, Contents* c)
  119.     {
  120.     if (c == 0) // Don't add empty stuff
  121.         return 0;
  122.  
  123.     MapNode *ln = search(k);
  124.     if (ln == 0)
  125.     {
  126.         // Insert
  127.         ln = new MapNode;
  128.         ln->key = k;
  129.         ln->cont = c;
  130.  
  131.         ln->_next = _first;
  132.         _first = ln;
  133.         _length++;
  134.     }
  135.     else
  136.     {
  137.         // Overwrite
  138.         ln->cont = c;
  139.     }
  140.     return 1;
  141.     }
  142.     
  143.     // Delete K if found
  144.     void del(Key k)
  145.     {
  146.     if (_first == 0)
  147.         return;
  148.     
  149.     MapNode *prev = 0;
  150.     MapNode *ln = _first;
  151.     
  152.     while (ln != 0 && !(ln->key == k))
  153.     {
  154.         prev = ln;
  155.         ln = ln->_next;
  156.     }
  157.  
  158.     if (ln == 0)
  159.         return; // not found
  160.                
  161.     if (prev == 0)
  162.     {
  163.         // delete first element
  164.         assert(_first == ln);
  165.         _first = _first->_next;
  166.         delete ln;
  167.         _length--;
  168.     }
  169.     else
  170.     {
  171.         prev->_next = ln->_next;
  172.         delete ln;
  173.         _length--;
  174.     }
  175.     assert(!contains(k));
  176.     }
  177.  
  178.     // Get contents of K; return 0 if not found
  179.     Contents *get(Key k) const
  180.     {
  181.     MapNode *ln = search(k);
  182.     if (ln == 0)
  183.         return 0;
  184.     else 
  185.         return ln->cont;
  186.     }
  187.     
  188.     // true if K is contained
  189.     bool contains(Key k) const
  190.     {
  191.     return search (k) != 0;
  192.     }
  193.     
  194.     // Return first key, or 0 if not found.
  195.     // This simulates a 0-terminated list.
  196.     Key first_key(MapRef& ref) const
  197.     {
  198.     if (_first == 0)
  199.     {
  200.         ref = 0;
  201.         return 0;
  202.     }
  203.     else
  204.     {
  205.         ref = _first->_next;
  206.         return _first->key;
  207.     }
  208.     }
  209.  
  210.     static Key next_key(MapRef& ref)
  211.     {
  212.     if (ref == 0)
  213.     {
  214.         // at the end
  215.         return 0;
  216.     }
  217.     else
  218.     {
  219.         MapNode *current_ln = (MapNode *) ref;
  220.         ref = current_ln->_next;
  221.         return current_ln->key;
  222.     }
  223.     }
  224.  
  225.     // Return first contents, or 0 if not found
  226.     Contents *first(MapRef& ref) const
  227.     {
  228.     if (_first == 0)
  229.     {
  230.         ref = 0;
  231.         return 0;
  232.     }
  233.     else
  234.     {
  235.         ref = _first->_next;
  236.         return _first->cont;
  237.     }
  238.     }
  239.  
  240.     static Contents *next(MapRef& ref)
  241.     {
  242.     if (ref == 0)
  243.     {
  244.         // at the end
  245.         return 0;
  246.     }
  247.     else
  248.     {
  249.         MapNode *current_ln = (MapNode *) ref;
  250.         ref = current_ln->_next;
  251.         return current_ln->cont;
  252.     }
  253.     }
  254.  
  255.     inline int length()  const { return _length; }
  256.  
  257. private:
  258.     // No copy constructor
  259.     Map(const Map<Key, Contents>&)
  260.     : _first(0), _length(0)
  261.     {
  262.     assert(0);
  263.     }
  264.  
  265.     // No assignment
  266.     Map<Key, Contents>& operator = (const Map<Key, Contents>&)
  267.     {
  268.     assert(0); return *this;
  269.     }
  270. };
  271.  
  272. #endif // _DDD_Map_h
  273. // DON'T ADD ANYTHING BEHIND THIS #endif
  274.