update assignment and copy constructor templates for fc::optional
This commit is contained in:
parent
8315e1bded
commit
9d79456cc5
1 changed files with 96 additions and 7 deletions
|
|
@ -22,13 +22,6 @@ namespace fc {
|
|||
optional():_valid(false){}
|
||||
~optional(){ reset(); }
|
||||
|
||||
optional( const optional& o )
|
||||
:_valid(false)
|
||||
{
|
||||
if( o._valid ) new (ptr()) T( *o );
|
||||
_valid = o._valid;
|
||||
}
|
||||
|
||||
optional( optional& o )
|
||||
:_valid(false)
|
||||
{
|
||||
|
|
@ -36,6 +29,13 @@ namespace fc {
|
|||
_valid = o._valid;
|
||||
}
|
||||
|
||||
optional( const optional& o )
|
||||
:_valid(false)
|
||||
{
|
||||
if( o._valid ) new (ptr()) T( *o );
|
||||
_valid = o._valid;
|
||||
}
|
||||
|
||||
optional( optional&& o )
|
||||
:_valid(false)
|
||||
{
|
||||
|
|
@ -44,6 +44,34 @@ namespace fc {
|
|||
o.reset();
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional( const optional<U>& o )
|
||||
:_valid(false)
|
||||
{
|
||||
if( o._valid ) new (ptr()) T( *o );
|
||||
_valid = o._valid;
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional( optional<U>& o )
|
||||
:_valid(false)
|
||||
{
|
||||
if( o._valid )
|
||||
{
|
||||
new (ptr()) T( *o );
|
||||
}
|
||||
_valid = o._valid;
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional( optional<U>&& o )
|
||||
:_valid(false)
|
||||
{
|
||||
if( o._valid ) new (ptr()) T( fc::move(*o) );
|
||||
_valid = o._valid;
|
||||
o.reset();
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional( U&& u )
|
||||
:_valid(true)
|
||||
|
|
@ -60,6 +88,49 @@ namespace fc {
|
|||
return *this;
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional& operator=( optional<U>& o ) {
|
||||
if (this != &o) {
|
||||
if( _valid && o._valid ) {
|
||||
ref() = *o;
|
||||
} else if( !_valid && o._valid ) {
|
||||
new (ptr()) T( *o );
|
||||
_valid = true;
|
||||
} else if (_valid) {
|
||||
reset();
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
template<typename U>
|
||||
optional& operator=( const optional<U>& o ) {
|
||||
if (this != &o) {
|
||||
if( _valid && o._valid ) {
|
||||
ref() = *o;
|
||||
} else if( !_valid && o._valid ) {
|
||||
new (ptr()) T( *o );
|
||||
_valid = true;
|
||||
} else if (_valid) {
|
||||
reset();
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
optional& operator=( optional& o ) {
|
||||
if (this != &o) {
|
||||
if( _valid && o._valid ) {
|
||||
ref() = *o;
|
||||
} else if( !_valid && o._valid ) {
|
||||
new (ptr()) T( *o );
|
||||
_valid = true;
|
||||
} else if (_valid) {
|
||||
reset();
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
optional& operator=( const optional& o ) {
|
||||
if (this != &o) {
|
||||
if( _valid && o._valid ) {
|
||||
|
|
@ -74,6 +145,24 @@ namespace fc {
|
|||
return *this;
|
||||
}
|
||||
|
||||
template<typename U>
|
||||
optional& operator=( optional<U>&& o )
|
||||
{
|
||||
if (this != &o)
|
||||
{
|
||||
if( _valid && o._valid )
|
||||
{
|
||||
ref() = fc::move(*o);
|
||||
o.reset();
|
||||
} else if ( !_valid && o._valid ) {
|
||||
*this = fc::move(*o);
|
||||
} else if (_valid) {
|
||||
reset();
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
optional& operator=( optional&& o )
|
||||
{
|
||||
if (this != &o)
|
||||
|
|
|
|||
Loading…
Reference in a new issue