8#ifndef INCLUDED_BSLSTL_BITSET
9#define INCLUDED_BSLSTL_BITSET
181#include <bslscm_version.h>
206#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
210#if defined(BSLS_PLATFORM_CMP_MSVC) || \
211 (defined(BSLS_PLATFORM_CMP_GNU) && BSLS_PLATFORM_CMP_VERSION < 40400)
219# define BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS
224template <std::
size_t N>
247 unsigned long long val = 0);
262template <std::size_t BITSETSIZE,
263 std::size_t NUM_INIT =
269template <std::
size_t BITSETSIZE>
273 unsigned int d_data[BITSETSIZE];
293template <std::
size_t BITSETSIZE>
297 unsigned int d_data[BITSETSIZE];
327template <std::
size_t N>
329 private Bitset_ImpBase<N ? (N - 1) / (CHAR_BIT *
sizeof(
int)) + 1 : 1> {
333 k_BYTES_PER_INT =
sizeof(int),
334 k_BITS_PER_INT = CHAR_BIT * k_BYTES_PER_INT,
335 k_BITSETSIZE = N ? (N - 1) / k_BITS_PER_INT + 1 : 1
359 unsigned int *d_int_p;
360 unsigned int d_offset;
369 reference(
unsigned int *i,
unsigned int offset);
372#ifdef BSLS_COMPILERFEATURES_SUPPORT_DEFAULTED_FUNCTIONS
415 void clearUnusedBits();
431 template <class CHAR_TYPE, class TRAITS, class ALLOCATOR>
437 ALLOCATOR>::size_type pos,
440 ALLOCATOR>::size_type n,
443 template <class CHAR_TYPE, class TRAITS, class ALLOCATOR>
446 typename
bsl::
basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type pos,
454 std::
size_t numOneSet(
unsigned int src) const;
478#if !defined(BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS)
479 template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
481 const std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>& str,
483 std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type pos = 0,
485 std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type n =
486 std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::npos,
487 CHAR_TYPE zeroChar = CHAR_TYPE(
'0'),
488 CHAR_TYPE oneChar = CHAR_TYPE(
'1'));
490 template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
492 bitset(
const std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>& str,
495 CHAR_TYPE zeroChar = CHAR_TYPE(
'0'),
496 CHAR_TYPE oneChar = CHAR_TYPE(
'1'));
508#if !defined(BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS)
509 template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
516 CHAR_TYPE zeroChar = CHAR_TYPE(
'0'),
517 CHAR_TYPE oneChar = CHAR_TYPE(
'1'));
519 template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
523 CHAR_TYPE zeroChar = CHAR_TYPE(
'0'),
524 CHAR_TYPE oneChar = CHAR_TYPE(
'1'));
647 bool test(
size_t pos) const;
649#if __cplusplus >= 201103L
655 template <
class CHAR_TYPE = char,
656 class TRAITS = char_traits<CHAR_TYPE>,
659 template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
662 CHAR_TYPE zero = CHAR_TYPE(
'0'),
663 CHAR_TYPE one = CHAR_TYPE(
'1'))
const;
669 unsigned long to_ulong()
const;
676template <std::
size_t N>
682template <std::
size_t N>
688template <std::
size_t N>
692template <
class CHAR_TYPE,
class TRAITS, std::
size_t N>
693std::basic_istream<CHAR_TYPE, TRAITS>&
696template <
class CHAR_TYPE,
class TRAITS, std::
size_t N>
697std::basic_ostream<CHAR_TYPE, TRAITS>&
709template <std::
size_t BITSETSIZE>
716template <std::
size_t BITSETSIZE>
719#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
720 : d_data{
static_cast<unsigned int>(val)}
733template <std::
size_t BITSETSIZE>
740template <std::
size_t BITSETSIZE>
743#if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
744 : d_data{
static_cast<unsigned int>(val),
745 static_cast<unsigned int>(val >> (
sizeof(
int) * CHAR_BIT))}
759template <std::
size_t N>
761bitset<N>::reference::reference(
unsigned int *i,
unsigned int offset)
769template <std::
size_t N>
771typename bitset<N>::reference&
775 *d_int_p |= (1 << d_offset);
778 *d_int_p &= ~(1 << d_offset);
783template <std::
size_t N>
789 *d_int_p |= (1 << d_offset);
792 *d_int_p &= ~(1 << d_offset);
797template <std::
size_t N>
802 *d_int_p ^= (1 << d_offset);
807template <std::
size_t N>
811 return ((*d_int_p & (1 << d_offset)) != 0);
814template <std::
size_t N>
818 return ((*d_int_p & (1 << d_offset)) == 0);
826template <std::
size_t N>
830 enum { k_VALUE = N % k_BITS_PER_INT ? 1 : 0 };
835template <std::
size_t N>
841template <std::
size_t N>
845 const unsigned int offset = N % k_BITS_PER_INT;
847 d_data[k_BITSETSIZE - 1] &= ~(~((
unsigned int)0) << offset);
850template <std::
size_t N>
851std::size_t bitset<N>::numOneSet(
unsigned int src)
const
854 unsigned input = src;
859 input -= (input >> 1) & 0x55555555;
864 const int mask = 0x33333333;
865 input = ((input >> 2) & mask) + (input & mask);
872 input = ((input >> 4) + input) & 0x0f0f0f0f;
879 input = (input >> 8) + input;
880 input = (input >> 16) + input;
882 return input & 0x000000ff;
885template <std::
size_t N>
886template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
887void bitset<N>::copyString(
888const std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>& str,
889typename std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type pos,
890typename std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type n,
894 typedef typename std::basic_string<CHAR_TYPE,
896 ALLOCATOR>::size_type size_type;
897 n = std::min(N, std::min(n, str.size() - pos));
898 for (size_type i = 0; i < n; ++i) {
899 typename TRAITS::int_type bit = TRAITS::to_int_type(
900 str[pos + n - i - 1]);
902 if (bit == oneChar) {
907 BloombergLP::bslstl::StdExceptUtil::throwInvalidArgument(
908 "string for bitset constructor "
909 "must be '0' or '1'");
914template <std::
size_t N>
915template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
916void bitset<N>::copyString(
925 ALLOCATOR>::size_type size_type;
926 n = std::min(N, std::min(n, str.
size() - pos));
927 for (size_type i = 0; i < n; ++i) {
928 typename TRAITS::int_type bit = TRAITS::to_int_type(
929 str[pos + n - i - 1]);
931 if (bit == oneChar) {
936 BloombergLP::bslstl::StdExceptUtil::throwInvalidArgument(
937 "string for bitset constructor "
938 "must be '0' or '1'");
944template <std::
size_t N>
950template <std::
size_t N>
956#if !defined(BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS)
957template <std::
size_t N>
958template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
961bitset(
const std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>& str,
962 typename std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type pos,
963 typename std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>::size_type n,
967template <std::
size_t N>
968template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
971bitset(
const std::basic_string<CHAR_TYPE, TRAITS, ALLOCATOR>& str,
980 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
981 "'pos > str.size()' for bitset constructor");
983 memset(d_data, 0, k_BITSETSIZE * k_BYTES_PER_INT);
984 copyString(str, pos, n, zeroChar, oneChar);
988#if !defined(BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS)
989template <std::
size_t N>
990template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
999template <std::
size_t N>
1000template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
1012 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
1013 "'pos > str.size()' for bitset constructor");
1015 memset(d_data, 0, k_BITSETSIZE * k_BYTES_PER_INT);
1016 copyString(str, pos, n, zeroChar, oneChar);
1020template <std::
size_t N>
1023 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1024 d_data[i] &=
rhs.d_data[i];
1029template <std::
size_t N>
1032 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1033 d_data[i] |=
rhs.d_data[i];
1038template <std::
size_t N>
1041 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1042 d_data[i] ^=
rhs.d_data[i];
1047template <std::
size_t N>
1053 const std::size_t shift = pos / k_BITS_PER_INT;
1054 const std::size_t offset = pos % k_BITS_PER_INT;
1057 memmove(d_data + shift,
1059 (k_BITSETSIZE - shift) * k_BYTES_PER_INT);
1060 memset(d_data, 0, shift * k_BYTES_PER_INT);
1064 for (std::size_t i = k_BITSETSIZE - 1; i > shift; --i) {
1065 d_data[i] = (d_data[i] << offset)
1066 | (d_data[i-1] >> (k_BITS_PER_INT - offset));
1068 d_data[shift] <<= offset;
1076template <std::
size_t N>
1082 const std::size_t shift = pos / k_BITS_PER_INT;
1083 const std::size_t offset = pos % k_BITS_PER_INT;
1088 (k_BITSETSIZE - shift) * k_BYTES_PER_INT);
1089 memset(d_data + k_BITSETSIZE - shift, 0, shift * k_BYTES_PER_INT);
1093 for (std::size_t i = 0; i < k_BITSETSIZE - shift - 1; ++i) {
1094 d_data[i] = (d_data[i] >> offset)
1095 | (d_data[i+1] << (k_BITS_PER_INT - offset));
1097 d_data[k_BITSETSIZE - shift - 1] >>= offset;
1105template <std::
size_t N>
1108 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1109 d_data[i] = ~d_data[i];
1115template <std::
size_t N>
1121 const std::size_t shift = pos / k_BITS_PER_INT;
1122 const std::size_t offset = pos % k_BITS_PER_INT;
1123 d_data[shift] ^= (1 << offset);
1127template <std::
size_t N>
1131 memset(d_data, 0, k_BITSETSIZE * k_BYTES_PER_INT);
1135template <std::
size_t N>
1141 const std::size_t shift = pos / k_BITS_PER_INT;
1142 const std::size_t offset = pos % k_BITS_PER_INT;
1143 d_data[shift] &= ~(1 << offset);
1147template <std::
size_t N>
1151 memset(d_data, 0xFF, k_BITSETSIZE * k_BYTES_PER_INT);
1156template <std::
size_t N>
1161 const std::size_t shift = pos / k_BITS_PER_INT;
1162 const std::size_t offset = pos % k_BITS_PER_INT;
1164 d_data[shift] |= (1 << offset);
1167 d_data[shift] &= ~(1 << offset);
1172template <std::
size_t N>
1178 const std::size_t shift = pos / k_BITS_PER_INT;
1179 const std::size_t offset = pos % k_BITS_PER_INT;
1181 static_cast<unsigned int>(offset));
1185template <std::
size_t N>
1195template <std::
size_t N>
1205template <std::
size_t N>
1213template <std::
size_t N>
1217#if defined(BSLSTL_BITSET_ALLOW_ASSERT_IN_CONSTEXPR)
1221 return 0 != (d_data[pos / k_BITS_PER_INT] & (1 << (pos % k_BITS_PER_INT)));
1224template <std::
size_t N>
1228 return memcmp(d_data,
rhs.d_data, k_BITSETSIZE * k_BYTES_PER_INT) == 0;
1231template <std::
size_t N>
1238template <std::
size_t N>
1241 for (std::size_t i = 0; i < N / k_BITS_PER_INT; ++i) {
1242 if (d_data[i] != ~0u) {
1247 const std::size_t modulo = N % k_BITS_PER_INT;
1250 const std::size_t mask = ((1u << modulo) - 1);
1251 return d_data[k_BITSETSIZE - 1] == mask;
1257template <std::
size_t N>
1260 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1261 if (d_data[i] != 0) {
1268template <std::
size_t N>
1271 std::size_t sum = 0;
1272 for (std::size_t i = 0; i < k_BITSETSIZE; ++i) {
1273 sum += numOneSet(d_data[i]);
1278template <std::
size_t N>
1285template <std::
size_t N>
1292template <std::
size_t N>
1298 BloombergLP::bslstl::StdExceptUtil::throwOutOfRange(
1299 "out_of_range in bsl::bitset<>::test");
1304template <std::
size_t N>
1305template <
class CHAR_TYPE,
class TRAITS,
class ALLOCATOR>
1308 CHAR_TYPE one)
const
1311 for (std::size_t i = 0; i < N; ++i) {
1312 if (this->
operator[](i)) {
1313 str[N - i - 1] = one;
1319template <std::
size_t N>
1323 k_INTS_IN_LONG =
sizeof(
unsigned long) /
sizeof(
int)
1326 for (std::size_t i = k_INTS_IN_LONG; i < k_BITSETSIZE; ++i) {
1329 BloombergLP::bslstl::StdExceptUtil::throwOverflowError(
1330 "overflow in bsl::bitset<>::to_ulong");
1334 unsigned long value = 0;
1335 const unsigned int numInts = (
unsigned int) k_INTS_IN_LONG
1336 < (
unsigned int) k_BITSETSIZE
1337 ? (
unsigned int) k_INTS_IN_LONG
1338 : (
unsigned int) k_BITSETSIZE;
1340 for (
unsigned int i = 0; i < numInts; ++i) {
1341 value |= (
unsigned long) d_data[i] << (k_BITS_PER_INT * i);
1347template <std::
size_t N>
1355template <std::
size_t N>
1363template <std::
size_t N>
1371template <
class CHAR_TYPE,
class TRAITS, std::
size_t N>
1372std::basic_istream<CHAR_TYPE, TRAITS>&
1375 typedef typename TRAITS::int_type int_type;
1380 typename std::basic_istream<CHAR_TYPE, TRAITS>::sentry sen(is);
1382 std::basic_streambuf<CHAR_TYPE, TRAITS> *buffer = is.rdbuf();
1383 for (std::size_t i = 0; i < N; ++i) {
1384 static int_type eof = TRAITS::eof();
1385 int_type cint = buffer->sbumpc();
1386 if (TRAITS::eq_int_type(cint, eof)) {
1387 is.setstate(std::ios_base::eofbit);
1391 CHAR_TYPE cchar = TRAITS::to_char_type(cint);
1392 char c = is.narrow(cchar,
'*');
1394 if (c ==
'0' || c ==
'1') {
1397 else if (TRAITS::eq_int_type(buffer->sputbackc(cchar), eof)) {
1398 is.setstate(std::ios_base::failbit);
1405 is.setstate(std::ios_base::failbit);
1414template <
class CHAR_TYPE,
class TRAITS, std::
size_t N>
1416std::basic_ostream<CHAR_TYPE, TRAITS>&
1417operator<<(std::basic_ostream<CHAR_TYPE, TRAITS>& os,
const bitset<N>& x)
1419 basic_string<CHAR_TYPE, TRAITS, allocator<CHAR_TYPE> > tmp (
1420 x.template
to_string<CHAR_TYPE, TRAITS, allocator<CHAR_TYPE> >());
1426#if defined(BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS)
1427# undef BSLSTL_BITSET_MSVC_CANNOT_PARSE_DEFAULTS_WITH_COLONS
Definition bslstl_bitset.h:267
Definition bslma_bslallocator.h:588
Definition bslstl_string.h:1252
size_type size() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_string.h:7292
AllocatorTraits::size_type size_type
Definition bslstl_string.h:1274
void push_back(CHAR_TYPE character)
Append the specified character to this string.
Definition bslstl_string.h:6330
static const size_type npos
Definition bslstl_string.h:1793
bool empty() const BSLS_KEYWORD_NOEXCEPT
Return true if this string has length 0, and false otherwise.
Definition bslstl_string.h:7331
void reserve(size_type newCapacity)
Definition bslstl_string.h:6020
Definition bslstl_bitset.h:353
reference & flip() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:800
bool operator~() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:816
reference & operator=(bool x) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:772
Definition bslstl_bitset.h:329
bitset operator>>(std::size_t pos) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1197
basic_string< CHAR_TYPE, TRAITS, ALLOCATOR > to_string(CHAR_TYPE zero=CHAR_TYPE('0'), CHAR_TYPE one=CHAR_TYPE('1')) const
Definition bslstl_bitset.h:1306
bool all() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1239
bool operator==(const bitset &rhs) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1226
bitset & set() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1149
bitset & operator^=(const bitset &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1039
bitset & flip() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1106
bitset & operator>>=(std::size_t pos) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1077
bool test(size_t pos) const
Definition bslstl_bitset.h:1294
unsigned long to_ulong() const
Definition bslstl_bitset.h:1320
BSLS_KEYWORD_CONSTEXPR bitset() BSLS_KEYWORD_NOEXCEPT
Create a bitset with all bits initialized to 0.
Definition bslstl_bitset.h:946
bool any() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1258
bitset & operator&=(const bitset &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1021
bitset operator~() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1207
bitset operator<<(std::size_t pos) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1187
reference operator[](std::size_t pos)
Definition bslstl_bitset.h:1174
bitset & operator|=(const bitset &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1030
std::size_t count() const BSLS_KEYWORD_NOEXCEPT
Return the number of bits in this bitset that have the value of 1.
Definition bslstl_bitset.h:1269
BSLS_KEYWORD_CONSTEXPR std::size_t size() const BSLS_KEYWORD_NOEXCEPT
Return the number of bits this bitset holds.
Definition bslstl_bitset.h:1287
bitset & operator<<=(std::size_t pos) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1048
bool operator!=(const bitset &rhs) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1233
bool none() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1280
bitset & reset() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1129
Definition bslstl_set.h:691
#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
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
Definition bdlat_valuetypefunctions.h:939
bitset< N > operator|(const bitset< N > &lhs, const bitset< N > &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1356
bitset< N > operator^(const bitset< N > &lhs, const bitset< N > &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1364
std::basic_istream< CHAR_TYPE, TRAITS > & operator>>(std::basic_istream< CHAR_TYPE, TRAITS > &is, bitset< N > &x)
Definition bslstl_bitset.h:1373
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
std::basic_ostream< CHAR_TYPE, TRAITS > & operator<<(std::basic_ostream< CHAR_TYPE, TRAITS > &os, const bitset< N > &x)
Definition bslstl_bitset.h:1417
string to_string(int value)
bitset< N > operator&(const bitset< N > &lhs, const bitset< N > &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_bitset.h:1348
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition bdldfp_decimal.h:5549
Definition bslstl_bitset.h:230
static void defaultInit(unsigned int *data, std::size_t size, unsigned long long val=0)
@ k_BITS_PER_INT
Definition bslstl_bitset.h:233
@ k_BYTES_PER_INT
Definition bslstl_bitset.h:232
@ k_INTS_IN_LLONG
Definition bslstl_bitset.h:235
@ k_INTS_IN_LONG
Definition bslstl_bitset.h:234
BSLMF_ASSERT(k_INTS_IN_LLONG==2)
Definition bslmf_integralconstant.h:261