| /* |
| * 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 |
| |
| 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; } |
| explicit operator bool() const { |
| return some(); |
| } |
| |
| private: |
| T *nullableValue; |
| alignas(alignof(T)) char storage[sizeof(T)]; |
| }; |
| |
| } // end namespace Catch |
| |
| #endif // TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED |