home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / dict / _int_set.c < prev    next >
C/C++ Source or Header  |  1996-09-03  |  3KB  |  106 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA 3.4
  4. +
  5. +  _int_set.c
  6. +
  7. +  This file is part of the LEDA research version (LEDA-R) that can be 
  8. +  used free of charge in academic research and teaching. Any commercial
  9. +  use of this software requires a license which is distributed by the
  10. +  LEDA Software GmbH, Postfach 151101, 66041 Saarbruecken, FRG
  11. +  (fax +49 681 31104).
  12. +
  13. +  Copyright (c) 1991-1996  by  Max-Planck-Institut fuer Informatik
  14. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  15. +  All rights reserved.
  16. *******************************************************************************/
  17. #include <LEDA/int_set.h>
  18.  
  19. //------------------------------------------------------------------------------
  20. //
  21. //  S. N"aher (1993)
  22. //------------------------------------------------------------------------------
  23.  
  24.  
  25. typedef unsigned long  word;
  26.  
  27. int_set::int_set(int n)
  28. { size = n; 
  29.   low = 0;
  30.   register int i = 1+size/SIZE_OF_ULONG;
  31.   if ((V=new word[i]) == 0) error_handler(1,"int_set: out of memory"); 
  32.   while (i--) V[i]=0;
  33.  } 
  34.  
  35. int_set::int_set(int a, int b)
  36. { size = b-a+1; 
  37.   low = a;
  38.   register int i = 1+size/SIZE_OF_ULONG;
  39.   if ((V=new word[i]) == 0) error_handler(1,"int_set: out of memory"); 
  40.   while (i--) V[i]=0;
  41.  } 
  42.  
  43. int_set::int_set(const int_set& b)
  44. { size = b.size;
  45.   low  = b.low;
  46.   register int n = 1+size/SIZE_OF_ULONG;
  47.   V = new word[n];
  48.   while (n--) V[n] = b.V[n];
  49. }
  50.  
  51. int_set& int_set::operator=(const int_set& b)
  52. { if (this == &b) return *this;
  53.   delete V;
  54.   size = b.size;
  55.   low  = b.low;
  56.   register int n = 1+size/SIZE_OF_ULONG;
  57.   V = new word[n];
  58.   while (n--) V[n] = b.V[n];
  59.   return *this;
  60. }
  61.  
  62. void int_set::clear()
  63. { register int i = 1+size/SIZE_OF_ULONG;
  64.   while (i--) V[i]=0;
  65.  }
  66.   
  67.  
  68. int_set& int_set::join(const int_set& b) 
  69. { word* stop = V+size/SIZE_OF_ULONG +1;
  70.   word* p;
  71.   word* q;
  72.   for(p = V, q = b.V; p<stop; p++, q++) *p |= *q;
  73.   return *this;
  74.  }
  75.  
  76. int_set& int_set::intersect(const int_set& b) 
  77. { word* stop = V+size/SIZE_OF_ULONG +1;
  78.   word* p;
  79.   word* q;
  80.   for(p = V, q = b.V; p<stop; p++, q++) *p &= *q;
  81.   return *this;
  82.  }
  83.  
  84. int_set& int_set::complement() 
  85. { word* stop = V+size/SIZE_OF_ULONG +1;
  86.   for(word* p = V; p<stop; p++) *p = ~(*p);
  87.   return *this;
  88.  }
  89.  
  90. int_set  int_set::operator|(const int_set& b) 
  91. { int_set res(*this); 
  92.   return res.join(b); 
  93.  }
  94.  
  95. int_set  int_set::operator&(const int_set& b) 
  96. { int_set res(*this); 
  97.   return res.intersect(b); 
  98.  }
  99.  
  100. int_set  int_set::operator~()   
  101. { int_set res(*this); 
  102.   return res.complement(); 
  103.  }
  104.  
  105.