OpenMD 3.2
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 following paper when you publish your work:
33 *
34 * [1] Drisko et al., J. Open Source Softw. 9, 7004 (2024).
35 *
36 * Good starting points for code and simulation methodology are:
37 *
38 * [2] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
39 * [3] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
40 * [4] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
41 * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
42 * [6] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
43 * [7] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
44 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
45 * [9] Drisko & Gezelter, J. Chem. Theory Comput. 20, 4986-4997 (2024).
46 */
47
48#ifndef UTILS_OPENMDBITSET_HPP
49#define UTILS_OPENMDBITSET_HPP
50
51#include <iostream>
52#include <vector>
53
54namespace OpenMD {
55
56 /**
57 * @class OpenMDBitSet OpenMDBitSet.hpp "OpenMDBitSet.hpp"
58 * @brief OpenMDBitSet is a wrapper class of std::vector<bool> to act as a
59 * growable std::bitset
60 */
61 class OpenMDBitSet {
62 public:
63 /** */
64 OpenMDBitSet() {}
65 /** */
66 OpenMDBitSet(size_t nbits) : bitset_(nbits) { clearAll(); }
67
68 /** Returns the number of bits set to true in this OpenMDBitSet. */
69 int countBits();
70
71 /** Sets the bit at the specified index to to the complement of its current
72 * value. */
73 void flip(size_t bitIndex) { bitset_[bitIndex] = !bitset_[bitIndex]; }
74
75 /** Sets each bit from the specified fromIndex(inclusive) to the specified
76 * toIndex(exclusive) to the complement of its current value. */
77 void flip(size_t fromIndex, size_t toIndex);
78
79 /** Sets each bit to the complement of its current value. */
80 void flip() { flip(0, size()); }
81
82 /** Returns the value of the bit with the specified index. */
83 bool get(size_t bitIndex) { return bitset_[bitIndex]; }
84
85 /** Returns a new OpenMDBitSet composed of bits from this OpenMDBitSet from
86 * fromIndex(inclusive) to toIndex(exclusive). */
87 OpenMDBitSet get(size_t fromIndex, size_t toIndex);
88
89 /** Returns true if any bits are set to true */
90 bool any() { return !none(); }
91
92 /** Returns true if no bits are set to true */
93 bool none();
94
95 int firstOffBit() const { return !bitset_[0] ? 0 : nextOffBit(0); }
96
97 /** Returns the index of the first bit that is set to false that occurs on
98 * or after the specified starting index.*/
99 int nextOffBit(int fromIndex) const;
100
101 /** Returns the index of the n^th bit that is set to false. */
102 int nthOffBit(unsigned long int n) const;
103
104 int firstOnBit() const { return bitset_[0] ? 0 : nextOnBit(0); }
105
106 /** Returns the index of the first bit that is set to true that occurs on or
107 * after the specified starting index. */
108 int nextOnBit(int fromIndex) const;
109
110 /** Returns the index of the n^th bit that is set to true. */
111 int nthOnBit(unsigned long int n) const;
112
113 /** Performs a logical AND of this target bit set with the argument bit set.
114 */
115 void andOperator(const OpenMDBitSet& bs);
116
117 /** Performs a logical OR of this bit set with the bit set argument. */
118 void orOperator(const OpenMDBitSet& bs);
119
120 /** Performs a logical XOR of this bit set with the bit set argument. */
121 void xorOperator(const OpenMDBitSet& bs);
122
123 void setBitOn(size_t bitIndex) { setBit(bitIndex, true); }
124
125 void setBitOff(size_t bitIndex) { setBit(bitIndex, false); }
126
127 void setRangeOn(size_t fromIndex, size_t toIndex) {
128 setBits(fromIndex, toIndex, true);
129 }
130
131 void setRangeOff(size_t fromIndex, size_t toIndex) {
132 setBits(fromIndex, toIndex, false);
133 }
134
135 /** Sets all of the bits in this OpenMDBitSet to false. */
136 void clearAll() { setRangeOff(0, size()); }
137
138 void setAll() { setRangeOn(0, size()); }
139
140 /** Returns the number of bits of space actually in use by this OpenMDBitSet
141 * to represent bit values. */
142 size_t size() const { return bitset_.size(); }
143
144 /** Changes the size of OpenMDBitSet*/
145 void resize(size_t nbits);
146
147 OpenMDBitSet& operator&=(const OpenMDBitSet& bs) {
148 andOperator(bs);
149 return *this;
150 }
151 OpenMDBitSet& operator|=(const OpenMDBitSet& bs) {
152 orOperator(bs);
153 return *this;
154 }
155 OpenMDBitSet& operator^=(const OpenMDBitSet& bs) {
156 xorOperator(bs);
157 return *this;
158 }
159 OpenMDBitSet& operator-=(const OpenMDBitSet& bs) {
160 OpenMDBitSet tmp = *this ^ bs;
161 *this &= tmp;
162 return *this;
163 }
164
165 OpenMDBitSet parallelReduce();
166
167 bool operator[](int bitIndex) const { return bitset_[bitIndex]; }
168 friend OpenMDBitSet operator|(const OpenMDBitSet& bs1,
169 const OpenMDBitSet& bs2);
170 friend OpenMDBitSet operator&(const OpenMDBitSet& bs1,
171 const OpenMDBitSet& bs2);
172 friend OpenMDBitSet operator^(const OpenMDBitSet& bs1,
173 const OpenMDBitSet& bs2);
174 friend OpenMDBitSet operator-(const OpenMDBitSet& bs1,
175 const OpenMDBitSet& bs2);
176
177 friend bool operator==(const OpenMDBitSet& bs1, const OpenMDBitSet& bs2);
178
179 // friend std::istream& operator>> ( std::istream&, const OpenMDBitSet& bs);
180 friend std::ostream& operator<<(std::ostream&, const OpenMDBitSet& bs);
181
182 private:
183 /** Sets the bit at the specified index to the specified value. */
184 void setBit(size_t bitIndex, bool value) { bitset_[bitIndex] = value; }
185
186 /** Sets the bits from the specified fromIndex(inclusive) to the specified
187 * toIndex(exclusive) to the specified value. */
188 void setBits(size_t fromIndex, size_t toIndex, bool value);
189
190 std::vector<bool> bitset_;
191 };
192} // namespace OpenMD
193
194#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.