38template <
typename BundleT,
typename FuncT,
typename... Args>
42 !std::is_void<std::result_of_t<FuncT(Args...)>>::value,
45 using result_type = std::result_of_t<FuncT(Args...)>;
47 return handler_type{ std::forward<BundleT>(_bundle),
48 std::forward<FuncT>(_func)(std::forward<Args>(
_args)...) };
51template <
typename BundleT,
typename FuncT,
typename... Args>
55 std::is_void<std::result_of_t<FuncT(Args...)>>::value,
58 _func(std::forward<Args>(
_args)...);
59 return std::forward<BundleT>(_bundle);
62template <
typename BundleT,
typename ValueT>
64execute(BundleT&& _bundle, ValueT&& _value,
68 return handler_type{ std::forward<BundleT>(_bundle), std::forward<ValueT>(_value) };
71template <
typename BundleT,
typename DataT>
75 static_assert(!std::is_function<DataT>::value,
76 "Error! should be result, not function!");
89 , m_data(
std::move(_data))
92 operator BundleT()
const {
return m_bundle; }
93 operator DataT()
const {
return m_data; }
94 operator std::pair<BundleT, DataT>()
const
96 return std::pair<BundleT, DataT>{ m_bundle, m_data };
98 operator std::tuple<BundleT, DataT>()
const
100 return std::tuple<BundleT, DataT>{ m_bundle, m_data };
105 TIMEMORY_NODISCARD
auto get_bundle() noexcept {
return BundleT{ m_bundle }; }
106 TIMEMORY_NODISCARD
auto get_result() noexcept {
return DataT{ m_data }; }
109 TIMEMORY_NODISCARD
auto return_result() noexcept {
return std::move(m_data); }
113 template <
typename... Args>
116 m_bundle.push(std::forward<Args>(args)...);
119 template <
typename... Args>
122 m_bundle.pop(std::forward<Args>(args)...);
125 template <
typename... Args>
128 m_bundle.measure(std::forward<Args>(args)...);
131 template <
typename... Args>
134 m_bundle.sample(std::forward<Args>(args)...);
137 template <
typename... Args>
140 m_bundle.start(std::forward<Args>(args)...);
143 template <
typename... Args>
146 m_bundle.stop(std::forward<Args>(args)...);
149 template <
typename... Args>
152 m_bundle.assemble(std::forward<Args>(args)...);
155 template <
typename... Args>
158 m_bundle.derive(std::forward<Args>(args)...);
161 template <
typename... Args>
164 m_bundle.mark(std::forward<Args>(args)...);
167 template <
typename... Args>
170 m_bundle.mark_begin(std::forward<Args>(args)...);
173 template <
typename... Args>
176 m_bundle.mark_end(std::forward<Args>(args)...);
179 template <
typename... Args>
182 m_bundle.store(std::forward<Args>(args)...);
185 template <
typename... Args>
188 m_bundle.audit(std::forward<Args>(args)...);
191 template <
typename... Args>
194 m_bundle.add_secondary(std::forward<Args>(args)...);
197 template <
template <
typename>
class OpT,
typename... Args>
200 m_bundle.template invoke<OpT>(std::forward<Args>(
_args)...);
203 template <
typename... Args>
204 decltype(
auto)
get(Args&&... args)
206 return execute(*
this, m_bundle.get(std::forward<Args>(args)...));
208 template <
typename... Args>
211 return execute(*
this, m_bundle.get_labeled(std::forward<Args>(args)...));
212 return m_bundle.get_labeled(std::forward<Args>(args)...);
221template <
typename BundleT>
239 operator BundleT()
const {
return m_bundle; }
241 operator std::pair<BundleT, null_type>()
const
243 return std::pair<BundleT, DataT>{ m_bundle,
null_type{} };
246 operator std::tuple<BundleT, null_type>()
const
248 return std::tuple<BundleT, DataT>{ m_bundle, null_type{} };
253 return std::pair<BundleT, DataT>{ m_bundle,
null_type{} };
261 template <
typename... Args>
264 m_bundle.push(std::forward<Args>(args)...);
267 template <
typename... Args>
270 m_bundle.pop(std::forward<Args>(args)...);
273 template <
typename... Args>
276 m_bundle.measure(std::forward<Args>(args)...);
279 template <
typename... Args>
282 m_bundle.sample(std::forward<Args>(args)...);
285 template <
typename... Args>
288 m_bundle.start(std::forward<Args>(args)...);
291 template <
typename... Args>
294 m_bundle.stop(std::forward<Args>(args)...);
297 template <
typename... Args>
300 m_bundle.assemble(std::forward<Args>(args)...);
303 template <
typename... Args>
306 m_bundle.derive(std::forward<Args>(args)...);
309 template <
typename... Args>
312 m_bundle.mark(std::forward<Args>(args)...);
315 template <
typename... Args>
318 m_bundle.mark_begin(std::forward<Args>(args)...);
321 template <
typename... Args>
324 m_bundle.mark_end(std::forward<Args>(args)...);
327 template <
typename... Args>
330 m_bundle.store(std::forward<Args>(args)...);
333 template <
typename... Args>
336 m_bundle.audit(std::forward<Args>(args)...);
339 template <
typename... Args>
342 m_bundle.add_secondary(std::forward<Args>(args)...);
345 template <
template <
typename>
class OpT,
typename... Args>
348 m_bundle.template invoke<OpT>(std::forward<Args>(
_args)...);
351 template <
typename... Args>
352 decltype(
auto)
get(Args&&... args)
354 return execute(*
this, m_bundle.get(std::forward<Args>(args)...));
356 template <
typename... Args>
359 return execute(*
this, m_bundle.get_labeled(std::forward<Args>(args)...));
360 return m_bundle.get_labeled(std::forward<Args>(args)...);
void return_result() noexcept
auto & return_bundle() noexcept
this_type & pop(Args &&... args)
this_type & measure(Args &&... args)
this_type & assemble(Args &&... args)
decltype(auto) get(Args &&... args)
this_type & push(Args &&... args)
execution_handler(const execution_handler &)=delete
execution_handler & operator=(const execution_handler &)=delete
this_type & store(Args &&... args)
this_type & mark_end(Args &&... args)
execution_handler()=delete
execution_handler(execution_handler &&) noexcept=default
auto get_bundle_and_result()
this_type & stop(Args &&... args)
decltype(auto) get_labeled(Args &&... args)
this_type & sample(Args &&... args)
this_type & derive(Args &&... args)
this_type & add_secondary(Args &&... args)
this_type & invoke(Args &&... _args)
this_type & mark_begin(Args &&... args)
this_type & start(Args &&... args)
this_type & mark(Args &&... args)
this_type & audit(Args &&... args)
This is an intermediate type that permits operations such as:
this_type & start(Args &&... args)
decltype(auto) get(Args &&... args)
execution_handler & operator=(const execution_handler &)=delete
this_type & add_secondary(Args &&... args)
this_type & stop(Args &&... args)
auto get_bundle() noexcept
execution_handler()=delete
execution_handler(const execution_handler &)=delete
this_type & measure(Args &&... args)
auto return_result() noexcept
this_type & mark_end(Args &&... args)
this_type & assemble(Args &&... args)
this_type & store(Args &&... args)
execution_handler(execution_handler &&) noexcept=default
auto get_result() noexcept
this_type & invoke(Args &&... _args)
this_type & mark_begin(Args &&... args)
this_type & mark(Args &&... args)
decltype(auto) get_labeled(Args &&... args)
this_type & pop(Args &&... args)
auto & return_bundle() noexcept
this_type & sample(Args &&... args)
auto get_bundle_and_result()
this_type & derive(Args &&... args)
this_type & audit(Args &&... args)
this_type & push(Args &&... args)
auto execute(BundleT &&_bundle, FuncT &&_func, Args &&... _args, enable_if_t< is_invocable< FuncT, Args... >::value &&!std::is_void< std::result_of_t< FuncT(Args...)> >::value, int >)
std::array< char *, 4 > _args
typename std::enable_if< B, T >::type enable_if_t
Alias template for enable_if.
this is a placeholder type for optional type-traits. It is used as the default type for the type-trai...