13#include <lagrange/utils/assert.h>
14#include <lagrange/utils/strings.h>
15#include <lagrange/utils/warning.h>
30template <
typename F,
typename Result,
typename...
Args>
33 using fn_type = std::function<Result(
Args...)>;
41struct AsFunction :
public AsFunction<decltype(&T::operator())>
45template <
class Class,
class ReturnType,
class Arg>
46struct AsFunction<ReturnType (Class::*)(Arg) const>
51template <
class ReturnType,
class Arg>
52struct AsFunction<ReturnType (*)(Arg)>
57template <
class ReturnType,
class Arg>
58struct AsFunction<ReturnType(Arg) const>
72 using type = std::conditional_t<std::is_same<T, const char*>::value, std::string, T>;
76using convert_implicit_t =
typename convert_implicit<T>::type;
79template <
typename...
Args>
82 using type = std::tuple<std::remove_cv_t<std::remove_reference_t<convert_implicit_t<Args>>>...>;
85template <
typename...
Args>
90std::unique_ptr<T> realize_default(
91 typename std::enable_if<std::is_default_constructible<T>::value>::type* dummy = 0)
94 return std::make_unique<T>();
98std::unique_ptr<T> realize_default(
99 typename std::enable_if<!std::is_default_constructible<T>::value>::type* dummy = 0)
106 "Cannot default construct type {}, provide a realization function to ResourceFactory",
112template <
typename T,
typename... Dummy>
113std::shared_ptr<T> realize_forward(
const std::shared_ptr<T>& ptr)
118template <
typename T,
typename...
Args>
119std::shared_ptr<T> realize_forward(
121 typename std::enable_if<std::is_constructible<T, Args...>::value>::type* dummy = 0)
124 return std::make_shared<T>(std::forward<Args>(args)...);
127template <
typename... Args>
128void unused_variadic(Args&&... args)
140template <
typename T,
typename... Args>
141std::shared_ptr<T> realize_forward(
143 typename std::enable_if<
144 !std::is_constructible<T, Args...>::value &&
145 !std::is_constructible<std::shared_ptr<T>, Args...>::value &&
146 !std::is_constructible<std::unique_ptr<T>, Args...>::value>::type* dummy = 0)
149 unused_variadic(std::forward<Args>(args)...);
153 "Cannot construct type {} from given arguments {}, provide a realization function to "
156 typeid(std::tuple<Args...>).name()));
162template <
typename T_out,
typename T_in>
163T_out copy_or_move_element(
165 typename std::enable_if<!std::is_rvalue_reference<T_out>::value>::type* dummy = 0)
172template <
typename T_out,
typename T_in>
173std::remove_reference_t<T_out> copy_or_move_element(
175 typename std::enable_if<std::is_rvalue_reference<T_out>::value>::type* dummy = 0)
178 std::remove_reference_t<T_out> moved = std::move(in);
183template <
typename ArgumentTuple,
typename... Ts,
size_t... Is>
184auto copy_or_move_impl(std::tuple<Ts...>& input, std::index_sequence<Is...>)
186 return std::tuple<Ts...>{
187 copy_or_move_element<std::tuple_element_t<Is, ArgumentTuple>>(std::get<Is>(input))...};
191template <
typename ArgumentTuple,
typename... Ts>
192std::tuple<Ts...> copy_or_move(std::tuple<Ts...>& input)
194 return copy_or_move_impl<ArgumentTuple>(input, std::make_index_sequence<
sizeof...(Ts)>{});
197template <
typename ParamPack,
typename ParamPackOriginal,
typename F>
198void apply_parameters(
201 typename std::enable_if<std::is_constructible<ParamPack, const ParamPack&>::value>::type*
206 auto& storage_tuple = std::any_cast<ParamPack&>(storage);
207 auto forwarded_tuple = copy_or_move<ParamPackOriginal>(storage_tuple);
209 std::apply(fn, std::move(forwarded_tuple));
213template <
typename ParamPack,
typename ParamPackOriginal,
typename F>
214void apply_parameters(
217 typename std::enable_if<!std::is_constructible<ParamPack, const ParamPack&>::value>::type*
#define la_runtime_assert(...)
Runtime assertion check.
Definition assert.h:177
std::string string_format(lagrange::format_string< Args... > format, Args &&... args)
Format args according to the format string fmt, and return the result as a string.
Definition strings.h:97
#define LA_IGNORE(x)
Ignore x to avoid an unused variable warning.
Definition warning.h:144
Lagrange UI Viewer and mini 3D engine.
Definition AcceleratedPicking.h:23
Main namespace for Lagrange.
Definition project.cpp:27