📄 sc_bit_proxies.h
字号:
sc_bitref<X>& operator ^= ( char a ) { *this ^= sc_logic( a ); return *this; } sc_bitref<X>& operator ^= ( int a ) { *this ^= sc_logic( a ); return *this; } // bitwise operators and functions // bitwise complement sc_bitref<X>& b_not(); // common methods void set_bit( int n, sc_logic_value_t value ); void set_word( int i, sc_digit w ); void set_cword( int i, sc_digit w ); void clean_tail() { this->m_obj.clean_tail(); } // other methods void scan( ::std::istream& is = ::std::cin );private: // disabled sc_bitref();};// l-value concatenation operators and functionstemplate <class T1, class T2>inlinesc_concref<sc_bitref<T1>,sc_bitref<T2> >operator , ( sc_bitref<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref<sc_bitref<T1>,sc_subref<T2> >operator , ( sc_bitref<T1>, sc_subref<T2> );template <class T1, class T2, class T3>inlinesc_concref<sc_bitref<T1>,sc_concref<T2,T3> >operator , ( sc_bitref<T1>, sc_concref<T2,T3> );template <class T1, class T2>inlinesc_concref<sc_bitref<T1>,T2>operator , ( sc_bitref<T1>, sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref<sc_bitref<T1>,sc_bitref<T2> >concat( sc_bitref<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref<sc_bitref<T1>,sc_subref<T2> >concat( sc_bitref<T1>, sc_subref<T2> );template <class T1, class T2, class T3>inlinesc_concref<sc_bitref<T1>,sc_concref<T2,T3> >concat( sc_bitref<T1>, sc_concref<T2,T3> );template <class T1, class T2>inlinesc_concref<sc_bitref<T1>,T2>concat( sc_bitref<T1>, sc_proxy<T2>& );template <class T>::std::istream&operator >> ( ::std::istream&, sc_bitref<T> );// ----------------------------------------------------------------------------// CLASS TEMPLATE : sc_subref_r<X>//// Proxy class for sc_proxy part selection (r-value only).// ----------------------------------------------------------------------------template <class X>class sc_subref_r : public sc_proxy<sc_subref_r<X> >{ void check_bounds();public: // constructor sc_subref_r( const X& obj_, int hi_, int lo_ ) : m_obj( CCAST<X&>( obj_ ) ), m_hi( hi_ ), m_lo( lo_ ), m_len( 0 ) { check_bounds(); } // copy constructor sc_subref_r( const sc_subref_r<X>& a ) : m_obj( a.m_obj ), m_hi( a.m_hi ), m_lo( a.m_lo ), m_len( a.m_len ) {} // cloning sc_subref_r<X>* clone() const { return new sc_subref_r<X>( *this ); } // common methods int length() const { return m_len; } int size() const { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); } sc_logic_value_t get_bit( int n ) const; void set_bit( int n, sc_logic_value_t value ); sc_digit get_word( int i )const; void set_word( int i, sc_digit w ); sc_digit get_cword( int i ) const; void set_cword( int i, sc_digit w ); void clean_tail() { m_obj.clean_tail(); } // other methods bool is_01() const; bool reversed() const { return m_lo > m_hi; }protected: mutable X& m_obj; int m_hi; int m_lo; int m_len;private: // disabled sc_subref_r(); sc_subref_r<X>& operator = ( const sc_subref_r<X>& );};// r-value concatenation operators and functionstemplate <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >operator , ( sc_subref_r<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >operator , ( sc_subref_r<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_subref_r<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>operator , ( sc_subref_r<T1>, const sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref_r<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( const char*, sc_subref_r<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref_r<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( const sc_logic&, sc_subref_r<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref_r<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( bool, sc_subref_r<T> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >concat( sc_subref_r<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >concat( sc_subref_r<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >concat( sc_subref_r<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>concat( sc_subref_r<T1>, const sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref_r<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( const char*, sc_subref_r<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref_r<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( const sc_logic&, sc_subref_r<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref_r<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( bool, sc_subref_r<T> );#ifdef SC_DT_MIXED_COMMA_OPERATORStemplate <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >operator , ( sc_subref_r<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >operator , ( sc_subref<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >operator , ( sc_subref_r<T1>, sc_subref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >operator , ( sc_subref<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_subref_r<T1>, sc_concref<T2,T3> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_subref<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>operator , ( sc_subref<T1>, const sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>operator , ( sc_subref_r<T1>, sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( const char*, sc_subref<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( const sc_logic&, sc_subref<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>operator , ( sc_subref<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >operator , ( bool, sc_subref<T> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >concat( sc_subref_r<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >concat( sc_subref<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >concat( sc_subref_r<T1>, sc_subref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >concat( sc_subref<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >concat( sc_subref_r<T1>, sc_concref<T2,T3> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >concat( sc_subref<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>concat( sc_subref<T1>, const sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref_r<sc_subref_r<T1>,T2>concat( sc_subref_r<T1>, sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( const char*, sc_subref<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( const sc_logic&, sc_subref<T> );template <class T>inlinesc_concref_r<sc_subref_r<T>,sc_lv_base>concat( sc_subref<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_subref_r<T> >concat( bool, sc_subref<T> );#endif// ----------------------------------------------------------------------------// CLASS TEMPLATE : sc_subref<X>//// Proxy class for sc_proxy part selection (r-value and l-value).// ----------------------------------------------------------------------------template <class X>class sc_subref : public sc_subref_r<X>{public: // typedefs typedef sc_subref_r<X> base_type; // constructor sc_subref( X& obj_, int hi_, int lo_ ) : sc_subref_r<X>( obj_, hi_, lo_ ) {} // copy constructor sc_subref( const sc_subref<X>& a ) : sc_subref_r<X>( a ) {} // cloning sc_subref<X>* clone() const { return new sc_subref<X>( *this ); } // assignment operators template <class Y> sc_subref<X>& operator = ( const sc_proxy<Y>& a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_subref_r<X>& a ); sc_subref<X>& operator = ( const sc_subref<X>& a ); sc_subref<X>& operator = ( const char* a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const bool* a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_logic* a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_unsigned& a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_signed& a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_uint_base& a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( const sc_int_base& a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( unsigned long a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( long a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( unsigned int a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( int a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( uint64 a ) { base_type::assign_( a ); return *this; } sc_subref<X>& operator = ( int64 a ) { base_type::assign_( a ); return *this; } // other methods void scan( ::std::istream& = ::std::cin );private: // disabled sc_subref();};// l-value concatenation operators and functionstemplate <class T1, class T2>inlinesc_concref<sc_subref<T1>,sc_bitref<T2> >operator , ( sc_subref<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref<sc_subref<T1>,sc_subref<T2> >operator , ( sc_subref<T1>, sc_subref<T2> );template <class T1, class T2, class T3>inlinesc_concref<sc_subref<T1>,sc_concref<T2,T3> >operator , ( sc_subref<T1>, sc_concref<T2,T3> );template <class T1, class T2>inlinesc_concref<sc_subref<T1>,T2>operator , ( sc_subref<T1>, sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref<sc_subref<T1>,sc_bitref<T2> >concat( sc_subref<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref<sc_subref<T1>,sc_subref<T2> >concat( sc_subref<T1>, sc_subref<T2> );template <class T1, class T2, class T3>inlinesc_concref<sc_subref<T1>,sc_concref<T2,T3> >concat( sc_subref<T1>, sc_concref<T2,T3> );template <class T1, class T2>inlinesc_concref<sc_subref<T1>,T2>concat( sc_subref<T1>, sc_proxy<T2>& );template <class T>inline::std::istream&operator >> ( ::std::istream&, sc_subref<T> );// ----------------------------------------------------------------------------// CLASS TEMPLATE : sc_concref_r<X,Y>//// Proxy class for sc_proxy concatenation (r-value only).// ----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -