#pragma once #include #include #include namespace fc { /** * Provides a fixed size array that is easier for templates to specialize * against or overload than T[N]. */ template class array { public: /** * Checked indexing (when in debug build) that also simplifies dereferencing * when you have an array*. */ ///@{ T& at( size_t pos ) { assert( pos < N); return data[pos]; } const T& at( size_t pos )const { assert( pos < N); return data[pos]; } ///@} T& operator[]( size_t pos ) { assert( pos < N); return data[pos]; } const T& operator[]( size_t pos )const { assert( pos < N); return data[pos]; } const T* begin()const { return &data[0]; } const T* end()const { return &data[N]; } T* begin() { return &data[0]; } T* end() { return &data[N]; } size_t size()const { return N; } T data[N]; }; /** provided for default 0 init */ template class array { public: typedef unsigned char T; array(){ memset( data, 0, sizeof(data) ); } /** * Checked indexing (when in debug build) that also simplifies dereferencing * when you have an array*. */ ///@{ T& at( size_t pos ) { assert( pos < N); return data[pos]; } const T& at( size_t pos )const { assert( pos < N); return data[pos]; } ///@} T* begin() { return &data[0]; } const T* begin()const { return &data[0]; } const T* end()const { return &data[N]; } size_t size()const { return N; } T data[N]; }; /** provided for default 0 init */ template class array { public: typedef char T; array(){ memset( data, 0, sizeof(data) ); } /** * Checked indexing (when in debug build) that also simplifies dereferencing * when you have an array*. */ ///@{ T& at( size_t pos ) { assert( pos < N); return data[pos]; } const T& at( size_t pos )const { assert( pos < N); return data[pos]; } ///@} T* begin() { return &data[0]; } const T* begin()const { return &data[0]; } const T* end()const { return &data[N]; } size_t size()const { return N; } T data[N]; }; template bool operator == ( const array& a, const array& b ) { return 0 == memcmp( a.data, b.data, N*sizeof(T) ); } template bool operator < ( const array& a, const array& b ) { return memcmp( a.data, b.data, N*sizeof(T) ) < 0 ; } template bool operator > ( const array& a, const array& b ) { return memcmp( a.data, b.data, N*sizeof(T) ) > 0 ; } template bool operator != ( const array& a, const array& b ) { return 0 != memcmp( a.data, b.data, N*sizeof(T) ); } template void to_variant( const array& bi, variant& v, uint32_t max_depth = 1 ) { to_variant( std::vector( (const char*)&bi, ((const char*)&bi) + sizeof(bi) ), v, 1 ); } template void from_variant( const variant& v, array& bi, uint32_t max_depth = 1 ) { std::vector ve = v.as< std::vector >( 1 ); if( ve.size() ) { memcpy(&bi, ve.data(), fc::min(ve.size(),sizeof(bi)) ); } else for (size_t i = 0; i < bi.size(); i++) { bi.data[i] = 0; } } template struct get_typename< fc::array > { static const char* name() { static std::string _name = std::string("fc::array<")+std::string(fc::get_typename::name())+","+ fc::to_string(N) + ">"; return _name.c_str(); } }; } #include #include namespace std { template struct hash > { size_t operator()( const fc::array& e )const { return fc::city_hash_size_t( (char*)&e, sizeof(e) ); } }; }