Home | History | Annotate | Download | only in profile
      1 // Profiling bitset implementation -*- C++ -*-
      2 
      3 // Copyright (C) 2009-2013 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file profile/bitset
     26  *  This file is a GNU profile extension to the Standard C++ Library.
     27  */
     28 
     29 #ifndef _GLIBCXX_PROFILE_BITSET
     30 #define _GLIBCXX_PROFILE_BITSET
     31 
     32 #include <bitset>
     33 
     34 namespace std _GLIBCXX_VISIBILITY(default)
     35 {
     36 namespace __profile
     37 {
     38   /// Class std::bitset wrapper with performance instrumentation.
     39   template<size_t _Nb>
     40     class bitset
     41     : public _GLIBCXX_STD_C::bitset<_Nb>
     42     {
     43       typedef _GLIBCXX_STD_C::bitset<_Nb> _Base;
     44 
     45     public:
     46       // bit reference:
     47       class reference
     48       : private _Base::reference
     49       {
     50 	typedef typename _Base::reference _Base_ref;
     51 
     52 	friend class bitset;
     53 	reference();
     54 
     55 	reference(const _Base_ref& __base, bitset* __seq) _GLIBCXX_NOEXCEPT
     56 	: _Base_ref(__base)
     57 	{ }
     58 
     59       public:
     60 	reference(const reference& __x) _GLIBCXX_NOEXCEPT
     61 	: _Base_ref(__x)
     62 	{ }
     63 
     64 	reference&
     65 	operator=(bool __x) _GLIBCXX_NOEXCEPT
     66 	{
     67 	  *static_cast<_Base_ref*>(this) = __x;
     68 	  return *this;
     69 	}
     70 
     71 	reference&
     72 	operator=(const reference& __x) _GLIBCXX_NOEXCEPT
     73 	{
     74 	  *static_cast<_Base_ref*>(this) = __x;
     75 	  return *this;
     76 	}
     77 
     78 	bool
     79 	operator~() const _GLIBCXX_NOEXCEPT
     80 	{
     81 	  return ~(*static_cast<const _Base_ref*>(this));
     82 	}
     83 
     84 	operator bool() const _GLIBCXX_NOEXCEPT
     85 	{
     86 	  return *static_cast<const _Base_ref*>(this);
     87 	}
     88 
     89 	reference&
     90 	flip() _GLIBCXX_NOEXCEPT
     91 	{
     92 	  _Base_ref::flip();
     93 	  return *this;
     94 	}
     95       };
     96 
     97       // 23.3.5.1 constructors:
     98       _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
     99       : _Base() { }
    100 
    101 #if __cplusplus >= 201103L
    102       constexpr bitset(unsigned long long __val) noexcept
    103 #else
    104       bitset(unsigned long __val)
    105 #endif
    106       : _Base(__val) { }
    107 
    108       template<typename _CharT, typename _Traits, typename _Alloc>
    109         explicit
    110         bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
    111 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    112 	       __pos = 0,
    113 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    114 	       __n = (std::basic_string<_CharT, _Traits, _Alloc>::npos))
    115 	: _Base(__str, __pos, __n) { }
    116 
    117       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    118       // 396. what are characters zero and one.
    119       template<class _CharT, class _Traits, class _Alloc>
    120 	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
    121 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    122 	       __pos,
    123 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    124 	       __n,
    125 	       _CharT __zero, _CharT __one = _CharT('1'))
    126 	: _Base(__str, __pos, __n, __zero, __one) { }
    127 
    128       bitset(const _Base& __x) : _Base(__x) { }
    129 
    130 #if __cplusplus >= 201103L
    131       template<typename _CharT>
    132         explicit
    133         bitset(const _CharT* __str,
    134 	       typename std::basic_string<_CharT>::size_type __n
    135 	       = std::basic_string<_CharT>::npos,
    136 	       _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
    137 	: _Base(__str, __n, __zero, __one) { }
    138 #endif
    139 
    140       // 23.3.5.2 bitset operations:
    141       bitset<_Nb>&
    142       operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
    143       {
    144 	_M_base() &= __rhs;
    145 	return *this;
    146       }
    147 
    148       bitset<_Nb>&
    149       operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
    150       {
    151 	_M_base() |= __rhs;
    152 	return *this;
    153       }
    154 
    155       bitset<_Nb>&
    156       operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
    157       {
    158 	_M_base() ^= __rhs;
    159 	return *this;
    160       }
    161 
    162       bitset<_Nb>&
    163       operator<<=(size_t __pos) _GLIBCXX_NOEXCEPT
    164       {
    165 	_M_base() <<= __pos;
    166 	return *this;
    167       }
    168 
    169       bitset<_Nb>&
    170       operator>>=(size_t __pos) _GLIBCXX_NOEXCEPT
    171       {
    172 	_M_base() >>= __pos;
    173 	return *this;
    174       }
    175 
    176       bitset<_Nb>&
    177       set() _GLIBCXX_NOEXCEPT
    178       {
    179 	_Base::set();
    180 	return *this;
    181       }
    182 
    183       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    184       // 186. bitset::set() second parameter should be bool
    185       bitset<_Nb>&
    186       set(size_t __pos, bool __val = true)
    187       {
    188 	_Base::set(__pos, __val);
    189 	return *this;
    190       }
    191 
    192       bitset<_Nb>&
    193       reset() _GLIBCXX_NOEXCEPT
    194       {
    195 	_Base::reset();
    196 	return *this;
    197       }
    198 
    199       bitset<_Nb>&
    200       reset(size_t __pos)
    201       {
    202 	_Base::reset(__pos);
    203 	return *this;
    204       }
    205 
    206       bitset<_Nb>
    207       operator~() const _GLIBCXX_NOEXCEPT
    208       { return bitset(~_M_base()); }
    209 
    210       bitset<_Nb>&
    211       flip() _GLIBCXX_NOEXCEPT
    212       {
    213 	_Base::flip();
    214 	return *this;
    215       }
    216 
    217       bitset<_Nb>&
    218       flip(size_t __pos)
    219       {
    220 	_Base::flip(__pos);
    221 	return *this;
    222       }
    223 
    224       // element access:
    225       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    226       // 11. Bitset minor problems
    227       reference
    228       operator[](size_t __pos)
    229       {
    230 	return reference(_M_base()[__pos], this);
    231       }
    232 
    233       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    234       // 11. Bitset minor problems
    235       _GLIBCXX_CONSTEXPR bool
    236       operator[](size_t __pos) const
    237       {
    238 	return _Base::operator[](__pos);
    239       }
    240 
    241       using _Base::to_ulong;
    242 #if __cplusplus >= 201103L
    243       using _Base::to_ullong;
    244 #endif
    245 
    246       template <typename _CharT, typename _Traits, typename _Alloc>
    247         std::basic_string<_CharT, _Traits, _Alloc>
    248         to_string() const
    249         { return _M_base().template to_string<_CharT, _Traits, _Alloc>(); }
    250 
    251       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    252       // 396. what are characters zero and one.
    253       template<class _CharT, class _Traits, class _Alloc>
    254 	std::basic_string<_CharT, _Traits, _Alloc>
    255 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    256 	{
    257 	  return _M_base().template
    258 	    to_string<_CharT, _Traits, _Alloc>(__zero, __one);
    259 	}
    260 
    261       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    262       // 434. bitset::to_string() hard to use.
    263       template<typename _CharT, typename _Traits>
    264         std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
    265         to_string() const
    266         { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
    267 
    268       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    269       // 853. to_string needs updating with zero and one.
    270       template<class _CharT, class _Traits>
    271 	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
    272 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    273 	{ return to_string<_CharT, _Traits,
    274 	                   std::allocator<_CharT> >(__zero, __one); }
    275 
    276       template<typename _CharT>
    277         std::basic_string<_CharT, std::char_traits<_CharT>,
    278                           std::allocator<_CharT> >
    279         to_string() const
    280         {
    281           return to_string<_CharT, std::char_traits<_CharT>,
    282                            std::allocator<_CharT> >();
    283         }
    284 
    285       template<class _CharT>
    286 	std::basic_string<_CharT, std::char_traits<_CharT>,
    287 	                  std::allocator<_CharT> >
    288 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    289 	{
    290 	  return to_string<_CharT, std::char_traits<_CharT>,
    291 	                   std::allocator<_CharT> >(__zero, __one);
    292 	}
    293 
    294       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
    295       to_string() const
    296       {
    297 	return to_string<char,std::char_traits<char>,std::allocator<char> >();
    298       }
    299 
    300       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
    301       to_string(char __zero, char __one = '1') const
    302       {
    303 	return to_string<char, std::char_traits<char>,
    304 	                 std::allocator<char> >(__zero, __one);
    305       }
    306 
    307       using _Base::count;
    308       using _Base::size;
    309 
    310       bool
    311       operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
    312       { return _M_base() == __rhs; }
    313 
    314       bool
    315       operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
    316       { return _M_base() != __rhs; }
    317 
    318       using _Base::test;
    319       using _Base::all;
    320       using _Base::any;
    321       using _Base::none;
    322 
    323       bitset<_Nb>
    324       operator<<(size_t __pos) const _GLIBCXX_NOEXCEPT
    325       { return bitset<_Nb>(_M_base() << __pos); }
    326 
    327       bitset<_Nb>
    328       operator>>(size_t __pos) const _GLIBCXX_NOEXCEPT
    329       { return bitset<_Nb>(_M_base() >> __pos); }
    330 
    331       _Base&
    332       _M_base() _GLIBCXX_NOEXCEPT
    333       { return *this; }
    334 
    335       const _Base&
    336       _M_base() const _GLIBCXX_NOEXCEPT
    337       { return *this; }
    338     };
    339 
    340   template<size_t _Nb>
    341     bitset<_Nb>
    342     operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
    343     { return bitset<_Nb>(__x) &= __y; }
    344 
    345   template<size_t _Nb>
    346     bitset<_Nb>
    347     operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
    348     { return bitset<_Nb>(__x) |= __y; }
    349 
    350   template<size_t _Nb>
    351     bitset<_Nb>
    352     operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
    353     { return bitset<_Nb>(__x) ^= __y; }
    354 
    355   template<typename _CharT, typename _Traits, size_t _Nb>
    356     std::basic_istream<_CharT, _Traits>&
    357     operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
    358     { return __is >> __x._M_base(); }
    359 
    360   template<typename _CharT, typename _Traits, size_t _Nb>
    361     std::basic_ostream<_CharT, _Traits>&
    362     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    363 	       const bitset<_Nb>& __x)
    364     { return __os << __x._M_base(); }
    365 } // namespace __profile
    366 
    367 #if __cplusplus >= 201103L
    368   // DR 1182.
    369   /// std::hash specialization for bitset.
    370   template<size_t _Nb>
    371     struct hash<__profile::bitset<_Nb>>
    372     : public __hash_base<size_t, __profile::bitset<_Nb>>
    373     {
    374       size_t
    375       operator()(const __profile::bitset<_Nb>& __b) const noexcept
    376       { return std::hash<_GLIBCXX_STD_C::bitset<_Nb>>()(__b._M_base()); }
    377     };
    378 #endif
    379 
    380 } // namespace std
    381 
    382 #endif
    383