/////////////////////////////////////////////////////////////////////////// // FILE: bitset (Container for N bits) // // ========================================================================= // // Open Watcom Project // // Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved. // // This file is automatically generated. Do not edit directly. // // ========================================================================= // // Description: This header is part of the C++ standard library. It defines // a template that provides a container for bits. The usual // bit manipulation operators are provided. /////////////////////////////////////////////////////////////////////////// #ifndef _BITSET_INCLUDED #define _BITSET_INCLUDED #ifndef _ENABLE_AUTODEPEND #pragma read_only_file; #endif #ifndef __cplusplus #error This header file requires C++ #endif #ifndef _CSTDDEF_INCLUDED #include #endif #ifndef _STRING_INCLUDED #include #endif #ifndef _STDEXCEPT_INCLUDED #include #endif #ifndef _IOSFWD_INCLUDED #include #endif namespace std { template< size_t N > class bitset { public: class reference { friend class bitset; reference( unsigned long *data, unsigned int bitpos ); public: ~reference( ); reference& operator=( bool x ); reference& operator=( const reference& x ); bool operator~( ) const; operator bool( ) const; reference& flip( ); private: unsigned long *data; unsigned int bitpos; }; // Constructors bitset( ); bitset( unsigned long val ); #if _NEVER template< class Ch, class Tr, class A > explicit bitset( const basic_string< Ch, Tr, A > &str, typename basic_string< Ch, Tr, A >::size_type pos = 0, typename basic_string< Ch, Tr, A >::size_type n = basic_string< Ch, Tr, A >::npos); #endif // Bitset operations bool operator[] ( size_t pos ) const; reference operator[] ( size_t pos ); bitset< N >& operator&=( const bitset< N >& s ); bitset< N >& operator|=( const bitset< N >& s ); bitset< N >& operator^=( const bitset< N >& s ); bitset< N >& operator<<=( size_t s ); bitset< N >& operator>>=( size_t s ); bitset< N >& set( ); bitset< N >& set( size_t pos, int val = 1 ); bitset< N >& reset( ); bitset< N >& reset( size_t pos ); bitset< N >& flip( ); bitset< N >& flip( size_t pos ); bitset< N > operator~( ) const { return bitset< N >( *this ).flip( ); } bitset< N > operator<<( size_t n ) const { return bitset< N >( *this ) <<= n; } bitset< N > operator>>( size_t n ) const { return bitset< N >( *this ) >>= n; } unsigned long to_ulong( ) const; #if _NEVER template< class Ch, class Tr, class A > basic_string< Ch, Tr, A > to_string( ) const; #endif size_t count( ) const; size_t size( ) const { return N; } bool operator==( const bitset< N >& s ) const; bool operator!=( const bitset< N >& s ) const; bool test( size_t pos ) const; bool any( ) const; bool none( ) const; private: unsigned long data[ ( N + ( ( sizeof ( unsigned long ) * 8 ) - 1 ) ) / ( sizeof ( unsigned long ) * 8 ) ]; unsigned int datasize; }; // ********************************* // Members of bitset< N >::reference // ********************************* template< size_t N > inline bitset< N >::reference::reference( unsigned long *data, unsigned int bitpos ) : data( data ), bitpos( bitpos ) { } template< size_t N > inline bitset< N >::reference::~reference( ) { } template< size_t N > inline bitset< N >::reference &bitset< N >::reference::operator=( bool x ) { if( x ) { data[ bitpos / ( sizeof ( unsigned long ) * 8 ) ] |= 1 << ( bitpos % ( sizeof ( unsigned long ) * 8 ) ); } else { data[ bitpos / ( sizeof ( unsigned long ) * 8 ) ] &= ~ ( 1 << ( bitpos % ( sizeof ( unsigned long ) * 8 ) ) ); } return *this; } template< size_t N > inline bitset< N >::reference & bitset< N >::reference::operator=( const reference& x ) { *this = x; return *this; } template< size_t N > inline bool bitset< N >::reference::operator~( ) const { return ~ ( bool )( *this ); } template< size_t N > inline bitset< N >::reference::operator bool( ) const { return ( data[bitpos / ( sizeof ( unsigned long ) * 8 ) ] & ( 1 << ( bitpos % ( sizeof ( unsigned long ) * 8 ) ) ) ) != 0; } template< size_t N > inline bitset< N >::reference &bitset< N >::reference::flip( ) { *this = ! *this; return *this; } // ********************** // Members of bitset< N > // ********************** template< size_t N > bitset< N >::bitset( ) : datasize( ( N + ( ( sizeof ( unsigned long ) * 8 ) - 1 ) ) / ( sizeof ( unsigned long ) * 8 ) ) { for( int i = 0; i < datasize; i++ ) { data[ i ] = 0; } } template< size_t N > bitset< N >::bitset( unsigned long val ) : datasize( ( N + ( ( sizeof ( unsigned long ) * 8 ) - 1 ) ) / ( sizeof ( unsigned long ) * 8 ) ) { data[0] = val; for( int i = 1; i < datasize; i++ ) { data[ i ] = 0; } } #if _NEVER template< size_t N > template< class Ch, class Tr, class A > bitset< N >::bitset( const basic_string< Ch, Tr, A >& str, typename basic_string< Ch, Tr, A >::size_type pos = 0, typename basic_string< Ch, Tr, A >::size_type n = basic_string< Ch, Tr, A >::npos ) { // TODO: implement me. } #endif template< size_t N > bool bitset< N >::operator[] ( size_t pos ) const { if( pos >= N ) throw std::out_of_range( "bitset::operator []" ); return ( data[ pos / ( sizeof ( unsigned long ) * 8 ) ] & ( 1 << ( pos % ( sizeof ( unsigned long ) * 8 ) ) ) ) != 0; } template< size_t N > bitset< N >::reference bitset< N >::operator [] ( size_t pos ) { if( pos >= N ) throw std::out_of_range( "bitset::operator []" ); return bitset< N >::reference( data, pos ); } template< size_t N > bitset< N > &bitset< N >::operator&=( const bitset< N >& s ) { for( int i = 0; i < datasize; i++ ) { data[ i ] &= s.data[ i ]; } return *this; } template< size_t N > bitset< N > &bitset< N >::operator|=( const bitset< N >& s ) { // it is assumed here, that "overflowed" bits are not set for( int i = 0; i < datasize; i++ ) { data[ i ] |= s.data[ i ]; } return *this; } template< size_t N > bitset< N > &bitset< N >::operator^=( const bitset< N >& s ) { // it is assumed here, that "overflowed" bits are not set for( int i = 0; i < datasize; i++ ) { data[ i ] ^= s.data[ i ]; } return *this; } template< size_t N > bitset< N > &bitset< N >::operator<<=( size_t s ) { if( s == 0 ) return *this; if( s > N ) s = N; for( int i = N-1; i >= s; i-- ) { (*this)[ i ] = (bool)((*this)[i - s]); } for( int i = 0; i < s; i++ ) { (*this)[ i ] = false; } return *this; } template< size_t N > bitset< N > &bitset< N >::operator>>=( size_t s ) { if( s == 0 ) return *this; if( s > N ) s = N; for( int i = 0; i < N-s; i++ ) { (*this)[ i ] = (bool)((*this)[i + s]); } for( int i = N-s; i < N; i++ ) { (*this)[ i ] = false; } return *this; } template< size_t N > bitset< N > &bitset< N >::set( ) { for( int i = 0; i < N; i++ ) { (*this)[ i ] = 1; } return *this; } template< size_t N > bitset< N > &bitset< N >::set( size_t pos, int val ) { if( pos >= N ) throw std::out_of_range( "bitset::set" ); (*this)[pos] = (val != 0); return *this; } template< size_t N > bitset< N > &bitset< N >::reset( ) { for( int i = 0; i < datasize; i++ ) { data[ i ] = 0; } return *this; } template< size_t N > bitset< N > &bitset< N >::reset( size_t pos ) { if( pos >= N ) throw std::out_of_range( "bitset::reset" ); (*this)[pos] = false; return *this; } template< size_t N > bitset< N > &bitset< N >::flip( ) { for( int i = 0; i < N; i++ ) { (*this)[ i ] = ! (*this)[ i ]; } return *this; } template< size_t N > bitset< N > &bitset< N >::flip( size_t pos ) { if( pos >= N ) throw std::out_of_range( "bitset::flip" ); (*this)[pos].flip( ); return *this; } template< size_t N > unsigned long bitset< N >::to_ulong( ) const { #if _NEVER if( ( sizeof ( unsigned long ) * 8 ) < N ) throw std::overflow_error( "bitset::to_ulong" ); #endif return data[0]; } #if _NEVER template< size_t N > template< class Ch, class Tr, class A > basic_string< Ch, Tr, A > bitset< N >::to_string( ) const { // TODO: implement me. } #endif template< size_t N > size_t bitset< N >::count( ) const { int cnt = 0; for( int i = 0; i < N; i++ ) { if( (*this)[ i ] == true ) cnt++; } return cnt; } template< size_t N > bool bitset< N >::operator==( const bitset< N >& s ) const { for( int i = 0; i < datasize; i++ ) { if( data[ i ] != s.data[ i ] ) return false; } return true; } template< size_t N > bool bitset< N >::operator!=( const bitset< N >& s ) const { for( int i = 0; i < datasize; i++ ) { if( data[ i ] != s.data[ i ] ) return true; } return false; } template< size_t N > bool bitset< N >::test( size_t pos ) const { if( pos >= N ) throw std::out_of_range( "bitset::test" ); return (*this)[pos]; } template< size_t N > bool bitset< N >::any( ) const { for( int i = 0; i < datasize; i++ ) { if( data[ i ] != 0 ) return true; } return false; } template< size_t N > bool bitset< N >::none( ) const { return !any( ); } #if _NEVER template< size_t N > bitset< N > operator&( const bitset< N >& s1, const bitset< N >& s2 ) { bitset< N > tmp = s1; tmp &= s2; return tmp; } template< size_t N > bitset< N > operator|( const bitset< N >& s1, const bitset< N >& s2 ) { bitset< N > tmp = s1; tmp |= s2; return tmp; } template< size_t N > bitset< N > operator^( const bitset< N >& s1, const bitset< N >& s2 ) { bitset< N > tmp = s1; tmp ^= s2; return tmp; } #endif #if _NEVER template< class Ch, class Tr, size_t N > basic_istream< Ch, Tr > &operator<< ( basic_ostream< Ch, Tr >& os, const bitset< N >& x ) { // TODO: implement me. } template< class Ch, class Tr, size_t N > basic_istream< Ch, Tr > &operator>> ( basic_ostream< Ch, Tr >& os, const bitset< N >& x ) { // TODO: implement me. } #endif } // namespace std #endif