BAN: Optional can be constructed inplace
This commit is contained in:
		
							parent
							
								
									16e5f96b1d
								
							
						
					
					
						commit
						b9603d9d23
					
				|  | @ -15,11 +15,17 @@ namespace BAN | ||||||
| 		Optional(); | 		Optional(); | ||||||
| 		Optional(const T&); | 		Optional(const T&); | ||||||
| 		Optional(T&&); | 		Optional(T&&); | ||||||
|  | 		template<typename... Args> | ||||||
|  | 		Optional(Args&&...); | ||||||
|  | 
 | ||||||
| 		~Optional(); | 		~Optional(); | ||||||
| 
 | 
 | ||||||
| 		Optional& operator=(const Optional&); | 		Optional& operator=(const Optional&); | ||||||
| 		Optional& operator=(Optional&&); | 		Optional& operator=(Optional&&); | ||||||
| 
 | 
 | ||||||
|  | 		template<typename... Args> | ||||||
|  | 		Optional& emplace(Args&&...); | ||||||
|  | 
 | ||||||
| 		T* operator->(); | 		T* operator->(); | ||||||
| 		const T* operator->() const; | 		const T* operator->() const; | ||||||
| 
 | 
 | ||||||
|  | @ -58,6 +64,14 @@ namespace BAN | ||||||
| 		new (m_storage) T(BAN::move(value)); | 		new (m_storage) T(BAN::move(value)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	template<typename... Args> | ||||||
|  | 	Optional<T>::Optional(Args&&... args) | ||||||
|  | 		: m_has_value(true) | ||||||
|  | 	{ | ||||||
|  | 		new (m_storage) T(BAN::forward<Args>(args)...); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	template<typename T> | 	template<typename T> | ||||||
| 	Optional<T>::~Optional() | 	Optional<T>::~Optional() | ||||||
| 	{ | 	{ | ||||||
|  | @ -73,6 +87,7 @@ namespace BAN | ||||||
| 			m_has_value = true; | 			m_has_value = true; | ||||||
| 			new (m_storage) T(other.value()); | 			new (m_storage) T(other.value()); | ||||||
| 		} | 		} | ||||||
|  | 		return *this; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	template<typename T> | 	template<typename T> | ||||||
|  | @ -84,6 +99,17 @@ namespace BAN | ||||||
| 			m_has_value = true; | 			m_has_value = true; | ||||||
| 			new (m_storage) T(BAN::move(other.release_value())); | 			new (m_storage) T(BAN::move(other.release_value())); | ||||||
| 		} | 		} | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	template<typename T> | ||||||
|  | 	template<typename... Args> | ||||||
|  | 	Optional<T>& Optional<T>::emplace(Args&&... args) | ||||||
|  | 	{ | ||||||
|  | 		clear(); | ||||||
|  | 		m_has_value = true; | ||||||
|  | 		new (m_storage) T(BAN::forward<Args>(args)...); | ||||||
|  | 		return *this; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	template<typename T> | 	template<typename T> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue