mirror of
https://github.com/catchorg/Catch2.git
synced 2024-12-28 05:33:30 +01:00
71df66365e
All C++11 toggles are now removed. What is left is either platform specific (POSIX_SIGNALS, WINDOWS_SEH), or possibly still needed (USE_COUNTER). If current CLion is compatible with `__COUNTER__`, then we should also force `__COUNTER__` usage. Changed * CATCH_AUTO_PTR -> std::unique_ptr * CATCH_OVERRIDE -> override * CATCH_NULL -> nullptr * CATCH_NOEXCEPT -> noexcept * CATCH_NOEXCEPT_IS -> noexcept Removed * CATCH_CONFIG_CPP11_UNIQUE_PTR * CATCH_CONFIG_CPP11_SHUFFLE * CATCH_CONFIG_CPP11_TYPE_TRAITS * CATCH_CONFIG_CPP11_OVERRIDE * CATCH_CONFIG_CPP11_LONG_LONG * CATCH_CONFIG_CPP11_TUPLE * CATCH_CONFIG_CPP11_IS_ENUM * CATCH_CONFIG_CPP11_GENERATED_METHODS * CATCH_CONFIG_CPP11_NOEXCEPT * CATCH_CONFIG_CPP11_NULLPTR * CATCH_CONFIG_VARIADIC_MACROS
84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
/*
|
|
* Created by Phil on 02/12/2012.
|
|
* Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
|
|
*
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
#ifndef TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|
|
#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|
|
|
|
#include "catch_common.h"
|
|
|
|
namespace Catch {
|
|
|
|
// An optional type
|
|
template<typename T>
|
|
class Option {
|
|
public:
|
|
Option() : nullableValue( nullptr ) {}
|
|
Option( T const& _value )
|
|
: nullableValue( new( storage ) T( _value ) )
|
|
{}
|
|
Option( Option const& _other )
|
|
: nullableValue( _other ? new( storage ) T( *_other ) : nullptr )
|
|
{}
|
|
|
|
~Option() {
|
|
reset();
|
|
}
|
|
|
|
Option& operator= ( Option const& _other ) {
|
|
if( &_other != this ) {
|
|
reset();
|
|
if( _other )
|
|
nullableValue = new( storage ) T( *_other );
|
|
}
|
|
return *this;
|
|
}
|
|
Option& operator = ( T const& _value ) {
|
|
reset();
|
|
nullableValue = new( storage ) T( _value );
|
|
return *this;
|
|
}
|
|
|
|
void reset() {
|
|
if( nullableValue )
|
|
nullableValue->~T();
|
|
nullableValue = nullptr;
|
|
}
|
|
|
|
T& operator*() { return *nullableValue; }
|
|
T const& operator*() const { return *nullableValue; }
|
|
T* operator->() { return nullableValue; }
|
|
const T* operator->() const { return nullableValue; }
|
|
|
|
T valueOr( T const& defaultValue ) const {
|
|
return nullableValue ? *nullableValue : defaultValue;
|
|
}
|
|
|
|
bool some() const { return nullableValue != nullptr; }
|
|
bool none() const { return nullableValue == nullptr; }
|
|
|
|
bool operator !() const { return nullableValue == nullptr; }
|
|
operator SafeBool::type() const {
|
|
return SafeBool::makeSafe( some() );
|
|
}
|
|
|
|
private:
|
|
T *nullableValue;
|
|
union {
|
|
char storage[sizeof(T)];
|
|
|
|
// These are here to force alignment for the storage
|
|
long double dummy1;
|
|
void (*dummy2)();
|
|
long double dummy3;
|
|
long long dummy4;
|
|
};
|
|
};
|
|
|
|
} // end namespace Catch
|
|
|
|
#endif // TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|