_int_set.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _int_set.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/int_set.h>
  12. typedef unsigned long  word;
  13. int_set::int_set(int n)
  14. { size = n; 
  15.   low = 0;
  16.   register int i = 1+size/SIZE_OF_ULONG;
  17.   if ((V=new word[i]) == 0) error_handler(1,"int_set: out of memory"); 
  18.   while (i--) V[i]=0;
  19.  } 
  20. int_set::int_set(int a, int b)
  21. { size = b-a+1; 
  22.   low = a;
  23.   register int i = 1+size/SIZE_OF_ULONG;
  24.   if ((V=new word[i]) == 0) error_handler(1,"int_set: out of memory"); 
  25.   while (i--) V[i]=0;
  26.  } 
  27. int_set::int_set(const int_set& b)
  28. { size = b.size;
  29.   low  = b.low;
  30.   register int n = 1+size/SIZE_OF_ULONG;
  31.   V = new word[n];
  32.   while (n--) V[n] = b.V[n];
  33. }
  34. int_set& int_set::operator=(const int_set& b)
  35. { if (this == &b) return *this;
  36.   delete V;
  37.   size = b.size;
  38.   low  = b.low;
  39.   register int n = 1+size/SIZE_OF_ULONG;
  40.   V = new word[n];
  41.   while (n--) V[n] = b.V[n];
  42.   return *this;
  43. }
  44. void int_set::clear()
  45. { register int i = 1+size/SIZE_OF_ULONG;
  46.   while (i--) V[i]=0;
  47.  }
  48.   
  49. int_set& int_set::join(const int_set& b) 
  50. { word* stop = V+size/SIZE_OF_ULONG +1;
  51.   word* p;
  52.   word* q;
  53.   for(p = V, q = b.V; p<stop; p++, q++) *p |= *q;
  54.   return *this;
  55.  }
  56. int_set& int_set::intersect(const int_set& b) 
  57. { word* stop = V+size/SIZE_OF_ULONG +1;
  58.   word* p;
  59.   word* q;
  60.   for(p = V, q = b.V; p<stop; p++, q++) *p &= *q;
  61.   return *this;
  62.  }
  63. int_set& int_set::complement() 
  64. { word* stop = V+size/SIZE_OF_ULONG +1;
  65.   for(word* p = V; p<stop; p++) *p = ~(*p);
  66.   return *this;
  67.  }
  68. int_set  int_set::operator|(const int_set& b) 
  69. { int_set res(*this); 
  70.   return res.join(b); 
  71.  }
  72. int_set  int_set::operator&(const int_set& b) 
  73. { int_set res(*this); 
  74.   return res.intersect(b); 
  75.  }
  76. int_set  int_set::operator~()   
  77. { int_set res(*this); 
  78.   return res.complement(); 
  79.  }