@ -114,8 +114,6 @@ inline T fromBigEndian(_In const& _bytes)
}
/// Convenience functions for toBigEndian
inline std : : string toBigEndianString ( u256 _val ) { std : : string ret ( 32 , ' \0 ' ) ; toBigEndian ( _val , ret ) ; return ret ; }
inline std : : string toBigEndianString ( u160 _val ) { std : : string ret ( 20 , ' \0 ' ) ; toBigEndian ( _val , ret ) ; return ret ; }
inline bytes toBigEndian ( u256 _val ) { bytes ret ( 32 ) ; toBigEndian ( _val , ret ) ; return ret ; }
inline bytes toBigEndian ( u160 _val ) { bytes ret ( 20 ) ; toBigEndian ( _val , ret ) ; return ret ; }
@ -131,23 +129,6 @@ inline bytes toCompactBigEndian(T _val, unsigned _min = 0)
toBigEndian ( _val , ret ) ;
return ret ;
}
inline bytes toCompactBigEndian ( byte _val , unsigned _min = 0 )
{
return ( _min | | _val ) ? bytes { _val } : bytes { } ;
}
/// Convenience function for toBigEndian.
/// @returns a string just big enough to represent @a _val.
template < class T >
inline std : : string toCompactBigEndianString ( T _val , unsigned _min = 0 )
{
static_assert ( std : : is_same < bigint , T > : : value | | ! std : : numeric_limits < T > : : is_signed , " only unsigned types or bigint supported " ) ; //bigint does not carry sign bit on shift
int i = 0 ;
for ( T v = _val ; v ; + + i , v > > = 8 ) { }
std : : string ret ( std : : max < unsigned > ( _min , i ) , ' \0 ' ) ;
toBigEndian ( _val , ret ) ;
return ret ;
}
/// Convenience function for conversion of a u256 to hex
inline std : : string toHex ( u256 val , HexPrefix prefix = HexPrefix : : DontAdd )
@ -174,175 +155,4 @@ inline unsigned bytesRequired(T _i)
return i ;
}
/// Trims a given number of elements from the front of a collection.
/// Only works for POD element types.
template < class T >
void trimFront ( T & _t , unsigned _elements )
{
static_assert ( std : : is_pod < typename T : : value_type > : : value , " " ) ;
memmove ( _t . data ( ) , _t . data ( ) + _elements , ( _t . size ( ) - _elements ) * sizeof ( _t [ 0 ] ) ) ;
_t . resize ( _t . size ( ) - _elements ) ;
}
/// Pushes an element on to the front of a collection.
/// Only works for POD element types.
template < class T , class _U >
void pushFront ( T & _t , _U _e )
{
static_assert ( std : : is_pod < typename T : : value_type > : : value , " " ) ;
_t . push_back ( _e ) ;
memmove ( _t . data ( ) + 1 , _t . data ( ) , ( _t . size ( ) - 1 ) * sizeof ( _e ) ) ;
_t [ 0 ] = _e ;
}
/// Concatenate two vectors of elements of POD types.
template < class T >
inline std : : vector < T > & operator + = ( std : : vector < typename std : : enable_if < std : : is_pod < T > : : value , T > : : type > & _a , std : : vector < T > const & _b )
{
auto s = _a . size ( ) ;
_a . resize ( _a . size ( ) + _b . size ( ) ) ;
memcpy ( _a . data ( ) + s , _b . data ( ) , _b . size ( ) * sizeof ( T ) ) ;
return _a ;
}
/// Concatenate two vectors of elements.
template < class T >
inline std : : vector < T > & operator + = ( std : : vector < typename std : : enable_if < ! std : : is_pod < T > : : value , T > : : type > & _a , std : : vector < T > const & _b )
{
_a . reserve ( _a . size ( ) + _b . size ( ) ) ;
for ( auto & i : _b )
_a . push_back ( i ) ;
return _a ;
}
/// Insert the contents of a container into a set
template < class T , class U > std : : set < T > & operator + = ( std : : set < T > & _a , U const & _b )
{
for ( auto const & i : _b )
_a . insert ( i ) ;
return _a ;
}
/// Insert the contents of a container into an unordered_set
template < class T , class U > std : : unordered_set < T > & operator + = ( std : : unordered_set < T > & _a , U const & _b )
{
for ( auto const & i : _b )
_a . insert ( i ) ;
return _a ;
}
/// Concatenate the contents of a container onto a vector
template < class T , class U > std : : vector < T > & operator + = ( std : : vector < T > & _a , U const & _b )
{
for ( auto const & i : _b )
_a . push_back ( i ) ;
return _a ;
}
/// Insert the contents of a container into a set
template < class T , class U > std : : set < T > operator + ( std : : set < T > _a , U const & _b )
{
return _a + = _b ;
}
/// Insert the contents of a container into an unordered_set
template < class T , class U > std : : unordered_set < T > operator + ( std : : unordered_set < T > _a , U const & _b )
{
return _a + = _b ;
}
/// Concatenate the contents of a container onto a vector
template < class T , class U > std : : vector < T > operator + ( std : : vector < T > _a , U const & _b )
{
return _a + = _b ;
}
/// Concatenate two vectors of elements.
template < class T >
inline std : : vector < T > operator + ( std : : vector < T > const & _a , std : : vector < T > const & _b )
{
std : : vector < T > ret ( _a ) ;
return ret + = _b ;
}
/// Merge two sets of elements.
template < class T >
inline std : : set < T > & operator + = ( std : : set < T > & _a , std : : set < T > const & _b )
{
for ( auto & i : _b )
_a . insert ( i ) ;
return _a ;
}
/// Merge two sets of elements.
template < class T >
inline std : : set < T > operator + ( std : : set < T > const & _a , std : : set < T > const & _b )
{
std : : set < T > ret ( _a ) ;
return ret + = _b ;
}
template < class A , class B >
std : : unordered_map < A , B > & operator + = ( std : : unordered_map < A , B > & _x , std : : unordered_map < A , B > const & _y )
{
for ( auto const & i : _y )
_x . insert ( i ) ;
return _x ;
}
template < class A , class B >
std : : unordered_map < A , B > operator + ( std : : unordered_map < A , B > const & _x , std : : unordered_map < A , B > const & _y )
{
std : : unordered_map < A , B > ret ( _x ) ;
return ret + = _y ;
}
/// Make normal string from fixed-length string.
std : : string toString ( string32 const & _s ) ;
template < class T , class U >
std : : vector < T > keysOf ( std : : map < T , U > const & _m )
{
std : : vector < T > ret ;
for ( auto const & i : _m )
ret . push_back ( i . first ) ;
return ret ;
}
template < class T , class U >
std : : vector < T > keysOf ( std : : unordered_map < T , U > const & _m )
{
std : : vector < T > ret ;
for ( auto const & i : _m )
ret . push_back ( i . first ) ;
return ret ;
}
template < class T , class U >
std : : vector < U > valuesOf ( std : : map < T , U > const & _m )
{
std : : vector < U > ret ;
ret . reserve ( _m . size ( ) ) ;
for ( auto const & i : _m )
ret . push_back ( i . second ) ;
return ret ;
}
template < class T , class U >
std : : vector < U > valuesOf ( std : : unordered_map < T , U > const & _m )
{
std : : vector < U > ret ;
ret . reserve ( _m . size ( ) ) ;
for ( auto const & i : _m )
ret . push_back ( i . second ) ;
return ret ;
}
template < class T , class V >
bool contains ( T const & _t , V const & _v )
{
return std : : end ( _t ) ! = std : : find ( std : : begin ( _t ) , std : : end ( _t ) , _v ) ;
}
}