mirror of https://github.com/procxx/kepka.git
				
				
				
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.1 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
 | 
						|
 | 
						|
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
 |