xref: /llvm-project-15.0.7/libcxx/include/bitset (revision 681cde7d)
13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
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
1152e2f3158SNikolas Klauser#include <__algorithm/fill.h>
116385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
1173e519524SHoward Hinnant#include <__bit_reference>
1184d81a46fSArthur O'Dwyer#include <__config>
119976f3705SNikolas Klauser#include <__functional/hash.h>
1202e2f3158SNikolas Klauser#include <__functional/unary_function.h>
121bfbd73f8SArthur O'Dwyer#include <climits>
122bfbd73f8SArthur O'Dwyer#include <cstddef>
123bfbd73f8SArthur O'Dwyer#include <stdexcept>
124bd6e6846SMark de Wever#include <version>
1253e519524SHoward Hinnant
126db1978b6SNikolas Klauser// standard-mandated includes
127db1978b6SNikolas Klauser#include <iosfwd>
128db1978b6SNikolas Klauser#include <string>
129db1978b6SNikolas Klauser
130a016efb1SEric Fiselier#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
131a016efb1SEric Fiselier#  pragma GCC system_header
132a016efb1SEric Fiselier#endif
133a016efb1SEric Fiselier
134a016efb1SEric Fiselier_LIBCPP_PUSH_MACROS
135a016efb1SEric Fiselier#include <__undef_macros>
136a016efb1SEric Fiselier
137ab4f4382SHoward Hinnant
1383e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
1393e519524SHoward Hinnant
1403e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
141a7744562SHoward Hinnantclass __bitset;
142a7744562SHoward Hinnant
143a7744562SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
144a7744562SHoward Hinnantstruct __has_storage_type<__bitset<_N_words, _Size> >
145a7744562SHoward Hinnant{
146a7744562SHoward Hinnant    static const bool value = true;
147a7744562SHoward Hinnant};
148a7744562SHoward Hinnant
149a7744562SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
1503e519524SHoward Hinnantclass __bitset
1513e519524SHoward Hinnant{
1523e519524SHoward Hinnantpublic:
1533e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
1543e519524SHoward Hinnant    typedef size_t                 size_type;
1550ae9efebSHoward Hinnant    typedef size_type              __storage_type;
1563e519524SHoward Hinnantprotected:
1573e519524SHoward Hinnant    typedef __bitset __self;
1583e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
1593e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
1603e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
1613e519524SHoward Hinnant
1623e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
1633e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
1643e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
1653e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
1667ee27136SHoward Hinnant    friend struct __bit_array<__bitset>;
1673e519524SHoward Hinnant
1683e519524SHoward Hinnant    __storage_type __first_[_N_words];
1693e519524SHoward Hinnant
1703e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
1713e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
1723e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
1733e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
1743e519524SHoward Hinnant
175906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
176eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
177906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
178eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
1793e519524SHoward Hinnant
180d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
1813e519524SHoward Hinnant        {return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
182eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
1833e519524SHoward Hinnant        {return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);}
184d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
1853e519524SHoward Hinnant        {return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
186d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
1873e519524SHoward Hinnant        {return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
1883e519524SHoward Hinnant
189906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
190d368a84cSHoward Hinnant    void operator&=(const __bitset& __v) _NOEXCEPT;
191906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
192d368a84cSHoward Hinnant    void operator|=(const __bitset& __v) _NOEXCEPT;
193906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
194d368a84cSHoward Hinnant    void operator^=(const __bitset& __v) _NOEXCEPT;
1953e519524SHoward Hinnant
196d368a84cSHoward Hinnant    void flip() _NOEXCEPT;
1973e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const
1983e519524SHoward Hinnant        {return to_ulong(integral_constant<bool, _Size < sizeof(unsigned long) * CHAR_BIT>());}
1993e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const
2003e519524SHoward Hinnant        {return to_ullong(integral_constant<bool, _Size < sizeof(unsigned long long) * CHAR_BIT>());}
2013e519524SHoward Hinnant
202d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
203d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
204906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
205d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT;
2063e519524SHoward Hinnantprivate:
207046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
208d368a84cSHoward Hinnant    void __init(unsigned long long __v, false_type) _NOEXCEPT;
20902b8e949SEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
210d368a84cSHoward Hinnant    void __init(unsigned long long __v, true_type) _NOEXCEPT;
211046492b9SEric Fiselier#endif // _LIBCPP_CXX03_LANG
2123e519524SHoward Hinnant    unsigned long to_ulong(false_type) const;
213906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2143e519524SHoward Hinnant    unsigned long to_ulong(true_type) const;
2153e519524SHoward Hinnant    unsigned long long to_ullong(false_type) const;
216906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2173e519524SHoward Hinnant    unsigned long long to_ullong(true_type) const;
218906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
2193e519524SHoward Hinnant    unsigned long long to_ullong(true_type, false_type) const;
2203e519524SHoward Hinnant    unsigned long long to_ullong(true_type, true_type) const;
2213e519524SHoward Hinnant};
2223e519524SHoward Hinnant
2233e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
224906c872dSEvgeniy Stepanovinline
225eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
226d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__bitset() _NOEXCEPT
227046492b9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
228eeac9fcfSHoward Hinnant    : __first_{0}
229eeac9fcfSHoward Hinnant#endif
2303e519524SHoward Hinnant{
231046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
232ce48a113SHoward Hinnant    _VSTD::fill_n(__first_, _N_words, __storage_type(0));
233eeac9fcfSHoward Hinnant#endif
2343e519524SHoward Hinnant}
2353e519524SHoward Hinnant
236046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
237eeac9fcfSHoward Hinnant
2383e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
2393e519524SHoward Hinnantvoid
240c206366fSHoward Hinnant__bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT
2413e519524SHoward Hinnant{
2423e519524SHoward Hinnant    __storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)];
243ea44ee20SMarshall Clow    size_t __sz = _Size;
244ea44ee20SMarshall Clow    for (size_t __i = 0; __i < sizeof(__t)/sizeof(__t[0]); ++__i, __v >>= __bits_per_word, __sz -= __bits_per_word )
245ea44ee20SMarshall Clow        if ( __sz < __bits_per_word)
246ea44ee20SMarshall Clow            __t[__i] = static_cast<__storage_type>(__v) & ( 1ULL << __sz ) - 1;
247ea44ee20SMarshall Clow        else
2483e519524SHoward Hinnant            __t[__i] = static_cast<__storage_type>(__v);
249ea44ee20SMarshall Clow
250ce48a113SHoward Hinnant    _VSTD::copy(__t, __t + sizeof(__t)/sizeof(__t[0]), __first_);
251ce48a113SHoward Hinnant    _VSTD::fill(__first_ + sizeof(__t)/sizeof(__t[0]), __first_ + sizeof(__first_)/sizeof(__first_[0]),
2523e519524SHoward Hinnant               __storage_type(0));
2533e519524SHoward Hinnant}
2543e519524SHoward Hinnant
2553e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
2563e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2573e519524SHoward Hinnantvoid
258c206366fSHoward Hinnant__bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT
2593e519524SHoward Hinnant{
2603e519524SHoward Hinnant    __first_[0] = __v;
261ea44ee20SMarshall Clow    if (_Size < __bits_per_word)
262ea44ee20SMarshall Clow        __first_[0] &= ( 1ULL << _Size ) - 1;
263ea44ee20SMarshall Clow
264ce48a113SHoward Hinnant    _VSTD::fill(__first_ + 1, __first_ + sizeof(__first_)/sizeof(__first_[0]), __storage_type(0));
2653e519524SHoward Hinnant}
2663e519524SHoward Hinnant
267046492b9SEric Fiselier#endif // _LIBCPP_CXX03_LANG
268eeac9fcfSHoward Hinnant
2693e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
270906c872dSEvgeniy Stepanovinline
271eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
272d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
273046492b9SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
2741d1b46cdSNico Weber#if __SIZEOF_SIZE_T__ == 8
275eeac9fcfSHoward Hinnant    : __first_{__v}
2761d1b46cdSNico Weber#elif __SIZEOF_SIZE_T__ == 4
277ea44ee20SMarshall Clow    : __first_{static_cast<__storage_type>(__v),
278ea44ee20SMarshall Clow                _Size >= 2 * __bits_per_word ? static_cast<__storage_type>(__v >> __bits_per_word)
279ea44ee20SMarshall Clow                : static_cast<__storage_type>((__v >> __bits_per_word) & (__storage_type(1) << (_Size - __bits_per_word)) - 1)}
2803fb6c6e5SHoward Hinnant#else
28153b9ee06SHoward Hinnant#error This constructor has not been ported to this platform
28253b9ee06SHoward Hinnant#endif
283eeac9fcfSHoward Hinnant#endif
2843e519524SHoward Hinnant{
285046492b9SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
2863e519524SHoward Hinnant    __init(__v, integral_constant<bool, sizeof(unsigned long long) == sizeof(__storage_type)>());
287eeac9fcfSHoward Hinnant#endif
2883e519524SHoward Hinnant}
2893e519524SHoward Hinnant
2903e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
291906c872dSEvgeniy Stepanovinline
2923e519524SHoward Hinnantvoid
293d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
2943e519524SHoward Hinnant{
2953e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
2963e519524SHoward Hinnant        __first_[__i] &= __v.__first_[__i];
2973e519524SHoward Hinnant}
2983e519524SHoward Hinnant
2993e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
300906c872dSEvgeniy Stepanovinline
3013e519524SHoward Hinnantvoid
302d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
3033e519524SHoward Hinnant{
3043e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
3053e519524SHoward Hinnant        __first_[__i] |= __v.__first_[__i];
3063e519524SHoward Hinnant}
3073e519524SHoward Hinnant
3083e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
309906c872dSEvgeniy Stepanovinline
3103e519524SHoward Hinnantvoid
311d368a84cSHoward Hinnant__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
3123e519524SHoward Hinnant{
3133e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
3143e519524SHoward Hinnant        __first_[__i] ^= __v.__first_[__i];
3153e519524SHoward Hinnant}
3163e519524SHoward Hinnant
3173e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3183e519524SHoward Hinnantvoid
319d368a84cSHoward Hinnant__bitset<_N_words, _Size>::flip() _NOEXCEPT
3203e519524SHoward Hinnant{
3213e519524SHoward Hinnant    // do middle whole words
3223e519524SHoward Hinnant    size_type __n = _Size;
3233e519524SHoward Hinnant    __storage_pointer __p = __first_;
3243e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
3253e519524SHoward Hinnant        *__p = ~*__p;
3263e519524SHoward Hinnant    // do last partial word
3273e519524SHoward Hinnant    if (__n > 0)
3283e519524SHoward Hinnant    {
3293e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
3303e519524SHoward Hinnant        __storage_type __b = *__p & __m;
3313e519524SHoward Hinnant        *__p &= ~__m;
3323e519524SHoward Hinnant        *__p |= ~__b & __m;
3333e519524SHoward Hinnant    }
3343e519524SHoward Hinnant}
3353e519524SHoward Hinnant
3363e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3373e519524SHoward Hinnantunsigned long
3383e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ulong(false_type) const
3393e519524SHoward Hinnant{
3403e519524SHoward Hinnant    const_iterator __e = __make_iter(_Size);
341ce48a113SHoward Hinnant    const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true);
3423e519524SHoward Hinnant    if (__i != __e)
343d437fa5cSMarshall Clow        __throw_overflow_error("bitset to_ulong overflow error");
344d437fa5cSMarshall Clow
3453e519524SHoward Hinnant    return __first_[0];
3463e519524SHoward Hinnant}
3473e519524SHoward Hinnant
3483e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
349906c872dSEvgeniy Stepanovinline
3503e519524SHoward Hinnantunsigned long
3513e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ulong(true_type) const
3523e519524SHoward Hinnant{
3533e519524SHoward Hinnant    return __first_[0];
3543e519524SHoward Hinnant}
3553e519524SHoward Hinnant
3563e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3573e519524SHoward Hinnantunsigned long long
3583e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(false_type) const
3593e519524SHoward Hinnant{
3603e519524SHoward Hinnant    const_iterator __e = __make_iter(_Size);
361ce48a113SHoward Hinnant    const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true);
3623e519524SHoward Hinnant    if (__i != __e)
363d437fa5cSMarshall Clow        __throw_overflow_error("bitset to_ullong overflow error");
364d437fa5cSMarshall Clow
3653e519524SHoward Hinnant    return to_ullong(true_type());
3663e519524SHoward Hinnant}
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
369906c872dSEvgeniy Stepanovinline
3703e519524SHoward Hinnantunsigned long long
3713e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type) const
3723e519524SHoward Hinnant{
3733e519524SHoward Hinnant    return to_ullong(true_type(), integral_constant<bool, sizeof(__storage_type) < sizeof(unsigned long long)>());
3743e519524SHoward Hinnant}
3753e519524SHoward Hinnant
3763e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
377906c872dSEvgeniy Stepanovinline
3783e519524SHoward Hinnantunsigned long long
3793e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const
3803e519524SHoward Hinnant{
3813e519524SHoward Hinnant    return __first_[0];
3823e519524SHoward Hinnant}
3833e519524SHoward Hinnant
3843e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3853e519524SHoward Hinnantunsigned long long
3863e519524SHoward Hinnant__bitset<_N_words, _Size>::to_ullong(true_type, true_type) const
3873e519524SHoward Hinnant{
3883e519524SHoward Hinnant    unsigned long long __r = __first_[0];
389d586f92cSArthur O'Dwyer    for (size_t __i = 1; __i < sizeof(unsigned long long) / sizeof(__storage_type); ++__i)
3903e519524SHoward Hinnant        __r |= static_cast<unsigned long long>(__first_[__i]) << (sizeof(__storage_type) * CHAR_BIT);
3913e519524SHoward Hinnant    return __r;
3923e519524SHoward Hinnant}
3933e519524SHoward Hinnant
3943e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
3953e519524SHoward Hinnantbool
396d368a84cSHoward Hinnant__bitset<_N_words, _Size>::all() const _NOEXCEPT
3973e519524SHoward Hinnant{
3983e519524SHoward Hinnant    // do middle whole words
3993e519524SHoward Hinnant    size_type __n = _Size;
4003e519524SHoward Hinnant    __const_storage_pointer __p = __first_;
4013e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
4023e519524SHoward Hinnant        if (~*__p)
4033e519524SHoward Hinnant            return false;
4043e519524SHoward Hinnant    // do last partial word
4053e519524SHoward Hinnant    if (__n > 0)
4063e519524SHoward Hinnant    {
4073e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4083e519524SHoward Hinnant        if (~*__p & __m)
4093e519524SHoward Hinnant            return false;
4103e519524SHoward Hinnant    }
4113e519524SHoward Hinnant    return true;
4123e519524SHoward Hinnant}
4133e519524SHoward Hinnant
4143e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
4153e519524SHoward Hinnantbool
416d368a84cSHoward Hinnant__bitset<_N_words, _Size>::any() const _NOEXCEPT
4173e519524SHoward Hinnant{
4183e519524SHoward Hinnant    // do middle whole words
4193e519524SHoward Hinnant    size_type __n = _Size;
4203e519524SHoward Hinnant    __const_storage_pointer __p = __first_;
4213e519524SHoward Hinnant    for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word)
4223e519524SHoward Hinnant        if (*__p)
4233e519524SHoward Hinnant            return true;
4243e519524SHoward Hinnant    // do last partial word
4253e519524SHoward Hinnant    if (__n > 0)
4263e519524SHoward Hinnant    {
4273e519524SHoward Hinnant        __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
4283e519524SHoward Hinnant        if (*__p & __m)
4293e519524SHoward Hinnant            return true;
4303e519524SHoward Hinnant    }
4313e519524SHoward Hinnant    return false;
4323e519524SHoward Hinnant}
4333e519524SHoward Hinnant
4343e519524SHoward Hinnanttemplate <size_t _N_words, size_t _Size>
435906c872dSEvgeniy Stepanovinline
4363e519524SHoward Hinnantsize_t
437d368a84cSHoward Hinnant__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT
4383e519524SHoward Hinnant{
4393e519524SHoward Hinnant    size_t __h = 0;
4403e519524SHoward Hinnant    for (size_type __i = 0; __i < _N_words; ++__i)
4413e519524SHoward Hinnant        __h ^= __first_[__i];
4423e519524SHoward Hinnant    return __h;
4433e519524SHoward Hinnant}
4443e519524SHoward Hinnant
4453e519524SHoward Hinnanttemplate <size_t _Size>
4463e519524SHoward Hinnantclass __bitset<1, _Size>
4473e519524SHoward Hinnant{
4483e519524SHoward Hinnantpublic:
4493e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
4503e519524SHoward Hinnant    typedef size_t                 size_type;
4510ae9efebSHoward Hinnant    typedef size_type              __storage_type;
4523e519524SHoward Hinnantprotected:
4533e519524SHoward Hinnant    typedef __bitset __self;
4543e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
4553e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
4563e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
4573e519524SHoward Hinnant
4583e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
4593e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
4603e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
4613e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
4627ee27136SHoward Hinnant    friend struct __bit_array<__bitset>;
4633e519524SHoward Hinnant
4643e519524SHoward Hinnant    __storage_type __first_;
4653e519524SHoward Hinnant
4663e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
4673e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
4683e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
4693e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
4703e519524SHoward Hinnant
471906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
472eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
473906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
474eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
4753e519524SHoward Hinnant
476d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
4773e519524SHoward Hinnant        {return reference(&__first_, __storage_type(1) << __pos);}
478eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT
4793e519524SHoward Hinnant        {return const_reference(&__first_, __storage_type(1) << __pos);}
480d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT
4813e519524SHoward Hinnant        {return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
482d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
4833e519524SHoward Hinnant        {return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
4843e519524SHoward Hinnant
485906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
486d368a84cSHoward Hinnant    void operator&=(const __bitset& __v) _NOEXCEPT;
487906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
488d368a84cSHoward Hinnant    void operator|=(const __bitset& __v) _NOEXCEPT;
489906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
490d368a84cSHoward Hinnant    void operator^=(const __bitset& __v) _NOEXCEPT;
4913e519524SHoward Hinnant
492906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
493d368a84cSHoward Hinnant    void flip() _NOEXCEPT;
4943e519524SHoward Hinnant
495906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4963e519524SHoward Hinnant    unsigned long to_ulong() const;
497906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
4983e519524SHoward Hinnant    unsigned long long to_ullong() const;
4993e519524SHoward Hinnant
500906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
501d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
502906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
503d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
5043e519524SHoward Hinnant
505906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
506d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT;
5073e519524SHoward Hinnant};
5083e519524SHoward Hinnant
5093e519524SHoward Hinnanttemplate <size_t _Size>
510906c872dSEvgeniy Stepanovinline
511eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
512d368a84cSHoward Hinnant__bitset<1, _Size>::__bitset() _NOEXCEPT
5133e519524SHoward Hinnant    : __first_(0)
5143e519524SHoward Hinnant{
5153e519524SHoward Hinnant}
5163e519524SHoward Hinnant
5173e519524SHoward Hinnanttemplate <size_t _Size>
518906c872dSEvgeniy Stepanovinline
519eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
520d368a84cSHoward Hinnant__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
52114d7aac1SMarshall Clow    : __first_(
52214d7aac1SMarshall Clow        _Size == __bits_per_word ? static_cast<__storage_type>(__v)
52314d7aac1SMarshall Clow                                 : static_cast<__storage_type>(__v) & ((__storage_type(1) << _Size) - 1)
52414d7aac1SMarshall Clow    )
5253e519524SHoward Hinnant{
5263e519524SHoward Hinnant}
5273e519524SHoward Hinnant
5283e519524SHoward Hinnanttemplate <size_t _Size>
529906c872dSEvgeniy Stepanovinline
5303e519524SHoward Hinnantvoid
531d368a84cSHoward Hinnant__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
5323e519524SHoward Hinnant{
5333e519524SHoward Hinnant    __first_ &= __v.__first_;
5343e519524SHoward Hinnant}
5353e519524SHoward Hinnant
5363e519524SHoward Hinnanttemplate <size_t _Size>
537906c872dSEvgeniy Stepanovinline
5383e519524SHoward Hinnantvoid
539d368a84cSHoward Hinnant__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
5403e519524SHoward Hinnant{
5413e519524SHoward Hinnant    __first_ |= __v.__first_;
5423e519524SHoward Hinnant}
5433e519524SHoward Hinnant
5443e519524SHoward Hinnanttemplate <size_t _Size>
545906c872dSEvgeniy Stepanovinline
5463e519524SHoward Hinnantvoid
547d368a84cSHoward Hinnant__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
5483e519524SHoward Hinnant{
5493e519524SHoward Hinnant    __first_ ^= __v.__first_;
5503e519524SHoward Hinnant}
5513e519524SHoward Hinnant
5523e519524SHoward Hinnanttemplate <size_t _Size>
553906c872dSEvgeniy Stepanovinline
5543e519524SHoward Hinnantvoid
555d368a84cSHoward Hinnant__bitset<1, _Size>::flip() _NOEXCEPT
5563e519524SHoward Hinnant{
5573e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5583e519524SHoward Hinnant    __first_ = ~__first_;
5593e519524SHoward Hinnant    __first_ &= __m;
5603e519524SHoward Hinnant}
5613e519524SHoward Hinnant
5623e519524SHoward Hinnanttemplate <size_t _Size>
563906c872dSEvgeniy Stepanovinline
5643e519524SHoward Hinnantunsigned long
5653e519524SHoward Hinnant__bitset<1, _Size>::to_ulong() const
5663e519524SHoward Hinnant{
5673e519524SHoward Hinnant    return __first_;
5683e519524SHoward Hinnant}
5693e519524SHoward Hinnant
5703e519524SHoward Hinnanttemplate <size_t _Size>
571906c872dSEvgeniy Stepanovinline
5723e519524SHoward Hinnantunsigned long long
5733e519524SHoward Hinnant__bitset<1, _Size>::to_ullong() const
5743e519524SHoward Hinnant{
5753e519524SHoward Hinnant    return __first_;
5763e519524SHoward Hinnant}
5773e519524SHoward Hinnant
5783e519524SHoward Hinnanttemplate <size_t _Size>
579906c872dSEvgeniy Stepanovinline
5803e519524SHoward Hinnantbool
581d368a84cSHoward Hinnant__bitset<1, _Size>::all() const _NOEXCEPT
5823e519524SHoward Hinnant{
5833e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5843e519524SHoward Hinnant    return !(~__first_ & __m);
5853e519524SHoward Hinnant}
5863e519524SHoward Hinnant
5873e519524SHoward Hinnanttemplate <size_t _Size>
588906c872dSEvgeniy Stepanovinline
5893e519524SHoward Hinnantbool
590d368a84cSHoward Hinnant__bitset<1, _Size>::any() const _NOEXCEPT
5913e519524SHoward Hinnant{
5923e519524SHoward Hinnant    __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size);
5933e519524SHoward Hinnant    return __first_ & __m;
5943e519524SHoward Hinnant}
5953e519524SHoward Hinnant
5963e519524SHoward Hinnanttemplate <size_t _Size>
597906c872dSEvgeniy Stepanovinline
5983e519524SHoward Hinnantsize_t
599d368a84cSHoward Hinnant__bitset<1, _Size>::__hash_code() const _NOEXCEPT
6003e519524SHoward Hinnant{
6013e519524SHoward Hinnant    return __first_;
6023e519524SHoward Hinnant}
6033e519524SHoward Hinnant
6043e519524SHoward Hinnanttemplate <>
6053e519524SHoward Hinnantclass __bitset<0, 0>
6063e519524SHoward Hinnant{
6073e519524SHoward Hinnantpublic:
6083e519524SHoward Hinnant    typedef ptrdiff_t              difference_type;
6093e519524SHoward Hinnant    typedef size_t                 size_type;
6100ae9efebSHoward Hinnant    typedef size_type              __storage_type;
6113e519524SHoward Hinnantprotected:
6123e519524SHoward Hinnant    typedef __bitset __self;
6133e519524SHoward Hinnant    typedef       __storage_type*  __storage_pointer;
6143e519524SHoward Hinnant    typedef const __storage_type*  __const_storage_pointer;
6153e519524SHoward Hinnant    static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT);
6163e519524SHoward Hinnant
6173e519524SHoward Hinnant    friend class __bit_reference<__bitset>;
6183e519524SHoward Hinnant    friend class __bit_const_reference<__bitset>;
6193e519524SHoward Hinnant    friend class __bit_iterator<__bitset, false>;
6203e519524SHoward Hinnant    friend class __bit_iterator<__bitset, true>;
621c206366fSHoward Hinnant    friend struct __bit_array<__bitset>;
6223e519524SHoward Hinnant
6233e519524SHoward Hinnant    typedef __bit_reference<__bitset>                  reference;
6243e519524SHoward Hinnant    typedef __bit_const_reference<__bitset>            const_reference;
6253e519524SHoward Hinnant    typedef __bit_iterator<__bitset, false>            iterator;
6263e519524SHoward Hinnant    typedef __bit_iterator<__bitset, true>             const_iterator;
6273e519524SHoward Hinnant
628906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
629eeac9fcfSHoward Hinnant    _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
630906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
631eeac9fcfSHoward Hinnant    explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT;
6323e519524SHoward Hinnant
633d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT
634527a7fdfSBruce Mitchener        {return reference(nullptr, 1);}
635eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR const_reference __make_ref(size_t) const _NOEXCEPT
636527a7fdfSBruce Mitchener        {return const_reference(nullptr, 1);}
637c206366fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t) _NOEXCEPT
638527a7fdfSBruce Mitchener        {return iterator(nullptr, 0);}
639c206366fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t) const _NOEXCEPT
640527a7fdfSBruce Mitchener        {return const_iterator(nullptr, 0);}
6413e519524SHoward Hinnant
642d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator&=(const __bitset&) _NOEXCEPT {}
643d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator|=(const __bitset&) _NOEXCEPT {}
644d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator^=(const __bitset&) _NOEXCEPT {}
6453e519524SHoward Hinnant
646d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {}
6473e519524SHoward Hinnant
6483e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const {return 0;}
6493e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const {return 0;}
6503e519524SHoward Hinnant
651d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool all() const _NOEXCEPT {return true;}
652d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool any() const _NOEXCEPT {return false;}
6533e519524SHoward Hinnant
654d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;}
6553e519524SHoward Hinnant};
6563e519524SHoward Hinnant
657906c872dSEvgeniy Stepanovinline
658eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
659d368a84cSHoward Hinnant__bitset<0, 0>::__bitset() _NOEXCEPT
6603e519524SHoward Hinnant{
6613e519524SHoward Hinnant}
6623e519524SHoward Hinnant
663906c872dSEvgeniy Stepanovinline
664eeac9fcfSHoward Hinnant_LIBCPP_CONSTEXPR
665d368a84cSHoward Hinnant__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
6663e519524SHoward Hinnant{
6673e519524SHoward Hinnant}
6683e519524SHoward Hinnant
669e2f2d1edSEric Fiseliertemplate <size_t _Size> class _LIBCPP_TEMPLATE_VIS bitset;
67089dd1dd2SEric Fiseliertemplate <size_t _Size> struct hash<bitset<_Size> >;
6713e519524SHoward Hinnant
6723e519524SHoward Hinnanttemplate <size_t _Size>
673e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS bitset
6743e519524SHoward Hinnant    : private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size>
6753e519524SHoward Hinnant{
67653b9ee06SHoward Hinnantpublic:
6773e519524SHoward Hinnant    static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1;
6783e519524SHoward Hinnant    typedef __bitset<__n_words, _Size> base;
6793e519524SHoward Hinnant
6803e519524SHoward Hinnantpublic:
6813e519524SHoward Hinnant    typedef typename base::reference       reference;
6823e519524SHoward Hinnant    typedef typename base::const_reference const_reference;
6833e519524SHoward Hinnant
6843e519524SHoward Hinnant    // 23.3.5.1 constructors:
685eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bitset() _NOEXCEPT {}
686eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
687eeac9fcfSHoward Hinnant        bitset(unsigned long long __v) _NOEXCEPT : base(__v) {}
688b4e88d4dSLouis Dionne    template<class _CharT, class = __enable_if_t<_IsCharLikeType<_CharT>::value> >
689d09f711dSHoward Hinnant        explicit bitset(const _CharT* __str,
690d09f711dSHoward Hinnant                        typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos,
691d09f711dSHoward Hinnant                        _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
6923e519524SHoward Hinnant    template<class _CharT, class _Traits, class _Allocator>
6933e519524SHoward Hinnant        explicit bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
6943e519524SHoward Hinnant                        typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos = 0,
6953e519524SHoward Hinnant                        typename basic_string<_CharT,_Traits,_Allocator>::size_type __n =
6963e519524SHoward Hinnant                                (basic_string<_CharT,_Traits,_Allocator>::npos),
6973e519524SHoward Hinnant                        _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
6983e519524SHoward Hinnant
6993e519524SHoward Hinnant    // 23.3.5.2 bitset operations:
700906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
701d368a84cSHoward Hinnant    bitset& operator&=(const bitset& __rhs) _NOEXCEPT;
702906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
703d368a84cSHoward Hinnant    bitset& operator|=(const bitset& __rhs) _NOEXCEPT;
704906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
705d368a84cSHoward Hinnant    bitset& operator^=(const bitset& __rhs) _NOEXCEPT;
706d368a84cSHoward Hinnant    bitset& operator<<=(size_t __pos) _NOEXCEPT;
707d368a84cSHoward Hinnant    bitset& operator>>=(size_t __pos) _NOEXCEPT;
708906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
709d368a84cSHoward Hinnant    bitset& set() _NOEXCEPT;
7103e519524SHoward Hinnant    bitset& set(size_t __pos, bool __val = true);
711906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
712d368a84cSHoward Hinnant    bitset& reset() _NOEXCEPT;
7133e519524SHoward Hinnant    bitset& reset(size_t __pos);
714906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
715d368a84cSHoward Hinnant    bitset  operator~() const _NOEXCEPT;
716906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
717d368a84cSHoward Hinnant    bitset& flip() _NOEXCEPT;
7183e519524SHoward Hinnant    bitset& flip(size_t __pos);
7193e519524SHoward Hinnant
7203e519524SHoward Hinnant    // element access:
721667925d4SNikolas Klauser#ifdef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL
722667925d4SNikolas Klauser    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR            bool operator[](size_t __p) const {return base::__make_ref(__p);}
723667925d4SNikolas Klauser#else
724667925d4SNikolas Klauser    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
725667925d4SNikolas Klauser#endif
726667925d4SNikolas Klauser    _LIBCPP_HIDE_FROM_ABI                         reference operator[](size_t __p)       {return base::__make_ref(__p);}
727906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7283e519524SHoward Hinnant    unsigned long to_ulong() const;
729906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7303e519524SHoward Hinnant    unsigned long long to_ullong() const;
7313e519524SHoward Hinnant    template <class _CharT, class _Traits, class _Allocator>
7323e519524SHoward Hinnant        basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'),
7333e519524SHoward Hinnant                                                            _CharT __one = _CharT('1')) const;
7343e519524SHoward Hinnant    template <class _CharT, class _Traits>
735906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
7363e519524SHoward Hinnant        basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
7373e519524SHoward Hinnant                                                                    _CharT __one = _CharT('1')) const;
7383e519524SHoward Hinnant    template <class _CharT>
739906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
7403e519524SHoward Hinnant        basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
7413e519524SHoward Hinnant                                                                                _CharT __one = _CharT('1')) const;
742906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
7433e519524SHoward Hinnant    basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0',
7443e519524SHoward Hinnant                                                                      char __one = '1') const;
745906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
746d368a84cSHoward Hinnant    size_t count() const _NOEXCEPT;
747eeac9fcfSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;}
748906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
749d368a84cSHoward Hinnant    bool operator==(const bitset& __rhs) const _NOEXCEPT;
750906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
751d368a84cSHoward Hinnant    bool operator!=(const bitset& __rhs) const _NOEXCEPT;
7523e519524SHoward Hinnant    bool test(size_t __pos) const;
753906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
754d368a84cSHoward Hinnant    bool all() const _NOEXCEPT;
755906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
756d368a84cSHoward Hinnant    bool any() const _NOEXCEPT;
757d368a84cSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();}
758906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
759d368a84cSHoward Hinnant    bitset operator<<(size_t __pos) const _NOEXCEPT;
760906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
761d368a84cSHoward Hinnant    bitset operator>>(size_t __pos) const _NOEXCEPT;
7623e519524SHoward Hinnant
7633e519524SHoward Hinnantprivate:
7643e519524SHoward Hinnant
765fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
766d368a84cSHoward Hinnant    size_t __hash_code() const _NOEXCEPT {return base::__hash_code();}
7673e519524SHoward Hinnant
7683e519524SHoward Hinnant    friend struct hash<bitset>;
7693e519524SHoward Hinnant};
7703e519524SHoward Hinnant
7713e519524SHoward Hinnanttemplate <size_t _Size>
772d1523f7aSEric Fiseliertemplate<class _CharT, class>
773d09f711dSHoward Hinnantbitset<_Size>::bitset(const _CharT* __str,
774d09f711dSHoward Hinnant                      typename basic_string<_CharT>::size_type __n,
775d09f711dSHoward Hinnant                      _CharT __zero, _CharT __one)
7763e519524SHoward Hinnant{
777ce48a113SHoward Hinnant    size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str));
7783e519524SHoward Hinnant    for (size_t __i = 0; __i < __rlen; ++__i)
779d09f711dSHoward Hinnant        if (__str[__i] != __zero && __str[__i] != __one)
780d437fa5cSMarshall Clow            __throw_invalid_argument("bitset string ctor has invalid argument");
781d437fa5cSMarshall Clow
782c003db1fSHoward Hinnant    size_t _Mp = _VSTD::min(__rlen, _Size);
7833e519524SHoward Hinnant    size_t __i = 0;
784c003db1fSHoward Hinnant    for (; __i < _Mp; ++__i)
7853e519524SHoward Hinnant    {
786c003db1fSHoward Hinnant        _CharT __c = __str[_Mp - 1 - __i];
7877402ec8fSShu Tian        (*this)[__i] = (__c == __one);
7883e519524SHoward Hinnant    }
789ce48a113SHoward Hinnant    _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
7903e519524SHoward Hinnant}
7913e519524SHoward Hinnant
7923e519524SHoward Hinnanttemplate <size_t _Size>
7933e519524SHoward Hinnanttemplate<class _CharT, class _Traits, class _Allocator>
7943e519524SHoward Hinnantbitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
7953e519524SHoward Hinnant       typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos,
7963e519524SHoward Hinnant       typename basic_string<_CharT,_Traits,_Allocator>::size_type __n,
7973e519524SHoward Hinnant       _CharT __zero, _CharT __one)
7983e519524SHoward Hinnant{
7993e519524SHoward Hinnant    if (__pos > __str.size())
800d437fa5cSMarshall Clow        __throw_out_of_range("bitset string pos out of range");
801d437fa5cSMarshall Clow
802ce48a113SHoward Hinnant    size_t __rlen = _VSTD::min(__n, __str.size() - __pos);
8033e519524SHoward Hinnant    for (size_t __i = __pos; __i < __pos + __rlen; ++__i)
8043e519524SHoward Hinnant        if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one))
805d437fa5cSMarshall Clow            __throw_invalid_argument("bitset string ctor has invalid argument");
806d437fa5cSMarshall Clow
807c003db1fSHoward Hinnant    size_t _Mp = _VSTD::min(__rlen, _Size);
8083e519524SHoward Hinnant    size_t __i = 0;
809c003db1fSHoward Hinnant    for (; __i < _Mp; ++__i)
8103e519524SHoward Hinnant    {
811c003db1fSHoward Hinnant        _CharT __c = __str[__pos + _Mp - 1 - __i];
8127402ec8fSShu Tian        (*this)[__i] = _Traits::eq(__c, __one);
8133e519524SHoward Hinnant    }
814ce48a113SHoward Hinnant    _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false);
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>
836906c872dSEvgeniy Stepanovinline
8373e519524SHoward Hinnantbitset<_Size>&
838d368a84cSHoward Hinnantbitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT
8393e519524SHoward Hinnant{
8403e519524SHoward Hinnant    base::operator^=(__rhs);
8413e519524SHoward Hinnant    return *this;
8423e519524SHoward Hinnant}
8433e519524SHoward Hinnant
8443e519524SHoward Hinnanttemplate <size_t _Size>
8453e519524SHoward Hinnantbitset<_Size>&
846d368a84cSHoward Hinnantbitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT
8473e519524SHoward Hinnant{
848ce48a113SHoward Hinnant    __pos = _VSTD::min(__pos, _Size);
849ce48a113SHoward Hinnant    _VSTD::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size));
850ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), __pos, false);
8513e519524SHoward Hinnant    return *this;
8523e519524SHoward Hinnant}
8533e519524SHoward Hinnant
8543e519524SHoward Hinnanttemplate <size_t _Size>
8553e519524SHoward Hinnantbitset<_Size>&
856d368a84cSHoward Hinnantbitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT
8573e519524SHoward Hinnant{
858ce48a113SHoward Hinnant    __pos = _VSTD::min(__pos, _Size);
859ce48a113SHoward Hinnant    _VSTD::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0));
860ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(_Size - __pos), __pos, false);
8613e519524SHoward Hinnant    return *this;
8623e519524SHoward Hinnant}
8633e519524SHoward Hinnant
8643e519524SHoward Hinnanttemplate <size_t _Size>
865906c872dSEvgeniy Stepanovinline
8663e519524SHoward Hinnantbitset<_Size>&
867d368a84cSHoward Hinnantbitset<_Size>::set() _NOEXCEPT
8683e519524SHoward Hinnant{
869ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), _Size, true);
8703e519524SHoward Hinnant    return *this;
8713e519524SHoward Hinnant}
8723e519524SHoward Hinnant
8733e519524SHoward Hinnanttemplate <size_t _Size>
8743e519524SHoward Hinnantbitset<_Size>&
8753e519524SHoward Hinnantbitset<_Size>::set(size_t __pos, bool __val)
8763e519524SHoward Hinnant{
8773e519524SHoward Hinnant    if (__pos >= _Size)
878d437fa5cSMarshall Clow        __throw_out_of_range("bitset set argument out of range");
879d437fa5cSMarshall Clow
8803e519524SHoward Hinnant    (*this)[__pos] = __val;
8813e519524SHoward Hinnant    return *this;
8823e519524SHoward Hinnant}
8833e519524SHoward Hinnant
8843e519524SHoward Hinnanttemplate <size_t _Size>
885906c872dSEvgeniy Stepanovinline
8863e519524SHoward Hinnantbitset<_Size>&
887d368a84cSHoward Hinnantbitset<_Size>::reset() _NOEXCEPT
8883e519524SHoward Hinnant{
889ce48a113SHoward Hinnant    _VSTD::fill_n(base::__make_iter(0), _Size, false);
8903e519524SHoward Hinnant    return *this;
8913e519524SHoward Hinnant}
8923e519524SHoward Hinnant
8933e519524SHoward Hinnanttemplate <size_t _Size>
8943e519524SHoward Hinnantbitset<_Size>&
8953e519524SHoward Hinnantbitset<_Size>::reset(size_t __pos)
8963e519524SHoward Hinnant{
8973e519524SHoward Hinnant    if (__pos >= _Size)
898d437fa5cSMarshall Clow        __throw_out_of_range("bitset reset argument out of range");
899d437fa5cSMarshall Clow
9003e519524SHoward Hinnant    (*this)[__pos] = false;
9013e519524SHoward Hinnant    return *this;
9023e519524SHoward Hinnant}
9033e519524SHoward Hinnant
9043e519524SHoward Hinnanttemplate <size_t _Size>
905906c872dSEvgeniy Stepanovinline
9063e519524SHoward Hinnantbitset<_Size>
907d368a84cSHoward Hinnantbitset<_Size>::operator~() const _NOEXCEPT
9083e519524SHoward Hinnant{
9093e519524SHoward Hinnant    bitset __x(*this);
9103e519524SHoward Hinnant    __x.flip();
9113e519524SHoward Hinnant    return __x;
9123e519524SHoward Hinnant}
9133e519524SHoward Hinnant
9143e519524SHoward Hinnanttemplate <size_t _Size>
915906c872dSEvgeniy Stepanovinline
9163e519524SHoward Hinnantbitset<_Size>&
917d368a84cSHoward Hinnantbitset<_Size>::flip() _NOEXCEPT
9183e519524SHoward Hinnant{
9193e519524SHoward Hinnant    base::flip();
9203e519524SHoward Hinnant    return *this;
9213e519524SHoward Hinnant}
9223e519524SHoward Hinnant
9233e519524SHoward Hinnanttemplate <size_t _Size>
9243e519524SHoward Hinnantbitset<_Size>&
9253e519524SHoward Hinnantbitset<_Size>::flip(size_t __pos)
9263e519524SHoward Hinnant{
9273e519524SHoward Hinnant    if (__pos >= _Size)
928d437fa5cSMarshall Clow        __throw_out_of_range("bitset flip argument out of range");
929d437fa5cSMarshall Clow
9303e519524SHoward Hinnant    reference r = base::__make_ref(__pos);
9313e519524SHoward Hinnant    r = ~r;
9323e519524SHoward Hinnant    return *this;
9333e519524SHoward Hinnant}
9343e519524SHoward Hinnant
9353e519524SHoward Hinnanttemplate <size_t _Size>
936906c872dSEvgeniy Stepanovinline
9373e519524SHoward Hinnantunsigned long
9383e519524SHoward Hinnantbitset<_Size>::to_ulong() const
9393e519524SHoward Hinnant{
9403e519524SHoward Hinnant    return base::to_ulong();
9413e519524SHoward Hinnant}
9423e519524SHoward Hinnant
9433e519524SHoward Hinnanttemplate <size_t _Size>
944906c872dSEvgeniy Stepanovinline
9453e519524SHoward Hinnantunsigned long long
9463e519524SHoward Hinnantbitset<_Size>::to_ullong() const
9473e519524SHoward Hinnant{
9483e519524SHoward Hinnant    return base::to_ullong();
9493e519524SHoward Hinnant}
9503e519524SHoward Hinnant
9513e519524SHoward Hinnanttemplate <size_t _Size>
9523e519524SHoward Hinnanttemplate <class _CharT, class _Traits, class _Allocator>
9533e519524SHoward Hinnantbasic_string<_CharT, _Traits, _Allocator>
9543e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9553e519524SHoward Hinnant{
9563e519524SHoward Hinnant    basic_string<_CharT, _Traits, _Allocator> __r(_Size, __zero);
957e39095a3SLouis Dionne    for (size_t __i = 0; __i != _Size; ++__i)
9583e519524SHoward Hinnant    {
9593e519524SHoward Hinnant        if ((*this)[__i])
9603e519524SHoward Hinnant            __r[_Size - 1 - __i] = __one;
9613e519524SHoward Hinnant    }
9623e519524SHoward Hinnant    return __r;
9633e519524SHoward Hinnant}
9643e519524SHoward Hinnant
9653e519524SHoward Hinnanttemplate <size_t _Size>
9663e519524SHoward Hinnanttemplate <class _CharT, class _Traits>
967906c872dSEvgeniy Stepanovinline
9683e519524SHoward Hinnantbasic_string<_CharT, _Traits, allocator<_CharT> >
9693e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9703e519524SHoward Hinnant{
9713e519524SHoward Hinnant    return to_string<_CharT, _Traits, allocator<_CharT> >(__zero, __one);
9723e519524SHoward Hinnant}
9733e519524SHoward Hinnant
9743e519524SHoward Hinnanttemplate <size_t _Size>
9753e519524SHoward Hinnanttemplate <class _CharT>
976906c872dSEvgeniy Stepanovinline
9773e519524SHoward Hinnantbasic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >
9783e519524SHoward Hinnantbitset<_Size>::to_string(_CharT __zero, _CharT __one) const
9793e519524SHoward Hinnant{
9803e519524SHoward Hinnant    return to_string<_CharT, char_traits<_CharT>, allocator<_CharT> >(__zero, __one);
9813e519524SHoward Hinnant}
9823e519524SHoward Hinnant
9833e519524SHoward Hinnanttemplate <size_t _Size>
984906c872dSEvgeniy Stepanovinline
9853e519524SHoward Hinnantbasic_string<char, char_traits<char>, allocator<char> >
9863e519524SHoward Hinnantbitset<_Size>::to_string(char __zero, char __one) const
9873e519524SHoward Hinnant{
9883e519524SHoward Hinnant    return to_string<char, char_traits<char>, allocator<char> >(__zero, __one);
9893e519524SHoward Hinnant}
9903e519524SHoward Hinnant
9913e519524SHoward Hinnanttemplate <size_t _Size>
992906c872dSEvgeniy Stepanovinline
9933e519524SHoward Hinnantsize_t
994d368a84cSHoward Hinnantbitset<_Size>::count() const _NOEXCEPT
9953e519524SHoward Hinnant{
996781c476cSArthur O'Dwyer    return static_cast<size_t>(_VSTD::__count_bool_true(base::__make_iter(0), _Size));
9973e519524SHoward Hinnant}
9983e519524SHoward Hinnant
9993e519524SHoward Hinnanttemplate <size_t _Size>
1000906c872dSEvgeniy Stepanovinline
10013e519524SHoward Hinnantbool
1002d368a84cSHoward Hinnantbitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
10033e519524SHoward Hinnant{
1004ce48a113SHoward Hinnant    return _VSTD::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0));
10053e519524SHoward Hinnant}
10063e519524SHoward Hinnant
10073e519524SHoward Hinnanttemplate <size_t _Size>
1008906c872dSEvgeniy Stepanovinline
10093e519524SHoward Hinnantbool
1010d368a84cSHoward Hinnantbitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT
10113e519524SHoward Hinnant{
10123e519524SHoward Hinnant    return !(*this == __rhs);
10133e519524SHoward Hinnant}
10143e519524SHoward Hinnant
10153e519524SHoward Hinnanttemplate <size_t _Size>
10163e519524SHoward Hinnantbool
10173e519524SHoward Hinnantbitset<_Size>::test(size_t __pos) const
10183e519524SHoward Hinnant{
10193e519524SHoward Hinnant    if (__pos >= _Size)
1020d437fa5cSMarshall Clow        __throw_out_of_range("bitset test argument out of range");
1021d437fa5cSMarshall Clow
10223e519524SHoward Hinnant    return (*this)[__pos];
10233e519524SHoward Hinnant}
10243e519524SHoward Hinnant
10253e519524SHoward Hinnanttemplate <size_t _Size>
1026906c872dSEvgeniy Stepanovinline
10273e519524SHoward Hinnantbool
1028d368a84cSHoward Hinnantbitset<_Size>::all() const _NOEXCEPT
10293e519524SHoward Hinnant{
10303e519524SHoward Hinnant    return base::all();
10313e519524SHoward Hinnant}
10323e519524SHoward Hinnant
10333e519524SHoward Hinnanttemplate <size_t _Size>
1034906c872dSEvgeniy Stepanovinline
10353e519524SHoward Hinnantbool
1036d368a84cSHoward Hinnantbitset<_Size>::any() const _NOEXCEPT
10373e519524SHoward Hinnant{
10383e519524SHoward Hinnant    return base::any();
10393e519524SHoward Hinnant}
10403e519524SHoward Hinnant
10413e519524SHoward Hinnanttemplate <size_t _Size>
1042906c872dSEvgeniy Stepanovinline
10433e519524SHoward Hinnantbitset<_Size>
1044d368a84cSHoward Hinnantbitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
10453e519524SHoward Hinnant{
10463e519524SHoward Hinnant    bitset __r = *this;
10473e519524SHoward Hinnant    __r <<= __pos;
10483e519524SHoward Hinnant    return __r;
10493e519524SHoward Hinnant}
10503e519524SHoward Hinnant
10513e519524SHoward Hinnanttemplate <size_t _Size>
1052906c872dSEvgeniy Stepanovinline
10533e519524SHoward Hinnantbitset<_Size>
1054d368a84cSHoward Hinnantbitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT
10553e519524SHoward Hinnant{
10563e519524SHoward Hinnant    bitset __r = *this;
10573e519524SHoward Hinnant    __r >>= __pos;
10583e519524SHoward Hinnant    return __r;
10593e519524SHoward Hinnant}
10603e519524SHoward Hinnant
10613e519524SHoward Hinnanttemplate <size_t _Size>
10623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10633e519524SHoward Hinnantbitset<_Size>
1064d368a84cSHoward Hinnantoperator&(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10653e519524SHoward Hinnant{
10663e519524SHoward Hinnant    bitset<_Size> __r = __x;
10673e519524SHoward Hinnant    __r &= __y;
10683e519524SHoward Hinnant    return __r;
10693e519524SHoward Hinnant}
10703e519524SHoward Hinnant
10713e519524SHoward Hinnanttemplate <size_t _Size>
10723e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10733e519524SHoward Hinnantbitset<_Size>
1074d368a84cSHoward Hinnantoperator|(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10753e519524SHoward Hinnant{
10763e519524SHoward Hinnant    bitset<_Size> __r = __x;
10773e519524SHoward Hinnant    __r |= __y;
10783e519524SHoward Hinnant    return __r;
10793e519524SHoward Hinnant}
10803e519524SHoward Hinnant
10813e519524SHoward Hinnanttemplate <size_t _Size>
10823e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10833e519524SHoward Hinnantbitset<_Size>
1084d368a84cSHoward Hinnantoperator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
10853e519524SHoward Hinnant{
10863e519524SHoward Hinnant    bitset<_Size> __r = __x;
10873e519524SHoward Hinnant    __r ^= __y;
10883e519524SHoward Hinnant    return __r;
10893e519524SHoward Hinnant}
10903e519524SHoward Hinnant
10913e519524SHoward Hinnanttemplate <size_t _Size>
1092e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS hash<bitset<_Size> >
1093*681cde7dSNikolas Klauser    : public __unary_function<bitset<_Size>, size_t>
10943e519524SHoward Hinnant{
1095fb100021SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1096d368a84cSHoward Hinnant    size_t operator()(const bitset<_Size>& __bs) const _NOEXCEPT
10973e519524SHoward Hinnant        {return __bs.__hash_code();}
10983e519524SHoward Hinnant};
10993e519524SHoward Hinnant
1100e3163f5aSHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
1101e3163f5aSHoward Hinnantbasic_istream<_CharT, _Traits>&
1102e3163f5aSHoward Hinnantoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x);
1103e3163f5aSHoward Hinnant
1104e3163f5aSHoward Hinnanttemplate <class _CharT, class _Traits, size_t _Size>
1105e3163f5aSHoward Hinnantbasic_ostream<_CharT, _Traits>&
1106e3163f5aSHoward Hinnantoperator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x);
1107e3163f5aSHoward Hinnant
11083e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
11093e519524SHoward Hinnant
1110a016efb1SEric Fiselier_LIBCPP_POP_MACROS
1111a016efb1SEric Fiselier
11123e519524SHoward Hinnant#endif // _LIBCPP_BITSET
1113