aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2010-04-30 12:29:39 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2010-04-30 12:29:39 +0000
commitb252fbd179c494b3c6220f6f7e42f3ff5d15bda6 (patch)
tree42b39211e7380652142959c54dae606567f8e801 /include/llvm
parent1e44aa0412473297994afb8b707d0326472fd2a4 (diff)
downloadexternal_llvm-b252fbd179c494b3c6220f6f7e42f3ff5d15bda6.zip
external_llvm-b252fbd179c494b3c6220f6f7e42f3ff5d15bda6.tar.gz
external_llvm-b252fbd179c494b3c6220f6f7e42f3ff5d15bda6.tar.bz2
Implement a read/write operator[] for SmallBitVector with a proxy class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102709 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm')
-rw-r--r--include/llvm/ADT/SmallBitVector.h38
1 files changed, 35 insertions, 3 deletions
diff --git a/include/llvm/ADT/SmallBitVector.h b/include/llvm/ADT/SmallBitVector.h
index 7563e81..884e631 100644
--- a/include/llvm/ADT/SmallBitVector.h
+++ b/include/llvm/ADT/SmallBitVector.h
@@ -52,6 +52,34 @@ class SmallBitVector {
SmallNumDataBits = SmallNumRawBits - SmallNumSizeBits
};
+public:
+ // Encapsulation of a single bit.
+ class reference {
+ SmallBitVector &TheVector;
+ unsigned BitPos;
+
+ public:
+ reference(SmallBitVector &b, unsigned Idx) : TheVector(b), BitPos(Idx) {}
+
+ reference& operator=(reference t) {
+ *this = bool(t);
+ return *this;
+ }
+
+ reference& operator=(bool t) {
+ if (t)
+ TheVector.set(BitPos);
+ else
+ TheVector.reset(BitPos);
+ return *this;
+ }
+
+ operator bool() const {
+ return const_cast<const SmallBitVector &>(TheVector).operator[](BitPos);
+ }
+ };
+
+private:
bool isSmall() const {
return X & uintptr_t(1);
}
@@ -81,7 +109,7 @@ class SmallBitVector {
void setSmallRawBits(uintptr_t NewRawBits) {
assert(isSmall());
- X = NewRawBits << 1 | uintptr_t(1);
+ X = (NewRawBits << 1) | uintptr_t(1);
}
// Return the size.
@@ -99,7 +127,7 @@ class SmallBitVector {
}
void setSmallBits(uintptr_t NewBits) {
- setSmallRawBits(NewBits & ~(~uintptr_t(0) << getSmallSize()) |
+ setSmallRawBits((NewBits & ~(~uintptr_t(0) << getSmallSize())) |
(getSmallSize() << SmallNumDataBits));
}
@@ -298,7 +326,11 @@ public:
}
// Indexing.
- // TODO: Add an index operator which returns a "reference" (proxy class).
+ reference operator[](unsigned Idx) {
+ assert(Idx < size() && "Out-of-bounds Bit access.");
+ return reference(*this, Idx);
+ }
+
bool operator[](unsigned Idx) const {
assert(Idx < size() && "Out-of-bounds Bit access.");
if (isSmall())