xref: /llvm-project-15.0.7/libcxx/include/bitset (revision b4e88d4d)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- bitset ----------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_BITSET
113e519524SHoward Hinnant#define _LIBCPP_BITSET
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    bitset synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnantnamespace std {
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <size_t N>
223e519524SHoward Hinnantclass bitset
233e519524SHoward Hinnant{
243e519524SHoward Hinnantpublic:
253e519524SHoward Hinnant    // bit reference:
263e519524SHoward Hinnant    class reference
273e519524SHoward Hinnant    {
283e519524SHoward Hinnant        friend class bitset;
29d368a84cSHoward Hinnant        reference() noexcept;
303e519524SHoward Hinnant    public:
31d368a84cSHoward Hinnant        ~reference() noexcept;
32d368a84cSHoward Hinnant        reference& operator=(bool x) noexcept;           // for b[i] = x;
33d368a84cSHoward Hinnant        reference& operator=(const reference&) noexcept; // for b[i] = b[j];
34d368a84cSHoward Hinnant        bool operator~() const noexcept;                 // flips the bit
35d368a84cSHoward Hinnant        operator bool() const noexcept;                  // for x = b[i];
36d368a84cSHoward Hinnant        reference& flip() noexcept;                      // for b[i].flip();
373e519524SHoward Hinnant    };
383e519524SHoward Hinnant
393e519524SHoward Hinnant    // 23.3.5.1 constructors:
40d368a84cSHoward Hinnant    constexpr bitset() noexcept;
41d368a84cSHoward Hinnant    constexpr bitset(unsigned long long val) noexcept;
42d09f711dSHoward Hinnant    template <class charT>
43d09f711dSHoward Hinnant        explicit bitset(const charT* str,
44d09f711dSHoward Hinnant                        typename basic_string<charT>::size_type n = basic_string<charT>::npos,
45d09f711dSHoward Hinnant                        charT zero = charT('0'), charT one = charT('1'));
463e519524SHoward Hinnant    template<class charT, class traits, class Allocator>
473e519524SHoward Hinnant        explicit bitset(const basic_string<charT,traits,Allocator>& str,
483e519524SHoward Hinnant                        typename basic_string<charT,traits,Allocator>::size_type pos = 0,
493e519524SHoward Hinnant                        typename basic_string<charT,traits,Allocator>::size_type n =
503e519524SHoward Hinnant                                 basic_string<charT,traits,Allocator>::npos,
513e519524SHoward Hinnant                        charT zero = charT('0'), charT one = charT('1'));
523e519524SHoward Hinnant
533e519524SHoward Hinnant    // 23.3.5.2 bitset operations:
54d368a84cSHoward Hinnant    bitset& operator&=(const bitset& rhs) noexcept;
55d368a84cSHoward Hinnant    bitset& operator|=(const bitset& rhs) noexcept;
56d368a84cSHoward Hinnant    bitset& operator^=(const bitset& rhs) noexcept;
57d368a84cSHoward Hinnant    bitset& operator<<=(size_t pos) noexcept;
58d368a84cSHoward Hinnant    bitset& operator>>=(size_t pos) noexcept;
59d368a84cSHoward Hinnant    bitset& set() noexcept;
603e519524SHoward Hinnant    bitset& set(size_t pos, bool val = true);
61d368a84cSHoward Hinnant    bitset& reset() noexcept;
623e519524SHoward Hinnant    bitset& reset(size_t pos);
63d368a84cSHoward Hinnant    bitset operator~() const noexcept;
64d368a84cSHoward Hinnant    bitset& flip() noexcept;
653e519524SHoward Hinnant    bitset& flip(size_t pos);
663e519524SHoward Hinnant
673e519524SHoward Hinnant    // element access:
683e519524SHoward Hinnant    constexpr bool operator[](size_t pos) const; // for b[i];
693e519524SHoward Hinnant    reference operator[](size_t pos);            // for b[i];
703e519524SHoward Hinnant    unsigned long to_ulong() const;
713e519524SHoward Hinnant    unsigned long long to_ullong() const;
723e519524SHoward Hinnant    template <class charT, class traits, class Allocator>
733e519524SHoward Hinnant        basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const;
743e519524SHoward Hinnant    template <class charT, class traits>
753e519524SHoward Hinnant        basic_string<charT, traits, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const;
763e519524SHoward Hinnant    template <class charT>
773e519524SHoward Hinnant        basic_string<charT, char_traits<charT>, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const;
783e519524SHoward Hinnant    basic_string<char, char_traits<char>, allocator<char> > to_string(char zero = '0', char one = '1') const;
79d368a84cSHoward Hinnant    size_t count() const noexcept;
80d368a84cSHoward Hinnant    constexpr size_t size() const noexcept;
81d368a84cSHoward Hinnant    bool operator==(const bitset& rhs) const noexcept;
82d368a84cSHoward Hinnant    bool operator!=(const bitset& rhs) const noexcept;
833e519524SHoward Hinnant    bool test(size_t pos) const;
84d368a84cSHoward Hinnant    bool all() const noexcept;
85d368a84cSHoward Hinnant    bool any() const noexcept;
86d368a84cSHoward Hinnant    bool none() const noexcept;
87d368a84cSHoward Hinnant    bitset operator<<(size_t pos) const noexcept;
88d368a84cSHoward Hinnant    bitset operator>>(size_t pos) const noexcept;
893e519524SHoward Hinnant};
903e519524SHoward Hinnant
913e519524SHoward Hinnant// 23.3.5.3 bitset operators:
923e519524SHoward Hinnanttemplate <size_t N>
93d368a84cSHoward Hinnantbitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept;
943e519524SHoward Hinnant
953e519524SHoward Hinnanttemplate <size_t N>
96d368a84cSHoward Hinnantbitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept;
973e519524SHoward Hinnant
983e519524SHoward Hinnanttemplate <size_t N>
99d368a84cSHoward Hinnantbitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept;
1003e519524SHoward Hinnant
1013e519524SHoward Hinnanttemplate <class charT, class traits, size_t N>
1023e519524SHoward Hinnantbasic_istream<charT, traits>&
1033e519524SHoward Hinnantoperator>>(basic_istream<charT, traits>& is, bitset<N>& x);
1043e519524SHoward Hinnant
1053e519524SHoward Hinnanttemplate <class charT, class traits, size_t N>
1063e519524SHoward Hinnantbasic_ostream<charT, traits>&
1073e519524SHoward Hinnantoperator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
1083e519524SHoward Hinnant
1093e519524SHoward Hinnanttemplate <size_t N> struct hash<std::bitset<N>>;
1103e519524SHoward Hinnant
1113e519524SHoward Hinnant}  // std
1123e519524SHoward Hinnant
1133e519524SHoward Hinnant*/
1143e519524SHoward Hinnant
1153e519524SHoward Hinnant#include <__config>
1163e519524SHoward Hinnant#include <__bit_reference>
1173e519524SHoward Hinnant#include <__functional_base>
118bfbd73f8SArthur O'Dwyer#include <climits>
119bfbd73f8SArthur O'Dwyer#include <cstddef>
120bfbd73f8SArthur O'Dwyer#include <iosfwd>
121bfbd73f8SArthur O'Dwyer#include <stdexcept>
122bfbd73f8SArthur O'Dwyer#include <string>
1233e519524SHoward Hinnant
124a016efb1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
125a016efb1SEric Fiselier#pragma GCC system_header
126a016efb1SEric Fiselier#endif
127a016efb1SEric Fiselier
128a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
129a016efb1SEric Fiselier#include <__undef_macros>
130a016efb1SEric Fiselier
131ab4f4382SHoward Hinnant
1323e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1333e519524SHoward Hinnant
1343e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
135a7744562SHoward Hinnantclass __bitset;
136a7744562SHoward Hinnant
137a7744562SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
138a7744562SHoward Hinnantstruct __has_storage_type<__bitset<_N_words, _Size> >
139a7744562SHoward Hinnant{
140a7744562SHoward Hinnant    static const bool value = true;
141a7744562SHoward Hinnant};
142a7744562SHoward Hinnant
143a7744562SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
1443e519524SHoward Hinnantclass __bitset
1453e519524SHoward Hinnant{
1463e519524SHoward Hinnantpublic:
1473e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
1483e519524SHoward Hinnant    typedef size_t                 size_type;
1490ae9efebSHoward Hinnant    typedef size_type              __storage_type;
1503e519524SHoward Hinnantprotected:
1513e519524SHoward Hinnant    typedef __bitset __self;
1523e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
1533e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
1543e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
1553e519524SHoward Hinnant
1563e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
1573e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
1583e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
1593e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
1607ee27136SHoward Hinnant    friend struct __bit_array<__bitset>;
1613e519524SHoward Hinnant
1623e519524SHoward Hinnant    __storage_type __first_[_N_words];
1633e519524SHoward Hinnant
1643e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
1653e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
1663e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
1673e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
1683e519524SHoward Hinnant
169906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
170eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
171906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
172eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
1733e519524SHoward Hinnant
174d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
1753e519524SHoward Hinnant        {return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
176eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
1773e519524SHoward Hinnant        {return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
178d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
1793e519524SHoward Hinnant        {return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
180d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
1813e519524SHoward Hinnant        {return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
1823e519524SHoward Hinnant
183906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
184d368a84cSHoward Hinnant    void operator&=(const __bitset& __v) _NOEXCEPT;
185906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
186d368a84cSHoward Hinnant    void operator|=(const __bitset& __v) _NOEXCEPT;
187906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
188d368a84cSHoward Hinnant    void operator^=(const __bitset& __v) _NOEXCEPT;
1893e519524SHoward Hinnant
190d368a84cSHoward Hinnant    void flip() _NOEXCEPT;
1913e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const
1923e519524SHoward Hinnant        {return to_ulong(integral_constant<bool, _Size < sizeof(unsigned long) * CHAR_BIT>());}
1933e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const
1943e519524SHoward Hinnant        {return to_ullong(integral_constant<bool, _Size < sizeof(unsigned long long) * CHAR_BIT>());}
1953e519524SHoward Hinnant
196d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
197d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
198906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
199d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT;
2003e519524SHoward Hinnantprivate:
201046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
202d368a84cSHoward Hinnant    void __init(unsigned long long __v, false_type) _NOEXCEPT;
20302b8e949SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
204d368a84cSHoward Hinnant    void __init(unsigned long long __v, true_type) _NOEXCEPT;
205046492b9SEric Fiselier#endif // _LIBCPP_CXX03_LANG
2063e519524SHoward Hinnant    unsigned long to_ulong(false_type) const;
207906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2083e519524SHoward Hinnant    unsigned long to_ulong(true_type) const;
2093e519524SHoward Hinnant    unsigned long long to_ullong(false_type) const;
210906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2113e519524SHoward Hinnant    unsigned long long to_ullong(true_type) const;
212906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2133e519524SHoward Hinnant    unsigned long long to_ullong(true_type, false_type) const;
2143e519524SHoward Hinnant    unsigned long long to_ullong(true_type, true_type) const;
2153e519524SHoward Hinnant};
2163e519524SHoward Hinnant
2173e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
218906c872dSEvgeniy Stepanovinline
219eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
220d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__bitset() _NOEXCEPT
221046492b9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
222eeac9fcfSHoward Hinnant    : __first_{0}
223eeac9fcfSHoward Hinnant#endif
2243e519524SHoward Hinnant{
225046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
226ce48a113SHoward Hinnant    _VSTD::fill_n(__first_, _N_words, __storage_type(0));
227eeac9fcfSHoward Hinnant#endif
2283e519524SHoward Hinnant}
2293e519524SHoward Hinnant
230046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
231eeac9fcfSHoward Hinnant
2323e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
2333e519524SHoward Hinnantvoid
234c206366fSHoward Hinnant__bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT
2353e519524SHoward Hinnant{
2363e519524SHoward Hinnant    __storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)];
237ea44ee20SMarshall Clow    size_t __sz = _Size;
238ea44ee20SMarshall Clow    for (size_t __i = 0; __i < sizeof(__t)/sizeof(__t[0]); ++__i, __v >>= __bits_per_word, __sz -= __bits_per_word )
239ea44ee20SMarshall Clow        if ( __sz < __bits_per_word)
240ea44ee20SMarshall Clow            __t[__i] = static_cast<__storage_type>(__v) & ( 1ULL << __sz ) - 1;
241ea44ee20SMarshall Clow        else
2423e519524SHoward Hinnant            __t[__i] = static_cast<__storage_type>(__v);
243ea44ee20SMarshall Clow
244ce48a113SHoward Hinnant    _VSTD::copy(__t, __t + sizeof(__t)/sizeof(__t[0]), __first_);
245ce48a113SHoward Hinnant    _VSTD::fill(__first_ + sizeof(__t)/sizeof(__t[0]), __first_ + sizeof(__first_)/sizeof(__first_[0]),
2463e519524SHoward Hinnant               __storage_type(0));
2473e519524SHoward Hinnant}
2483e519524SHoward Hinnant
2493e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
2503e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2513e519524SHoward Hinnantvoid
252c206366fSHoward Hinnant__bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT
2533e519524SHoward Hinnant{
2543e519524SHoward Hinnant    __first_[0] = __v;
255ea44ee20SMarshall Clow    if (_Size < __bits_per_word)
256ea44ee20SMarshall Clow        __first_[0] &= ( 1ULL << _Size ) - 1;
257ea44ee20SMarshall Clow
258ce48a113SHoward Hinnant    _VSTD::fill(__first_ + 1, __first_ + sizeof(__first_)/sizeof(__first_[0]), __storage_type(0));
2593e519524SHoward Hinnant}
2603e519524SHoward Hinnant
261046492b9SEric Fiselier#endif // _LIBCPP_CXX03_LANG
262eeac9fcfSHoward Hinnant
2633e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
264906c872dSEvgeniy Stepanovinline
265eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
266d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
267046492b9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2681d1b46cdSNico Weber#if __SIZEOF_SIZE_T__ == 8
269eeac9fcfSHoward Hinnant    : __first_{__v}
2701d1b46cdSNico Weber#elif __SIZEOF_SIZE_T__ == 4
271ea44ee20SMarshall Clow    : __first_{static_cast<__storage_type>(__v),
272ea44ee20SMarshall Clow                _Size >= 2 * __bits_per_word ? static_cast<__storage_type>(__v >> __bits_per_word)
273ea44ee20SMarshall Clow                : static_cast<__storage_type>((__v >> __bits_per_word) & (__storage_type(1) << (_Size - __bits_per_word)) - 1)}
2743fb6c6e5SHoward Hinnant#else
27553b9ee06SHoward Hinnant#error This constructor has not been ported to this platform
27653b9ee06SHoward Hinnant#endif
277eeac9fcfSHoward Hinnant#endif
2783e519524SHoward Hinnant{
279046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
2803e519524SHoward Hinnant    __init(__v, integral_constant<bool, sizeof(unsigned long long) == sizeof(__storage_type)>());
281eeac9fcfSHoward Hinnant#endif
2823e519524SHoward Hinnant}
2833e519524SHoward Hinnant
2843e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
285906c872dSEvgeniy Stepanovinline
2863e519524SHoward Hinnantvoid
287d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
2883e519524SHoward Hinnant{
2893e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
2903e519524SHoward Hinnant        __first_[__i] &= __v.__first_[__i];
2913e519524SHoward Hinnant}
2923e519524SHoward Hinnant
2933e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
294906c872dSEvgeniy Stepanovinline
2953e519524SHoward Hinnantvoid
296d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
2973e519524SHoward Hinnant{
2983e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
2993e519524SHoward Hinnant        __first_[__i] |= __v.__first_[__i];
3003e519524SHoward Hinnant}
3013e519524SHoward Hinnant
3023e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
303906c872dSEvgeniy Stepanovinline
3043e519524SHoward Hinnantvoid
305d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
3063e519524SHoward Hinnant{
3073e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
3083e519524SHoward Hinnant        __first_[__i] ^= __v.__first_[__i];
3093e519524SHoward Hinnant}
3103e519524SHoward Hinnant
3113e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3123e519524SHoward Hinnantvoid
313d368a84cSHoward Hinnant__bitset<_N_words, _Size>::flip() _NOEXCEPT
3143e519524SHoward Hinnant{
3153e519524SHoward Hinnant    // do middle whole words
3163e519524SHoward Hinnant    size_type __n = _Size;
3173e519524SHoward Hinnant    __storage_pointer __p = __first_;
3183e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3193e519524SHoward Hinnant        *__p = ~*__p;
3203e519524SHoward Hinnant    // do last partial word
3213e519524SHoward Hinnant    if (__n > 0)
3223e519524SHoward Hinnant    {
3233e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3243e519524SHoward Hinnant        __storage_type __b = *__p & __m;
3253e519524SHoward Hinnant        *__p &= ~__m;
3263e519524SHoward Hinnant        *__p |= ~__b & __m;
3273e519524SHoward Hinnant    }
3283e519524SHoward Hinnant}
3293e519524SHoward Hinnant
3303e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3313e519524SHoward Hinnantunsigned long
3323e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ulong(false_type) const
3333e519524SHoward Hinnant{
3343e519524SHoward Hinnant    const_iterator __e = __make_iter(_Size);
335ce48a113SHoward Hinnant    const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true);
3363e519524SHoward Hinnant    if (__i != __e)
337d437fa5cSMarshall Clow        __throw_overflow_error("bitset to_ulong overflow error");
338d437fa5cSMarshall Clow
3393e519524SHoward Hinnant    return __first_[0];
3403e519524SHoward Hinnant}
3413e519524SHoward Hinnant
3423e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
343906c872dSEvgeniy Stepanovinline
3443e519524SHoward Hinnantunsigned long
3453e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ulong(true_type) const
3463e519524SHoward Hinnant{
3473e519524SHoward Hinnant    return __first_[0];
3483e519524SHoward Hinnant}
3493e519524SHoward Hinnant
3503e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3513e519524SHoward Hinnantunsigned long long
3523e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(false_type) const
3533e519524SHoward Hinnant{
3543e519524SHoward Hinnant    const_iterator __e = __make_iter(_Size);
355ce48a113SHoward Hinnant    const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true);
3563e519524SHoward Hinnant    if (__i != __e)
357d437fa5cSMarshall Clow        __throw_overflow_error("bitset to_ullong overflow error");
358d437fa5cSMarshall Clow
3593e519524SHoward Hinnant    return to_ullong(true_type());
3603e519524SHoward Hinnant}
3613e519524SHoward Hinnant
3623e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
363906c872dSEvgeniy Stepanovinline
3643e519524SHoward Hinnantunsigned long long
3653e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type) const
3663e519524SHoward Hinnant{
3673e519524SHoward Hinnant    return to_ullong(true_type(), integral_constant<bool, sizeof(__storage_type) < sizeof(unsigned long long)>());
3683e519524SHoward Hinnant}
3693e519524SHoward Hinnant
3703e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
371906c872dSEvgeniy Stepanovinline
3723e519524SHoward Hinnantunsigned long long
3733e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const
3743e519524SHoward Hinnant{
3753e519524SHoward Hinnant    return __first_[0];
3763e519524SHoward Hinnant}
3773e519524SHoward Hinnant
3783e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3793e519524SHoward Hinnantunsigned long long
3803e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type, true_type) const
3813e519524SHoward Hinnant{
3823e519524SHoward Hinnant    unsigned long long __r = __first_[0];
383d586f92cSArthur O'Dwyer    for (size_t __i = 1; __i < sizeof(unsigned long long) / sizeof(__storage_type); ++__i)
3843e519524SHoward Hinnant        __r |= static_cast<unsigned long long>(__first_[__i]) << (sizeof(__storage_type) * CHAR_BIT);
3853e519524SHoward Hinnant    return __r;
3863e519524SHoward Hinnant}
3873e519524SHoward Hinnant
3883e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3893e519524SHoward Hinnantbool
390d368a84cSHoward Hinnant__bitset<_N_words, _Size>::all() const _NOEXCEPT
3913e519524SHoward Hinnant{
3923e519524SHoward Hinnant    // do middle whole words
3933e519524SHoward Hinnant    size_type __n = _Size;
3943e519524SHoward Hinnant    __const_storage_pointer __p = __first_;
3953e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3963e519524SHoward Hinnant        if (~*__p)
3973e519524SHoward Hinnant            return false;
3983e519524SHoward Hinnant    // do last partial word
3993e519524SHoward Hinnant    if (__n > 0)
4003e519524SHoward Hinnant    {
4013e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4023e519524SHoward Hinnant        if (~*__p & __m)
4033e519524SHoward Hinnant            return false;
4043e519524SHoward Hinnant    }
4053e519524SHoward Hinnant    return true;
4063e519524SHoward Hinnant}
4073e519524SHoward Hinnant
4083e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
4093e519524SHoward Hinnantbool
410d368a84cSHoward Hinnant__bitset<_N_words, _Size>::any() const _NOEXCEPT
4113e519524SHoward Hinnant{
4123e519524SHoward Hinnant    // do middle whole words
4133e519524SHoward Hinnant    size_type __n = _Size;
4143e519524SHoward Hinnant    __const_storage_pointer __p = __first_;
4153e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
4163e519524SHoward Hinnant        if (*__p)
4173e519524SHoward Hinnant            return true;
4183e519524SHoward Hinnant    // do last partial word
4193e519524SHoward Hinnant    if (__n > 0)
4203e519524SHoward Hinnant    {
4213e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4223e519524SHoward Hinnant        if (*__p & __m)
4233e519524SHoward Hinnant            return true;
4243e519524SHoward Hinnant    }
4253e519524SHoward Hinnant    return false;
4263e519524SHoward Hinnant}
4273e519524SHoward Hinnant
4283e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
429906c872dSEvgeniy Stepanovinline
4303e519524SHoward Hinnantsize_t
431d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT
4323e519524SHoward Hinnant{
4333e519524SHoward Hinnant    size_t __h = 0;
4343e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
4353e519524SHoward Hinnant        __h ^= __first_[__i];
4363e519524SHoward Hinnant    return __h;
4373e519524SHoward Hinnant}
4383e519524SHoward Hinnant
4393e519524SHoward Hinnanttemplate <size_t _Size>
4403e519524SHoward Hinnantclass __bitset<1, _Size>
4413e519524SHoward Hinnant{
4423e519524SHoward Hinnantpublic:
4433e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
4443e519524SHoward Hinnant    typedef size_t                 size_type;
4450ae9efebSHoward Hinnant    typedef size_type              __storage_type;
4463e519524SHoward Hinnantprotected:
4473e519524SHoward Hinnant    typedef __bitset __self;
4483e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
4493e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
4503e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
4513e519524SHoward Hinnant
4523e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
4533e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
4543e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
4553e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
4567ee27136SHoward Hinnant    friend struct __bit_array<__bitset>;
4573e519524SHoward Hinnant
4583e519524SHoward Hinnant    __storage_type __first_;
4593e519524SHoward Hinnant
4603e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
4613e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
4623e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
4633e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
4643e519524SHoward Hinnant
465906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
466eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
467906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
468eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
4693e519524SHoward Hinnant
470d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
4713e519524SHoward Hinnant        {return reference(&__first_, __storage_type(1) << __pos);}
472eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
4733e519524SHoward Hinnant        {return const_reference(&__first_, __storage_type(1) << __pos);}
474d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
4753e519524SHoward Hinnant        {return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
476d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
4773e519524SHoward Hinnant        {return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
4783e519524SHoward Hinnant
479906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
480d368a84cSHoward Hinnant    void operator&=(const __bitset& __v) _NOEXCEPT;
481906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
482d368a84cSHoward Hinnant    void operator|=(const __bitset& __v) _NOEXCEPT;
483906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
484d368a84cSHoward Hinnant    void operator^=(const __bitset& __v) _NOEXCEPT;
4853e519524SHoward Hinnant
486906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
487d368a84cSHoward Hinnant    void flip() _NOEXCEPT;
4883e519524SHoward Hinnant
489906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4903e519524SHoward Hinnant    unsigned long to_ulong() const;
491906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4923e519524SHoward Hinnant    unsigned long long to_ullong() const;
4933e519524SHoward Hinnant
494906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
495d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
496906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
497d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
4983e519524SHoward Hinnant
499906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
500d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT;
5013e519524SHoward Hinnant};
5023e519524SHoward Hinnant
5033e519524SHoward Hinnanttemplate <size_t _Size>
504906c872dSEvgeniy Stepanovinline
505eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
506d368a84cSHoward Hinnant__bitset<1, _Size>::__bitset() _NOEXCEPT
5073e519524SHoward Hinnant    : __first_(0)
5083e519524SHoward Hinnant{
5093e519524SHoward Hinnant}
5103e519524SHoward Hinnant
5113e519524SHoward Hinnanttemplate <size_t _Size>
512906c872dSEvgeniy Stepanovinline
513eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
514d368a84cSHoward Hinnant__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
51514d7aac1SMarshall Clow    : __first_(
51614d7aac1SMarshall Clow        _Size == __bits_per_word ? static_cast<__storage_type>(__v)
51714d7aac1SMarshall Clow                                 : static_cast<__storage_type>(__v) & ((__storage_type(1) << _Size) - 1)
51814d7aac1SMarshall Clow    )
5193e519524SHoward Hinnant{
5203e519524SHoward Hinnant}
5213e519524SHoward Hinnant
5223e519524SHoward Hinnanttemplate <size_t _Size>
523906c872dSEvgeniy Stepanovinline
5243e519524SHoward Hinnantvoid
525d368a84cSHoward Hinnant__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
5263e519524SHoward Hinnant{
5273e519524SHoward Hinnant    __first_ &= __v.__first_;
5283e519524SHoward Hinnant}
5293e519524SHoward Hinnant
5303e519524SHoward Hinnanttemplate <size_t _Size>
531906c872dSEvgeniy Stepanovinline
5323e519524SHoward Hinnantvoid
533d368a84cSHoward Hinnant__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
5343e519524SHoward Hinnant{
5353e519524SHoward Hinnant    __first_ |= __v.__first_;
5363e519524SHoward Hinnant}
5373e519524SHoward Hinnant
5383e519524SHoward Hinnanttemplate <size_t _Size>
539906c872dSEvgeniy Stepanovinline
5403e519524SHoward Hinnantvoid
541d368a84cSHoward Hinnant__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
5423e519524SHoward Hinnant{
5433e519524SHoward Hinnant    __first_ ^= __v.__first_;
5443e519524SHoward Hinnant}
5453e519524SHoward Hinnant
5463e519524SHoward Hinnanttemplate <size_t _Size>
547906c872dSEvgeniy Stepanovinline
5483e519524SHoward Hinnantvoid
549d368a84cSHoward Hinnant__bitset<1, _Size>::flip() _NOEXCEPT
5503e519524SHoward Hinnant{
5513e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5523e519524SHoward Hinnant    __first_ = ~__first_;
5533e519524SHoward Hinnant    __first_ &= __m;
5543e519524SHoward Hinnant}
5553e519524SHoward Hinnant
5563e519524SHoward Hinnanttemplate <size_t _Size>
557906c872dSEvgeniy Stepanovinline
5583e519524SHoward Hinnantunsigned long
5593e519524SHoward Hinnant__bitset<1, _Size>::to_ulong() const
5603e519524SHoward Hinnant{
5613e519524SHoward Hinnant    return __first_;
5623e519524SHoward Hinnant}
5633e519524SHoward Hinnant
5643e519524SHoward Hinnanttemplate <size_t _Size>
565906c872dSEvgeniy Stepanovinline
5663e519524SHoward Hinnantunsigned long long
5673e519524SHoward Hinnant__bitset<1, _Size>::to_ullong() const
5683e519524SHoward Hinnant{
5693e519524SHoward Hinnant    return __first_;
5703e519524SHoward Hinnant}
5713e519524SHoward Hinnant
5723e519524SHoward Hinnanttemplate <size_t _Size>
573906c872dSEvgeniy Stepanovinline
5743e519524SHoward Hinnantbool
575d368a84cSHoward Hinnant__bitset<1, _Size>::all() const _NOEXCEPT
5763e519524SHoward Hinnant{
5773e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5783e519524SHoward Hinnant    return !(~__first_ & __m);
5793e519524SHoward Hinnant}
5803e519524SHoward Hinnant
5813e519524SHoward Hinnanttemplate <size_t _Size>
582906c872dSEvgeniy Stepanovinline
5833e519524SHoward Hinnantbool
584d368a84cSHoward Hinnant__bitset<1, _Size>::any() const _NOEXCEPT
5853e519524SHoward Hinnant{
5863e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5873e519524SHoward Hinnant    return __first_ & __m;
5883e519524SHoward Hinnant}
5893e519524SHoward Hinnant
5903e519524SHoward Hinnanttemplate <size_t _Size>
591906c872dSEvgeniy Stepanovinline
5923e519524SHoward Hinnantsize_t
593d368a84cSHoward Hinnant__bitset<1, _Size>::__hash_code() const _NOEXCEPT
5943e519524SHoward Hinnant{
5953e519524SHoward Hinnant    return __first_;
5963e519524SHoward Hinnant}
5973e519524SHoward Hinnant
5983e519524SHoward Hinnanttemplate <>
5993e519524SHoward Hinnantclass __bitset<0, 0>
6003e519524SHoward Hinnant{
6013e519524SHoward Hinnantpublic:
6023e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
6033e519524SHoward Hinnant    typedef size_t                 size_type;
6040ae9efebSHoward Hinnant    typedef size_type              __storage_type;
6053e519524SHoward Hinnantprotected:
6063e519524SHoward Hinnant    typedef __bitset __self;
6073e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
6083e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
6093e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
6103e519524SHoward Hinnant
6113e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
6123e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
6133e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
6143e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
615c206366fSHoward Hinnant    friend struct __bit_array<__bitset>;
6163e519524SHoward Hinnant
6173e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
6183e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
6193e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
6203e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
6213e519524SHoward Hinnant
622906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
623eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
624906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
625eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT;
6263e519524SHoward Hinnant
627d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT
628527a7fdfSBruce Mitchener        {return reference(nullptr, 1);}
629eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t) const _NOEXCEPT
630527a7fdfSBruce Mitchener        {return const_reference(nullptr, 1);}
631c206366fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t) _NOEXCEPT
632527a7fdfSBruce Mitchener        {return iterator(nullptr, 0);}
633c206366fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t) const _NOEXCEPT
634527a7fdfSBruce Mitchener        {return const_iterator(nullptr, 0);}
6353e519524SHoward Hinnant
636d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator&=(const __bitset&) _NOEXCEPT {}
637d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator|=(const __bitset&) _NOEXCEPT {}
638d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator^=(const __bitset&) _NOEXCEPT {}
6393e519524SHoward Hinnant
640d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {}
6413e519524SHoward Hinnant
6423e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const {return 0;}
6433e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const {return 0;}
6443e519524SHoward Hinnant
645d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool all() const _NOEXCEPT {return true;}
646d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool any() const _NOEXCEPT {return false;}
6473e519524SHoward Hinnant
648d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;}
6493e519524SHoward Hinnant};
6503e519524SHoward Hinnant
651906c872dSEvgeniy Stepanovinline
652eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
653d368a84cSHoward Hinnant__bitset<0, 0>::__bitset() _NOEXCEPT
6543e519524SHoward Hinnant{
6553e519524SHoward Hinnant}
6563e519524SHoward Hinnant
657906c872dSEvgeniy Stepanovinline
658eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
659d368a84cSHoward Hinnant__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
6603e519524SHoward Hinnant{
6613e519524SHoward Hinnant}
6623e519524SHoward Hinnant
663e2f2d1edSEric Fiseliertemplate <size_t _Size> class _LIBCPP_TEMPLATE_VIS bitset;
66489dd1dd2SEric Fiseliertemplate <size_t _Size> struct hash<bitset<_Size> >;
6653e519524SHoward Hinnant
6663e519524SHoward Hinnanttemplate <size_t _Size>
667e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS bitset
6683e519524SHoward Hinnant    : private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size>
6693e519524SHoward Hinnant{
67053b9ee06SHoward Hinnantpublic:
6713e519524SHoward Hinnant    static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1;
6723e519524SHoward Hinnant    typedef __bitset<__n_words, _Size> base;
6733e519524SHoward Hinnant
6743e519524SHoward Hinnantpublic:
6753e519524SHoward Hinnant    typedef typename base::reference       reference;
6763e519524SHoward Hinnant    typedef typename base::const_reference const_reference;
6773e519524SHoward Hinnant
6783e519524SHoward Hinnant    // 23.3.5.1 constructors:
679eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
680eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
681eeac9fcfSHoward Hinnant        bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
682*b4e88d4dSLouis Dionne    template<class _CharT, class = __enable_if_t<_IsCharLikeType<_CharT>::value> >
683d09f711dSHoward Hinnant        explicit bitset(const _CharT* __str,
684d09f711dSHoward Hinnant                        typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
685d09f711dSHoward Hinnant                        _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
6863e519524SHoward Hinnant    template<class _CharT, class _Traits, class _Allocator>
6873e519524SHoward Hinnant        explicit bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
6883e519524SHoward Hinnant                        typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos = 0,
6893e519524SHoward Hinnant                        typename basic_string<_CharT,_Traits,_Allocator>::size_type __n =
6903e519524SHoward Hinnant                                (basic_string<_CharT,_Traits,_Allocator>::npos),
6913e519524SHoward Hinnant                        _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
6923e519524SHoward Hinnant
6933e519524SHoward Hinnant    // 23.3.5.2 bitset operations:
694906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
695d368a84cSHoward Hinnant    bitset& operator&=(const bitset& __rhs) _NOEXCEPT;
696906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
697d368a84cSHoward Hinnant    bitset& operator|=(const bitset& __rhs) _NOEXCEPT;
698906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
699d368a84cSHoward Hinnant    bitset& operator^=(const bitset& __rhs) _NOEXCEPT;
700d368a84cSHoward Hinnant    bitset& operator<<=(size_t __pos) _NOEXCEPT;
701d368a84cSHoward Hinnant    bitset& operator>>=(size_t __pos) _NOEXCEPT;
702906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
703d368a84cSHoward Hinnant    bitset& set() _NOEXCEPT;
7043e519524SHoward Hinnant    bitset& set(size_t __pos, bool __val = true);
705906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
706d368a84cSHoward Hinnant    bitset& reset() _NOEXCEPT;
7073e519524SHoward Hinnant    bitset& reset(size_t __pos);
708906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
709d368a84cSHoward Hinnant    bitset  operator~() const _NOEXCEPT;
710906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
711d368a84cSHoward Hinnant    bitset& flip() _NOEXCEPT;
7123e519524SHoward Hinnant    bitset& flip(size_t __pos);
7133e519524SHoward Hinnant
7143e519524SHoward Hinnant    // element access:
715eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
716eeac9fcfSHoward Hinnant                              const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
7173e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY       reference operator[](size_t __p)       {return base::__make_ref(__p);}
718906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7193e519524SHoward Hinnant    unsigned long to_ulong() const;
720906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7213e519524SHoward Hinnant    unsigned long long to_ullong() const;
7223e519524SHoward Hinnant    template <class _CharT, class _Traits, class _Allocator>
7233e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'),
7243e519524SHoward Hinnant                                                            _CharT __one = _CharT('1')) const;
7253e519524SHoward Hinnant    template <class _CharT, class _Traits>
726906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
7273e519524SHoward Hinnant        basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
7283e519524SHoward Hinnant                                                                    _CharT __one = _CharT('1')) const;
7293e519524SHoward Hinnant    template <class _CharT>
730906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
7313e519524SHoward Hinnant        basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
7323e519524SHoward Hinnant                                                                                _CharT __one = _CharT('1')) const;
733906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7343e519524SHoward Hinnant    basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0',
7353e519524SHoward Hinnant                                                                      char __one = '1') const;
736906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
737d368a84cSHoward Hinnant    size_t count() const _NOEXCEPT;
738eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;}
739906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
740d368a84cSHoward Hinnant    bool operator==(const bitset& __rhs) const _NOEXCEPT;
741906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
742d368a84cSHoward Hinnant    bool operator!=(const bitset& __rhs) const _NOEXCEPT;
7433e519524SHoward Hinnant    bool test(size_t __pos) const;
744906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
745d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
746906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
747d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
748d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();}
749906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
750d368a84cSHoward Hinnant    bitset operator<<(size_t __pos) const _NOEXCEPT;
751906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
752d368a84cSHoward Hinnant    bitset operator>>(size_t __pos) const _NOEXCEPT;
7533e519524SHoward Hinnant
7543e519524SHoward Hinnantprivate:
7553e519524SHoward Hinnant
756fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
757d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT {return base::__hash_code();}
7583e519524SHoward Hinnant
7593e519524SHoward Hinnant    friend struct hash<bitset>;
7603e519524SHoward Hinnant};
7613e519524SHoward Hinnant
7623e519524SHoward Hinnanttemplate <size_t _Size>
763d1523f7aSEric Fiseliertemplate<class _CharT, class>
764d09f711dSHoward Hinnantbitset<_Size>::bitset(const _CharT* __str,
765d09f711dSHoward Hinnant                      typename basic_string<_CharT>::size_type __n,
766d09f711dSHoward Hinnant                      _CharT __zero, _CharT __one)
7673e519524SHoward Hinnant{
768ce48a113SHoward Hinnant    size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str));
7693e519524SHoward Hinnant    for (size_t __i = 0; __i < __rlen; ++__i)
770d09f711dSHoward Hinnant        if (__str[__i] != __zero && __str[__i] != __one)
771d437fa5cSMarshall Clow            __throw_invalid_argument("bitset string ctor has invalid argument");
772d437fa5cSMarshall Clow
773c003db1fSHoward Hinnant    size_t _Mp = _VSTD::min(__rlen, _Size);
7743e519524SHoward Hinnant    size_t __i = 0;
775c003db1fSHoward Hinnant    for (; __i < _Mp; ++__i)
7763e519524SHoward Hinnant    {
777c003db1fSHoward Hinnant        _CharT __c = __str[_Mp - 1 - __i];
7787402ec8fSShu Tian        (*this)[__i] = (__c == __one);
7793e519524SHoward Hinnant    }
780ce48a113SHoward Hinnant    _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
7813e519524SHoward Hinnant}
7823e519524SHoward Hinnant
7833e519524SHoward Hinnanttemplate <size_t _Size>
7843e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
7853e519524SHoward Hinnantbitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
7863e519524SHoward Hinnant       typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos,
7873e519524SHoward Hinnant       typename basic_string<_CharT,_Traits,_Allocator>::size_type __n,
7883e519524SHoward Hinnant       _CharT __zero, _CharT __one)
7893e519524SHoward Hinnant{
7903e519524SHoward Hinnant    if (__pos > __str.size())
791d437fa5cSMarshall Clow        __throw_out_of_range("bitset string pos out of range");
792d437fa5cSMarshall Clow
793ce48a113SHoward Hinnant    size_t __rlen = _VSTD::min(__n, __str.size() - __pos);
7943e519524SHoward Hinnant    for (size_t __i = __pos; __i < __pos + __rlen; ++__i)
7953e519524SHoward Hinnant        if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one))
796d437fa5cSMarshall Clow            __throw_invalid_argument("bitset string ctor has invalid argument");
797d437fa5cSMarshall Clow
798c003db1fSHoward Hinnant    size_t _Mp = _VSTD::min(__rlen, _Size);
7993e519524SHoward Hinnant    size_t __i = 0;
800c003db1fSHoward Hinnant    for (; __i < _Mp; ++__i)
8013e519524SHoward Hinnant    {
802c003db1fSHoward Hinnant        _CharT __c = __str[__pos + _Mp - 1 - __i];
8037402ec8fSShu Tian        (*this)[__i] = _Traits::eq(__c, __one);
8043e519524SHoward Hinnant    }
805ce48a113SHoward Hinnant    _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
8063e519524SHoward Hinnant}
8073e519524SHoward Hinnant
8083e519524SHoward Hinnanttemplate <size_t _Size>
809906c872dSEvgeniy Stepanovinline
8103e519524SHoward Hinnantbitset<_Size>&
811d368a84cSHoward Hinnantbitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT
8123e519524SHoward Hinnant{
8133e519524SHoward Hinnant    base::operator&=(__rhs);
8143e519524SHoward Hinnant    return *this;
8153e519524SHoward Hinnant}
8163e519524SHoward Hinnant
8173e519524SHoward Hinnanttemplate <size_t _Size>
818906c872dSEvgeniy Stepanovinline
8193e519524SHoward Hinnantbitset<_Size>&
820d368a84cSHoward Hinnantbitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT
8213e519524SHoward Hinnant{
8223e519524SHoward Hinnant    base::operator|=(__rhs);
8233e519524SHoward Hinnant    return *this;
8243e519524SHoward Hinnant}
8253e519524SHoward Hinnant
8263e519524SHoward Hinnanttemplate <size_t _Size>
827906c872dSEvgeniy Stepanovinline
8283e519524SHoward Hinnantbitset<_Size>&
829d368a84cSHoward Hinnantbitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT
8303e519524SHoward Hinnant{
8313e519524SHoward Hinnant    base::operator^=(__rhs);
8323e519524SHoward Hinnant    return *this;
8333e519524SHoward Hinnant}
8343e519524SHoward Hinnant
8353e519524SHoward Hinnanttemplate <size_t _Size>
8363e519524SHoward Hinnantbitset<_Size>&
837d368a84cSHoward Hinnantbitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT
8383e519524SHoward Hinnant{
839ce48a113SHoward Hinnant    __pos = _VSTD::min(__pos, _Size);
840ce48a113SHoward Hinnant    _VSTD::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size));
841ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), __pos, false);
8423e519524SHoward Hinnant    return *this;
8433e519524SHoward Hinnant}
8443e519524SHoward Hinnant
8453e519524SHoward Hinnanttemplate <size_t _Size>
8463e519524SHoward Hinnantbitset<_Size>&
847d368a84cSHoward Hinnantbitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT
8483e519524SHoward Hinnant{
849ce48a113SHoward Hinnant    __pos = _VSTD::min(__pos, _Size);
850ce48a113SHoward Hinnant    _VSTD::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0));
851ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(_Size - __pos), __pos, false);
8523e519524SHoward Hinnant    return *this;
8533e519524SHoward Hinnant}
8543e519524SHoward Hinnant
8553e519524SHoward Hinnanttemplate <size_t _Size>
856906c872dSEvgeniy Stepanovinline
8573e519524SHoward Hinnantbitset<_Size>&
858d368a84cSHoward Hinnantbitset<_Size>::set() _NOEXCEPT
8593e519524SHoward Hinnant{
860ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), _Size, true);
8613e519524SHoward Hinnant    return *this;
8623e519524SHoward Hinnant}
8633e519524SHoward Hinnant
8643e519524SHoward Hinnanttemplate <size_t _Size>
8653e519524SHoward Hinnantbitset<_Size>&
8663e519524SHoward Hinnantbitset<_Size>::set(size_t __pos, bool __val)
8673e519524SHoward Hinnant{
8683e519524SHoward Hinnant    if (__pos >= _Size)
869d437fa5cSMarshall Clow        __throw_out_of_range("bitset set argument out of range");
870d437fa5cSMarshall Clow
8713e519524SHoward Hinnant    (*this)[__pos] = __val;
8723e519524SHoward Hinnant    return *this;
8733e519524SHoward Hinnant}
8743e519524SHoward Hinnant
8753e519524SHoward Hinnanttemplate <size_t _Size>
876906c872dSEvgeniy Stepanovinline
8773e519524SHoward Hinnantbitset<_Size>&
878d368a84cSHoward Hinnantbitset<_Size>::reset() _NOEXCEPT
8793e519524SHoward Hinnant{
880ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), _Size, false);
8813e519524SHoward Hinnant    return *this;
8823e519524SHoward Hinnant}
8833e519524SHoward Hinnant
8843e519524SHoward Hinnanttemplate <size_t _Size>
8853e519524SHoward Hinnantbitset<_Size>&
8863e519524SHoward Hinnantbitset<_Size>::reset(size_t __pos)
8873e519524SHoward Hinnant{
8883e519524SHoward Hinnant    if (__pos >= _Size)
889d437fa5cSMarshall Clow        __throw_out_of_range("bitset reset argument out of range");
890d437fa5cSMarshall Clow
8913e519524SHoward Hinnant    (*this)[__pos] = false;
8923e519524SHoward Hinnant    return *this;
8933e519524SHoward Hinnant}
8943e519524SHoward Hinnant
8953e519524SHoward Hinnanttemplate <size_t _Size>
896906c872dSEvgeniy Stepanovinline
8973e519524SHoward Hinnantbitset<_Size>
898d368a84cSHoward Hinnantbitset<_Size>::operator~() const _NOEXCEPT
8993e519524SHoward Hinnant{
9003e519524SHoward Hinnant    bitset __x(*this);
9013e519524SHoward Hinnant    __x.flip();
9023e519524SHoward Hinnant    return __x;
9033e519524SHoward Hinnant}
9043e519524SHoward Hinnant
9053e519524SHoward Hinnanttemplate <size_t _Size>
906906c872dSEvgeniy Stepanovinline
9073e519524SHoward Hinnantbitset<_Size>&
908d368a84cSHoward Hinnantbitset<_Size>::flip() _NOEXCEPT
9093e519524SHoward Hinnant{
9103e519524SHoward Hinnant    base::flip();
9113e519524SHoward Hinnant    return *this;
9123e519524SHoward Hinnant}
9133e519524SHoward Hinnant
9143e519524SHoward Hinnanttemplate <size_t _Size>
9153e519524SHoward Hinnantbitset<_Size>&
9163e519524SHoward Hinnantbitset<_Size>::flip(size_t __pos)
9173e519524SHoward Hinnant{
9183e519524SHoward Hinnant    if (__pos >= _Size)
919d437fa5cSMarshall Clow        __throw_out_of_range("bitset flip argument out of range");
920d437fa5cSMarshall Clow
9213e519524SHoward Hinnant    reference r = base::__make_ref(__pos);
9223e519524SHoward Hinnant    r = ~r;
9233e519524SHoward Hinnant    return *this;
9243e519524SHoward Hinnant}
9253e519524SHoward Hinnant
9263e519524SHoward Hinnanttemplate <size_t _Size>
927906c872dSEvgeniy Stepanovinline
9283e519524SHoward Hinnantunsigned long
9293e519524SHoward Hinnantbitset<_Size>::to_ulong() const
9303e519524SHoward Hinnant{
9313e519524SHoward Hinnant    return base::to_ulong();
9323e519524SHoward Hinnant}
9333e519524SHoward Hinnant
9343e519524SHoward Hinnanttemplate <size_t _Size>
935906c872dSEvgeniy Stepanovinline
9363e519524SHoward Hinnantunsigned long long
9373e519524SHoward Hinnantbitset<_Size>::to_ullong() const
9383e519524SHoward Hinnant{
9393e519524SHoward Hinnant    return base::to_ullong();
9403e519524SHoward Hinnant}
9413e519524SHoward Hinnant
9423e519524SHoward Hinnanttemplate <size_t _Size>
9433e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator>
9443e519524SHoward Hinnantbasic_string<_CharT, _Traits, _Allocator>
9453e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9463e519524SHoward Hinnant{
9473e519524SHoward Hinnant    basic_string<_CharT, _Traits, _Allocator> __r(_Size, __zero);
9483e519524SHoward Hinnant    for (size_t __i = 0; __i < _Size; ++__i)
9493e519524SHoward Hinnant    {
9503e519524SHoward Hinnant        if ((*this)[__i])
9513e519524SHoward Hinnant            __r[_Size - 1 - __i] = __one;
9523e519524SHoward Hinnant    }
9533e519524SHoward Hinnant    return __r;
9543e519524SHoward Hinnant}
9553e519524SHoward Hinnant
9563e519524SHoward Hinnanttemplate <size_t _Size>
9573e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
958906c872dSEvgeniy Stepanovinline
9593e519524SHoward Hinnantbasic_string<_CharT, _Traits, allocator<_CharT> >
9603e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9613e519524SHoward Hinnant{
9623e519524SHoward Hinnant    return to_string<_CharT, _Traits, allocator<_CharT> >(__zero, __one);
9633e519524SHoward Hinnant}
9643e519524SHoward Hinnant
9653e519524SHoward Hinnanttemplate <size_t _Size>
9663e519524SHoward Hinnanttemplate <class _CharT>
967906c872dSEvgeniy Stepanovinline
9683e519524SHoward Hinnantbasic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >
9693e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9703e519524SHoward Hinnant{
9713e519524SHoward Hinnant    return to_string<_CharT, char_traits<_CharT>, allocator<_CharT> >(__zero, __one);
9723e519524SHoward Hinnant}
9733e519524SHoward Hinnant
9743e519524SHoward Hinnanttemplate <size_t _Size>
975906c872dSEvgeniy Stepanovinline
9763e519524SHoward Hinnantbasic_string<char, char_traits<char>, allocator<char> >
9773e519524SHoward Hinnantbitset<_Size>::to_string(char __zero, char __one) const
9783e519524SHoward Hinnant{
9793e519524SHoward Hinnant    return to_string<char, char_traits<char>, allocator<char> >(__zero, __one);
9803e519524SHoward Hinnant}
9813e519524SHoward Hinnant
9823e519524SHoward Hinnanttemplate <size_t _Size>
983906c872dSEvgeniy Stepanovinline
9843e519524SHoward Hinnantsize_t
985d368a84cSHoward Hinnantbitset<_Size>::count() const _NOEXCEPT
9863e519524SHoward Hinnant{
987781c476cSArthur O'Dwyer    return static_cast<size_t>(_VSTD::__count_bool_true(base::__make_iter(0), _Size));
9883e519524SHoward Hinnant}
9893e519524SHoward Hinnant
9903e519524SHoward Hinnanttemplate <size_t _Size>
991906c872dSEvgeniy Stepanovinline
9923e519524SHoward Hinnantbool
993d368a84cSHoward Hinnantbitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
9943e519524SHoward Hinnant{
995ce48a113SHoward Hinnant    return _VSTD::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0));
9963e519524SHoward Hinnant}
9973e519524SHoward Hinnant
9983e519524SHoward Hinnanttemplate <size_t _Size>
999906c872dSEvgeniy Stepanovinline
10003e519524SHoward Hinnantbool
1001d368a84cSHoward Hinnantbitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT
10023e519524SHoward Hinnant{
10033e519524SHoward Hinnant    return !(*this == __rhs);
10043e519524SHoward Hinnant}
10053e519524SHoward Hinnant
10063e519524SHoward Hinnanttemplate <size_t _Size>
10073e519524SHoward Hinnantbool
10083e519524SHoward Hinnantbitset<_Size>::test(size_t __pos) const
10093e519524SHoward Hinnant{
10103e519524SHoward Hinnant    if (__pos >= _Size)
1011d437fa5cSMarshall Clow        __throw_out_of_range("bitset test argument out of range");
1012d437fa5cSMarshall Clow
10133e519524SHoward Hinnant    return (*this)[__pos];
10143e519524SHoward Hinnant}
10153e519524SHoward Hinnant
10163e519524SHoward Hinnanttemplate <size_t _Size>
1017906c872dSEvgeniy Stepanovinline
10183e519524SHoward Hinnantbool
1019d368a84cSHoward Hinnantbitset<_Size>::all() const _NOEXCEPT
10203e519524SHoward Hinnant{
10213e519524SHoward Hinnant    return base::all();
10223e519524SHoward Hinnant}
10233e519524SHoward Hinnant
10243e519524SHoward Hinnanttemplate <size_t _Size>
1025906c872dSEvgeniy Stepanovinline
10263e519524SHoward Hinnantbool
1027d368a84cSHoward Hinnantbitset<_Size>::any() const _NOEXCEPT
10283e519524SHoward Hinnant{
10293e519524SHoward Hinnant    return base::any();
10303e519524SHoward Hinnant}
10313e519524SHoward Hinnant
10323e519524SHoward Hinnanttemplate <size_t _Size>
1033906c872dSEvgeniy Stepanovinline
10343e519524SHoward Hinnantbitset<_Size>
1035d368a84cSHoward Hinnantbitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
10363e519524SHoward Hinnant{
10373e519524SHoward Hinnant    bitset __r = *this;
10383e519524SHoward Hinnant    __r <<= __pos;
10393e519524SHoward Hinnant    return __r;
10403e519524SHoward Hinnant}
10413e519524SHoward Hinnant
10423e519524SHoward Hinnanttemplate <size_t _Size>
1043906c872dSEvgeniy Stepanovinline
10443e519524SHoward Hinnantbitset<_Size>
1045d368a84cSHoward Hinnantbitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT
10463e519524SHoward Hinnant{
10473e519524SHoward Hinnant    bitset __r = *this;
10483e519524SHoward Hinnant    __r >>= __pos;
10493e519524SHoward Hinnant    return __r;
10503e519524SHoward Hinnant}
10513e519524SHoward Hinnant
10523e519524SHoward Hinnanttemplate <size_t _Size>
10533e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10543e519524SHoward Hinnantbitset<_Size>
1055d368a84cSHoward Hinnantoperator&(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10563e519524SHoward Hinnant{
10573e519524SHoward Hinnant    bitset<_Size> __r = __x;
10583e519524SHoward Hinnant    __r &= __y;
10593e519524SHoward Hinnant    return __r;
10603e519524SHoward Hinnant}
10613e519524SHoward Hinnant
10623e519524SHoward Hinnanttemplate <size_t _Size>
10633e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10643e519524SHoward Hinnantbitset<_Size>
1065d368a84cSHoward Hinnantoperator|(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10663e519524SHoward Hinnant{
10673e519524SHoward Hinnant    bitset<_Size> __r = __x;
10683e519524SHoward Hinnant    __r |= __y;
10693e519524SHoward Hinnant    return __r;
10703e519524SHoward Hinnant}
10713e519524SHoward Hinnant
10723e519524SHoward Hinnanttemplate <size_t _Size>
10733e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10743e519524SHoward Hinnantbitset<_Size>
1075d368a84cSHoward Hinnantoperator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10763e519524SHoward Hinnant{
10773e519524SHoward Hinnant    bitset<_Size> __r = __x;
10783e519524SHoward Hinnant    __r ^= __y;
10793e519524SHoward Hinnant    return __r;
10803e519524SHoward Hinnant}
10813e519524SHoward Hinnant
10823e519524SHoward Hinnanttemplate <size_t _Size>
1083e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<bitset<_Size> >
10843e519524SHoward Hinnant    : public unary_function<bitset<_Size>, size_t>
10853e519524SHoward Hinnant{
1086fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1087d368a84cSHoward Hinnant    size_t operator()(const bitset<_Size>& __bs) const _NOEXCEPT
10883e519524SHoward Hinnant        {return __bs.__hash_code();}
10893e519524SHoward Hinnant};
10903e519524SHoward Hinnant
1091e3163f5aSHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
1092e3163f5aSHoward Hinnantbasic_istream<_CharT, _Traits>&
1093e3163f5aSHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x);
1094e3163f5aSHoward Hinnant
1095e3163f5aSHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
1096e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>&
1097e3163f5aSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x);
1098e3163f5aSHoward Hinnant
10993e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
11003e519524SHoward Hinnant
1101a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1102a016efb1SEric Fiselier
11033e519524SHoward Hinnant#endif // _LIBCPP_BITSET
1104