bitvec.h

Go to the documentation of this file.
00001 /**********************************************************************
00002 bitvec.h - Vector of bits.
00003  
00004 Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
00005 Some portions Copyright (C) 2001-2006 by Geoffrey R. Hutchison
00006  
00007 This file is part of the Open Babel project.
00008 For more information, see <http://openbabel.sourceforge.net/>
00009  
00010 This program is free software; you can redistribute it and/or modify
00011 it under the terms of the GNU General Public License as published by
00012 the Free Software Foundation version 2 of the License.
00013  
00014 This program is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 GNU General Public License for more details.
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   // class introduction in bitvec.cpp
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