25 #ifndef TIMEMORY_VARIADIC_FUNCTIONAL_CPP_
26 #define TIMEMORY_VARIADIC_FUNCTIONAL_CPP_ 1
38 #include <type_traits>
49 template <
template <
typename>
class OpT,
typename Tag,
50 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
52 invoke(TupleT<Tp...>& _obj, Args&&... _args)
54 using data_type = std::tuple<decay_t<Tp>...>;
59 std::forward<Args>(_args)...));
64 template <
template <
typename,
typename>
class OpT,
typename Tag,
65 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
67 invoke(TupleT<Tp...>& _obj, Args&&... _args)
69 using data_type = std::tuple<decay_t<Tp>...>;
74 std::forward<Args>(_args)...));
79 template <
template <
typename>
class OpT,
typename Tag,
80 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
82 invoke(TupleT<Tp&...>&& _obj, Args&&... _args)
84 using data_type = std::tuple<decay_t<Tp>...>;
89 std::forward<Args>(_args)...));
94 template <
template <
typename,
typename>
class OpT,
typename Tag,
95 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
97 invoke(TupleT<Tp&...>&& _obj, Args&&... _args)
99 using data_type = std::tuple<decay_t<Tp>...>;
104 std::forward<Args>(_args)...));
109 template <
template <
typename>
class OpT,
typename Tag,
110 template <
typename...>
class TupleT,
typename... Tp,
111 template <
typename...>
class ValueT,
typename... Vp,
typename... Args>
113 invoke_data(TupleT<Tp...>& _obj, ValueT<Vp...>& _val, Args&&... _args)
115 using data_type = std::tuple<decay_t<Tp>...>;
121 std::forward<Args>(_args)...));
126 template <
template <
typename>
class OpT,
typename Tag,
127 template <
typename...>
class TupleT,
typename... Tp,
128 template <
typename...>
class ValueT,
typename... Vp,
typename... Args>
130 invoke_data(TupleT<Tp&...>&& _obj, ValueT<Vp...>& _val, Args&&... _args)
132 using data_type = std::tuple<decay_t<Tp>...>;
138 std::forward<Args>(_args)...));
143 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
145 construct(TupleT<Tp...>& _obj, Args&&... _args)
147 using data_type = std::tuple<decay_t<Tp>...>;
157 template <
typename... Args>
159 print(std::ostream& os, Args&&... args)
164 template <
typename... Args>
175 template <
template <
typename...>
class OpT,
typename ApiT,
176 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
178 invoke(TupleT<Tp...>& obj, Args&&... args)
180 invoke_impl::invoke<OpT, ApiT>(obj, std::forward<Args>(args)...);
183 template <
template <
typename...>
class OpT,
template <
typename...>
class TupleT,
184 typename... Tp,
typename... Args>
186 invoke(TupleT<Tp...>& obj, Args&&... args)
188 invoke<OpT, TIMEMORY_API>(obj, std::forward<Args>(args)...);
191 template <
template <
typename...>
class OpT,
typename ApiT,
192 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
194 invoke(TupleT<Tp&...>&& obj, Args&&... args)
196 invoke_impl::invoke<OpT, ApiT>(std::forward<TupleT<Tp&...>>(obj),
197 std::forward<Args>(args)...);
200 template <
template <
typename...>
class OpT,
template <
typename...>
class TupleT,
201 typename... Tp,
typename... Args>
203 invoke(TupleT<Tp&...>&& obj, Args&&... args)
205 invoke<OpT, TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
206 std::forward<Args>(args)...);
209 template <
template <
typename...>
class OpT,
typename ApiT,
typename... Up,
210 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
215 invoke_impl::invoke<OpT, ApiT>(
217 std::forward<Args>(args)...);
220 template <
template <
typename...>
class OpT,
typename ApiT,
typename... Up,
221 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
226 invoke_impl::invoke<OpT, ApiT>(
228 std::forward<Args>(args)...);
235 template <
typename TupleT,
typename ApiT,
typename... Args>
251 template <
typename TupleT,
typename... Args>
255 return construct<TupleT, TIMEMORY_API>(std::forward<Args>(args)...);
262 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
266 invoke_impl::invoke<operation::generic_deleter, ApiT>(obj);
269 template <
template <
typename...>
class TupleT,
typename... Tp>
273 destroy<TIMEMORY_API>(obj);
276 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
280 invoke_impl::invoke<operation::generic_deleter, ApiT>(
281 std::forward<TupleT<Tp&...>>(obj));
284 template <
template <
typename...>
class TupleT,
typename... Tp>
288 destroy<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj));
295 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
298 start(TupleT<Tp...>& obj, Args&&... args)
300 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
307 auto&& _priority_start = mpl::get_reference_tuple<priority_tuple_t>(obj);
308 invoke_impl::invoke<operation::priority_start, ApiT>(_priority_start,
309 std::forward<Args>(args)...);
311 invoke_impl::invoke<operation::standard_start, ApiT>(obj,
312 std::forward<Args>(args)...);
314 auto&& _delayed_start = mpl::get_reference_tuple<delayed_tuple_t>(obj);
315 invoke_impl::invoke<operation::delayed_start, ApiT>(_delayed_start,
316 std::forward<Args>(args)...);
319 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
321 start(TupleT<Tp...>& obj, Args&&... args)
323 start<TIMEMORY_API>(obj, std::forward<Args>(args)...);
326 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
329 start(TupleT<Tp&...>&& obj, Args&&... args)
331 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
338 auto&& _priority_start =
339 mpl::get_reference_tuple<priority_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
340 invoke_impl::invoke<operation::priority_start, ApiT>(_priority_start,
341 std::forward<Args>(args)...);
344 invoke_impl::invoke<operation::standard_start, ApiT>(
345 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
348 auto&& _delayed_start =
349 mpl::get_reference_tuple<delayed_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
350 invoke_impl::invoke<operation::delayed_start, ApiT>(_delayed_start,
351 std::forward<Args>(args)...);
354 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
356 start(TupleT<Tp&...>&& obj, Args&&... args)
358 start<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
365 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
368 stop(TupleT<Tp...>& obj, Args&&... args)
370 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
377 auto&& _priority_stop = mpl::get_reference_tuple<priority_tuple_t>(obj);
378 invoke_impl::invoke<operation::priority_stop, ApiT>(_priority_stop,
379 std::forward<Args>(args)...);
382 invoke_impl::invoke<operation::standard_stop, ApiT>(obj, std::forward<Args>(args)...);
385 auto&& _delayed_stop = mpl::get_reference_tuple<delayed_tuple_t>(obj);
386 invoke_impl::invoke<operation::delayed_stop, ApiT>(_delayed_stop,
387 std::forward<Args>(args)...);
390 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
392 stop(TupleT<Tp...>& obj, Args&&... args)
394 stop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
397 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
400 stop(TupleT<Tp&...>&& obj, Args&&... args)
402 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
409 auto&& _priority_stop =
410 mpl::get_reference_tuple<priority_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
411 invoke_impl::invoke<operation::priority_stop, ApiT>(_priority_stop,
412 std::forward<Args>(args)...);
415 invoke_impl::invoke<operation::standard_stop, ApiT>(std::forward<TupleT<Tp&...>>(obj),
416 std::forward<Args>(args)...);
419 auto&& _delayed_stop =
420 mpl::get_reference_tuple<delayed_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
421 invoke_impl::invoke<operation::delayed_stop, ApiT>(_delayed_stop,
422 std::forward<Args>(args)...);
425 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
427 stop(TupleT<Tp&...>&& obj, Args&&... args)
429 stop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
436 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
439 mark(TupleT<Tp...>& obj, Args&&... args)
441 invoke_impl::invoke<operation::mark, ApiT>(obj, std::forward<Args>(args)...);
444 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
446 mark(TupleT<Tp...>& obj, Args&&... args)
448 mark<TIMEMORY_API>(obj, std::forward<Args>(args)...);
451 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
454 mark(TupleT<Tp&...>&& obj, Args&&... args)
456 invoke_impl::invoke<operation::mark, ApiT>(std::forward<TupleT<Tp&...>>(obj),
457 std::forward<Args>(args)...);
460 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
462 mark(TupleT<Tp&...>&& obj, Args&&... args)
464 mark<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
471 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
476 invoke_impl::invoke<operation::mark_begin, ApiT>(obj, std::forward<Args>(args)...);
479 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
483 mark_begin<TIMEMORY_API>(obj, std::forward<Args>(args)...);
486 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
491 invoke_impl::invoke<operation::mark_begin, ApiT>(std::forward<TupleT<Tp&...>>(obj),
492 std::forward<Args>(args)...);
495 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
499 mark_begin<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
500 std::forward<Args>(args)...);
507 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
512 invoke_impl::invoke<operation::mark_end, ApiT>(obj, std::forward<Args>(args)...);
515 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
519 mark_end<TIMEMORY_API>(obj, std::forward<Args>(args)...);
522 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
527 invoke_impl::invoke<operation::mark_end, ApiT>(std::forward<TupleT<Tp&...>>(obj),
528 std::forward<Args>(args)...);
531 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
535 mark_end<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
536 std::forward<Args>(args)...);
543 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
546 store(TupleT<Tp...>& obj, Args&&... args)
548 invoke_impl::invoke<operation::store, ApiT>(obj, std::forward<Args>(args)...);
551 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
553 store(TupleT<Tp...>& obj, Args&&... args)
555 store<TIMEMORY_API>(obj, std::forward<Args>(args)...);
558 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
561 store(TupleT<Tp&...>&& obj, Args&&... args)
563 invoke_impl::invoke<operation::store, ApiT>(std::forward<TupleT<Tp&...>>(obj),
564 std::forward<Args>(args)...);
567 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
569 store(TupleT<Tp&...>&& obj, Args&&... args)
571 store<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
578 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
581 reset(TupleT<Tp...>& obj, Args&&... args)
583 invoke_impl::invoke<operation::reset, ApiT>(obj, std::forward<Args>(args)...);
586 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
588 reset(TupleT<Tp...>& obj, Args&&... args)
590 reset<TIMEMORY_API>(obj, std::forward<Args>(args)...);
593 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
596 reset(TupleT<Tp&...>&& obj, Args&&... args)
598 invoke_impl::invoke<operation::reset, ApiT>(std::forward<TupleT<Tp&...>>(obj),
599 std::forward<Args>(args)...);
602 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
604 reset(TupleT<Tp&...>&& obj, Args&&... args)
606 reset<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
613 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
616 record(TupleT<Tp...>& obj, Args&&... args)
618 invoke_impl::invoke<operation::record, ApiT>(obj, std::forward<Args>(args)...);
621 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
623 record(TupleT<Tp...>& obj, Args&&... args)
625 record<TIMEMORY_API>(obj, std::forward<Args>(args)...);
628 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
631 record(TupleT<Tp&...>&& obj, Args&&... args)
633 invoke_impl::invoke<operation::record, ApiT>(std::forward<TupleT<Tp&...>>(obj),
634 std::forward<Args>(args)...);
637 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
639 record(TupleT<Tp&...>&& obj, Args&&... args)
641 record<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
648 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
653 invoke_impl::invoke<operation::measure, ApiT>(obj, std::forward<Args>(args)...);
656 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
660 measure<TIMEMORY_API>(obj, std::forward<Args>(args)...);
663 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
668 invoke_impl::invoke<operation::measure, ApiT>(std::forward<TupleT<Tp&...>>(obj),
669 std::forward<Args>(args)...);
672 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
676 measure<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
683 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
686 push(TupleT<Tp...>& obj, Args&&... args)
688 invoke_impl::invoke<operation::push_node, ApiT>(obj, std::forward<Args>(args)...);
691 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
693 push(TupleT<Tp...>& obj, Args&&... args)
695 push<TIMEMORY_API>(obj, std::forward<Args>(args)...);
698 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
701 push(TupleT<Tp&...>&& obj, Args&&... args)
703 invoke_impl::invoke<operation::push_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
704 std::forward<Args>(args)...);
707 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
709 push(TupleT<Tp&...>&& obj, Args&&... args)
711 push<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
718 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
721 pop(TupleT<Tp...>& obj, Args&&... args)
723 invoke_impl::invoke<operation::pop_node, ApiT>(obj, std::forward<Args>(args)...);
726 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
728 pop(TupleT<Tp...>& obj, Args&&... args)
730 pop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
733 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
736 pop(TupleT<Tp&...>&& obj, Args&&... args)
738 invoke_impl::invoke<operation::pop_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
739 std::forward<Args>(args)...);
742 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
744 pop(TupleT<Tp&...>&& obj, Args&&... args)
746 pop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
753 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
758 invoke_impl::invoke<operation::set_prefix, ApiT>(obj, std::forward<Args>(args)...);
761 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
765 set_prefix<TIMEMORY_API>(obj, std::forward<Args>(args)...);
768 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
773 invoke_impl::invoke<operation::set_prefix, ApiT>(std::forward<TupleT<Tp&...>>(obj),
774 std::forward<Args>(args)...);
777 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
781 set_prefix<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
782 std::forward<Args>(args)...);
789 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
794 invoke_impl::invoke<operation::set_scope, ApiT>(obj, std::forward<Args>(args)...);
797 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
801 set_scope<TIMEMORY_API>(obj, std::forward<Args>(args)...);
804 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
809 invoke_impl::invoke<operation::set_scope, ApiT>(std::forward<TupleT<Tp&...>>(obj),
810 std::forward<Args>(args)...);
813 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
817 set_scope<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
818 std::forward<Args>(args)...);
825 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
830 invoke_impl::invoke_data<operation::set_state, ApiT>(obj,
831 std::forward<Args>(args)...);
834 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
839 invoke_impl::invoke_data<operation::set_state, ApiT>(
840 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
847 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
852 invoke_impl::invoke<operation::assemble, ApiT>(obj, std::forward<Args>(args)...);
855 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
859 assemble<TIMEMORY_API>(obj, std::forward<Args>(args)...);
862 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
867 invoke_impl::invoke<operation::assemble, ApiT>(std::forward<TupleT<Tp&...>>(obj),
868 std::forward<Args>(args)...);
871 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
875 assemble<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
876 std::forward<Args>(args)...);
883 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
886 derive(TupleT<Tp...>& obj, Args&&... args)
888 invoke_impl::invoke<operation::derive, ApiT>(obj, std::forward<Args>(args)...);
891 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
893 derive(TupleT<Tp...>& obj, Args&&... args)
895 derive<TIMEMORY_API>(obj, std::forward<Args>(args)...);
898 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
901 derive(TupleT<Tp&...>&& obj, Args&&... args)
903 invoke_impl::invoke<operation::derive, ApiT>(std::forward<TupleT<Tp&...>>(obj),
904 std::forward<Args>(args)...);
907 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
909 derive(TupleT<Tp&...>&& obj, Args&&... args)
911 derive<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
918 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
921 audit(TupleT<Tp...>& obj, Args&&... args)
923 invoke_impl::invoke<operation::audit, ApiT>(obj, std::forward<Args>(args)...);
926 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
928 audit(TupleT<Tp...>& obj, Args&&... args)
930 audit<TIMEMORY_API>(obj, std::forward<Args>(args)...);
933 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
936 audit(TupleT<Tp&...>&& obj, Args&&... args)
938 invoke_impl::invoke<operation::audit, ApiT>(std::forward<TupleT<Tp&...>>(obj),
939 std::forward<Args>(args)...);
942 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
944 audit(TupleT<Tp&...>&& obj, Args&&... args)
946 audit<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
953 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
958 invoke_impl::invoke<operation::add_secondary, ApiT>(obj, std::forward<Args>(args)...);
961 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
965 add_secondary<TIMEMORY_API>(obj, std::forward<Args>(args)...);
968 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
973 invoke_impl::invoke<operation::add_secondary, ApiT>(std::forward<TupleT<Tp&...>>(obj),
974 std::forward<Args>(args)...);
977 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
981 add_secondary<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
982 std::forward<Args>(args)...);
989 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
992 get(TupleT<Tp...>& obj, Args&&... args)
994 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
998 data_value_type _data{};
999 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1000 invoke_impl::invoke_data<operation::get_data, ApiT>(_obj, _data,
1001 std::forward<Args>(args)...);
1005 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1007 get(TupleT<Tp...>& obj, Args&&... args)
1009 return ::tim::invoke::get<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1012 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1015 get(TupleT<Tp&...>&& obj, Args&&... args)
1017 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1021 data_value_type _data{};
1022 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1023 invoke_impl::invoke_data<operation::get_data, ApiT>(_obj, _data,
1024 std::forward<Args>(args)...);
1028 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1030 get(TupleT<Tp&...>&& obj, Args&&... args)
1032 return ::tim::invoke::get<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1033 std::forward<Args>(args)...);
1036 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
1038 get(TupleT<Tp...>& obj,
void*& _ptr,
size_t _hash)
1040 invoke_impl::invoke<operation::get, ApiT>(obj, _ptr, _hash);
1043 template <
template <
typename...>
class TupleT,
typename... Tp>
1045 get(TupleT<Tp...>& obj,
void*& _ptr,
size_t _hash)
1047 return ::tim::invoke::get<TIMEMORY_API>(obj, _ptr, _hash);
1054 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1059 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1063 data_label_type _data{};
1064 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1065 invoke_impl::invoke_data<operation::get_labeled_data, ApiT>(
1066 _obj, _data, std::forward<Args>(args)...);
1070 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1074 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1077 template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1082 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1086 data_label_type _data{};
1087 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1088 invoke_impl::invoke_data<operation::get_labeled_data, ApiT>(
1089 _obj, _data, std::forward<Args>(args)...);
1093 template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1097 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1106 template <
typename ArchiveT,
typename TupleT,
size_t... Idx>
1108 serialize(ArchiveT& ar, TupleT& obj, std::index_sequence<Idx...>)
1110 auto _serialize = [&ar](
auto& _obj) {
1111 auto _label = _obj.label();
1112 ar(cereal::make_nvp(_label.c_str(), _obj));
1119 template <
typename ArchiveT,
template <
typename...>
class TupleT,
typename... Tp>
1126 template <
typename ArchiveT,
template <
typename...>
class TupleT,
typename... Tp>
1137 template <
typename... BundleT>
1157 #define TIMEMORY_DEFINE_DISJOINT_FUNCTION(FUNC) \
1158 namespace disjoint_impl \
1160 template <template <typename...> class TupleT, typename... Tp, size_t... Idx, \
1162 void FUNC(TupleT<Tp...>&& obj, index_sequence<Idx...>, Args&&... args) \
1164 TIMEMORY_FOLD_EXPRESSION(std::get<Idx>(obj).FUNC(std::forward<Args>(args)...)); \
1168 template <template <typename...> class TupleT, typename... Tp, typename... Args> \
1169 void FUNC(TupleT<Tp...>&& obj, Args&&... args) \
1171 disjoint_impl::FUNC(std::forward<TupleT<Tp...>>(obj), \
1172 make_index_sequence<sizeof...(Tp)>{}, \
1173 std::forward<Args>(args)...); \
1194 #undef TIMEMORY_DEFINE_DISJOINT_FUNCTION
1197 namespace disjoint_impl
1199 template <
template <
typename...>
class TupleT,
typename... Tp,
typename FuncT,
1200 size_t... Idx,
typename... Args>
1205 std::forward<FuncT>(func)(std::get<Idx>(obj), std::forward<Args>(args)...));
1209 template <
template <
typename...>
class TupleT,
typename... Tp,
typename FuncT,
1212 invoke(TupleT<Tp...>&& obj, FuncT&& func, Args&&... args)
1216 std::forward<Args>(args)...);
Definition for various functions for cache in operations.
#define TIMEMORY_DEFINE_DISJOINT_FUNCTION(FUNC)
Definition for various functions for generic in operations.
#define IF_CONSTEXPR(...)
void add_secondary(TupleT< Tp... > &&obj, Args &&... args)
void mark_begin(TupleT< Tp... > &&obj, Args &&... args)
void measure(TupleT< Tp... > &&obj, Args &&... args)
void set_scope(TupleT< Tp... > &&obj, Args &&... args)
void invoke(TupleT< Tp... > &&obj, FuncT &&func, Args &&... args)
void audit(TupleT< Tp... > &&obj, Args &&... args)
void pop(TupleT< Tp... > &&obj, Args &&... args)
void push(TupleT< Tp... > &&obj, Args &&... args)
void reset(TupleT< Tp... > &&obj, Args &&... args)
void derive(TupleT< Tp... > &&obj, Args &&... args)
void store(TupleT< Tp... > &&obj, Args &&... args)
void set_prefix(TupleT< Tp... > &&obj, Args &&... args)
void start(TupleT< Tp... > &&obj, Args &&... args)
void mark(TupleT< Tp... > &&obj, Args &&... args)
void mark_end(TupleT< Tp... > &&obj, Args &&... args)
void stop(TupleT< Tp... > &&obj, Args &&... args)
void assemble(TupleT< Tp... > &&obj, Args &&... args)
void record(TupleT< Tp... > &&obj, Args &&... args)
void set_state(TupleT< Tp... > &obj, Args &&... args)
void set_scope(TupleT< Tp... > &obj, Args &&... args)
void assemble(TupleT< Tp... > &obj, Args &&... args)
auto construct(Args &&... args)
void mark_begin(TupleT< Tp... > &obj, Args &&... args)
auto serialize(ArchiveT &ar, TupleT< Tp &... > &&obj)
void set_prefix(TupleT< Tp... > &obj, Args &&... args)
void audit(TupleT< Tp... > &obj, Args &&... args)
void store(TupleT< Tp... > &obj, Args &&... args)
auto serialize(ArchiveT &ar, TupleT< Tp... > &obj)
auto construct(Args &&... args)
void record(TupleT< Tp... > &obj, Args &&... args)
void add_secondary(TupleT< Tp... > &obj, Args &&... args)
void derive(TupleT< Tp... > &obj, Args &&... args)
void pop(TupleT< Tp... > &obj, Args &&... args)
auto get(TupleT< Tp... > &obj, Args &&... args)
void invoke(TupleT< Tp... > &obj, Args &&... args)
void stop(TupleT< Tp... > &obj, Args &&... args)
void measure(TupleT< Tp... > &obj, Args &&... args)
auto get(TupleT< Tp... > &obj, void *&_ptr, size_t _hash)
void push(TupleT< Tp... > &obj, Args &&... args)
void mark_end(TupleT< Tp... > &obj, Args &&... args)
auto destroy(TupleT< Tp... > &obj)
auto get_labeled(TupleT< Tp... > &obj, Args &&... args)
void mark(TupleT< Tp... > &obj, Args &&... args)
void reset(TupleT< Tp... > &obj, Args &&... args)
void print(std::ostream &os, Args &&... args)
void start(TupleT< Tp... > &obj, Args &&... args)
convert_t< typename ::tim::mpl::impl::sortT< PrioT, convert_t< Tuple, type_list<> >, convert_t< BegT, type_list<> >, convert_t< EndT, type_list<> >>::type, std::tuple<> > sort
impl::filter_false< Predicate, Sequence > filter_false_t
typename impl::template get_data_tuple< TypeList >::type get_data_type_t
get the tuple of types
typename impl::template get_data_tuple< TypeList >::label_type get_data_label_t
get the tuple of pair of descriptor and value
typename impl::template get_data_tuple< TypeList >::value_type get_data_value_t
get the tuple of values
std::bitset< scope_count > data_type
std::make_integer_sequence< size_t, Num > make_index_sequence
Alias template make_index_sequence.
typename std::remove_pointer< U >::type remove_pointer_t
impl::index_of< Tp, Type > index_of
typename std::decay< T >::type decay_t
Alias template for decay.
tim::mpl::apply< std::string > string
std::integer_sequence< size_t, Idx... > index_sequence
Alias template index_sequence.
The purpose of this operation class is construct an object with specific args.
This operation class is similar to pointer_operator but can handle non-pointer types.
trait that signifies that an implementation for the component is available. When this is set to false...
#define TIMEMORY_FOLD_EXPRESSION(...)