mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Add another weirdly missing file.
This commit is contained in:
		
							
								
								
									
										98
									
								
								dep/lexy/include/lexy/callback/object.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								dep/lexy/include/lexy/callback/object.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| // Copyright (C) 2020-2025 Jonathan Müller and lexy contributors | ||||
| // SPDX-License-Identifier: BSL-1.0 | ||||
|  | ||||
| #ifndef LEXY_CALLBACK_OBJECT_HPP_INCLUDED | ||||
| #define LEXY_CALLBACK_OBJECT_HPP_INCLUDED | ||||
|  | ||||
| #include <lexy/callback/base.hpp> | ||||
|  | ||||
| namespace lexy::_detail | ||||
| { | ||||
| template <typename T, typename... Args> | ||||
| using _detect_brace_construct = decltype(T{LEXY_DECLVAL(Args)...}); | ||||
| template <typename T, typename... Args> | ||||
| constexpr auto is_brace_constructible = _detail::is_detected<_detect_brace_construct, T, Args...>; | ||||
|  | ||||
| template <typename T, typename... Args> | ||||
| constexpr auto is_constructible | ||||
|     = std::is_constructible_v<T, Args...> || is_brace_constructible<T, Args...>; | ||||
| } // namespace lexy::_detail | ||||
|  | ||||
| namespace lexy | ||||
| { | ||||
| template <typename T> | ||||
| struct _construct | ||||
| { | ||||
|     using return_type = T; | ||||
|  | ||||
|     constexpr T operator()(T&& t) const | ||||
|     { | ||||
|         return LEXY_MOV(t); | ||||
|     } | ||||
|     constexpr T operator()(const T& t) const | ||||
|     { | ||||
|         return t; | ||||
|     } | ||||
|  | ||||
|     template <typename... Args> | ||||
|     constexpr auto operator()(Args&&... args) const | ||||
|         -> std::enable_if_t<_detail::is_constructible<T, Args&&...>, T> | ||||
|     { | ||||
|         if constexpr (std::is_constructible_v<T, Args&&...>) | ||||
|             return T(LEXY_FWD(args)...); | ||||
|         else | ||||
|             return T{LEXY_FWD(args)...}; | ||||
|     } | ||||
| }; | ||||
| template <> | ||||
| struct _construct<void> | ||||
| { | ||||
|     using return_type = void; | ||||
|  | ||||
|     constexpr void operator()() const {} | ||||
| }; | ||||
|  | ||||
| /// A callback that constructs an object of type T by forwarding the arguments. | ||||
| template <typename T> | ||||
| constexpr auto construct = _construct<T>{}; | ||||
|  | ||||
| template <typename T, typename PtrT> | ||||
| struct _new | ||||
| { | ||||
|     using return_type = PtrT; | ||||
|  | ||||
|     constexpr PtrT operator()(T&& t) const | ||||
|     { | ||||
|         auto ptr = new T(LEXY_MOV(t)); | ||||
|         return PtrT(ptr); | ||||
|     } | ||||
|     constexpr PtrT operator()(const T& t) const | ||||
|     { | ||||
|         auto ptr = new T(t); | ||||
|         return PtrT(ptr); | ||||
|     } | ||||
|  | ||||
|     template <typename... Args> | ||||
|     constexpr auto operator()(Args&&... args) const | ||||
|         -> std::enable_if_t<_detail::is_constructible<T, Args&&...>, PtrT> | ||||
|     { | ||||
|         if constexpr (std::is_constructible_v<T, Args&&...>) | ||||
|         { | ||||
|             auto ptr = new T(LEXY_FWD(args)...); | ||||
|             return PtrT(ptr); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             auto ptr = new T{LEXY_FWD(args)...}; | ||||
|             return PtrT(ptr); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// A callback that constructs an object of type T on the heap by forwarding the arguments. | ||||
| template <typename T, typename PtrT = T*> | ||||
| constexpr auto new_ = _new<T, PtrT>{}; | ||||
| } // namespace lexy | ||||
|  | ||||
| #endif // LEXY_CALLBACK_OBJECT_HPP_INCLUDED | ||||
|  | ||||
		Reference in New Issue
	
	Block a user