timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
functional.cpp
Go to the documentation of this file.
1// MIT License
2//
3// Copyright (c) 2020, The Regents of the University of California,
4// through Lawrence Berkeley National Laboratory (subject to receipt of any
5// required approvals from the U.S. Dept. of Energy). All rights reserved.
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in all
15// copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23// SOFTWARE.
24
25#ifndef TIMEMORY_VARIADIC_FUNCTIONAL_CPP_
26#define TIMEMORY_VARIADIC_FUNCTIONAL_CPP_ 1
27
28// #include "timemory/variadic/functional.hpp"
29
30#include "timemory/api.hpp"
37
38#include <type_traits>
39
40namespace tim
41{
42namespace invoke
43{
44namespace invoke_impl
45{
46//
47//--------------------------------------------------------------------------------------//
48//
49template <template <typename> class OpT, typename Tag,
50 template <typename...> class TupleT, typename... Tp, typename... Args>
51TIMEMORY_INLINE void
52invoke(TupleT<Tp...>& _obj, Args&&... _args)
53{
54 using data_type = std::tuple<decay_t<Tp>...>;
58 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
59 std::forward<Args>(_args)...));
60}
61//
62//--------------------------------------------------------------------------------------//
63//
64template <template <typename, typename> class OpT, typename Tag,
65 template <typename...> class TupleT, typename... Tp, typename... Args>
66TIMEMORY_INLINE void
67invoke(TupleT<Tp...>& _obj, Args&&... _args)
68{
69 using data_type = std::tuple<decay_t<Tp>...>;
72 OpT<std::remove_pointer_t<decay_t<Tp>>, Tag>, Tag>(
73 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
74 std::forward<Args>(_args)...));
75}
76//
77//--------------------------------------------------------------------------------------//
78//
79template <template <typename> class OpT, typename Tag,
80 template <typename...> class TupleT, typename... Tp, typename... Args>
81TIMEMORY_INLINE void
82invoke(TupleT<Tp&...>&& _obj, Args&&... _args)
83{
84 using data_type = std::tuple<decay_t<Tp>...>;
88 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
89 std::forward<Args>(_args)...));
90}
91//
92//--------------------------------------------------------------------------------------//
93//
94template <template <typename, typename> class OpT, typename Tag,
95 template <typename...> class TupleT, typename... Tp, typename... Args>
96TIMEMORY_INLINE void
97invoke(TupleT<Tp&...>&& _obj, Args&&... _args)
98{
99 using data_type = std::tuple<decay_t<Tp>...>;
102 OpT<std::remove_pointer_t<decay_t<Tp>>, Tag>, Tag>(
103 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
104 std::forward<Args>(_args)...));
105}
106//
107//--------------------------------------------------------------------------------------//
108//
109template <template <typename> class OpT, typename Tag,
110 template <typename...> class TupleT, typename... Tp,
111 template <typename...> class ValueT, typename... Vp, typename... Args>
112TIMEMORY_INLINE void
113invoke_data(TupleT<Tp...>& _obj, ValueT<Vp...>& _val, Args&&... _args)
114{
115 using data_type = std::tuple<decay_t<Tp>...>;
119 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
120 std::get<index_of<decay_t<Tp>, data_type>::value>(_val),
121 std::forward<Args>(_args)...));
122}
123//
124//--------------------------------------------------------------------------------------//
125//
126template <template <typename> class OpT, typename Tag,
127 template <typename...> class TupleT, typename... Tp,
128 template <typename...> class ValueT, typename... Vp, typename... Args>
129TIMEMORY_INLINE void
130invoke_data(TupleT<Tp&...>&& _obj, ValueT<Vp...>& _val, Args&&... _args)
131{
132 using data_type = std::tuple<decay_t<Tp>...>;
136 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj),
137 std::get<index_of<decay_t<Tp>, data_type>::value>(_val),
138 std::forward<Args>(_args)...));
139}
140//
141//--------------------------------------------------------------------------------------//
142//
143template <template <typename...> class TupleT, typename... Tp, typename... Args>
144TIMEMORY_INLINE void
145construct(TupleT<Tp...>& _obj, Args&&... _args)
146{
147 using data_type = std::tuple<decay_t<Tp>...>;
149 std::get<index_of<decay_t<Tp>, data_type>::value>(_obj) =
150 operation::construct<Tp>::get(std::forward<Args>(_args)...));
151}
152//
153} // namespace invoke_impl
154//
155//======================================================================================//
156//
157template <typename... Args>
158void
159print(std::ostream& os, Args&&... args)
160{
161 TIMEMORY_FOLD_EXPRESSION(os << args << "\n");
162}
163//
164template <typename... Args>
165void
166print(std::ostream& os, const std::string& delim, Args&&... args)
167{
168 TIMEMORY_FOLD_EXPRESSION(os << args << delim);
169}
170//
171//--------------------------------------------------------------------------------------//
172// invoke
173//--------------------------------------------------------------------------------------//
174//
175template <template <typename...> class OpT, typename ApiT,
176 template <typename...> class TupleT, typename... Tp, typename... Args>
177void
178invoke(TupleT<Tp...>& obj, Args&&... args)
179{
180 invoke_impl::invoke<OpT, ApiT>(obj, std::forward<Args>(args)...);
181}
182//
183template <template <typename...> class OpT, template <typename...> class TupleT,
184 typename... Tp, typename... Args>
185void
186invoke(TupleT<Tp...>& obj, Args&&... args)
187{
188 invoke<OpT, TIMEMORY_API>(obj, std::forward<Args>(args)...);
189}
190//
191template <template <typename...> class OpT, typename ApiT,
192 template <typename...> class TupleT, typename... Tp, typename... Args>
193void
194invoke(TupleT<Tp&...>&& obj, Args&&... args)
195{
196 invoke_impl::invoke<OpT, ApiT>(std::forward<TupleT<Tp&...>>(obj),
197 std::forward<Args>(args)...);
198}
199//
200template <template <typename...> class OpT, template <typename...> class TupleT,
201 typename... Tp, typename... Args>
202void
203invoke(TupleT<Tp&...>&& obj, Args&&... args)
204{
205 invoke<OpT, TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
206 std::forward<Args>(args)...);
207}
208//
209template <template <typename...> class OpT, typename ApiT, typename... Up,
210 template <typename...> class TupleT, typename... Tp, typename... Args>
211void
212invoke(mpl::piecewise_select<Up...>, TupleT<Tp...>& obj, Args&&... args)
213{
214 using data_type = TupleT<Tp...>;
215 invoke_impl::invoke<OpT, ApiT>(
216 std::forward_as_tuple(std::get<index_of<Up, data_type>::value>(obj)...),
217 std::forward<Args>(args)...);
218}
219//
220template <template <typename...> class OpT, typename ApiT, typename... Up,
221 template <typename...> class TupleT, typename... Tp, typename... Args>
222void
223invoke(mpl::piecewise_select<Up...>, TupleT<Tp&...>& obj, Args&&... args)
224{
225 using data_type = TupleT<Tp...>;
226 invoke_impl::invoke<OpT, ApiT>(
227 std::tie(std::get<index_of<Up, data_type>::value>(obj)...),
228 std::forward<Args>(args)...);
229}
230//
231template <template <typename...> class OpT, typename ApiT, typename... Up,
232 template <typename...> class TupleT, typename... Tp, typename... Args>
233void
234invoke(mpl::piecewise_ignore<Up...>, TupleT<Tp...>& obj, Args&&... args)
235{
236 using data_type = mpl::subtract_t<type_list<Tp...>, type_list<Up...>>;
238 std::forward<Args>(args)...);
239}
240//
241template <template <typename...> class OpT, typename ApiT, typename... Up,
242 template <typename...> class TupleT, typename... Tp, typename... Args>
243void
244invoke(mpl::piecewise_ignore<Up...>, TupleT<Tp&...>& obj, Args&&... args)
245{
246 using data_type = mpl::subtract_t<type_list<Tp...>, type_list<Up...>>;
248 std::forward<Args>(args)...);
249}
250//
251//--------------------------------------------------------------------------------------//
252// construct
253//--------------------------------------------------------------------------------------//
254//
255template <typename TupleT, typename ApiT, typename... Args>
256auto
257construct(Args&&... args)
258{
260 {
261 TupleT obj{};
262 invoke_impl::construct(std::ref(obj).get(), std::forward<Args>(args)...);
263 return obj;
264 }
265 return TupleT{};
266}
267//
268//
269template <typename TupleT, typename... Args>
270auto
271construct(Args&&... args)
272{
273 return construct<TupleT, TIMEMORY_API>(std::forward<Args>(args)...);
274}
275//
276//--------------------------------------------------------------------------------------//
277// destroy
278//--------------------------------------------------------------------------------------//
279//
280template <typename ApiT, template <typename...> class TupleT, typename... Tp>
281auto
282destroy(TupleT<Tp...>& obj)
283{
284 invoke_impl::invoke<operation::generic_deleter, ApiT>(obj);
285}
286//
287template <template <typename...> class TupleT, typename... Tp>
288auto
289destroy(TupleT<Tp...>& obj)
290{
291 destroy<TIMEMORY_API>(obj);
292}
293//
294template <typename ApiT, template <typename...> class TupleT, typename... Tp>
295auto
296destroy(TupleT<Tp&...>&& obj)
297{
298 invoke_impl::invoke<operation::generic_deleter, ApiT>(
299 std::forward<TupleT<Tp&...>>(obj));
300}
301//
302template <template <typename...> class TupleT, typename... Tp>
303auto
304destroy(TupleT<Tp&...>&& obj)
305{
306 destroy<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj));
307}
308//
309//--------------------------------------------------------------------------------------//
310// start
311//--------------------------------------------------------------------------------------//
312//
313template <typename ApiT, template <typename...> class TupleT, typename... Tp,
314 typename... Args>
315void
316start(TupleT<Tp...>& obj, Args&&... args)
317{
318 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
323
324 // start high priority components
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)...);
328 // start non-prioritized components
329 invoke_impl::invoke<operation::standard_start, ApiT>(obj,
330 std::forward<Args>(args)...);
331 // start low prioritized components
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)...);
335}
336//
337template <template <typename...> class TupleT, typename... Tp, typename... Args>
338void
339start(TupleT<Tp...>& obj, Args&&... args)
340{
341 start<TIMEMORY_API>(obj, std::forward<Args>(args)...);
342}
343//
344template <typename ApiT, template <typename...> class TupleT, typename... Tp,
345 typename... Args>
346void
347start(TupleT<Tp&...>&& obj, Args&&... args)
348{
349 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
354
355 // start high priority components
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)...);
360
361 // start non-prioritized components
362 invoke_impl::invoke<operation::standard_start, ApiT>(
363 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
364
365 // start low prioritized components
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)...);
370}
371//
372template <template <typename...> class TupleT, typename... Tp, typename... Args>
373void
374start(TupleT<Tp&...>&& obj, Args&&... args)
375{
376 start<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
377}
378//
379//--------------------------------------------------------------------------------------//
380// stop
381//--------------------------------------------------------------------------------------//
382//
383template <typename ApiT, template <typename...> class TupleT, typename... Tp,
384 typename... Args>
385void
386stop(TupleT<Tp...>& obj, Args&&... args)
387{
388 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
393
394 // stop high priority components
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)...);
398
399 // stop non-prioritized components
400 invoke_impl::invoke<operation::standard_stop, ApiT>(obj, std::forward<Args>(args)...);
401
402 // stop low prioritized components
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)...);
406}
407//
408template <template <typename...> class TupleT, typename... Tp, typename... Args>
409void
410stop(TupleT<Tp...>& obj, Args&&... args)
411{
412 stop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
413}
414//
415template <typename ApiT, template <typename...> class TupleT, typename... Tp,
416 typename... Args>
417void
418stop(TupleT<Tp&...>&& obj, Args&&... args)
419{
420 using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
425
426 // stop high priority components
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)...);
431
432 // stop non-prioritized components
433 invoke_impl::invoke<operation::standard_stop, ApiT>(std::forward<TupleT<Tp&...>>(obj),
434 std::forward<Args>(args)...);
435
436 // stop low prioritized components
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)...);
441}
442//
443template <template <typename...> class TupleT, typename... Tp, typename... Args>
444void
445stop(TupleT<Tp&...>&& obj, Args&&... args)
446{
447 stop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
448}
449//
450//--------------------------------------------------------------------------------------//
451// mark
452//--------------------------------------------------------------------------------------//
453//
454template <typename ApiT, template <typename...> class TupleT, typename... Tp,
455 typename... Args>
456void
457mark(TupleT<Tp...>& obj, Args&&... args)
458{
459 invoke_impl::invoke<operation::mark, ApiT>(obj, std::forward<Args>(args)...);
460}
461//
462template <template <typename...> class TupleT, typename... Tp, typename... Args>
463void
464mark(TupleT<Tp...>& obj, Args&&... args)
465{
466 mark<TIMEMORY_API>(obj, std::forward<Args>(args)...);
467}
468//
469template <typename ApiT, template <typename...> class TupleT, typename... Tp,
470 typename... Args>
471void
472mark(TupleT<Tp&...>&& obj, Args&&... args)
473{
474 invoke_impl::invoke<operation::mark, ApiT>(std::forward<TupleT<Tp&...>>(obj),
475 std::forward<Args>(args)...);
476}
477//
478template <template <typename...> class TupleT, typename... Tp, typename... Args>
479void
480mark(TupleT<Tp&...>&& obj, Args&&... args)
481{
482 mark<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
483}
484//
485//--------------------------------------------------------------------------------------//
486// mark_begin
487//--------------------------------------------------------------------------------------//
488//
489template <typename ApiT, template <typename...> class TupleT, typename... Tp,
490 typename... Args>
491void
492mark_begin(TupleT<Tp...>& obj, Args&&... args)
493{
494 invoke_impl::invoke<operation::mark_begin, ApiT>(obj, std::forward<Args>(args)...);
495}
496//
497template <template <typename...> class TupleT, typename... Tp, typename... Args>
498void
499mark_begin(TupleT<Tp...>& obj, Args&&... args)
500{
501 mark_begin<TIMEMORY_API>(obj, std::forward<Args>(args)...);
502}
503//
504template <typename ApiT, template <typename...> class TupleT, typename... Tp,
505 typename... Args>
506void
507mark_begin(TupleT<Tp&...>&& obj, Args&&... args)
508{
509 invoke_impl::invoke<operation::mark_begin, ApiT>(std::forward<TupleT<Tp&...>>(obj),
510 std::forward<Args>(args)...);
511}
512//
513template <template <typename...> class TupleT, typename... Tp, typename... Args>
514void
515mark_begin(TupleT<Tp&...>&& obj, Args&&... args)
516{
517 mark_begin<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
518 std::forward<Args>(args)...);
519}
520//
521//--------------------------------------------------------------------------------------//
522// mark_end
523//--------------------------------------------------------------------------------------//
524//
525template <typename ApiT, template <typename...> class TupleT, typename... Tp,
526 typename... Args>
527void
528mark_end(TupleT<Tp...>& obj, Args&&... args)
529{
530 invoke_impl::invoke<operation::mark_end, ApiT>(obj, std::forward<Args>(args)...);
531}
532//
533template <template <typename...> class TupleT, typename... Tp, typename... Args>
534void
535mark_end(TupleT<Tp...>& obj, Args&&... args)
536{
537 mark_end<TIMEMORY_API>(obj, std::forward<Args>(args)...);
538}
539//
540template <typename ApiT, template <typename...> class TupleT, typename... Tp,
541 typename... Args>
542void
543mark_end(TupleT<Tp&...>&& obj, Args&&... args)
544{
545 invoke_impl::invoke<operation::mark_end, ApiT>(std::forward<TupleT<Tp&...>>(obj),
546 std::forward<Args>(args)...);
547}
548//
549template <template <typename...> class TupleT, typename... Tp, typename... Args>
550void
551mark_end(TupleT<Tp&...>&& obj, Args&&... args)
552{
553 mark_end<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
554 std::forward<Args>(args)...);
555}
556//
557//--------------------------------------------------------------------------------------//
558// store
559//--------------------------------------------------------------------------------------//
560//
561template <typename ApiT, template <typename...> class TupleT, typename... Tp,
562 typename... Args>
563void
564store(TupleT<Tp...>& obj, Args&&... args)
565{
566 invoke_impl::invoke<operation::store, ApiT>(obj, std::forward<Args>(args)...);
567}
568//
569template <template <typename...> class TupleT, typename... Tp, typename... Args>
570void
571store(TupleT<Tp...>& obj, Args&&... args)
572{
573 store<TIMEMORY_API>(obj, std::forward<Args>(args)...);
574}
575//
576template <typename ApiT, template <typename...> class TupleT, typename... Tp,
577 typename... Args>
578void
579store(TupleT<Tp&...>&& obj, Args&&... args)
580{
581 invoke_impl::invoke<operation::store, ApiT>(std::forward<TupleT<Tp&...>>(obj),
582 std::forward<Args>(args)...);
583}
584//
585template <template <typename...> class TupleT, typename... Tp, typename... Args>
586void
587store(TupleT<Tp&...>&& obj, Args&&... args)
588{
589 store<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
590}
591//
592//--------------------------------------------------------------------------------------//
593// reset
594//--------------------------------------------------------------------------------------//
595//
596template <typename ApiT, template <typename...> class TupleT, typename... Tp,
597 typename... Args>
598void
599reset(TupleT<Tp...>& obj, Args&&... args)
600{
601 invoke_impl::invoke<operation::reset, ApiT>(obj, std::forward<Args>(args)...);
602}
603//
604template <template <typename...> class TupleT, typename... Tp, typename... Args>
605void
606reset(TupleT<Tp...>& obj, Args&&... args)
607{
608 reset<TIMEMORY_API>(obj, std::forward<Args>(args)...);
609}
610//
611template <typename ApiT, template <typename...> class TupleT, typename... Tp,
612 typename... Args>
613void
614reset(TupleT<Tp&...>&& obj, Args&&... args)
615{
616 invoke_impl::invoke<operation::reset, ApiT>(std::forward<TupleT<Tp&...>>(obj),
617 std::forward<Args>(args)...);
618}
619//
620template <template <typename...> class TupleT, typename... Tp, typename... Args>
621void
622reset(TupleT<Tp&...>&& obj, Args&&... args)
623{
624 reset<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
625}
626//
627//--------------------------------------------------------------------------------------//
628// record
629//--------------------------------------------------------------------------------------//
630//
631template <typename ApiT, template <typename...> class TupleT, typename... Tp,
632 typename... Args>
633void
634record(TupleT<Tp...>& obj, Args&&... args)
635{
636 invoke_impl::invoke<operation::record, ApiT>(obj, std::forward<Args>(args)...);
637}
638//
639template <template <typename...> class TupleT, typename... Tp, typename... Args>
640void
641record(TupleT<Tp...>& obj, Args&&... args)
642{
643 record<TIMEMORY_API>(obj, std::forward<Args>(args)...);
644}
645//
646template <typename ApiT, template <typename...> class TupleT, typename... Tp,
647 typename... Args>
648void
649record(TupleT<Tp&...>&& obj, Args&&... args)
650{
651 invoke_impl::invoke<operation::record, ApiT>(std::forward<TupleT<Tp&...>>(obj),
652 std::forward<Args>(args)...);
653}
654//
655template <template <typename...> class TupleT, typename... Tp, typename... Args>
656void
657record(TupleT<Tp&...>&& obj, Args&&... args)
658{
659 record<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
660}
661//
662//--------------------------------------------------------------------------------------//
663// measure
664//--------------------------------------------------------------------------------------//
665//
666template <typename ApiT, template <typename...> class TupleT, typename... Tp,
667 typename... Args>
668void
669measure(TupleT<Tp...>& obj, Args&&... args)
670{
671 invoke_impl::invoke<operation::measure, ApiT>(obj, std::forward<Args>(args)...);
672}
673//
674template <template <typename...> class TupleT, typename... Tp, typename... Args>
675void
676measure(TupleT<Tp...>& obj, Args&&... args)
677{
678 measure<TIMEMORY_API>(obj, std::forward<Args>(args)...);
679}
680//
681template <typename ApiT, template <typename...> class TupleT, typename... Tp,
682 typename... Args>
683void
684measure(TupleT<Tp&...>&& obj, Args&&... args)
685{
686 invoke_impl::invoke<operation::measure, ApiT>(std::forward<TupleT<Tp&...>>(obj),
687 std::forward<Args>(args)...);
688}
689//
690template <template <typename...> class TupleT, typename... Tp, typename... Args>
691void
692measure(TupleT<Tp&...>&& obj, Args&&... args)
693{
694 measure<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
695}
696//
697//--------------------------------------------------------------------------------------//
698// push
699//--------------------------------------------------------------------------------------//
700//
701template <typename ApiT, template <typename...> class TupleT, typename... Tp,
702 typename... Args>
703void
704push(TupleT<Tp...>& obj, Args&&... args)
705{
706 invoke_impl::invoke<operation::push_node, ApiT>(obj, std::forward<Args>(args)...);
707}
708//
709template <template <typename...> class TupleT, typename... Tp, typename... Args>
710void
711push(TupleT<Tp...>& obj, Args&&... args)
712{
713 push<TIMEMORY_API>(obj, std::forward<Args>(args)...);
714}
715//
716template <typename ApiT, template <typename...> class TupleT, typename... Tp,
717 typename... Args>
718void
719push(TupleT<Tp&...>&& obj, Args&&... args)
720{
721 invoke_impl::invoke<operation::push_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
722 std::forward<Args>(args)...);
723}
724//
725template <template <typename...> class TupleT, typename... Tp, typename... Args>
726void
727push(TupleT<Tp&...>&& obj, Args&&... args)
728{
729 push<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
730}
731//
732//--------------------------------------------------------------------------------------//
733// pop
734//--------------------------------------------------------------------------------------//
735//
736template <typename ApiT, template <typename...> class TupleT, typename... Tp,
737 typename... Args>
738void
739pop(TupleT<Tp...>& obj, Args&&... args)
740{
741 invoke_impl::invoke<operation::pop_node, ApiT>(obj, std::forward<Args>(args)...);
742}
743//
744template <template <typename...> class TupleT, typename... Tp, typename... Args>
745void
746pop(TupleT<Tp...>& obj, Args&&... args)
747{
748 pop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
749}
750//
751template <typename ApiT, template <typename...> class TupleT, typename... Tp,
752 typename... Args>
753void
754pop(TupleT<Tp&...>&& obj, Args&&... args)
755{
756 invoke_impl::invoke<operation::pop_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
757 std::forward<Args>(args)...);
758}
759//
760template <template <typename...> class TupleT, typename... Tp, typename... Args>
761void
762pop(TupleT<Tp&...>&& obj, Args&&... args)
763{
764 pop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
765}
766//
767//--------------------------------------------------------------------------------------//
768// set_prefix
769//--------------------------------------------------------------------------------------//
770//
771template <typename ApiT, template <typename...> class TupleT, typename... Tp,
772 typename... Args>
773void
774set_prefix(TupleT<Tp...>& obj, Args&&... args)
775{
776 invoke_impl::invoke<operation::set_prefix, ApiT>(obj, std::forward<Args>(args)...);
777}
778//
779template <template <typename...> class TupleT, typename... Tp, typename... Args>
780void
781set_prefix(TupleT<Tp...>& obj, Args&&... args)
782{
783 set_prefix<TIMEMORY_API>(obj, std::forward<Args>(args)...);
784}
785//
786template <typename ApiT, template <typename...> class TupleT, typename... Tp,
787 typename... Args>
788void
789set_prefix(TupleT<Tp&...>&& obj, Args&&... args)
790{
791 invoke_impl::invoke<operation::set_prefix, ApiT>(std::forward<TupleT<Tp&...>>(obj),
792 std::forward<Args>(args)...);
793}
794//
795template <template <typename...> class TupleT, typename... Tp, typename... Args>
796void
797set_prefix(TupleT<Tp&...>&& obj, Args&&... args)
798{
799 set_prefix<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
800 std::forward<Args>(args)...);
801}
802//
803//--------------------------------------------------------------------------------------//
804// set_scope
805//--------------------------------------------------------------------------------------//
806//
807template <typename ApiT, template <typename...> class TupleT, typename... Tp,
808 typename... Args>
809void
810set_scope(TupleT<Tp...>& obj, Args&&... args)
811{
812 invoke_impl::invoke<operation::set_scope, ApiT>(obj, std::forward<Args>(args)...);
813}
814//
815template <template <typename...> class TupleT, typename... Tp, typename... Args>
816void
817set_scope(TupleT<Tp...>& obj, Args&&... args)
818{
819 set_scope<TIMEMORY_API>(obj, std::forward<Args>(args)...);
820}
821//
822template <typename ApiT, template <typename...> class TupleT, typename... Tp,
823 typename... Args>
824void
825set_scope(TupleT<Tp&...>&& obj, Args&&... args)
826{
827 invoke_impl::invoke<operation::set_scope, ApiT>(std::forward<TupleT<Tp&...>>(obj),
828 std::forward<Args>(args)...);
829}
830//
831template <template <typename...> class TupleT, typename... Tp, typename... Args>
832void
833set_scope(TupleT<Tp&...>&& obj, Args&&... args)
834{
835 set_scope<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
836 std::forward<Args>(args)...);
837}
838//
839//--------------------------------------------------------------------------------------//
840// set_state
841//--------------------------------------------------------------------------------------//
842//
843template <typename ApiT, template <typename...> class TupleT, typename... Tp,
844 typename... Args>
845void
846set_state(TupleT<Tp...>& obj, Args&&... args)
847{
848 invoke_impl::invoke_data<operation::set_state, ApiT>(obj,
849 std::forward<Args>(args)...);
850}
851//
852template <typename ApiT, template <typename...> class TupleT, typename... Tp,
853 typename... Args>
854void
855set_state(TupleT<Tp&...>&& obj, Args&&... args)
856{
857 invoke_impl::invoke_data<operation::set_state, ApiT>(
858 std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
859}
860//
861//--------------------------------------------------------------------------------------//
862// assemble
863//--------------------------------------------------------------------------------------//
864//
865template <typename ApiT, template <typename...> class TupleT, typename... Tp,
866 typename... Args>
867void
868assemble(TupleT<Tp...>& obj, Args&&... args)
869{
870 invoke_impl::invoke<operation::assemble, ApiT>(obj, std::forward<Args>(args)...);
871}
872//
873template <template <typename...> class TupleT, typename... Tp, typename... Args>
874void
875assemble(TupleT<Tp...>& obj, Args&&... args)
876{
877 assemble<TIMEMORY_API>(obj, std::forward<Args>(args)...);
878}
879//
880template <typename ApiT, template <typename...> class TupleT, typename... Tp,
881 typename... Args>
882void
883assemble(TupleT<Tp&...>&& obj, Args&&... args)
884{
885 invoke_impl::invoke<operation::assemble, ApiT>(std::forward<TupleT<Tp&...>>(obj),
886 std::forward<Args>(args)...);
887}
888//
889template <template <typename...> class TupleT, typename... Tp, typename... Args>
890void
891assemble(TupleT<Tp&...>&& obj, Args&&... args)
892{
893 assemble<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
894 std::forward<Args>(args)...);
895}
896//
897//--------------------------------------------------------------------------------------//
898// derive
899//--------------------------------------------------------------------------------------//
900//
901template <typename ApiT, template <typename...> class TupleT, typename... Tp,
902 typename... Args>
903void
904derive(TupleT<Tp...>& obj, Args&&... args)
905{
906 invoke_impl::invoke<operation::derive, ApiT>(obj, std::forward<Args>(args)...);
907}
908//
909template <template <typename...> class TupleT, typename... Tp, typename... Args>
910void
911derive(TupleT<Tp...>& obj, Args&&... args)
912{
913 derive<TIMEMORY_API>(obj, std::forward<Args>(args)...);
914}
915//
916template <typename ApiT, template <typename...> class TupleT, typename... Tp,
917 typename... Args>
918void
919derive(TupleT<Tp&...>&& obj, Args&&... args)
920{
921 invoke_impl::invoke<operation::derive, ApiT>(std::forward<TupleT<Tp&...>>(obj),
922 std::forward<Args>(args)...);
923}
924//
925template <template <typename...> class TupleT, typename... Tp, typename... Args>
926void
927derive(TupleT<Tp&...>&& obj, Args&&... args)
928{
929 derive<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
930}
931//
932//--------------------------------------------------------------------------------------//
933// audit
934//--------------------------------------------------------------------------------------//
935//
936template <typename ApiT, template <typename...> class TupleT, typename... Tp,
937 typename... Args>
938void
939audit(TupleT<Tp...>& obj, Args&&... args)
940{
941 invoke_impl::invoke<operation::audit, ApiT>(obj, std::forward<Args>(args)...);
942}
943//
944template <template <typename...> class TupleT, typename... Tp, typename... Args>
945void
946audit(TupleT<Tp...>& obj, Args&&... args)
947{
948 audit<TIMEMORY_API>(obj, std::forward<Args>(args)...);
949}
950//
951template <typename ApiT, template <typename...> class TupleT, typename... Tp,
952 typename... Args>
953void
954audit(TupleT<Tp&...>&& obj, Args&&... args)
955{
956 invoke_impl::invoke<operation::audit, ApiT>(std::forward<TupleT<Tp&...>>(obj),
957 std::forward<Args>(args)...);
958}
959//
960template <template <typename...> class TupleT, typename... Tp, typename... Args>
961void
962audit(TupleT<Tp&...>&& obj, Args&&... args)
963{
964 audit<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
965}
966//
967//--------------------------------------------------------------------------------------//
968// add_secondary
969//--------------------------------------------------------------------------------------//
970//
971template <typename ApiT, template <typename...> class TupleT, typename... Tp,
972 typename... Args>
973void
974add_secondary(TupleT<Tp...>& obj, Args&&... args)
975{
976 invoke_impl::invoke<operation::add_secondary, ApiT>(obj, std::forward<Args>(args)...);
977}
978//
979template <template <typename...> class TupleT, typename... Tp, typename... Args>
980void
981add_secondary(TupleT<Tp...>& obj, Args&&... args)
982{
983 add_secondary<TIMEMORY_API>(obj, std::forward<Args>(args)...);
984}
985//
986template <typename ApiT, template <typename...> class TupleT, typename... Tp,
987 typename... Args>
988void
989add_secondary(TupleT<Tp&...>&& obj, Args&&... args)
990{
991 invoke_impl::invoke<operation::add_secondary, ApiT>(std::forward<TupleT<Tp&...>>(obj),
992 std::forward<Args>(args)...);
993}
994//
995template <template <typename...> class TupleT, typename... Tp, typename... Args>
996void
997add_secondary(TupleT<Tp&...>&& obj, Args&&... args)
998{
999 add_secondary<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1000 std::forward<Args>(args)...);
1001}
1002//
1003//--------------------------------------------------------------------------------------//
1004// get
1005//--------------------------------------------------------------------------------------//
1006//
1007template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1008 typename... Args>
1009auto
1010get(TupleT<Tp...>& obj, Args&&... args)
1011{
1012 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1013 using data_collect_type = mpl::get_data_type_t<data_type>;
1014 using data_value_type = mpl::get_data_value_t<data_type>;
1015
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)...);
1020 return _data;
1021}
1022//
1023template <template <typename...> class TupleT, typename... Tp, typename... Args>
1024auto
1025get(TupleT<Tp...>& obj, Args&&... args)
1026{
1027 return ::tim::invoke::get<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1028}
1029//
1030template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1031 typename... Args>
1032auto
1033get(TupleT<Tp&...>&& obj, Args&&... args)
1034{
1035 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1036 using data_collect_type = mpl::get_data_type_t<data_type>;
1037 using data_value_type = mpl::get_data_value_t<data_type>;
1038
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)...);
1043 return _data;
1044}
1045//
1046template <template <typename...> class TupleT, typename... Tp, typename... Args>
1047auto
1048get(TupleT<Tp&...>&& obj, Args&&... args)
1049{
1050 return ::tim::invoke::get<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1051 std::forward<Args>(args)...);
1052}
1053//
1054template <typename ApiT, template <typename...> class TupleT, typename... Tp>
1055auto
1056get(TupleT<Tp...>& obj, void*& _ptr, size_t _hash)
1057{
1058 invoke_impl::invoke<operation::get, ApiT>(obj, _ptr, _hash);
1059}
1060//
1061template <template <typename...> class TupleT, typename... Tp>
1062auto
1063get(TupleT<Tp...>& obj, void*& _ptr, size_t _hash)
1064{
1065 return ::tim::invoke::get<TIMEMORY_API>(obj, _ptr, _hash);
1066}
1067//
1068//--------------------------------------------------------------------------------------//
1069// get_labeled
1070//--------------------------------------------------------------------------------------//
1071//
1072template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1073 typename... Args>
1074auto
1075get_labeled(TupleT<Tp...>& obj, Args&&... args)
1076{
1077 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1078 using data_collect_type = mpl::get_data_type_t<data_type>;
1079 using data_label_type = mpl::get_data_label_t<data_type>;
1080
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)...);
1085 return _data;
1086}
1087//
1088template <template <typename...> class TupleT, typename... Tp, typename... Args>
1089auto
1090get_labeled(TupleT<Tp...>& obj, Args&&... args)
1091{
1092 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1093}
1094//
1095template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1096 typename... Args>
1097auto
1098get_labeled(TupleT<Tp&...>&& obj, Args&&... args)
1099{
1100 using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1101 using data_collect_type = mpl::get_data_type_t<data_type>;
1102 using data_label_type = mpl::get_data_label_t<data_type>;
1103
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)...);
1108 return _data;
1109}
1110//
1111template <template <typename...> class TupleT, typename... Tp, typename... Args>
1112auto
1113get_labeled(TupleT<Tp&...>&& obj, Args&&... args)
1114{
1115 return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1116}
1117//
1118//--------------------------------------------------------------------------------------//
1119// get_labeled
1120//--------------------------------------------------------------------------------------//
1121//
1122namespace impl
1123{
1124template <typename ArchiveT, typename TupleT, size_t... Idx>
1125auto
1126serialize(ArchiveT& ar, TupleT& obj, std::index_sequence<Idx...>)
1127{
1128 auto _serialize = [&ar](auto& _obj) {
1129 auto _label = _obj.label();
1130 ar(cereal::make_nvp(_label.c_str(), _obj));
1131 };
1132 TIMEMORY_FOLD_EXPRESSION(_serialize(std::get<Idx>(obj)));
1133}
1134//
1135} // namespace impl
1136//
1137template <typename ArchiveT, template <typename...> class TupleT, typename... Tp>
1138auto
1139serialize(ArchiveT& ar, TupleT<Tp...>& obj)
1140{
1141 impl::serialize(ar, obj, std::make_index_sequence<sizeof...(Tp)>{});
1142}
1143//
1144template <typename ArchiveT, template <typename...> class TupleT, typename... Tp>
1145auto
1146serialize(ArchiveT& ar, TupleT<Tp&...>&& obj)
1147{
1148 impl::serialize(ar, obj, std::make_index_sequence<sizeof...(Tp)>{});
1149}
1150//
1151//--------------------------------------------------------------------------------------//
1152// get_cache
1153//--------------------------------------------------------------------------------------//
1154//
1155template <typename... BundleT>
1156auto
1158{
1159 return operation::construct_cache<std::tuple<BundleT...>>{}();
1160}
1161//
1162//--------------------------------------------------------------------------------------//
1163//
1164// This is for multiple component bundlers, e.g.
1165// start(comp_tuple<A...>, comp_tuple<B...>)
1166//
1167// MUST USE INDEX SEQUENCE. W/o index sequence multiple instances of same bundle
1168// will give weird results
1169//
1170//--------------------------------------------------------------------------------------//
1171//
1172namespace disjoint
1173{
1174//
1175#define TIMEMORY_DEFINE_DISJOINT_FUNCTION(FUNC) \
1176 namespace disjoint_impl \
1177 { \
1178 template <template <typename...> class TupleT, typename... Tp, size_t... Idx, \
1179 typename... Args> \
1180 void FUNC(TupleT<Tp...>&& obj, index_sequence<Idx...>, Args&&... args) \
1181 { \
1182 TIMEMORY_FOLD_EXPRESSION(std::get<Idx>(obj).FUNC(std::forward<Args>(args)...)); \
1183 } \
1184 } \
1185 \
1186 template <template <typename...> class TupleT, typename... Tp, typename... Args> \
1187 void FUNC(TupleT<Tp...>&& obj, Args&&... args) \
1188 { \
1189 disjoint_impl::FUNC(std::forward<TupleT<Tp...>>(obj), \
1190 make_index_sequence<sizeof...(Tp)>{}, \
1191 std::forward<Args>(args)...); \
1192 }
1193
1211
1212#undef TIMEMORY_DEFINE_DISJOINT_FUNCTION
1213
1214// invoke is slightly different than the others
1215namespace disjoint_impl
1216{
1217template <template <typename...> class TupleT, typename... Tp, typename FuncT,
1218 size_t... Idx, typename... Args>
1219void
1220invoke(TupleT<Tp...>&& obj, FuncT&& func, index_sequence<Idx...>, Args&&... args)
1221{
1223 std::forward<FuncT>(func)(std::get<Idx>(obj), std::forward<Args>(args)...));
1224}
1225} // namespace disjoint_impl
1226//
1227template <template <typename...> class TupleT, typename... Tp, typename FuncT,
1228 typename... Args>
1229void
1230invoke(TupleT<Tp...>&& obj, FuncT&& func, Args&&... args)
1231{
1232 disjoint_impl::invoke(std::forward<TupleT<Tp...>>(obj), std::forward<FuncT>(func),
1233 make_index_sequence<sizeof...(Tp)>{},
1234 std::forward<Args>(args)...);
1235}
1236} // namespace disjoint
1237} // namespace invoke
1238} // namespace tim
1239
1240#endif
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(...)
Definition: language.hpp:72
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)
Definition: functional.cpp:846
void set_scope(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:810
void assemble(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:868
auto construct(Args &&... args)
Definition: functional.cpp:271
void mark_begin(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:492
auto serialize(ArchiveT &ar, TupleT< Tp &... > &&obj)
void set_prefix(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:774
void audit(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:939
void store(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:564
auto serialize(ArchiveT &ar, TupleT< Tp... > &obj)
auto construct(Args &&... args)
Definition: functional.cpp:257
void record(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:634
auto get_cache()
void add_secondary(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:974
void derive(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:904
void pop(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:739
auto get(TupleT< Tp... > &obj, Args &&... args)
void invoke(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:178
void stop(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:386
void measure(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:669
void push(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:704
void mark_end(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:528
auto destroy(TupleT< Tp... > &obj)
Definition: functional.cpp:282
auto get_labeled(TupleT< Tp... > &obj, Args &&... args)
void mark(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:457
void reset(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:599
void print(std::ostream &os, Args &&... args)
Definition: functional.cpp:159
void start(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:316
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
Definition: filters.hpp:478
impl::filter_false< Predicate, Sequence > filter_false_t
Definition: available.hpp:251
typename impl::template get_data_tuple< TypeList >::type get_data_type_t
get the tuple of types
Definition: filters.hpp:452
typename impl::template get_data_tuple< TypeList >::label_type get_data_label_t
get the tuple of pair of descriptor and value
Definition: filters.hpp:460
typename impl::template get_data_tuple< TypeList >::value_type get_data_value_t
get the tuple of values
Definition: filters.hpp:456
typename impl::subtract< LhsT, RhsT >::type subtract_t
Definition: filters.hpp:426
std::bitset< scope_count > data_type
Definition: types.hpp:399
Definition: kokkosp.cpp:39
std::make_integer_sequence< size_t, Num > make_index_sequence
Alias template make_index_sequence.
Definition: types.hpp:182
std::array< char *, 4 > _args
typename std::remove_pointer< U >::type remove_pointer_t
Definition: types.hpp:569
impl::index_of< Tp, Type > index_of
Definition: types.hpp:575
typename std::decay< T >::type decay_t
Alias template for decay.
Definition: types.hpp:194
tim::mpl::apply< std::string > string
Definition: macros.hpp:53
const std::string std::ostream * os
typename impl::convert< T, U >::type convert_t
Definition: types.hpp:855
std::integer_sequence< size_t, Idx... > index_sequence
Alias template index_sequence.
Definition: types.hpp:178
lightweight tuple-alternative for meta-programming logic
Definition: types.hpp:233
The purpose of this operation class is construct an object with specific args.
Definition: construct.hpp:52
This operation class is similar to pointer_operator but can handle non-pointer types.
Definition: generic.hpp:55
trait that signifies that an implementation for the component is available. When this is set to false...
Definition: types.hpp:355
#define TIMEMORY_FOLD_EXPRESSION(...)
Definition: types.hpp:56