Sets - Free & clear (inb4 blood parasites)
This commit is contained in:
parent
e40417384d
commit
752b4977e6
2 changed files with 119 additions and 1 deletions
103
Sets-inline.hh
103
Sets-inline.hh
|
@ -25,10 +25,14 @@ class T_SetImplementation< Type , ArrayBacked< 0 , Growth > >
|
|||
|
||||
uint32_t size( ) const noexcept;
|
||||
int32_t indexOf( Type const& item ) const noexcept;
|
||||
Type const* access( uint32_t item ) const noexcept;
|
||||
|
||||
bool add( Type const& item ) noexcept;
|
||||
bool add( Type&& item ) noexcept;
|
||||
bool remove( Type const& item ) noexcept;
|
||||
|
||||
void free( ) noexcept;
|
||||
void clear( ) noexcept;
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
@ -48,6 +52,8 @@ M_TYPE_::T_SetImplementation( ) noexcept
|
|||
: data_( Growth )
|
||||
{ }
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
M_TMPL_ uint32_t M_TYPE_::size( ) const noexcept
|
||||
{
|
||||
return data_.size( );
|
||||
|
@ -59,6 +65,14 @@ M_TMPL_ int32_t M_TYPE_::indexOf(
|
|||
return data_.indexOf( item );
|
||||
}
|
||||
|
||||
M_TMPL_ Type const* M_TYPE_::access(
|
||||
const uint32_t item ) const noexcept
|
||||
{
|
||||
return &data_[ item ];
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
M_TMPL_ bool M_TYPE_::add(
|
||||
Type const& item ) noexcept
|
||||
{
|
||||
|
@ -89,6 +103,18 @@ M_TMPL_ bool M_TYPE_::remove(
|
|||
return index >= 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
M_TMPL_ void M_TYPE_::free( ) noexcept
|
||||
{
|
||||
data_.free( );
|
||||
}
|
||||
|
||||
M_TMPL_ void M_TYPE_::clear( ) noexcept
|
||||
{
|
||||
data_.clear( );
|
||||
}
|
||||
|
||||
#undef M_TMPL_
|
||||
#undef M_TYPE_
|
||||
|
||||
|
@ -106,10 +132,14 @@ class T_SetImplementation< Type , ArrayBacked< InPlace , Growth > >
|
|||
public:
|
||||
uint32_t size( ) const noexcept;
|
||||
int32_t indexOf( Type const& item ) const noexcept;
|
||||
Type const* access( uint32_t item ) const noexcept;
|
||||
|
||||
bool add( Type const& item ) noexcept;
|
||||
bool add( Type&& item ) noexcept;
|
||||
bool remove( Type const& item ) noexcept;
|
||||
|
||||
void free( ) noexcept;
|
||||
void clear( ) noexcept;
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
@ -128,6 +158,14 @@ M_TMPL_ int32_t M_TYPE_::indexOf(
|
|||
return data_.indexOf( item );
|
||||
}
|
||||
|
||||
M_TMPL_ Type const* M_TYPE_::access(
|
||||
const uint32_t item ) const noexcept
|
||||
{
|
||||
return &data_[ item ];
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
M_TMPL_ bool M_TYPE_::add(
|
||||
Type const& item ) noexcept
|
||||
{
|
||||
|
@ -158,6 +196,18 @@ M_TMPL_ bool M_TYPE_::remove(
|
|||
return index >= 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
M_TMPL_ void M_TYPE_::free( ) noexcept
|
||||
{
|
||||
data_.free( );
|
||||
}
|
||||
|
||||
M_TMPL_ void M_TYPE_::clear( ) noexcept
|
||||
{
|
||||
data_.clear( );
|
||||
}
|
||||
|
||||
#undef M_TMPL_
|
||||
#undef M_TYPE_
|
||||
|
||||
|
@ -203,6 +253,11 @@ void T_SetHelper::T_InPlaceHandler< Type , ImplTag >::shdl(
|
|||
*(Type const*) rArg );
|
||||
break;
|
||||
|
||||
case ACCESS:
|
||||
*((Type const**) output) = ((T_Impl_ const*)rArg)->access(
|
||||
*(uint32_t const*) wArg );
|
||||
break;
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
case ADD_COPY:
|
||||
|
@ -217,6 +272,16 @@ void T_SetHelper::T_InPlaceHandler< Type , ImplTag >::shdl(
|
|||
case REMOVE:
|
||||
*((bool*)output) = ((T_Impl_*)wArg)->remove( *((Type const*) rArg) );
|
||||
break;
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
case FREE:
|
||||
((T_Impl_*)wArg)->free( );
|
||||
break;
|
||||
|
||||
case CLEAR:
|
||||
((T_Impl_*)wArg)->clear( );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,6 +326,11 @@ void T_SetHelper::T_HeapHandler< Type , ImplTag >::shdl(
|
|||
*(Type const*) rArg );
|
||||
break;
|
||||
|
||||
case ACCESS:
|
||||
*((Type const**) output) = (*(T_Impl_ const**)rArg)->access(
|
||||
*(uint32_t const*) wArg );
|
||||
break;
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
case ADD_COPY:
|
||||
|
@ -275,6 +345,16 @@ void T_SetHelper::T_HeapHandler< Type , ImplTag >::shdl(
|
|||
case REMOVE:
|
||||
*((bool*)output) = (*(T_Impl_**)wArg)->remove( *((Type const*) rArg) );
|
||||
break;
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
||||
case FREE:
|
||||
(*(T_Impl_**)wArg)->free( );
|
||||
break;
|
||||
|
||||
case CLEAR:
|
||||
(*(T_Impl_**)wArg)->clear( );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -368,6 +448,15 @@ int32_t T_Set< Type >::indexOf(
|
|||
return r;
|
||||
}
|
||||
|
||||
template< typename Type >
|
||||
Type const& T_Set< Type >::operator[](
|
||||
uint32_t index ) const noexcept
|
||||
{
|
||||
Type* ptr;
|
||||
handler_( T_SetHelper::ACCESS , &index , &storage_ , &ptr );
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
template< typename Type >
|
||||
|
@ -397,6 +486,20 @@ bool T_Set< Type >::remove(
|
|||
return r;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
template< typename Type >
|
||||
void T_Set< Type >::free( ) noexcept
|
||||
{
|
||||
handler_( T_SetHelper::FREE , &storage_ , nullptr , nullptr );
|
||||
}
|
||||
|
||||
template< typename Type >
|
||||
void T_Set< Type >::clear( ) noexcept
|
||||
{
|
||||
handler_( T_SetHelper::CLEAR , &storage_ , nullptr , nullptr );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
#endif // _H_EBCL_INLINE_SETS
|
||||
|
|
17
Sets.hh
17
Sets.hh
|
@ -36,7 +36,7 @@ template< typename Type , typename ImplTag >
|
|||
|
||||
|
||||
// ArrayBacked implementation tag. InPlace is the amount of items to
|
||||
// store in-place (0 will cause a T_Array to be used
|
||||
// store in-place (0 will cause a fully dynamic array to be used)
|
||||
M_DEFINE_TEMPLATE_TAG( ArrayBacked ,
|
||||
uint32_t InPlace ,
|
||||
uint32_t Growth = 0
|
||||
|
@ -85,6 +85,8 @@ struct T_SetHelper
|
|||
SIZE ,
|
||||
// Get index of element; wArg = storage, rArg = element, output = result
|
||||
INDEX_OF ,
|
||||
// Access an element; wArg = index , rArg = storage, output = pointer
|
||||
ACCESS ,
|
||||
|
||||
// Add copy of element; wArg = storage, rArg = element, output = result
|
||||
ADD_COPY ,
|
||||
|
@ -92,6 +94,11 @@ struct T_SetHelper
|
|||
ADD_MOVE ,
|
||||
// Delete element; wArg = storage, rArg = element, output = result
|
||||
REMOVE ,
|
||||
|
||||
// Free memory; wArg = storage
|
||||
FREE ,
|
||||
// Clear contents; wArg = storage
|
||||
CLEAR ,
|
||||
};
|
||||
|
||||
// Handler function type
|
||||
|
@ -172,6 +179,9 @@ class T_Set
|
|||
// Returns underlying index of item, or -1 if not in the set
|
||||
int32_t indexOf( Type const& item ) const noexcept;
|
||||
|
||||
// Access an element using its underlying index
|
||||
Type const& operator[]( uint32_t index ) const noexcept;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
// Add copy of item, returns true if added
|
||||
|
@ -180,6 +190,11 @@ class T_Set
|
|||
bool add( Type&& item ) noexcept;
|
||||
// Remove item, returns true if removed
|
||||
bool remove( Type const& item ) noexcept;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
void clear( ) noexcept;
|
||||
void free( ) noexcept;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue