Arrays - New utility methods

empty(), last() and removeLast()
This commit is contained in:
Emmanuel BENOîT 2017-11-03 09:35:14 +01:00
parent 90048ad3cc
commit 4d336e7086
2 changed files with 100 additions and 2 deletions

View file

@ -116,6 +116,7 @@ class T_Array final
uint32_t capacity( ) const noexcept;
uint32_t size( ) const noexcept;
uint32_t growth( ) const noexcept;
bool empty( ) const noexcept;
MyType_& ensureCapacity( uint32_t capacity ) noexcept;
@ -124,6 +125,9 @@ class T_Array final
T& operator[] ( uint32_t index ) noexcept;
T const& operator[] ( uint32_t index ) const noexcept;
T& last( ) noexcept;
T const& last( ) const noexcept;
int32_t indexOf( T const& item ) const noexcept;
bool contains( T const& item ) const noexcept;
@ -162,6 +166,7 @@ class T_Array final
void remove( uint32_t index ) noexcept;
void removeSwap( uint32_t index ) noexcept;
void removeLast( ) noexcept;
// ---------------------------------------------------------------------
@ -251,12 +256,16 @@ class T_StaticArray final
constexpr uint32_t capacity( ) const noexcept;
uint32_t size( ) const noexcept;
bool empty( ) const noexcept;
// ---------------------------------------------------------------------
Type& operator[] ( uint32_t index ) noexcept;
Type const& operator[] ( uint32_t index ) const noexcept;
Type& last( ) noexcept;
Type const& last( ) const noexcept;
int32_t indexOf( Type const& item ) const noexcept;
bool contains( Type const& item ) const noexcept;
@ -293,6 +302,7 @@ class T_StaticArray final
void remove( uint32_t index ) noexcept;
void removeSwap( uint32_t index ) noexcept;
void removeLast( ) noexcept;
// ---------------------------------------------------------------------
@ -444,6 +454,7 @@ template<
uint32_t size( ) const noexcept;
constexpr uint32_t growth( ) const noexcept;
bool isStatic( ) const noexcept;
bool empty( ) const noexcept;
T_Self& ensureCapacity( uint32_t capacity ) noexcept;
@ -452,6 +463,9 @@ template<
T& operator[] ( uint32_t index ) noexcept;
T const& operator[] ( uint32_t index ) const noexcept;
T& last( ) noexcept;
T const& last( ) const noexcept;
int32_t indexOf( T const& item ) const noexcept;
bool contains( T const& item ) const noexcept;
@ -490,6 +504,7 @@ template<
void remove( uint32_t index ) noexcept;
void removeSwap( uint32_t index ) noexcept;
void removeLast( ) noexcept;
// ---------------------------------------------------------------------

View file

@ -147,6 +147,12 @@ inline uint32_t T_Array< T >::growth( ) const noexcept
return growth_;
}
template< typename T >
inline bool T_Array< T >::empty( ) const noexcept
{
return size_ != 0;
}
/*----------------------------------------------------------------------------*/
template< typename T >
@ -191,6 +197,20 @@ inline T const& T_Array< T >::operator[] (
return data_[ index ];
}
template< typename T >
inline T& T_Array< T >::last( ) noexcept
{
assert( !empty( ) );
return data_[ size_ - 1 ];
}
template< typename T >
inline T const& T_Array< T >::last( ) const noexcept
{
assert( !empty( ) );
return data_[ size_ - 1 ];
}
/*----------------------------------------------------------------------------*/
template< typename T >
@ -401,6 +421,14 @@ inline void T_Array< T >::removeSwap(
size_ --;
}
template< typename T >
inline void T_Array< T >::removeLast( ) noexcept
{
assert( size_ );
data_[ size_ - 1 ].~T( );
size_ --;
}
/*----------------------------------------------------------------------------*/
template< typename T >
@ -1076,6 +1104,12 @@ inline uint32_t T_StaticArray< T , S >::size( ) const noexcept
return size_;
}
template< typename T , uint32_t S >
inline bool T_StaticArray< T , S >::empty( ) const noexcept
{
return size_ != 0;
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S >
@ -1094,6 +1128,20 @@ inline T const& T_StaticArray< T , S >::operator[] (
return *reinterpret_cast< T const* >( &storage_[ index ] );
}
template< typename T , uint32_t S >
inline T& T_StaticArray< T , S >::last( ) noexcept
{
assert( !empty( ) );
return *reinterpret_cast< T* >( &storage_[ size_ - 1 ] );
}
template< typename T , uint32_t S >
inline T const& T_StaticArray< T , S >::last( ) const noexcept
{
assert( !empty( ) );
return *reinterpret_cast< T const* >( &storage_[ size_ - 1 ] );
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S >
@ -1307,6 +1355,14 @@ inline void T_StaticArray< T , S >::removeSwap(
size_ --;
}
template< typename T , uint32_t S >
inline void T_StaticArray< T , S >::removeLast( ) noexcept
{
assert( size_ );
(*this)[ size_ - 1 ].~T( );
size_ --;
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S >
@ -1681,6 +1737,12 @@ inline bool T_AutoArray< T , S , G >::isStatic( ) const noexcept
return array_.template hasType< T_Static_ >( );
}
template< typename T , uint32_t S , uint32_t G >
inline bool T_AutoArray< T , S , G >::empty( ) const noexcept
{
return size( ) != 0;
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S , uint32_t G >
@ -1713,6 +1775,20 @@ inline T const& T_AutoArray< T , S , G >::operator[] (
return isStatic( ) ? static_( )[ index ] : dynamic_( )[ index ];
}
template< typename T , uint32_t S , uint32_t G >
inline T& T_AutoArray< T , S , G >::last( ) noexcept
{
assert( !empty( ) );
return (*this)[ size( ) - 1 ];
}
template< typename T , uint32_t S , uint32_t G >
inline T const& T_AutoArray< T , S , G >::last( ) const noexcept
{
assert( !empty( ) );
return (*this)[ size( ) - 1 ];
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S , uint32_t G >
@ -1881,7 +1957,7 @@ template< typename T , uint32_t S , uint32_t G >
inline void T_AutoArray< T , S , G >::remove(
const uint32_t index ) noexcept
{
return isStatic( )
isStatic( )
? static_( ).remove( index )
: dynamic_( ).remove( index );
}
@ -1890,11 +1966,18 @@ template< typename T , uint32_t S , uint32_t G >
inline void T_AutoArray< T , S , G >::removeSwap(
const uint32_t index ) noexcept
{
return isStatic( )
isStatic( )
? static_( ).removeSwap( index )
: dynamic_( ).removeSwap( index );
}
template< typename T , uint32_t S , uint32_t G >
inline void T_AutoArray< T , S , G >::removeLast( ) noexcept
{
assert( !empty( ) );
remove( size( ) - 1 );
}
/*----------------------------------------------------------------------------*/
template< typename T , uint32_t S , uint32_t G >