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():_valid(false){}
|
||||||
~optional(){ reset(); }
|
~optional(){ reset(); }
|
||||||
|
|
||||||
optional( const optional& o )
|
|
||||||
:_valid(false)
|
|
||||||
{
|
|
||||||
if( o._valid ) new (ptr()) T( *o );
|
|
||||||
_valid = o._valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
optional( optional& o )
|
optional( optional& o )
|
||||||
:_valid(false)
|
:_valid(false)
|
||||||
{
|
{
|
||||||
|
|
@ -36,6 +29,13 @@ namespace fc {
|
||||||
_valid = o._valid;
|
_valid = o._valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optional( const optional& o )
|
||||||
|
:_valid(false)
|
||||||
|
{
|
||||||
|
if( o._valid ) new (ptr()) T( *o );
|
||||||
|
_valid = o._valid;
|
||||||
|
}
|
||||||
|
|
||||||
optional( optional&& o )
|
optional( optional&& o )
|
||||||
:_valid(false)
|
:_valid(false)
|
||||||
{
|
{
|
||||||
|
|
@ -44,6 +44,34 @@ namespace fc {
|
||||||
o.reset();
|
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>
|
template<typename U>
|
||||||
optional( U&& u )
|
optional( U&& u )
|
||||||
:_valid(true)
|
:_valid(true)
|
||||||
|
|
@ -60,6 +88,49 @@ namespace fc {
|
||||||
return *this;
|
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 ) {
|
optional& operator=( const optional& o ) {
|
||||||
if (this != &o) {
|
if (this != &o) {
|
||||||
if( _valid && o._valid ) {
|
if( _valid && o._valid ) {
|
||||||
|
|
@ -74,6 +145,24 @@ namespace fc {
|
||||||
return *this;
|
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 )
|
optional& operator=( optional&& o )
|
||||||
{
|
{
|
||||||
if (this != &o)
|
if (this != &o)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue