BitSet.cpp
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

Others

  1. #include "antlr/BitSet.hpp"
  2. ANTLR_BEGIN_NAMESPACE(antlr)
  3. /**A BitSet to replace java.util.BitSet.
  4.  * Primary differences are that most set operators return new sets
  5.  * as opposed to oring and anding "in place".  Further, a number of
  6.  * operations were added.  I cannot contain a BitSet because there
  7.  * is no way to access the internal bits (which I need for speed)
  8.  * and, because it is final, I cannot subclass to add functionality.
  9.  * Consider defining set degree.  Without access to the bits, I must
  10.  * call a method n times to test the ith bit...ack!
  11.  *
  12.  * Also seems like or() from util is wrong when size of incoming set is bigger
  13.  * than this.length.
  14.  *
  15.  *
  16.  * This is a C++ version of the Java class described above, with only
  17.  * a handful of the methods implemented, because we don't need the
  18.  * others at runtime. It's really just a wrapper around vector<bool>,
  19.  * which should probably be changed to a wrapper around bitset, once
  20.  * bitset is more widely available.
  21.  *
  22.  * @author Terence Parr, MageLang Institute
  23.  * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
  24.  */
  25. BitSet::BitSet(int nbits)
  26. : storage(nbits)
  27. {
  28. for (int i=0;i<nbits;i++) {
  29. storage[i] = false;
  30. }
  31. }
  32. BitSet::BitSet(const unsigned long* bits_,int nlongs)
  33. : storage(nlongs*32)
  34. {
  35. for (int i=0;i<nlongs*32;i++) {
  36. storage[i] = (bits_[i>>5] & (1UL << (i&31))) ? true : false;
  37. }
  38. }
  39. BitSet::~BitSet()
  40. {
  41. }
  42. void BitSet::add(int el)
  43. {
  44. storage[el] = true;
  45. }
  46. bool BitSet::member(int el) const
  47. {
  48. if ( el < 0 || static_cast<unsigned int>(el) >= storage.size())
  49. return false;
  50. return storage[el];
  51. }
  52. ANTLR_USE_NAMESPACE(std)vector<int> BitSet::toArray() const
  53. {
  54. ANTLR_USE_NAMESPACE(std)vector<int> elems;
  55. for (unsigned int i=0;i<storage.size();i++) {
  56. if (storage[i])
  57. elems.push_back(i);
  58. }
  59. return elems;
  60. }
  61. ANTLR_END_NAMESPACE