Home | History | Annotate | Download | only in profile
      1 // Profiling bitset implementation -*- C++ -*-
      2 
      3 // Copyright (C) 2009, 2010 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)
     56 	: _Base_ref(__base)
     57 	{ }
     58 
     59       public:
     60 	reference(const reference& __x)
     61 	: _Base_ref(__x)
     62 	{ }
     63 
     64 	reference&
     65 	operator=(bool __x)
     66 	{
     67 	  *static_cast<_Base_ref*>(this) = __x;
     68 	  return *this;
     69 	}
     70 
     71 	reference&
     72 	operator=(const reference& __x)
     73 	{
     74 	  *static_cast<_Base_ref*>(this) = __x;
     75 	  return *this;
     76 	}
     77 
     78 	bool
     79 	operator~() const
     80 	{
     81 	  return ~(*static_cast<const _Base_ref*>(this));
     82 	}
     83 
     84 	operator bool() const
     85 	{
     86 	  return *static_cast<const _Base_ref*>(this);
     87 	}
     88 
     89 	reference&
     90 	flip()
     91 	{
     92 	  _Base_ref::flip();
     93 	  return *this;
     94 	}
     95       };
     96 
     97       // 23.3.5.1 constructors:
     98       _GLIBCXX_CONSTEXPR bitset() : _Base() { }
     99 
    100 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    101       constexpr bitset(unsigned long long __val)
    102 #else
    103       bitset(unsigned long __val)
    104 #endif
    105       : _Base(__val) { }
    106 
    107       template<typename _CharT, typename _Traits, typename _Alloc>
    108         explicit
    109         bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
    110 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    111 	       __pos = 0,
    112 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    113 	       __n = (std::basic_string<_CharT, _Traits, _Alloc>::npos))
    114 	: _Base(__str, __pos, __n) { }
    115 
    116       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    117       // 396. what are characters zero and one.
    118       template<class _CharT, class _Traits, class _Alloc>
    119 	bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
    120 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    121 	       __pos,
    122 	       typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
    123 	       __n,
    124 	       _CharT __zero, _CharT __one = _CharT('1'))
    125 	: _Base(__str, __pos, __n, __zero, __one) { }
    126 
    127       bitset(const _Base& __x) : _Base(__x) { }
    128 
    129 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    130       template<typename _CharT>
    131         explicit
    132         bitset(const _CharT* __str,
    133 	       typename std::basic_string<_CharT>::size_type __n
    134 	       = std::basic_string<_CharT>::npos,
    135 	       _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
    136 	: _Base(__str, __n, __zero, __one) { }
    137 #endif
    138 
    139       // 23.3.5.2 bitset operations:
    140       bitset<_Nb>&
    141       operator&=(const bitset<_Nb>& __rhs)
    142       {
    143 	_M_base() &= __rhs;
    144 	return *this;
    145       }
    146 
    147       bitset<_Nb>&
    148       operator|=(const bitset<_Nb>& __rhs)
    149       {
    150 	_M_base() |= __rhs;
    151 	return *this;
    152       }
    153 
    154       bitset<_Nb>&
    155       operator^=(const bitset<_Nb>& __rhs)
    156       {
    157 	_M_base() ^= __rhs;
    158 	return *this;
    159       }
    160 
    161       bitset<_Nb>&
    162       operator<<=(size_t __pos)
    163       {
    164 	_M_base() <<= __pos;
    165 	return *this;
    166       }
    167 
    168       bitset<_Nb>&
    169       operator>>=(size_t __pos)
    170       {
    171 	_M_base() >>= __pos;
    172 	return *this;
    173       }
    174 
    175       bitset<_Nb>&
    176       set()
    177       {
    178 	_Base::set();
    179 	return *this;
    180       }
    181 
    182       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    183       // 186. bitset::set() second parameter should be bool
    184       bitset<_Nb>&
    185       set(size_t __pos, bool __val = true)
    186       {
    187 	_Base::set(__pos, __val);
    188 	return *this;
    189       }
    190 
    191       bitset<_Nb>&
    192       reset()
    193       {
    194 	_Base::reset();
    195 	return *this;
    196       }
    197 
    198       bitset<_Nb>&
    199       reset(size_t __pos)
    200       {
    201 	_Base::reset(__pos);
    202 	return *this;
    203       }
    204 
    205       bitset<_Nb> operator~() const { return bitset(~_M_base()); }
    206 
    207       bitset<_Nb>&
    208       flip()
    209       {
    210 	_Base::flip();
    211 	return *this;
    212       }
    213 
    214       bitset<_Nb>&
    215       flip(size_t __pos)
    216       {
    217 	_Base::flip(__pos);
    218 	return *this;
    219       }
    220 
    221       // element access:
    222       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    223       // 11. Bitset minor problems
    224       reference
    225       operator[](size_t __pos)
    226       {
    227 	return reference(_M_base()[__pos], this);
    228       }
    229 
    230       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    231       // 11. Bitset minor problems
    232       bool
    233       operator[](size_t __pos) const
    234       {
    235 	return _M_base()[__pos];
    236       }
    237 
    238       using _Base::to_ulong;
    239 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    240       using _Base::to_ullong;
    241 #endif
    242 
    243       template <typename _CharT, typename _Traits, typename _Alloc>
    244         std::basic_string<_CharT, _Traits, _Alloc>
    245         to_string() const
    246         { return _M_base().template to_string<_CharT, _Traits, _Alloc>(); }
    247 
    248       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    249       // 396. what are characters zero and one.
    250       template<class _CharT, class _Traits, class _Alloc>
    251 	std::basic_string<_CharT, _Traits, _Alloc>
    252 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    253 	{
    254 	  return _M_base().template
    255 	    to_string<_CharT, _Traits, _Alloc>(__zero, __one);
    256 	}
    257 
    258       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    259       // 434. bitset::to_string() hard to use.
    260       template<typename _CharT, typename _Traits>
    261         std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
    262         to_string() const
    263         { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
    264 
    265       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    266       // 853. to_string needs updating with zero and one.
    267       template<class _CharT, class _Traits>
    268 	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
    269 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    270 	{ return to_string<_CharT, _Traits,
    271 	                   std::allocator<_CharT> >(__zero, __one); }
    272 
    273       template<typename _CharT>
    274         std::basic_string<_CharT, std::char_traits<_CharT>,
    275                           std::allocator<_CharT> >
    276         to_string() const
    277         {
    278           return to_string<_CharT, std::char_traits<_CharT>,
    279                            std::allocator<_CharT> >();
    280         }
    281 
    282       template<class _CharT>
    283 	std::basic_string<_CharT, std::char_traits<_CharT>,
    284 	                  std::allocator<_CharT> >
    285 	to_string(_CharT __zero, _CharT __one = _CharT('1')) const
    286 	{
    287 	  return to_string<_CharT, std::char_traits<_CharT>,
    288 	                   std::allocator<_CharT> >(__zero, __one);
    289 	}
    290 
    291       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
    292       to_string() const
    293       {
    294 	return to_string<char,std::char_traits<char>,std::allocator<char> >();
    295       }
    296 
    297       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
    298       to_string(char __zero, char __one = '1') const
    299       {
    300 	return to_string<char, std::char_traits<char>,
    301 	                 std::allocator<char> >(__zero, __one);
    302       }
    303 
    304       using _Base::count;
    305       using _Base::size;
    306 
    307       bool
    308       operator==(const bitset<_Nb>& __rhs) const
    309       { return _M_base() == __rhs; }
    310 
    311       bool
    312       operator!=(const bitset<_Nb>& __rhs) const
    313       { return _M_base() != __rhs; }
    314 
    315       using _Base::test;
    316       using _Base::all;
    317       using _Base::any;
    318       using _Base::none;
    319 
    320       bitset<_Nb>
    321       operator<<(size_t __pos) const
    322       { return bitset<_Nb>(_M_base() << __pos); }
    323 
    324       bitset<_Nb>
    325       operator>>(size_t __pos) const
    326       { return bitset<_Nb>(_M_base() >> __pos); }
    327 
    328       _Base&
    329       _M_base() { return *this; }
    330 
    331       const _Base&
    332       _M_base() const { return *this; }
    333     };
    334 
    335   template<size_t _Nb>
    336     bitset<_Nb>
    337     operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
    338     { return bitset<_Nb>(__x) &= __y; }
    339 
    340   template<size_t _Nb>
    341     bitset<_Nb>
    342     operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y)
    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)
    348     { return bitset<_Nb>(__x) ^= __y; }
    349 
    350   template<typename _CharT, typename _Traits, size_t _Nb>
    351     std::basic_istream<_CharT, _Traits>&
    352     operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
    353     { return __is >> __x._M_base(); }
    354 
    355   template<typename _CharT, typename _Traits, size_t _Nb>
    356     std::basic_ostream<_CharT, _Traits>&
    357     operator<<(std::basic_ostream<_CharT, _Traits>& __os,
    358 	       const bitset<_Nb>& __x)
    359     { return __os << __x._M_base(); }
    360 } // namespace __profile
    361 
    362 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    363   // DR 1182.
    364   /// std::hash specialization for bitset.
    365   template<size_t _Nb>
    366     struct hash<__profile::bitset<_Nb>>
    367     : public __hash_base<size_t, __profile::bitset<_Nb>>
    368     {
    369       size_t
    370       operator()(const __profile::bitset<_Nb>& __b) const noexcept
    371       { return std::hash<_GLIBCXX_STD_C::bitset<_Nb>>()(__b._M_base()); }
    372     };
    373 #endif
    374 
    375 } // namespace std
    376 
    377 #endif
    378