00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OB_BITVEC_H
00021 #define OB_BITVEC_H
00022
00023 #include <openbabel/babelconfig.h>
00024
00025 #ifdef WIN32
00026 #pragma warning (disable : 4786)
00027 #endif
00028
00029 #include <vector>
00030 #include <string>
00031
00032 #ifndef SETWORD
00033 #define SETWORD 32
00034 #endif
00035
00036 #ifndef STARTWORDS
00037 #define STARTWORDS 10
00038 #endif //STARTBITS
00039
00040 namespace OpenBabel
00041 {
00042
00043
00044 class OBAPI OBBitVec
00045 {
00046 int _size;
00047 std::vector<int> _set;
00048 public:
00049 OBBitVec()
00050 {
00051 _set.resize(STARTWORDS);
00052 _size=_set.size();
00053 Clear();
00054 }
00055 OBBitVec(int bits)
00056 {
00057 _set.resize(bits/SETWORD);
00058 _size=_set.size();
00059 Clear();
00060 }
00062 OBBitVec(const OBBitVec&);
00063 void SetBitOn(int);
00064 void SetBitOff(int);
00065 void SetRangeOn(int, int);
00066 void SetRangeOff(int, int);
00067 void Fold(int);
00068
00071 int FirstBit(int index = 0)
00072 {
00073 return (BitIsSet(index) ? 0 : NextBit(index));
00074 }
00075 int NextBit(int);
00077 int EndBit() { return(-1); }
00079 int GetSize() const { return(_size); }
00081 int CountBits();
00082
00084 bool Empty() { return(IsEmpty()); }
00085 bool IsEmpty();
00087 bool Resize(int maxbits);
00088
00089 bool BitIsSet(int bit)
00090 {
00091 return((bit/SETWORD >= GetSize()) ?
00092 false : _set[bit/SETWORD]>>(bit%SETWORD)&1);
00093 }
00094 bool BitIsOn(int bit)
00095 {
00096 return((bit/SETWORD >= GetSize()) ?
00097 false : _set[bit/SETWORD]>>(bit%SETWORD)&1);
00098 }
00099
00100 void FromVecInt(std::vector<int>&);
00101 void FromString(std::string&,int);
00102 void ToVecInt(std::vector<int>&);
00103 void Clear(void);
00105 void Negate()
00106 {
00107 for (int i= 0; i != _size; ++i)
00108 {
00109 _set[i] = ~_set[i];
00110 }
00111 }
00112
00114 OBBitVec &operator= (const OBBitVec &);
00115 OBBitVec &operator&= (OBBitVec &);
00116 OBBitVec &operator|= (OBBitVec &);
00117 OBBitVec &operator|= (const int i)
00118 {
00119 SetBitOn(i);
00120 return(*this);
00121 }
00122 OBBitVec &operator^= (OBBitVec &);
00123 OBBitVec &operator-= (OBBitVec &);
00124 OBBitVec &operator+= (OBBitVec &bv);
00125 bool operator[] (int bit)
00126 {
00127 return((bit/SETWORD >= GetSize()) ?
00128 false : _set[bit/SETWORD]>>(bit%SETWORD)&1);
00129 }
00130
00131 friend OBBitVec operator| (OBBitVec &, OBBitVec &);
00132 friend OBBitVec operator& (OBBitVec &,OBBitVec &);
00133 friend OBBitVec operator^ (OBBitVec &,OBBitVec &);
00134 friend OBBitVec operator- (OBBitVec &,OBBitVec &);
00135 friend bool operator== (const OBBitVec &,const OBBitVec &);
00136 friend bool operator< (const OBBitVec &bv1, const OBBitVec &bv2);
00137
00138 friend std::istream& operator>> ( std::istream&, OBBitVec& );
00139 friend std::ostream& ".">operator<< ( std::ostream&, const OBBitVec& ) ;
00140
00142 void GetWords(std::vector<unsigned int>& vec)
00143 {
00144 std::vector<int>::iterator itr;
00145 for(itr=_set.begin();itr!=_set.end();itr++)
00146 vec.push_back(*itr);
00147 }
00148 };
00149
00151 OBAPI double Tanimoto(OBBitVec&,OBBitVec&);
00152
00153 }
00154
00155 #endif // OB_BITVEC_H
00156