Summary: Use a bit set to keep track of which random number is generated. Currently only supports single-threaded. All our perf tests are run with threads=1 Copied over bitset implementation from common/datastructures Test Plan: printed the generated keys, and verified all keys were present. Reviewers: MarkCallaghan, haobo, dhruba Reviewed By: MarkCallaghan CC: leveldb Differential Revision: https://reviews.facebook.net/D11247main
parent
2a52e1dcb6
commit
bff718d81c
@ -0,0 +1,75 @@ |
||||
/**
|
||||
* Copyright 2009 Facebook |
||||
* @author Tudor Bosman (tudorb@facebook.com) |
||||
*/ |
||||
|
||||
#ifndef STORAGE_LEVELDB_UTIL_BIT_SET_H_ |
||||
#define STORAGE_LEVELDB_UTIL_BIT_SET_H_ |
||||
|
||||
#include <cassert> |
||||
|
||||
namespace leveldb { |
||||
|
||||
class BitSet { |
||||
public: |
||||
/**
|
||||
* Create a bit set of numBits, with the bits set to either true or false. |
||||
*/ |
||||
explicit BitSet(size_t numBits, bool initial=false) |
||||
: numBits_(numBits), |
||||
data_(numWords(), initial ? ~0UL : 0UL) { |
||||
} |
||||
|
||||
/**
|
||||
* Set bit b to 1. |
||||
*/ |
||||
void set(size_t b) { |
||||
assert(b >= 0 && b < numBits_); |
||||
data_[word(b)] |= wordOffsetMask(b); |
||||
} |
||||
|
||||
/**
|
||||
* Set bit b to 0; |
||||
*/ |
||||
void reset(size_t b) { |
||||
assert(b >= 0 && b < numBits_); |
||||
data_[word(b)] &= ~wordOffsetMask(b); |
||||
} |
||||
|
||||
/**
|
||||
* Get a bit. |
||||
*/ |
||||
bool test(int b) const { |
||||
return data_[word(b)] & wordOffsetMask(b); |
||||
} |
||||
|
||||
/**
|
||||
* Return the size of the BitSet, in bits. |
||||
*/ |
||||
size_t size() const { |
||||
return numBits_; |
||||
} |
||||
|
||||
private: |
||||
|
||||
inline size_t numWords() const { |
||||
if (numBits_ == 0) return 0; |
||||
return 1 + (numBits_-1) / (8*sizeof(unsigned long)); |
||||
} |
||||
inline static size_t word(int b) { |
||||
return b / (8*sizeof(unsigned long)); |
||||
} |
||||
inline static int wordOffset(int b) { |
||||
return b % (8*sizeof(unsigned long)); |
||||
} |
||||
inline static unsigned long wordOffsetMask(int b) { |
||||
return 1UL << wordOffset(b); |
||||
} |
||||
|
||||
size_t numBits_; |
||||
std::vector<unsigned long> data_; |
||||
}; |
||||
|
||||
} // namespace facebook
|
||||
|
||||
#endif // STORAGE_LEVELDB_UTIL_BIT_SET_H_
|
Loading…
Reference in new issue