OpenMD 3.0
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
OpenMDBitSet.hpp
1/*
2 * Copyright (c) 2004-present, The University of Notre Dame. All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32 * research, please cite the appropriate papers when you publish your
33 * work. Good starting points are:
34 *
35 * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
36 * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
37 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
38 * [4] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
39 * [5] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
40 * [6] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
41 * [7] Lamichhane, Newman & Gezelter, J. Chem. Phys. 141, 134110 (2014).
42 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
43 */
44
45#ifndef UTILS_OPENMDBITSET_HPP
46#define UTILS_OPENMDBITSET_HPP
47
48#include <iostream>
49#include <vector>
50
51namespace OpenMD {
52
53 /**
54 * @class OpenMDBitSet OpenMDBitSet.hpp "OpenMDBitSet.hpp"
55 * @brief OpenMDBitSet is a wrapper class of std::vector<bool> to act as a
56 * growable std::bitset
57 */
59 public:
60 /** */
61 OpenMDBitSet() {}
62 /** */
63 OpenMDBitSet(size_t nbits) : bitset_(nbits) { clearAll(); }
64
65 /** Returns the number of bits set to true in this OpenMDBitSet. */
66 int countBits();
67
68 /** Sets the bit at the specified index to to the complement of its current
69 * value. */
70 void flip(size_t bitIndex) { bitset_[bitIndex] = !bitset_[bitIndex]; }
71
72 /** Sets each bit from the specified fromIndex(inclusive) to the specified
73 * toIndex(exclusive) to the complement of its current value. */
74 void flip(size_t fromIndex, size_t toIndex);
75
76 /** Sets each bit to the complement of its current value. */
77 void flip() { flip(0, size()); }
78
79 /** Returns the value of the bit with the specified index. */
80 bool get(size_t bitIndex) { return bitset_[bitIndex]; }
81
82 /** Returns a new OpenMDBitSet composed of bits from this OpenMDBitSet from
83 * fromIndex(inclusive) to toIndex(exclusive). */
84 OpenMDBitSet get(size_t fromIndex, size_t toIndex);
85
86 /** Returns true if any bits are set to true */
87 bool any() { return !none(); }
88
89 /** Returns true if no bits are set to true */
90 bool none();
91
92 int firstOffBit() const { return !bitset_[0] ? 0 : nextOffBit(0); }
93
94 /** Returns the index of the first bit that is set to false that occurs on
95 * or after the specified starting index.*/
96 int nextOffBit(int fromIndex) const;
97
98 /** Returns the index of the n^th bit that is set to false. */
99 int nthOffBit(unsigned long int n) const;
100
101 int firstOnBit() const { return bitset_[0] ? 0 : nextOnBit(0); }
102
103 /** Returns the index of the first bit that is set to true that occurs on or
104 * after the specified starting index. */
105 int nextOnBit(int fromIndex) const;
106
107 /** Returns the index of the n^th bit that is set to true. */
108 int nthOnBit(unsigned long int n) const;
109
110 /** Performs a logical AND of this target bit set with the argument bit set.
111 */
112 void andOperator(const OpenMDBitSet& bs);
113
114 /** Performs a logical OR of this bit set with the bit set argument. */
115 void orOperator(const OpenMDBitSet& bs);
116
117 /** Performs a logical XOR of this bit set with the bit set argument. */
118 void xorOperator(const OpenMDBitSet& bs);
119
120 void setBitOn(size_t bitIndex) { setBit(bitIndex, true); }
121
122 void setBitOff(size_t bitIndex) { setBit(bitIndex, false); }
123
124 void setRangeOn(size_t fromIndex, size_t toIndex) {
125 setBits(fromIndex, toIndex, true);
126 }
127
128 void setRangeOff(size_t fromIndex, size_t toIndex) {
129 setBits(fromIndex, toIndex, false);
130 }
131
132 /** Sets all of the bits in this OpenMDBitSet to false. */
133 void clearAll() { setRangeOff(0, size()); }
134
135 void setAll() { setRangeOn(0, size()); }
136
137 /** Returns the number of bits of space actually in use by this OpenMDBitSet
138 * to represent bit values. */
139 size_t size() const { return bitset_.size(); }
140
141 /** Changes the size of OpenMDBitSet*/
142 void resize(size_t nbits);
143
144 OpenMDBitSet& operator&=(const OpenMDBitSet& bs) {
145 andOperator(bs);
146 return *this;
147 }
148 OpenMDBitSet& operator|=(const OpenMDBitSet& bs) {
149 orOperator(bs);
150 return *this;
151 }
152 OpenMDBitSet& operator^=(const OpenMDBitSet& bs) {
153 xorOperator(bs);
154 return *this;
155 }
156 OpenMDBitSet& operator-=(const OpenMDBitSet& bs) {
157 OpenMDBitSet tmp = *this ^ bs;
158 *this &= tmp;
159 return *this;
160 }
161
162 OpenMDBitSet parallelReduce();
163
164 bool operator[](int bitIndex) const { return bitset_[bitIndex]; }
165 friend OpenMDBitSet operator|(const OpenMDBitSet& bs1,
166 const OpenMDBitSet& bs2);
167 friend OpenMDBitSet operator&(const OpenMDBitSet& bs1,
168 const OpenMDBitSet& bs2);
169 friend OpenMDBitSet operator^(const OpenMDBitSet& bs1,
170 const OpenMDBitSet& bs2);
171 friend OpenMDBitSet operator-(const OpenMDBitSet& bs1,
172 const OpenMDBitSet& bs2);
173
174 friend bool operator==(const OpenMDBitSet& bs1, const OpenMDBitSet& bs2);
175
176 // friend std::istream& operator>> ( std::istream&, const OpenMDBitSet& bs);
177 friend std::ostream& operator<<(std::ostream&, const OpenMDBitSet& bs);
178
179 private:
180 /** Sets the bit at the specified index to the specified value. */
181 void setBit(size_t bitIndex, bool value) { bitset_[bitIndex] = value; }
182
183 /** Sets the bits from the specified fromIndex(inclusive) to the specified
184 * toIndex(exclusive) to the specified value. */
185 void setBits(size_t fromIndex, size_t toIndex, bool value);
186
187 std::vector<bool> bitset_;
188 };
189} // namespace OpenMD
190
191#endif
OpenMDBitSet is a wrapper class of std::vector<bool> to act as a growable std::bitset.
bool any()
Returns true if any bits are set to true.
void andOperator(const OpenMDBitSet &bs)
Performs a logical AND of this target bit set with the argument bit set.
void clearAll()
Sets all of the bits in this OpenMDBitSet to false.
void flip(size_t bitIndex)
Sets the bit at the specified index to to the complement of its current value.
void flip()
Sets each bit to the complement of its current value.
bool none()
Returns true if no bits are set to true.
void resize(size_t nbits)
Changes the size of OpenMDBitSet.
int countBits()
Returns the number of bits set to true in this OpenMDBitSet.
size_t size() const
Returns the number of bits of space actually in use by this OpenMDBitSet to represent bit values.
int nextOnBit(int fromIndex) const
Returns the index of the first bit that is set to true that occurs on or after the specified starting...
bool get(size_t bitIndex)
Returns the value of the bit with the specified index.
void xorOperator(const OpenMDBitSet &bs)
Performs a logical XOR of this bit set with the bit set argument.
int nthOffBit(unsigned long int n) const
Returns the index of the n^th bit that is set to false.
int nextOffBit(int fromIndex) const
Returns the index of the first bit that is set to false that occurs on or after the specified startin...
void orOperator(const OpenMDBitSet &bs)
Performs a logical OR of this bit set with the bit set argument.
int nthOnBit(unsigned long int n) const
Returns the index of the n^th bit that is set to true.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.