25#ifndef TIMEMORY_VARIADIC_FUNCTIONAL_CPP_
26#define TIMEMORY_VARIADIC_FUNCTIONAL_CPP_ 1
49template <
template <
typename>
class OpT,
typename Tag,
50 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
54 using data_type = std::tuple<decay_t<Tp>...>;
59 std::forward<Args>(
_args)...));
64template <
template <
typename,
typename>
class OpT,
typename Tag,
65 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
69 using data_type = std::tuple<decay_t<Tp>...>;
74 std::forward<Args>(
_args)...));
79template <
template <
typename>
class OpT,
typename Tag,
80 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
84 using data_type = std::tuple<decay_t<Tp>...>;
89 std::forward<Args>(
_args)...));
94template <
template <
typename,
typename>
class OpT,
typename Tag,
95 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
99 using data_type = std::tuple<decay_t<Tp>...>;
104 std::forward<Args>(
_args)...));
109template <
template <
typename>
class OpT,
typename Tag,
110 template <
typename...>
class TupleT,
typename... Tp,
111 template <
typename...>
class ValueT,
typename... Vp,
typename... Args>
113invoke_data(TupleT<Tp...>& _obj, ValueT<Vp...>& _val, Args&&...
_args)
115 using data_type = std::tuple<decay_t<Tp>...>;
121 std::forward<Args>(
_args)...));
126template <
template <
typename>
class OpT,
typename Tag,
127 template <
typename...>
class TupleT,
typename... Tp,
128 template <
typename...>
class ValueT,
typename... Vp,
typename... Args>
130invoke_data(TupleT<Tp&...>&& _obj, ValueT<Vp...>& _val, Args&&...
_args)
132 using data_type = std::tuple<decay_t<Tp>...>;
138 std::forward<Args>(
_args)...));
143template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
147 using data_type = std::tuple<decay_t<Tp>...>;
157template <
typename... Args>
164template <
typename... Args>
175template <
template <
typename...>
class OpT,
typename ApiT,
176 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
178invoke(TupleT<Tp...>& obj, Args&&... args)
180 invoke_impl::invoke<OpT, ApiT>(obj, std::forward<Args>(args)...);
183template <
template <
typename...>
class OpT,
template <
typename...>
class TupleT,
184 typename... Tp,
typename... Args>
186invoke(TupleT<Tp...>& obj, Args&&... args)
188 invoke<OpT, TIMEMORY_API>(obj, std::forward<Args>(args)...);
191template <
template <
typename...>
class OpT,
typename ApiT,
192 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
194invoke(TupleT<Tp&...>&& obj, Args&&... args)
196 invoke_impl::invoke<OpT, ApiT>(std::forward<TupleT<Tp&...>>(obj),
197 std::forward<Args>(args)...);
200template <
template <
typename...>
class OpT,
template <
typename...>
class TupleT,
201 typename... Tp,
typename... Args>
203invoke(TupleT<Tp&...>&& obj, Args&&... args)
205 invoke<OpT, TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
206 std::forward<Args>(args)...);
209template <
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)...);
220template <
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)...);
231template <
template <
typename...>
class OpT,
typename ApiT,
typename... Up,
232 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
238 std::forward<Args>(args)...);
241template <
template <
typename...>
class OpT,
typename ApiT,
typename... Up,
242 template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
248 std::forward<Args>(args)...);
255template <
typename TupleT,
typename ApiT,
typename... Args>
269template <
typename TupleT,
typename... Args>
273 return construct<TupleT, TIMEMORY_API>(std::forward<Args>(args)...);
280template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
284 invoke_impl::invoke<operation::generic_deleter, ApiT>(obj);
287template <
template <
typename...>
class TupleT,
typename... Tp>
291 destroy<TIMEMORY_API>(obj);
294template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
298 invoke_impl::invoke<operation::generic_deleter, ApiT>(
299 std::forward<TupleT<Tp&...>>(obj));
302template <
template <
typename...>
class TupleT,
typename... Tp>
306 destroy<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj));
313template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
316start(TupleT<Tp...>& obj, Args&&... args)
318 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
325 auto&& _priority_start = mpl::get_reference_tuple<priority_tuple_t>(obj);
326 invoke_impl::invoke<operation::priority_start, ApiT>(_priority_start,
327 std::forward<Args>(args)...);
329 invoke_impl::invoke<operation::standard_start, ApiT>(obj,
330 std::forward<Args>(args)...);
332 auto&& _delayed_start = mpl::get_reference_tuple<delayed_tuple_t>(obj);
333 invoke_impl::invoke<operation::delayed_start, ApiT>(_delayed_start,
334 std::forward<Args>(args)...);
337template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
339start(TupleT<Tp...>& obj, Args&&... args)
341 start<TIMEMORY_API>(obj, std::forward<Args>(args)...);
344template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
347start(TupleT<Tp&...>&& obj, Args&&... args)
349 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
356 auto&& _priority_start =
357 mpl::get_reference_tuple<priority_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
358 invoke_impl::invoke<operation::priority_start, ApiT>(_priority_start,
359 std::forward<Args>(args)...);
362 invoke_impl::invoke<operation::standard_start, ApiT>(
363 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
366 auto&& _delayed_start =
367 mpl::get_reference_tuple<delayed_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
368 invoke_impl::invoke<operation::delayed_start, ApiT>(_delayed_start,
369 std::forward<Args>(args)...);
372template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
374start(TupleT<Tp&...>&& obj, Args&&... args)
376 start<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
383template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
386stop(TupleT<Tp...>& obj, Args&&... args)
388 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
395 auto&& _priority_stop = mpl::get_reference_tuple<priority_tuple_t>(obj);
396 invoke_impl::invoke<operation::priority_stop, ApiT>(_priority_stop,
397 std::forward<Args>(args)...);
400 invoke_impl::invoke<operation::standard_stop, ApiT>(obj, std::forward<Args>(args)...);
403 auto&& _delayed_stop = mpl::get_reference_tuple<delayed_tuple_t>(obj);
404 invoke_impl::invoke<operation::delayed_stop, ApiT>(_delayed_stop,
405 std::forward<Args>(args)...);
408template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
410stop(TupleT<Tp...>& obj, Args&&... args)
412 stop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
415template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
418stop(TupleT<Tp&...>&& obj, Args&&... args)
420 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
427 auto&& _priority_stop =
428 mpl::get_reference_tuple<priority_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
429 invoke_impl::invoke<operation::priority_stop, ApiT>(_priority_stop,
430 std::forward<Args>(args)...);
433 invoke_impl::invoke<operation::standard_stop, ApiT>(std::forward<TupleT<Tp&...>>(obj),
434 std::forward<Args>(args)...);
437 auto&& _delayed_stop =
438 mpl::get_reference_tuple<delayed_tuple_t>(std::forward<TupleT<Tp&...>>(obj));
439 invoke_impl::invoke<operation::delayed_stop, ApiT>(_delayed_stop,
440 std::forward<Args>(args)...);
443template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
445stop(TupleT<Tp&...>&& obj, Args&&... args)
447 stop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
454template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
457mark(TupleT<Tp...>& obj, Args&&... args)
459 invoke_impl::invoke<operation::mark, ApiT>(obj, std::forward<Args>(args)...);
462template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
464mark(TupleT<Tp...>& obj, Args&&... args)
466 mark<TIMEMORY_API>(obj, std::forward<Args>(args)...);
469template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
472mark(TupleT<Tp&...>&& obj, Args&&... args)
474 invoke_impl::invoke<operation::mark, ApiT>(std::forward<TupleT<Tp&...>>(obj),
475 std::forward<Args>(args)...);
478template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
480mark(TupleT<Tp&...>&& obj, Args&&... args)
482 mark<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
489template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
494 invoke_impl::invoke<operation::mark_begin, ApiT>(obj, std::forward<Args>(args)...);
497template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
501 mark_begin<TIMEMORY_API>(obj, std::forward<Args>(args)...);
504template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
509 invoke_impl::invoke<operation::mark_begin, ApiT>(std::forward<TupleT<Tp&...>>(obj),
510 std::forward<Args>(args)...);
513template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
517 mark_begin<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
518 std::forward<Args>(args)...);
525template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
530 invoke_impl::invoke<operation::mark_end, ApiT>(obj, std::forward<Args>(args)...);
533template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
537 mark_end<TIMEMORY_API>(obj, std::forward<Args>(args)...);
540template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
545 invoke_impl::invoke<operation::mark_end, ApiT>(std::forward<TupleT<Tp&...>>(obj),
546 std::forward<Args>(args)...);
549template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
553 mark_end<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
554 std::forward<Args>(args)...);
561template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
564store(TupleT<Tp...>& obj, Args&&... args)
566 invoke_impl::invoke<operation::store, ApiT>(obj, std::forward<Args>(args)...);
569template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
571store(TupleT<Tp...>& obj, Args&&... args)
573 store<TIMEMORY_API>(obj, std::forward<Args>(args)...);
576template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
579store(TupleT<Tp&...>&& obj, Args&&... args)
581 invoke_impl::invoke<operation::store, ApiT>(std::forward<TupleT<Tp&...>>(obj),
582 std::forward<Args>(args)...);
585template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
587store(TupleT<Tp&...>&& obj, Args&&... args)
589 store<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
596template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
599reset(TupleT<Tp...>& obj, Args&&... args)
601 invoke_impl::invoke<operation::reset, ApiT>(obj, std::forward<Args>(args)...);
604template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
606reset(TupleT<Tp...>& obj, Args&&... args)
608 reset<TIMEMORY_API>(obj, std::forward<Args>(args)...);
611template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
614reset(TupleT<Tp&...>&& obj, Args&&... args)
616 invoke_impl::invoke<operation::reset, ApiT>(std::forward<TupleT<Tp&...>>(obj),
617 std::forward<Args>(args)...);
620template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
622reset(TupleT<Tp&...>&& obj, Args&&... args)
624 reset<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
631template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
634record(TupleT<Tp...>& obj, Args&&... args)
636 invoke_impl::invoke<operation::record, ApiT>(obj, std::forward<Args>(args)...);
639template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
641record(TupleT<Tp...>& obj, Args&&... args)
643 record<TIMEMORY_API>(obj, std::forward<Args>(args)...);
646template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
649record(TupleT<Tp&...>&& obj, Args&&... args)
651 invoke_impl::invoke<operation::record, ApiT>(std::forward<TupleT<Tp&...>>(obj),
652 std::forward<Args>(args)...);
655template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
657record(TupleT<Tp&...>&& obj, Args&&... args)
659 record<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
666template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
671 invoke_impl::invoke<operation::measure, ApiT>(obj, std::forward<Args>(args)...);
674template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
678 measure<TIMEMORY_API>(obj, std::forward<Args>(args)...);
681template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
686 invoke_impl::invoke<operation::measure, ApiT>(std::forward<TupleT<Tp&...>>(obj),
687 std::forward<Args>(args)...);
690template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
694 measure<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
701template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
704push(TupleT<Tp...>& obj, Args&&... args)
706 invoke_impl::invoke<operation::push_node, ApiT>(obj, std::forward<Args>(args)...);
709template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
711push(TupleT<Tp...>& obj, Args&&... args)
713 push<TIMEMORY_API>(obj, std::forward<Args>(args)...);
716template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
719push(TupleT<Tp&...>&& obj, Args&&... args)
721 invoke_impl::invoke<operation::push_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
722 std::forward<Args>(args)...);
725template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
727push(TupleT<Tp&...>&& obj, Args&&... args)
729 push<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
736template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
739pop(TupleT<Tp...>& obj, Args&&... args)
741 invoke_impl::invoke<operation::pop_node, ApiT>(obj, std::forward<Args>(args)...);
744template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
746pop(TupleT<Tp...>& obj, Args&&... args)
748 pop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
751template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
754pop(TupleT<Tp&...>&& obj, Args&&... args)
756 invoke_impl::invoke<operation::pop_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
757 std::forward<Args>(args)...);
760template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
762pop(TupleT<Tp&...>&& obj, Args&&... args)
764 pop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
771template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
776 invoke_impl::invoke<operation::set_prefix, ApiT>(obj, std::forward<Args>(args)...);
779template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
783 set_prefix<TIMEMORY_API>(obj, std::forward<Args>(args)...);
786template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
791 invoke_impl::invoke<operation::set_prefix, ApiT>(std::forward<TupleT<Tp&...>>(obj),
792 std::forward<Args>(args)...);
795template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
799 set_prefix<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
800 std::forward<Args>(args)...);
807template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
812 invoke_impl::invoke<operation::set_scope, ApiT>(obj, std::forward<Args>(args)...);
815template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
819 set_scope<TIMEMORY_API>(obj, std::forward<Args>(args)...);
822template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
827 invoke_impl::invoke<operation::set_scope, ApiT>(std::forward<TupleT<Tp&...>>(obj),
828 std::forward<Args>(args)...);
831template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
835 set_scope<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
836 std::forward<Args>(args)...);
843template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
848 invoke_impl::invoke_data<operation::set_state, ApiT>(obj,
849 std::forward<Args>(args)...);
852template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
857 invoke_impl::invoke_data<operation::set_state, ApiT>(
858 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
865template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
870 invoke_impl::invoke<operation::assemble, ApiT>(obj, std::forward<Args>(args)...);
873template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
877 assemble<TIMEMORY_API>(obj, std::forward<Args>(args)...);
880template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
885 invoke_impl::invoke<operation::assemble, ApiT>(std::forward<TupleT<Tp&...>>(obj),
886 std::forward<Args>(args)...);
889template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
893 assemble<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
894 std::forward<Args>(args)...);
901template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
904derive(TupleT<Tp...>& obj, Args&&... args)
906 invoke_impl::invoke<operation::derive, ApiT>(obj, std::forward<Args>(args)...);
909template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
911derive(TupleT<Tp...>& obj, Args&&... args)
913 derive<TIMEMORY_API>(obj, std::forward<Args>(args)...);
916template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
919derive(TupleT<Tp&...>&& obj, Args&&... args)
921 invoke_impl::invoke<operation::derive, ApiT>(std::forward<TupleT<Tp&...>>(obj),
922 std::forward<Args>(args)...);
925template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
927derive(TupleT<Tp&...>&& obj, Args&&... args)
929 derive<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
936template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
939audit(TupleT<Tp...>& obj, Args&&... args)
941 invoke_impl::invoke<operation::audit, ApiT>(obj, std::forward<Args>(args)...);
944template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
946audit(TupleT<Tp...>& obj, Args&&... args)
948 audit<TIMEMORY_API>(obj, std::forward<Args>(args)...);
951template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
954audit(TupleT<Tp&...>&& obj, Args&&... args)
956 invoke_impl::invoke<operation::audit, ApiT>(std::forward<TupleT<Tp&...>>(obj),
957 std::forward<Args>(args)...);
960template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
962audit(TupleT<Tp&...>&& obj, Args&&... args)
964 audit<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
971template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
976 invoke_impl::invoke<operation::add_secondary, ApiT>(obj, std::forward<Args>(args)...);
979template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
983 add_secondary<TIMEMORY_API>(obj, std::forward<Args>(args)...);
986template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
991 invoke_impl::invoke<operation::add_secondary, ApiT>(std::forward<TupleT<Tp&...>>(obj),
992 std::forward<Args>(args)...);
995template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
999 add_secondary<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1000 std::forward<Args>(args)...);
1007template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1010get(TupleT<Tp...>& obj, Args&&... args)
1012 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1016 data_value_type _data{};
1017 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1018 invoke_impl::invoke_data<operation::get_data, ApiT>(_obj, _data,
1019 std::forward<Args>(args)...);
1023template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1025get(TupleT<Tp...>& obj, Args&&... args)
1027 return ::tim::invoke::get<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1030template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1033get(TupleT<Tp&...>&& obj, Args&&... args)
1035 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1039 data_value_type _data{};
1040 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1041 invoke_impl::invoke_data<operation::get_data, ApiT>(_obj, _data,
1042 std::forward<Args>(args)...);
1046template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1048get(TupleT<Tp&...>&& obj, Args&&... args)
1050 return ::tim::invoke::get<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1051 std::forward<Args>(args)...);
1054template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp>
1056get(TupleT<Tp...>& obj,
void*& _ptr,
size_t _hash)
1058 invoke_impl::invoke<operation::get, ApiT>(obj, _ptr, _hash);
1061template <
template <
typename...>
class TupleT,
typename... Tp>
1063get(TupleT<Tp...>& obj,
void*& _ptr,
size_t _hash)
1065 return ::tim::invoke::get<TIMEMORY_API>(obj, _ptr, _hash);
1072template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1077 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1081 data_label_type _data{};
1082 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1083 invoke_impl::invoke_data<operation::get_labeled_data, ApiT>(
1084 _obj, _data, std::forward<Args>(args)...);
1088template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1092 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1095template <
typename ApiT,
template <
typename...>
class TupleT,
typename... Tp,
1100 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1104 data_label_type _data{};
1105 auto&& _obj = mpl::get_reference_tuple<data_collect_type>(obj);
1106 invoke_impl::invoke_data<operation::get_labeled_data, ApiT>(
1107 _obj, _data, std::forward<Args>(args)...);
1111template <
template <
typename...>
class TupleT,
typename... Tp,
typename... Args>
1115 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1124template <
typename ArchiveT,
typename TupleT,
size_t... Idx>
1126serialize(ArchiveT& ar, TupleT& obj, std::index_sequence<Idx...>)
1128 auto _serialize = [&ar](
auto& _obj) {
1129 auto _label = _obj.label();
1130 ar(cereal::make_nvp(_label.c_str(), _obj));
1137template <
typename ArchiveT,
template <
typename...>
class TupleT,
typename... Tp>
1144template <
typename ArchiveT,
template <
typename...>
class TupleT,
typename... Tp>
1155template <
typename... BundleT>
1175#define TIMEMORY_DEFINE_DISJOINT_FUNCTION(FUNC) \
1176 namespace disjoint_impl \
1178 template <template <typename...> class TupleT, typename... Tp, size_t... Idx, \
1180 void FUNC(TupleT<Tp...>&& obj, index_sequence<Idx...>, Args&&... args) \
1182 TIMEMORY_FOLD_EXPRESSION(std::get<Idx>(obj).FUNC(std::forward<Args>(args)...)); \
1186 template <template <typename...> class TupleT, typename... Tp, typename... Args> \
1187 void FUNC(TupleT<Tp...>&& obj, Args&&... args) \
1189 disjoint_impl::FUNC(std::forward<TupleT<Tp...>>(obj), \
1190 make_index_sequence<sizeof...(Tp)>{}, \
1191 std::forward<Args>(args)...); \
1212#undef TIMEMORY_DEFINE_DISJOINT_FUNCTION
1215namespace disjoint_impl
1217template <
template <
typename...>
class TupleT,
typename... Tp,
typename FuncT,
1218 size_t... Idx,
typename... Args>
1223 std::forward<FuncT>(func)(std::get<Idx>(obj), std::forward<Args>(args)...));
1227template <
template <
typename...>
class TupleT,
typename... Tp,
typename FuncT,
1230invoke(TupleT<Tp...>&& obj, FuncT&& func, Args&&... args)
1234 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(...)
std::tuple_element< N, std::tuple< Types... > >::type & get(tim::auto_bundle< Tag, Types... > &obj)
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)
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
typename impl::subtract< LhsT, RhsT >::type subtract_t
std::bitset< scope_count > data_type
std::make_integer_sequence< size_t, Num > make_index_sequence
Alias template make_index_sequence.
std::array< char *, 4 > _args
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
const std::string std::ostream * os
typename impl::convert< T, U >::type convert_t
std::integer_sequence< size_t, Idx... > index_sequence
Alias template index_sequence.
lightweight tuple-alternative for meta-programming logic
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(...)