mirror of https://github.com/procxx/kepka.git
				
				
				
			
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #ifndef MAPBOX_UTIL_OPTIONAL_HPP
 | |
| #define MAPBOX_UTIL_OPTIONAL_HPP
 | |
| 
 | |
| #pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.")
 | |
| 
 | |
| #include <type_traits>
 | |
| #include <utility>
 | |
| 
 | |
| #include <mapbox/variant.hpp>
 | |
| 
 | |
| namespace mapbox {
 | |
| namespace util {
 | |
| 
 | |
| template <typename T>
 | |
| class optional
 | |
| {
 | |
|     static_assert(!std::is_reference<T>::value, "optional doesn't support references");
 | |
| 
 | |
|     struct none_type
 | |
|     {
 | |
|     };
 | |
| 
 | |
|     variant<none_type, T> variant_;
 | |
| 
 | |
| public:
 | |
|     optional() = default;
 | |
| 
 | |
|     optional(optional const& rhs)
 | |
|     {
 | |
|         if (this != &rhs)
 | |
|         { // protect against invalid self-assignment
 | |
|             variant_ = rhs.variant_;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     optional(T const& v) { variant_ = v; }
 | |
| 
 | |
|     explicit operator bool() const noexcept { return variant_.template is<T>(); }
 | |
| 
 | |
|     T const& get() const { return variant_.template get<T>(); }
 | |
|     T& get() { return variant_.template get<T>(); }
 | |
| 
 | |
|     T const& operator*() const { return this->get(); }
 | |
|     T operator*() { return this->get(); }
 | |
| 
 | |
|     optional& operator=(T const& v)
 | |
|     {
 | |
|         variant_ = v;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     optional& operator=(optional const& rhs)
 | |
|     {
 | |
|         if (this != &rhs)
 | |
|         {
 | |
|             variant_ = rhs.variant_;
 | |
|         }
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     template <typename... Args>
 | |
|     void emplace(Args&&... args)
 | |
|     {
 | |
|         variant_ = T{std::forward<Args>(args)...};
 | |
|     }
 | |
| 
 | |
|     void reset() { variant_ = none_type{}; }
 | |
| 
 | |
| }; // class optional
 | |
| 
 | |
| } // namespace util
 | |
| } // namespace mapbox
 | |
| 
 | |
| #endif // MAPBOX_UTIL_OPTIONAL_HPP
 |