upgrade variant dependency
This commit is contained in:
		
							parent
							
								
									90d191f5f8
								
							
						
					
					
						commit
						9b501276fb
					
				
							
								
								
									
										78
									
								
								ThirdParty/variant/optional.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								ThirdParty/variant/optional.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | |||||||
|  | #ifndef MAPBOX_UTIL_OPTIONAL_HPP | ||||||
|  | #define MAPBOX_UTIL_OPTIONAL_HPP | ||||||
|  | 
 | ||||||
|  | #include <type_traits> | ||||||
|  | 
 | ||||||
|  | #include "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; } | ||||||
|  | 
 | ||||||
|  |     optional &operator=(optional other) | ||||||
|  |     { // note: argument passed by value!
 | ||||||
|  |         if (this != &other) | ||||||
|  |         { | ||||||
|  |             swap(other); | ||||||
|  |         } | ||||||
|  |         return *this; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     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{}; } | ||||||
|  | }; | ||||||
|  | } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user