RDKit
Open-source cheminformatics and machine learning.
SparseBitVect.h
Go to the documentation of this file.
1 //
2 // Copyright (c) 2003-2008 greg Landrum and Rational Discovery LLC
3 //
4 // @@ All Rights Reserved @@
5 // This file is part of the RDKit.
6 // The contents are covered by the terms of the BSD license
7 // which is included in the file license.txt, found at the root
8 // of the RDKit source tree.
9 //
10 #include <RDGeneral/export.h>
11 #ifndef __RD_SPARSEBITVECTS_H__
12 #define __RD_SPARSEBITVECTS_H__
13 
14 #include "BitVect.h"
15 
16 #include <set>
17 using std::set;
18 #include <iterator>
19 #include <algorithm>
20 
21 typedef set<int> IntSet;
22 typedef IntSet::iterator IntSetIter;
23 typedef IntSet::const_iterator IntSetConstIter;
24 
25 //! a class for bit vectors that are sparsely occupied.
26 /*!
27  SparseBitVect objects store only their on bits, in an
28  std::set.
29 
30  They are, as you might expect, quite memory efficient for sparsely populated
31  vectors but become rather a nightmare if they need to be negated.
32 
33  */
35  public:
36  SparseBitVect() : dp_bits(0), d_size(0){};
37  //! initialize with a particular size;
38  explicit SparseBitVect(unsigned int size) : dp_bits(0), d_size(0) {
39  _initForSize(size);
40  };
41 
42  //! copy constructor
43  SparseBitVect(const SparseBitVect &other) : BitVect(other) {
44  d_size = 0;
45  dp_bits = 0;
46  _initForSize(other.getNumBits());
47  IntSet *bv = other.dp_bits;
48  std::copy(bv->begin(), bv->end(), std::inserter(*dp_bits, dp_bits->end()));
49  }
50  //! construct from a string pickle
51  SparseBitVect(const std::string &);
52  //! construct from a text pickle
53  SparseBitVect(const char *data, const unsigned int dataLen);
54 
55  SparseBitVect &operator=(const SparseBitVect &);
56  ~SparseBitVect() { delete dp_bits; };
57 
58  bool operator[](const unsigned int which) const;
59  SparseBitVect operator|(const SparseBitVect &) const;
60  SparseBitVect operator&(const SparseBitVect &)const;
61  SparseBitVect operator^(const SparseBitVect &) const;
62  SparseBitVect operator~() const;
63 
64  //! returns a (const) pointer to our raw storage
65  const IntSet *getBitSet() const { return dp_bits; }
66 
67  unsigned int getNumBits() const { return d_size; };
68  bool setBit(const unsigned int which);
69  bool setBit(const IntSetIter which);
70  bool unsetBit(const unsigned int which);
71  bool getBit(const unsigned int which) const;
72  bool getBit(const IntVectIter which) const;
73  bool getBit(const IntSetIter which) const;
74 
75  unsigned int getNumOnBits() const {
76  return static_cast<unsigned int>(dp_bits->size());
77  };
78  unsigned int getNumOffBits() const {
79  return d_size - static_cast<unsigned int>(dp_bits->size());
80  };
81 
82  std::string toString() const;
83 
84  void getOnBits(IntVect &v) const;
85  void clearBits() { dp_bits->clear(); };
86  IntSet *dp_bits; //!< our raw data, exposed for the sake of efficiency
87 
88  bool operator==(const SparseBitVect &o) const {
89  return *dp_bits == *o.dp_bits;
90  }
91  bool operator!=(const SparseBitVect &o) const {
92  return *dp_bits != *o.dp_bits;
93  }
94 
95  private:
96  unsigned int d_size;
97  void _initForSize(const unsigned int size);
98 };
99 
100 #endif
BitVect.h
BitVect::getBit
virtual bool getBit(const unsigned int which) const =0
returns the value of a particular bit
IntVectIter
IntVect::iterator IntVectIter
Definition: BitVect.h:18
BitVect::setBit
virtual bool setBit(const unsigned int which)=0
sets a particular bit and returns its original value
BitVect::operator[]
virtual bool operator[](const unsigned int which) const =0
BitVect::getOnBits
virtual void getOnBits(IntVect &v) const =0
replaces the contents of v with indices of our on bits
SparseBitVect::getNumOffBits
unsigned int getNumOffBits() const
returns the number of off bits
Definition: SparseBitVect.h:78
SparseBitVect::getNumBits
unsigned int getNumBits() const
returns the number of bits (the length of the BitVect)
Definition: SparseBitVect.h:67
SparseBitVect::SparseBitVect
SparseBitVect(unsigned int size)
initialize with a particular size;
Definition: SparseBitVect.h:38
SparseBitVect::getNumOnBits
unsigned int getNumOnBits() const
returns the number of on bits
Definition: SparseBitVect.h:75
IntSetIter
IntSet::iterator IntSetIter
Definition: SparseBitVect.h:22
SparseBitVect::operator!=
bool operator!=(const SparseBitVect &o) const
Definition: SparseBitVect.h:91
BitVect::clearBits
virtual void clearBits()=0
clears (sets to off) all of our bits
RDKIT_DATASTRUCTS_EXPORT
#define RDKIT_DATASTRUCTS_EXPORT
Definition: export.h:112
BitVect::toString
virtual std::string toString() const =0
returns a serialized (pickled) version of this BitVect
IntSetConstIter
IntSet::const_iterator IntSetConstIter
Definition: SparseBitVect.h:23
BitVect
Abstract base class for storing BitVectors.
Definition: BitVect.h:24
SparseBitVect::getBitSet
const IntSet * getBitSet() const
returns a (const) pointer to our raw storage
Definition: SparseBitVect.h:65
IntSet
set< int > IntSet
Definition: SparseBitVect.h:21
SparseBitVect::~SparseBitVect
~SparseBitVect()
Definition: SparseBitVect.h:56
BitVect::unsetBit
virtual bool unsetBit(const unsigned int which)=0
unsets a particular bit and returns its original value
SparseBitVect
a class for bit vectors that are sparsely occupied.
Definition: SparseBitVect.h:34
IntVect
std::vector< int > IntVect
Definition: BitVect.h:17
SparseBitVect::dp_bits
IntSet * dp_bits
our raw data, exposed for the sake of efficiency
Definition: SparseBitVect.h:85
SparseBitVect::SparseBitVect
SparseBitVect()
Definition: SparseBitVect.h:36
SparseBitVect::SparseBitVect
SparseBitVect(const SparseBitVect &other)
copy constructor
Definition: SparseBitVect.h:43
SparseBitVect::operator==
bool operator==(const SparseBitVect &o) const
Definition: SparseBitVect.h:88
export.h