| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | 
							- /*
 
-  *  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
 
 
  |