52 using base_t =
typename U::base_type;
54 TIMEMORY_DEFAULT_OBJECT(
start)
56 TIMEMORY_HOT explicit
start(
type& obj) { impl(obj); }
62 template <
typename Arg,
typename... Args>
63 TIMEMORY_HOT
start(
type& obj, Arg&& arg, Args&&... args)
65 impl(obj, std::forward<Arg>(arg), std::forward<Args>(args)...);
68 template <
typename... Args>
71 using RetT =
decltype(do_sfinae(obj, 0, 0, std::forward<Args>(args)...));
74 return do_sfinae(obj, 0, 0, std::forward<Args>(args)...);
76 return get_return<RetT>();
79 template <
typename... Args>
82 return do_sfinae(obj, 0, 0, std::forward<Args>(args)...);
87 auto get_return(
enable_if_t<std::is_void<T>::value,
int> = 0)
const
91 auto get_return(
enable_if_t<!std::is_void<T>::value,
long> = 0)
const
93 static_assert(std::is_default_constructible<T>::value,
94 "Error! start() returns a type that is not default constructible! "
95 "You must specialize operation::start<T> struct");
99 template <
typename... Args>
100 TIMEMORY_HOT
void impl(
type& obj, Args&&... args)
const;
102 template <
typename... Args>
103 TIMEMORY_HOT
auto impl(
type& obj, quirk::unsafe&&, Args&&... args)
const
105 return do_sfinae(obj, 0, 0, std::forward<Args>(args)...);
109 template <
typename Up,
typename... Args>
110 TIMEMORY_HOT
auto do_sfinae(Up& obj,
int,
int, Args&&... args)
const
111 ->
decltype(obj.start(std::forward<Args>(args)...))
113 set_started<Tp>{}(obj);
114 return obj.start(std::forward<Args>(args)...);
118 template <
typename Up,
typename... Args>
119 TIMEMORY_HOT
auto do_sfinae(Up& obj,
int,
long, Args&&...) const
120 -> decltype(obj.
start())
122 set_started<Tp>{}(obj);
127 template <
typename Up,
typename... Args>
128 void do_sfinae(Up&,
long,
long, Args&&...)
const
144template <
typename Tp>
151 template <
typename... Args>
156 template <
typename Up,
typename... Args>
157 TIMEMORY_HOT
auto sfinae(Up& obj, true_type&&, Args&&...
args)
163 template <
typename Up,
typename... Args>
164 TIMEMORY_INLINE
void sfinae(Up&, false_type&&, Args&&...)
174template <
typename Tp>
181 template <
typename... Args>
186 template <
typename Up,
typename... Args>
187 TIMEMORY_HOT
auto sfinae(Up& obj, true_type&&, Args&&...
args)
193 template <
typename Up,
typename... Args>
194 TIMEMORY_INLINE
void sfinae(Up&, false_type&&, Args&&...)
204template <
typename Tp>
211 template <
typename... Args>
216 template <
typename Up,
typename... Args>
217 TIMEMORY_HOT
auto sfinae(Up& obj, true_type&&, Args&&...
args)
223 template <
typename Up,
typename... Args>
224 TIMEMORY_INLINE
void sfinae(Up&, false_type&&, Args&&...)
230template <
typename Tp>
231template <
typename... Args>
233start<Tp>::impl(type& obj, Args&&... args)
const
235 if(!is_running<Tp, false>{}(obj))
237 set_started<Tp>{}(obj);
238 do_sfinae(obj, 0, 0, std::forward<Args>(args)...);
244template <
typename Tp>
245template <
typename... Args>
246priority_start<Tp>::priority_start(type& obj, Args&&... args)
249 conditional_t<(trait::start_priority<Tp>::value < 0), true_type, false_type>;
250 sfinae(obj, sfinae_type{}, std::forward<Args>(args)...);
255template <
typename Tp>
256template <
typename... Args>
257standard_start<Tp>::standard_start(type& obj, Args&&... args)
260 conditional_t<(trait::start_priority<Tp>::value == 0), true_type, false_type>;
261 sfinae(obj, sfinae_type{}, std::forward<Args>(args)...);
266template <
typename Tp>
267template <
typename... Args>
268delayed_start<Tp>::delayed_start(type& obj, Args&&... args)
271 conditional_t<(trait::start_priority<Tp>::value > 0), true_type, false_type>;
272 sfinae(obj, sfinae_type{}, std::forward<Args>(args)...);
typename std::enable_if< B, T >::type enable_if_t
Alias template for enable_if.
typename std::conditional< B, Lhs, Rhs >::type conditional_t
The declaration for the types for operations without definitions.
#define SFINAE_WARNING(...)
Include the macros for operations.
Declare the operations types.
TIMEMORY_DELETED_OBJECT(delayed_start) template< typename... Args > explicit delayed_start(type &obj
This operation attempts to call a member function which provides whether or not the component current...
TIMEMORY_DELETED_OBJECT(priority_start) template< typename... Args > explicit priority_start(type &obj
TIMEMORY_DELETED_OBJECT(standard_start) template< typename... Args > explicit standard_start(type &obj
auto operator()(type &obj, quirk::unsafe &&, Args &&... args) const
start(type &obj, quirk::unsafe &&)
start(type &obj, Arg &&arg, Args &&... args)
typename U::base_type base_t
auto operator()(type &obj, Args &&... args) const
When present, this argument instructs to skip any safety checks. Example checks include: checking whe...
#define DEBUG_PRINT_HERE(...)