Implement "move" equivalent of assignment operator for StrPair

This commit is contained in:
Dmitry-Me 2014-11-10 11:17:21 +03:00
parent 97cfa03865
commit 08b40dd8a5
2 changed files with 29 additions and 1 deletions

View File

@ -70,6 +70,29 @@ StrPair::~StrPair()
}
void StrPair::TransferTo( StrPair& other )
{
if ( this == &other ) {
return;
}
// This in effect implements the assignment operator by "moving"
// ownership (as in auto_ptr).
TIXMLASSERT( other._flags == 0 );
TIXMLASSERT( other._start == 0 );
TIXMLASSERT( other._end == 0 );
other.Reset();
other._flags = _flags;
other._start = _start;
other._end = _end;
_flags = 0;
_start = 0;
_end = 0;
}
void StrPair::Reset()
{
if ( _flags & NEEDS_DELETE ) {
@ -824,7 +847,7 @@ char* XMLNode::ParseDeep( char* p, StrPair* parentEnd )
// We read the end tag. Return it to the parent.
if ( ele && ele->ClosingType() == XMLElement::CLOSING ) {
if ( parentEnd ) {
*parentEnd = ele->_value;
ele->_value.TransferTo( *parentEnd );
}
node->_memPool->SetTracked(); // created and then immediately deleted.
DeleteNode( node );

View File

@ -184,6 +184,8 @@ public:
char* ParseText( char* in, const char* endTag, int strFlags );
char* ParseName( char* in );
void TransferTo( StrPair& other );
private:
void Reset();
void CollapseWhitespace();
@ -197,6 +199,9 @@ private:
int _flags;
char* _start;
char* _end;
StrPair( const StrPair& other ); // not supported
void operator=( StrPair& other ); // not supported, use TransferTo()
};