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>
17using std::set;
18#include <iterator>
19#include <algorithm>
20
21typedef set<int> IntSet;
22typedef IntSet::iterator IntSetIter;
23typedef 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:
37 //! initialize with a particular size;
38 explicit SparseBitVect(unsigned int size) : dp_bits(nullptr), 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 = nullptr;
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
56 ~SparseBitVect() override { delete dp_bits; }
57
58 bool operator[](const unsigned int which) const override;
63
64 //! returns a (const) pointer to our raw storage
65 const IntSet *getBitSet() const { return dp_bits; }
66
67 unsigned int getNumBits() const override { return d_size; }
68 bool setBit(const unsigned int which) override;
69 bool setBit(const IntSetIter which);
70 bool unsetBit(const unsigned int which) override;
71 bool getBit(const unsigned int which) const override;
72 bool getBit(const IntVectIter which) const;
73 bool getBit(const IntSetIter which) const;
74
75 unsigned int getNumOnBits() const override {
76 return static_cast<unsigned int>(dp_bits->size());
77 }
78 unsigned int getNumOffBits() const override {
79 return d_size - static_cast<unsigned int>(dp_bits->size());
80 }
81
82 std::string toString() const override;
83
84 void getOnBits(IntVect &v) const override;
85 void clearBits() override { dp_bits->clear(); }
86 IntSet *dp_bits{
87 nullptr}; //!< our raw data, exposed for the sake of efficiency
88
89 bool operator==(const SparseBitVect &o) const {
90 return *dp_bits == *o.dp_bits;
91 }
92 bool operator!=(const SparseBitVect &o) const {
93 return *dp_bits != *o.dp_bits;
94 }
95
96 private:
97 unsigned int d_size{0};
98 void _initForSize(const unsigned int size) override;
99};
100
101#endif
std::vector< int > IntVect
Definition: BitVect.h:17
IntVect::iterator IntVectIter
Definition: BitVect.h:18
IntSet::iterator IntSetIter
Definition: SparseBitVect.h:22
IntSet::const_iterator IntSetConstIter
Definition: SparseBitVect.h:23
set< int > IntSet
Definition: SparseBitVect.h:21
Abstract base class for storing BitVectors.
Definition: BitVect.h:24
a class for bit vectors that are sparsely occupied.
Definition: SparseBitVect.h:34
bool setBit(const unsigned int which) override
sets a particular bit and returns its original value
unsigned int getNumOffBits() const override
returns the number of off bits
Definition: SparseBitVect.h:78
bool getBit(const IntSetIter which) const
unsigned int getNumBits() const override
returns the number of bits (the length of the BitVect)
Definition: SparseBitVect.h:67
SparseBitVect operator|(const SparseBitVect &) const
bool getBit(const unsigned int which) const override
returns the value of a particular bit
void clearBits() override
clears (sets to off) all of our bits
Definition: SparseBitVect.h:85
SparseBitVect operator&(const SparseBitVect &) const
~SparseBitVect() override
Definition: SparseBitVect.h:56
bool unsetBit(const unsigned int which) override
unsets a particular bit and returns its original value
SparseBitVect & operator=(const SparseBitVect &)
SparseBitVect operator~() const
unsigned int getNumOnBits() const override
returns the number of on bits
Definition: SparseBitVect.h:75
void getOnBits(IntVect &v) const override
replaces the contents of v with indices of our on bits
bool operator!=(const SparseBitVect &o) const
Definition: SparseBitVect.h:92
SparseBitVect(const char *data, const unsigned int dataLen)
construct from a text pickle
bool setBit(const IntSetIter which)
bool operator[](const unsigned int which) const override
bool operator==(const SparseBitVect &o) const
Definition: SparseBitVect.h:89
SparseBitVect operator^(const SparseBitVect &) const
SparseBitVect(unsigned int size)
initialize with a particular size;
Definition: SparseBitVect.h:38
IntSet * dp_bits
our raw data, exposed for the sake of efficiency
Definition: SparseBitVect.h:86
std::string toString() const override
returns a serialized (pickled) version of this BitVect
bool getBit(const IntVectIter which) const
SparseBitVect(const SparseBitVect &other)
copy constructor
Definition: SparseBitVect.h:43
const IntSet * getBitSet() const
returns a (const) pointer to our raw storage
Definition: SparseBitVect.h:65
SparseBitVect(const std::string &)
construct from a string pickle
#define RDKIT_DATASTRUCTS_EXPORT
Definition: export.h:81