8#ifndef INCLUDED_BDLC_BITARRAY
9#define INCLUDED_BDLC_BITARRAY
477#include <bdlscm_version.h>
494#include <bsl_cstddef.h>
495#include <bsl_cstdint.h>
496#include <bsl_climits.h>
497#include <bsl_cstring.h>
498#include <bsl_iosfwd.h>
499#include <bsl_vector.h>
501#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
502#include <bsl_algorithm.h>
538 bsl::size_t d_length;
542 static const bsl::uint64_t s_one = 1;
543 static const bsl::uint64_t s_minusOne = ~static_cast<bsl::uint64_t>(0);
553 static bsl::size_t arraySize(bsl::size_t numBits);
559 bsl::uint64_t *data();
565 const bsl::uint64_t *data()
const;
687 void andEqual(bsl::size_t index,
bool value);
697 bsl::size_t srcIndex,
698 bsl::size_t numBits);
714 void append(
bool value, bsl::size_t numBits);
734 bsl::size_t srcIndex,
735 bsl::size_t numBits);
741 void assign(bsl::size_t index,
bool value);
747 void assign(bsl::size_t index,
bool value, bsl::size_t numBits);
762 void assign(bsl::size_t dstIndex,
764 bsl::size_t srcIndex,
765 bsl::size_t numBits);
770 void assign0(bsl::size_t index);
776 void assign0(bsl::size_t index, bsl::size_t numBits);
781 void assign1(bsl::size_t index);
787 void assign1(bsl::size_t index, bsl::size_t numBits);
804 bsl::uint64_t srcBits,
805 bsl::size_t numBits);
812 void insert(bsl::size_t dstIndex,
bool value);
819 void insert(bsl::size_t dstIndex,
bool value, bsl::size_t numBits);
838 bsl::size_t srcIndex,
839 bsl::size_t numBits);
847 void minusEqual(bsl::size_t index,
bool value);
860 bsl::size_t srcIndex,
861 bsl::size_t numBits);
867 void orEqual(bsl::size_t index,
bool value);
875 void orEqual(bsl::size_t dstIndex,
877 bsl::size_t srcIndex,
878 bsl::size_t numBits);
885 void remove(bsl::size_t index);
893 void remove(bsl::size_t index, bsl::size_t numBits);
929 void setLength(bsl::size_t newLength,
bool value =
false);
935 void swapBits(bsl::size_t index1, bsl::size_t index2);
940 void toggle(bsl::size_t index);
946 void toggle(bsl::size_t index, bsl::size_t numBits);
958 void xorEqual(bsl::size_t index,
bool value);
968 bsl::size_t srcIndex,
969 bsl::size_t numBits);
984 template <
class STREAM>
1007 bsl::uint64_t
bits(bsl::size_t index, bsl::size_t numBits)
const;
1062 bsl::size_t
length()
const;
1070 bsl::size_t
num0(bsl::size_t begin = 0,
1079 bsl::size_t
num1(bsl::size_t begin = 0,
1096 template <
class STREAM>
1111 bsl::ostream&
print(bsl::ostream& stream,
1113 int spacesPerLevel = 4)
const;
1115#ifndef BDE_OPENSOURCE_PUBLICATION
1218bsl::size_t BitArray::arraySize(bsl::size_t numBits)
1225 return ret ? ret : 1;
1230bsl::uint64_t *BitArray::data()
1234 return d_array.
data();
1239const bsl::uint64_t *BitArray::data()
const
1243 return d_array.
data();
1260 d_array.
resize(rhs.d_array.size());
1261 bsl::memcpy(d_array.
data(),
1263 d_array.
size() *
sizeof(bsl::uint64_t));
1264 d_length = rhs.d_length;
1276 const bsl::size_t rLen = rhs.d_length;
1278 if (rLen > d_length) {
1281 else if (rLen < d_length) {
1282 assign0(rLen, d_length - rLen);
1298 if (d_length < rhs.d_length) {
1313 if (d_length < rhs.d_length) {
1330 if (d_length < rhs.d_length) {
1344 if (d_length > numBits) {
1345 const bsl::size_t remBits = d_length - numBits;
1364 if (d_length > numBits) {
1365 const bsl::size_t remBits = d_length - numBits;
1391 bsl::size_t srcIndex,
1392 bsl::size_t numBits)
1395 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1419 insert(d_length, value, numBits);
1425 insert(d_length, srcArray, 0, srcArray.d_length);
1430 bsl::size_t srcIndex,
1431 bsl::size_t numBits)
1433 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1435 insert(d_length, srcArray, srcIndex, numBits);
1457 bsl::size_t srcIndex,
1458 bsl::size_t numBits)
1461 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1463 if (&srcArray ==
this) {
1540 bsl::uint64_t srcBits,
1541 bsl::size_t numBits)
1554 insert(dstIndex, srcArray, 0, srcArray.d_length);
1592 bsl::size_t srcIndex,
1593 bsl::size_t numBits)
1596 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1618 bsl::size_t srcIndex,
1619 bsl::size_t numBits)
1622 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1659 d_array.
reserve(arraySize(numBits));
1668 if (index1 != index2) {
1669 const bool tmp = (*this)[index1];
1670 assign(index1, (*
this)[index2]);
1683 d_array[idx] ^= (s_one << pos);
1715 bsl::size_t srcIndex,
1716 bsl::size_t numBits)
1719 BSLS_ASSERT(srcIndex + numBits <= srcArray.d_length);
1730template <
class STREAM>
1737 stream.getLength(newLength);
1742 if (0 == newLength) {
1748 const bsl::size_t len = arraySize(newLength);
1757 d_length = newLength;
1759 stream.getArrayUint64(
1761 static_cast<int>(len));
1769 const int rem =
static_cast<unsigned>(d_length) %
1772 const bsl::uint64_t mask = (s_one << rem) - 1;
1773 if (d_array.
back() & ~mask) {
1777 d_array.
back() &= mask;
1778 stream.invalidate();
1784 stream.invalidate();
1882 return 0 == d_length;
1923template <
class STREAM>
1930 stream.putLength(
static_cast<int>(d_length));
1931 if (0 != d_length) {
1932 stream.putArrayUint64(
1934 static_cast<int>(d_array.
size()));
1938 stream.invalidate();
1945#ifndef BDE_OPENSOURCE_PUBLICATION
1962 if (lhs.d_length != rhs.d_length) {
1980 BitArray tmp(array);
2022 BitArray tmp(array);
2032 BitArray tmp(array);
2040 return rhs.print(stream, 0, -1);
Definition bdlc_bitarray.h:525
bsl::size_t num0(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1892
void insert(bsl::size_t dstIndex, bool value)
Definition bdlc_bitarray.h:1558
bsl::size_t length() const
Return the number of bits in this array.
Definition bdlc_bitarray.h:1886
bool operator[](bsl::size_t index) const
Definition bdlc_bitarray.h:1804
BitArray & operator&=(const BitArray &rhs)
Definition bdlc_bitarray.h:1270
bool isAny1() const
Definition bdlc_bitarray.h:1874
void assignAll1()
Set to 1 the value of every bit in this array.
Definition bdlc_bitarray.h:1533
bsl::size_t num1(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1904
bsl::uint64_t bits(bsl::size_t index, bsl::size_t numBits) const
Definition bdlc_bitarray.h:1812
BitArray & operator^=(const BitArray &rhs)
Definition bdlc_bitarray.h:1322
void removeAll()
Definition bdlc_bitarray.h:1649
bsl::size_t find0AtMinIndex(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1832
void assign1(bsl::size_t index)
Definition bdlc_bitarray.h:1500
void andEqual(bsl::size_t index, bool value)
Definition bdlc_bitarray.h:1379
void toggleAll()
Definition bdlc_bitarray.h:1697
BitArray(bsl::size_t initialLength, bslma::Allocator *basicAllocator=0)
void assign(bsl::size_t index, bool value)
Definition bdlc_bitarray.h:1439
void append(bool value)
Definition bdlc_bitarray.h:1405
void rotateRight(bsl::size_t numBits)
void toggle(bsl::size_t index)
Definition bdlc_bitarray.h:1676
BitArray & operator>>=(bsl::size_t numBits)
Definition bdlc_bitarray.h:1339
void swapBits(bsl::size_t index1, bsl::size_t index2)
Definition bdlc_bitarray.h:1663
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlc_bitarray.h:1924
void assignAll0()
Set to 0 the value of every bit in this array.
Definition bdlc_bitarray.h:1527
void swap(BitArray &other)
Definition bdlc_bitarray.h:1792
void assign0(bsl::size_t index)
Definition bdlc_bitarray.h:1484
friend bool operator==(const BitArray &, const BitArray &)
bsl::size_t find1AtMaxIndex(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1844
void orEqual(bsl::size_t index, bool value)
Definition bdlc_bitarray.h:1606
BitArray & operator=(const BitArray &rhs)
Definition bdlc_bitarray.h:1258
BitArray & operator-=(const BitArray &rhs)
Definition bdlc_bitarray.h:1290
void xorEqual(bsl::size_t index, bool value)
Definition bdlc_bitarray.h:1703
BitArray(bsl::size_t initialLength, bool value, bslma::Allocator *basicAllocator=0)
void reserveCapacity(bsl::size_t numBits)
Definition bdlc_bitarray.h:1657
static int maxSupportedBdexVersion()
Definition bdlc_bitarray.h:1949
bsl::size_t find0AtMaxIndex(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1820
bslma::Allocator * allocator() const
Return the allocator used by this object to supply memory.
Definition bdlc_bitarray.h:1918
bool isEmpty() const
Definition bdlc_bitarray.h:1880
BitArray & operator<<=(bsl::size_t numBits)
Definition bdlc_bitarray.h:1359
void setLength(bsl::size_t newLength, bool value=false)
static const bsl::size_t k_INVALID_INDEX
Definition bdlc_bitarray.h:532
bool isAny0() const
Definition bdlc_bitarray.h:1868
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
void minusEqual(bsl::size_t index, bool value)
Definition bdlc_bitarray.h:1580
void remove(bsl::size_t index)
Definition bdlc_bitarray.h:1632
~BitArray()
Destroy this object.
bsl::size_t find1AtMinIndex(bsl::size_t begin=0, bsl::size_t end=k_INVALID_INDEX) const
Definition bdlc_bitarray.h:1856
void assignBits(bsl::size_t index, bsl::uint64_t srcBits, bsl::size_t numBits)
Definition bdlc_bitarray.h:1539
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlc_bitarray.h:1731
BitArray & operator|=(const BitArray &rhs)
Definition bdlc_bitarray.h:1307
void rotateLeft(bsl::size_t numBits)
BitArray(bslma::Allocator *basicAllocator=0)
void assignAll(bool value)
Set all bits in this array to the specified value.
Definition bdlc_bitarray.h:1516
void insert(bsl::size_t dstIndex, const BitArray &srcArray, bsl::size_t srcIndex, bsl::size_t numBits)
@ k_BITS_PER_UINT64
Definition bdlc_bitarray.h:529
BitArray(const BitArray &original, bslma::Allocator *basicAllocator=0)
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this vector.
Definition bslstl_vector.h:3019
reference back()
Definition bslstl_vector.h:2932
bool empty() const BSLS_KEYWORD_NOEXCEPT
Return true if this vector has size 0, and false otherwise.
Definition bslstl_vector.h:3034
VALUE_TYPE * data() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2942
Definition bslstl_vector.h:1120
allocator_type get_allocator() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:4621
void reserve(size_type newCapacity)
Definition bslstl_vector.h:4263
void push_back(const VALUE_TYPE &value)
Definition bslstl_vector.h:4343
void swap(vector &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:1938
void resize(size_type newSize)
Definition bslstl_vector.h:4189
static void swap(T *a, T *b)
Definition bslalg_swaputil.h:182
Definition bslma_allocator.h:545
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlc_bitarray.h:506
BitArray operator|(const BitArray &lhs, const BitArray &rhs)
BitArray operator&(const BitArray &lhs, const BitArray &rhs)
bool operator==(const BitArray &lhs, const BitArray &rhs)
BitArray operator>>(const BitArray &array, bsl::size_t numBits)
BitArray operator~(const BitArray &array)
Return the bitwise complement ("toggle") of the specified array.
bool operator!=(const BitArray &lhs, const BitArray &rhs)
BitArray operator^(const BitArray &lhs, const BitArray &rhs)
BitArray operator-(const BitArray &lhs, const BitArray &rhs)
BitArray operator<<(const BitArray &array, bsl::size_t numBits)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
static bsl::size_t find0AtMinIndex(const bsl::uint64_t *bitString, bsl::size_t length)
static void assign(bsl::uint64_t *bitString, bsl::size_t index, bool value)
Definition bdlb_bitstringutil.h:878
static void toggle(bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
static void assignBits(bsl::uint64_t *bitString, bsl::size_t index, bsl::uint64_t srcValue, bsl::size_t numBits)
static void assign0(bsl::uint64_t *bitString, bsl::size_t index)
Definition bdlb_bitstringutil.h:896
static bool bit(const bsl::uint64_t *bitString, bsl::size_t index)
Definition bdlb_bitstringutil.h:984
static void orEqual(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static const bsl::size_t k_INVALID_INDEX
Definition bdlb_bitstringutil.h:422
static bsl::uint64_t bits(const bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
static bool areEqual(const bsl::uint64_t *bitString1, const bsl::uint64_t *bitString2, bsl::size_t numBits)
static void copyRaw(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static bsl::size_t find0AtMaxIndex(const bsl::uint64_t *bitString, bsl::size_t length)
static bsl::size_t find1AtMaxIndex(const bsl::uint64_t *bitString, bsl::size_t length)
static void assign1(bsl::uint64_t *bitString, bsl::size_t index)
Definition bdlb_bitstringutil.h:907
static void remove(bsl::uint64_t *bitString, bsl::size_t length, bsl::size_t index, bsl::size_t numBits)
static bool isAny0(const bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
static void andEqual(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static void minusEqual(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static bsl::size_t find1AtMinIndex(const bsl::uint64_t *bitString, bsl::size_t length)
static bsl::size_t num0(const bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
Definition bdlb_bitstringutil.h:997
static bool isAny1(const bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
static void copy(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static void insert(bsl::uint64_t *bitString, bsl::size_t initialLength, bsl::size_t dstIndex, bool value, bsl::size_t numBits)
Definition bdlb_bitstringutil.h:920
static void xorEqual(bsl::uint64_t *dstBitString, bsl::size_t dstIndex, const bsl::uint64_t *srcBitString, bsl::size_t srcIndex, bsl::size_t numBits)
static bsl::size_t num1(const bsl::uint64_t *bitString, bsl::size_t index, bsl::size_t numBits)
Definition bslma_usesbslmaallocator.h:344
Definition bslmf_isbitwisemoveable.h:718
unsigned long long Uint64
Definition bsls_types.h:139