mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-04-26 03:21:26 +00:00
Add move semantics to idList and idStr
* idListArrayResize uses std::move * idStr implements move constructor * and move operator * mpMap_t also implements a move operator
This commit is contained in:
parent
868fd1dce3
commit
93b8564b6e
3 changed files with 71 additions and 1 deletions
|
@ -167,6 +167,7 @@ struct MemInfo_t
|
||||||
|
|
||||||
struct mpMap_t
|
struct mpMap_t
|
||||||
{
|
{
|
||||||
|
mpMap_t& operator=( mpMap_t&& src ) = default;
|
||||||
|
|
||||||
void operator=( const mpMap_t& src )
|
void operator=( const mpMap_t& src )
|
||||||
{
|
{
|
||||||
|
|
|
@ -130,6 +130,7 @@ class idStr
|
||||||
|
|
||||||
public:
|
public:
|
||||||
idStr();
|
idStr();
|
||||||
|
idStr( idStr&& text ) noexcept; // Admer: added move constructor
|
||||||
idStr( const idStr& text );
|
idStr( const idStr& text );
|
||||||
idStr( const idStr& text, int start, int end );
|
idStr( const idStr& text, int start, int end );
|
||||||
idStr( const char* text );
|
idStr( const char* text );
|
||||||
|
@ -149,6 +150,7 @@ public:
|
||||||
char operator[]( int index ) const;
|
char operator[]( int index ) const;
|
||||||
char& operator[]( int index );
|
char& operator[]( int index );
|
||||||
|
|
||||||
|
void operator=( idStr&& text ) noexcept; // Admer: added move operator
|
||||||
void operator=( const idStr& text );
|
void operator=( const idStr& text );
|
||||||
void operator=( const char* text );
|
void operator=( const char* text );
|
||||||
|
|
||||||
|
@ -477,6 +479,12 @@ ID_INLINE idStr::idStr()
|
||||||
Construct();
|
Construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ID_INLINE idStr::idStr( idStr&& text ) noexcept
|
||||||
|
{
|
||||||
|
Construct();
|
||||||
|
*this = std::move( text );
|
||||||
|
}
|
||||||
|
|
||||||
ID_INLINE idStr::idStr( const idStr& text )
|
ID_INLINE idStr::idStr( const idStr& text )
|
||||||
{
|
{
|
||||||
Construct();
|
Construct();
|
||||||
|
@ -677,6 +685,28 @@ ID_INLINE char& idStr::operator[]( int index )
|
||||||
return data[ index ];
|
return data[ index ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ID_INLINE void idStr::operator=( idStr&& text ) noexcept
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
|
||||||
|
len = text.len;
|
||||||
|
allocedAndFlag = text.allocedAndFlag;
|
||||||
|
memcpy( baseBuffer, text.baseBuffer, sizeof( baseBuffer ) );
|
||||||
|
|
||||||
|
if ( text.data == text.baseBuffer )
|
||||||
|
{
|
||||||
|
data = baseBuffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = text.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
text.len = 0;
|
||||||
|
text.allocedAndFlag = 0;
|
||||||
|
text.data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
ID_INLINE void idStr::operator=( const idStr& text )
|
ID_INLINE void idStr::operator=( const idStr& text )
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
|
|
|
@ -98,7 +98,8 @@ ID_INLINE void* idListArrayResize( void* voldptr, int oldNum, int newNum, bool z
|
||||||
int overlap = Min( oldNum, newNum );
|
int overlap = Min( oldNum, newNum );
|
||||||
for( int i = 0; i < overlap; i++ )
|
for( int i = 0; i < overlap; i++ )
|
||||||
{
|
{
|
||||||
newptr[i] = oldptr[i];
|
//newptr[i] = oldptr[i];
|
||||||
|
newptr[i] = std::move( oldptr[i] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
idListArrayDelete<_type_>( voldptr, oldNum );
|
idListArrayDelete<_type_>( voldptr, oldNum );
|
||||||
|
@ -125,6 +126,7 @@ public:
|
||||||
typedef _type_ new_t();
|
typedef _type_ new_t();
|
||||||
|
|
||||||
idList( int newgranularity = 16 );
|
idList( int newgranularity = 16 );
|
||||||
|
idList( idList&& other );
|
||||||
idList( const idList& other );
|
idList( const idList& other );
|
||||||
idList( std::initializer_list<_type_> initializerList );
|
idList( std::initializer_list<_type_> initializerList );
|
||||||
~idList();
|
~idList();
|
||||||
|
@ -139,6 +141,7 @@ public:
|
||||||
size_t Size() const; // returns total size of allocated memory including size of list _type_
|
size_t Size() const; // returns total size of allocated memory including size of list _type_
|
||||||
size_t MemoryUsed() const; // returns size of the used elements in the list
|
size_t MemoryUsed() const; // returns size of the used elements in the list
|
||||||
|
|
||||||
|
idList<_type_, _tag_>& operator=( idList<_type_, _tag_>&& other );
|
||||||
idList<_type_, _tag_>& operator=( const idList<_type_, _tag_>& other );
|
idList<_type_, _tag_>& operator=( const idList<_type_, _tag_>& other );
|
||||||
const _type_& operator[]( int index ) const;
|
const _type_& operator[]( int index ) const;
|
||||||
_type_& operator[]( int index );
|
_type_& operator[]( int index );
|
||||||
|
@ -303,6 +306,18 @@ ID_INLINE idList<_type_, _tag_>::idList( int newgranularity )
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
idList<_type_,_tag_>::idList( idList< _type_, _tag_ >&& other )
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
template< typename _type_, memTag_t _tag_ >
|
||||||
|
ID_INLINE idList<_type_, _tag_>::idList( idList&& other )
|
||||||
|
{
|
||||||
|
list = NULL;
|
||||||
|
*this = std::move( other );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
idList<_type_,_tag_>::idList( const idList< _type_, _tag_ > &other )
|
idList<_type_,_tag_>::idList( const idList< _type_, _tag_ > &other )
|
||||||
|
@ -700,6 +715,30 @@ ID_INLINE void idList<_type_, _tag_>::AssureSizeAlloc( int newSize, new_t* alloc
|
||||||
================
|
================
|
||||||
idList<_type_,_tag_>::operator=
|
idList<_type_,_tag_>::operator=
|
||||||
|
|
||||||
|
Moves the contents and size attributes of another list, effectively emptying the other list.
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
template< typename _type_, memTag_t _tag_ >
|
||||||
|
ID_INLINE idList<_type_, _tag_>& idList<_type_, _tag_>::operator=( idList<_type_, _tag_>&& other )
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
|
||||||
|
num = other.num;
|
||||||
|
size = other.size;
|
||||||
|
granularity = other.granularity;
|
||||||
|
memTag = other.memTag;
|
||||||
|
list = other.list;
|
||||||
|
|
||||||
|
other.list = nullptr;
|
||||||
|
other.Clear();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
idList<_type_,_tag_>::operator=
|
||||||
|
|
||||||
Copies the contents and size attributes of another list.
|
Copies the contents and size attributes of another list.
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue