RDKit
Open-source cheminformatics and machine learning.
Loading...
Searching...
No Matches
SparseBitVect.h
Go to the documentation of this file.
1//
2// Copyright (C) 2007-2024 Greg Landrum and other RDKit contributors
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#include <limits>
21
22typedef set<int> IntSet;
23typedef IntSet::iterator IntSetIter;
24typedef IntSet::const_iterator IntSetConstIter;
25
26//! a class for bit vectors that are sparsely occupied.
27/*!
28 SparseBitVect objects store only their on bits, in an
29 std::set.
30
31 They are, as you might expect, quite memory efficient for sparsely populated
32 vectors but become rather a nightmare if they need to be negated.
33
34 */
36 public:
38 //! initialize with a particular size;
39 explicit SparseBitVect(unsigned int size) : dp_bits(nullptr), d_size(0) {
40 _initForSize(size);
41 }
42
43 //! copy constructor
44 SparseBitVect(const SparseBitVect &other) : BitVect(other) {
45 d_size = 0;
46 dp_bits = nullptr;
47 _initForSize(other.getNumBits());
48 IntSet *bv = other.dp_bits;
49 std::copy(bv->begin(), bv->end(), std::inserter(*dp_bits, dp_bits->end()));
50 }
51 //! construct from a string pickle
52 SparseBitVect(const std::string &pkl);
53 //! construct from a text pickle
54 SparseBitVect(const char *data, const unsigned int dataLen);
55
57 ~SparseBitVect() override { delete dp_bits; }
58
59 bool operator[](const unsigned int which) const override;
64
65 //! returns a (const) pointer to our raw storage
66 const IntSet *getBitSet() const { return dp_bits; }
67
68 unsigned int getNumBits() const override { return d_size; }
69 bool setBit(const unsigned int which) override;
70 bool setBit(const IntSetIter which);
71 bool unsetBit(const unsigned int which) override;
72 bool getBit(const unsigned int which) const override;
73 bool getBit(const IntVectIter which) const;
74 bool getBit(const IntSetIter which) const;
75
76 unsigned int getNumOnBits() const override {
77 return static_cast<unsigned int>(dp_bits->size());
78 }
79 unsigned int getNumOffBits() const override {
80 return d_size - static_cast<unsigned int>(dp_bits->size());
81 }
82
83 std::string toString() const override;
84
85 void getOnBits(IntVect &v) const override;
86 void clearBits() override { dp_bits->clear(); }
87 IntSet *dp_bits{
88 nullptr}; //!< our raw data, exposed for the sake of efficiency
89
90 bool operator==(const SparseBitVect &o) const {
91 return *dp_bits == *o.dp_bits;
92 }
93 bool operator!=(const SparseBitVect &o) const {
94 return *dp_bits != *o.dp_bits;
95 }
96
97 private:
98 unsigned int d_size{0};
99 void _initForSize(const unsigned int size) override;
100 bool checkIndex(const unsigned int idx) const {
101 return idx < d_size || (idx == d_size &&
102 d_size == std::numeric_limits<unsigned int>::max());
103 }
104 template <typename T>
105 bool checkIndex(const T which) const {
106 return *which >= 0 && static_cast<unsigned int>(*which) < d_size;
107 }
108};
109
110#endif
std::vector< int > IntVect
Definition BitVect.h:17
IntVect::iterator IntVectIter
Definition BitVect.h:18
IntSet::iterator IntSetIter
IntSet::const_iterator IntSetConstIter
set< int > IntSet
Abstract base class for storing BitVectors.
Definition BitVect.h:24
a class for bit vectors that are sparsely occupied.
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
bool getBit(const IntSetIter which) const
unsigned int getNumBits() const override
returns the number of bits (the length of the BitVect)
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
SparseBitVect operator&(const SparseBitVect &) const
~SparseBitVect() override
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
void getOnBits(IntVect &v) const override
replaces the contents of v with indices of our on bits
bool operator!=(const SparseBitVect &o) const
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
SparseBitVect operator^(const SparseBitVect &) const
SparseBitVect(unsigned int size)
initialize with a particular size;
IntSet * dp_bits
our raw data, exposed for the sake of efficiency
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
SparseBitVect(const std::string &pkl)
construct from a string pickle
const IntSet * getBitSet() const
returns a (const) pointer to our raw storage
#define RDKIT_DATASTRUCTS_EXPORT
Definition export.h:81