diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2023-05-08 12:59:46 -0400 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2023-05-08 12:59:46 -0400 |
| commit | fdf5ef27fec1368a33801a98bbc5ed3556476979 (patch) | |
| tree | 7ecd9477fed6495d05a44343e19bfb6480785c7a /include/ds/BitArray.h | |
| parent | 2380dd4d73cd6a179567e06e1aa4871ad44ccce3 (diff) | |
| download | dynamic-extension-fdf5ef27fec1368a33801a98bbc5ed3556476979.tar.gz | |
Began porting source files over from other repository
Diffstat (limited to 'include/ds/BitArray.h')
| -rw-r--r-- | include/ds/BitArray.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/include/ds/BitArray.h b/include/ds/BitArray.h new file mode 100644 index 0000000..1d33d5b --- /dev/null +++ b/include/ds/BitArray.h @@ -0,0 +1,67 @@ +/* + * include/ds/BloomFilter.h + * + * Copyright (C) 2023 Dong Xie <dongx@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <cstdlib> +#include <memory> +#include <cstring> + +#include "util/base.h" + +namespace lsm { + +class BitArray { +public: + BitArray(size_t bits): m_bits(bits), m_data(nullptr) { + if (m_bits > 0) { + size_t n_bytes = (m_bits >> 3) << 3; + m_data = (char*) std::aligned_alloc(CACHELINE_SIZE, CACHELINEALIGN(n_bytes)); + memset(m_data, 0, n_bytes); + } + } + + ~BitArray() { + if (m_data) free(m_data); + } + + bool is_set(size_t bit) { + if (bit >= m_bits) return false; + return m_data[bit >> 3] & (1 << (bit & 7)); + } + + int set(size_t bit) { + if (bit >= m_bits) return 0; + m_data[bit >> 3] |= ((char) 1 << (bit & 7)); + return 1; + } + + int unset(size_t bit) { + if (bit >= m_bits) return 0; + m_data[bit >> 3] &= ~((char) 1 << (bit & 7)); + return 1; + } + + void clear() { + memset(m_data, 0, (m_bits >> 3) << 3); + } + + size_t mem_size() { + return m_bits >> 3; + } + + size_t size() { + return m_bits; + } + +private: + size_t m_bits; + char* m_data; +}; + +} |