timemory  3.2.1
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"
32 #include "timemory/mpl/apply.hpp"
37 
38 #include <type_traits>
39 
40 namespace tim
41 {
42 namespace invoke
43 {
44 namespace invoke_impl
45 {
46 //
47 //--------------------------------------------------------------------------------------//
48 //
49 template <template <typename> class OpT, typename Tag,
50  template <typename...> class TupleT, typename... Tp, typename... Args>
51 TIMEMORY_INLINE void
52 invoke(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 //
64 template <template <typename, typename> class OpT, typename Tag,
65  template <typename...> class TupleT, typename... Tp, typename... Args>
66 TIMEMORY_INLINE void
67 invoke(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 //
79 template <template <typename> class OpT, typename Tag,
80  template <typename...> class TupleT, typename... Tp, typename... Args>
81 TIMEMORY_INLINE void
82 invoke(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 //
94 template <template <typename, typename> class OpT, typename Tag,
95  template <typename...> class TupleT, typename... Tp, typename... Args>
96 TIMEMORY_INLINE void
97 invoke(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 //
109 template <template <typename> class OpT, typename Tag,
110  template <typename...> class TupleT, typename... Tp,
111  template <typename...> class ValueT, typename... Vp, typename... Args>
112 TIMEMORY_INLINE void
113 invoke_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 //
126 template <template <typename> class OpT, typename Tag,
127  template <typename...> class TupleT, typename... Tp,
128  template <typename...> class ValueT, typename... Vp, typename... Args>
129 TIMEMORY_INLINE void
130 invoke_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 //
143 template <template <typename...> class TupleT, typename... Tp, typename... Args>
144 TIMEMORY_INLINE void
145 construct(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 //
157 template <typename... Args>
158 void
159 print(std::ostream& os, Args&&... args)
160 {
161  TIMEMORY_FOLD_EXPRESSION(os << args << "\n");
162 }
163 //
164 template <typename... Args>
165 void
166 print(std::ostream& os, const std::string& delim, Args&&... args)
167 {
168  TIMEMORY_FOLD_EXPRESSION(os << args << delim);
169 }
170 //
171 //--------------------------------------------------------------------------------------//
172 // invoke
173 //--------------------------------------------------------------------------------------//
174 //
175 template <template <typename...> class OpT, typename ApiT,
176  template <typename...> class TupleT, typename... Tp, typename... Args>
177 void
178 invoke(TupleT<Tp...>& obj, Args&&... args)
179 {
180  invoke_impl::invoke<OpT, ApiT>(obj, std::forward<Args>(args)...);
181 }
182 //
183 template <template <typename...> class OpT, template <typename...> class TupleT,
184  typename... Tp, typename... Args>
185 void
186 invoke(TupleT<Tp...>& obj, Args&&... args)
187 {
188  invoke<OpT, TIMEMORY_API>(obj, std::forward<Args>(args)...);
189 }
190 //
191 template <template <typename...> class OpT, typename ApiT,
192  template <typename...> class TupleT, typename... Tp, typename... Args>
193 void
194 invoke(TupleT<Tp&...>&& obj, Args&&... args)
195 {
196  invoke_impl::invoke<OpT, ApiT>(std::forward<TupleT<Tp&...>>(obj),
197  std::forward<Args>(args)...);
198 }
199 //
200 template <template <typename...> class OpT, template <typename...> class TupleT,
201  typename... Tp, typename... Args>
202 void
203 invoke(TupleT<Tp&...>&& obj, Args&&... args)
204 {
205  invoke<OpT, TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
206  std::forward<Args>(args)...);
207 }
208 //
209 template <template <typename...> class OpT, typename ApiT, typename... Up,
210  template <typename...> class TupleT, typename... Tp, typename... Args>
211 void
212 invoke(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 //
220 template <template <typename...> class OpT, typename ApiT, typename... Up,
221  template <typename...> class TupleT, typename... Tp, typename... Args>
222 void
223 invoke(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 //
231 //--------------------------------------------------------------------------------------//
232 // construct
233 //--------------------------------------------------------------------------------------//
234 //
235 template <typename TupleT, typename ApiT, typename... Args>
236 auto
237 construct(Args&&... args)
238 {
240  {
241  {
242  TupleT obj{};
243  invoke_impl::construct(std::ref(obj).get(), std::forward<Args>(args)...);
244  return obj;
245  }
246  }
247  return TupleT{};
248 }
249 //
250 //
251 template <typename TupleT, typename... Args>
252 auto
253 construct(Args&&... args)
254 {
255  return construct<TupleT, TIMEMORY_API>(std::forward<Args>(args)...);
256 }
257 //
258 //--------------------------------------------------------------------------------------//
259 // destroy
260 //--------------------------------------------------------------------------------------//
261 //
262 template <typename ApiT, template <typename...> class TupleT, typename... Tp>
263 auto
264 destroy(TupleT<Tp...>& obj)
265 {
266  invoke_impl::invoke<operation::generic_deleter, ApiT>(obj);
267 }
268 //
269 template <template <typename...> class TupleT, typename... Tp>
270 auto
271 destroy(TupleT<Tp...>& obj)
272 {
273  destroy<TIMEMORY_API>(obj);
274 }
275 //
276 template <typename ApiT, template <typename...> class TupleT, typename... Tp>
277 auto
278 destroy(TupleT<Tp&...>&& obj)
279 {
280  invoke_impl::invoke<operation::generic_deleter, ApiT>(
281  std::forward<TupleT<Tp&...>>(obj));
282 }
283 //
284 template <template <typename...> class TupleT, typename... Tp>
285 auto
286 destroy(TupleT<Tp&...>&& obj)
287 {
288  destroy<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj));
289 }
290 //
291 //--------------------------------------------------------------------------------------//
292 // start
293 //--------------------------------------------------------------------------------------//
294 //
295 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
296  typename... Args>
297 void
298 start(TupleT<Tp...>& obj, Args&&... args)
299 {
300  using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
305 
306  // start high priority components
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)...);
310  // start non-prioritized components
311  invoke_impl::invoke<operation::standard_start, ApiT>(obj,
312  std::forward<Args>(args)...);
313  // start low prioritized components
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)...);
317 }
318 //
319 template <template <typename...> class TupleT, typename... Tp, typename... Args>
320 void
321 start(TupleT<Tp...>& obj, Args&&... args)
322 {
323  start<TIMEMORY_API>(obj, std::forward<Args>(args)...);
324 }
325 //
326 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
327  typename... Args>
328 void
329 start(TupleT<Tp&...>&& obj, Args&&... args)
330 {
331  using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
336 
337  // start high priority components
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)...);
342 
343  // start non-prioritized components
344  invoke_impl::invoke<operation::standard_start, ApiT>(
345  std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
346 
347  // start low prioritized components
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)...);
352 }
353 //
354 template <template <typename...> class TupleT, typename... Tp, typename... Args>
355 void
356 start(TupleT<Tp&...>&& obj, Args&&... args)
357 {
358  start<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
359 }
360 //
361 //--------------------------------------------------------------------------------------//
362 // stop
363 //--------------------------------------------------------------------------------------//
364 //
365 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
366  typename... Args>
367 void
368 stop(TupleT<Tp...>& obj, Args&&... args)
369 {
370  using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
372  using priority_tuple_t = mpl::sort<trait::stop_priority, priority_types_t>;
374  using delayed_tuple_t = mpl::sort<trait::stop_priority, delayed_types_t>;
375 
376  // stop high priority components
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)...);
380 
381  // stop non-prioritized components
382  invoke_impl::invoke<operation::standard_stop, ApiT>(obj, std::forward<Args>(args)...);
383 
384  // stop low prioritized components
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)...);
388 }
389 //
390 template <template <typename...> class TupleT, typename... Tp, typename... Args>
391 void
392 stop(TupleT<Tp...>& obj, Args&&... args)
393 {
394  stop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
395 }
396 //
397 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
398  typename... Args>
399 void
400 stop(TupleT<Tp&...>&& obj, Args&&... args)
401 {
402  using data_type = std::tuple<remove_pointer_t<decay_t<Tp>>...>;
404  using priority_tuple_t = mpl::sort<trait::stop_priority, priority_types_t>;
406  using delayed_tuple_t = mpl::sort<trait::stop_priority, delayed_types_t>;
407 
408  // stop high priority components
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)...);
413 
414  // stop non-prioritized components
415  invoke_impl::invoke<operation::standard_stop, ApiT>(std::forward<TupleT<Tp&...>>(obj),
416  std::forward<Args>(args)...);
417 
418  // stop low prioritized components
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)...);
423 }
424 //
425 template <template <typename...> class TupleT, typename... Tp, typename... Args>
426 void
427 stop(TupleT<Tp&...>&& obj, Args&&... args)
428 {
429  stop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
430 }
431 //
432 //--------------------------------------------------------------------------------------//
433 // mark
434 //--------------------------------------------------------------------------------------//
435 //
436 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
437  typename... Args>
438 void
439 mark(TupleT<Tp...>& obj, Args&&... args)
440 {
441  invoke_impl::invoke<operation::mark, ApiT>(obj, std::forward<Args>(args)...);
442 }
443 //
444 template <template <typename...> class TupleT, typename... Tp, typename... Args>
445 void
446 mark(TupleT<Tp...>& obj, Args&&... args)
447 {
448  mark<TIMEMORY_API>(obj, std::forward<Args>(args)...);
449 }
450 //
451 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
452  typename... Args>
453 void
454 mark(TupleT<Tp&...>&& obj, Args&&... args)
455 {
456  invoke_impl::invoke<operation::mark, ApiT>(std::forward<TupleT<Tp&...>>(obj),
457  std::forward<Args>(args)...);
458 }
459 //
460 template <template <typename...> class TupleT, typename... Tp, typename... Args>
461 void
462 mark(TupleT<Tp&...>&& obj, Args&&... args)
463 {
464  mark<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
465 }
466 //
467 //--------------------------------------------------------------------------------------//
468 // mark_begin
469 //--------------------------------------------------------------------------------------//
470 //
471 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
472  typename... Args>
473 void
474 mark_begin(TupleT<Tp...>& obj, Args&&... args)
475 {
476  invoke_impl::invoke<operation::mark_begin, ApiT>(obj, std::forward<Args>(args)...);
477 }
478 //
479 template <template <typename...> class TupleT, typename... Tp, typename... Args>
480 void
481 mark_begin(TupleT<Tp...>& obj, Args&&... args)
482 {
483  mark_begin<TIMEMORY_API>(obj, std::forward<Args>(args)...);
484 }
485 //
486 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
487  typename... Args>
488 void
489 mark_begin(TupleT<Tp&...>&& obj, Args&&... args)
490 {
491  invoke_impl::invoke<operation::mark_begin, ApiT>(std::forward<TupleT<Tp&...>>(obj),
492  std::forward<Args>(args)...);
493 }
494 //
495 template <template <typename...> class TupleT, typename... Tp, typename... Args>
496 void
497 mark_begin(TupleT<Tp&...>&& obj, Args&&... args)
498 {
499  mark_begin<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
500  std::forward<Args>(args)...);
501 }
502 //
503 //--------------------------------------------------------------------------------------//
504 // mark_end
505 //--------------------------------------------------------------------------------------//
506 //
507 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
508  typename... Args>
509 void
510 mark_end(TupleT<Tp...>& obj, Args&&... args)
511 {
512  invoke_impl::invoke<operation::mark_end, ApiT>(obj, std::forward<Args>(args)...);
513 }
514 //
515 template <template <typename...> class TupleT, typename... Tp, typename... Args>
516 void
517 mark_end(TupleT<Tp...>& obj, Args&&... args)
518 {
519  mark_end<TIMEMORY_API>(obj, std::forward<Args>(args)...);
520 }
521 //
522 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
523  typename... Args>
524 void
525 mark_end(TupleT<Tp&...>&& obj, Args&&... args)
526 {
527  invoke_impl::invoke<operation::mark_end, ApiT>(std::forward<TupleT<Tp&...>>(obj),
528  std::forward<Args>(args)...);
529 }
530 //
531 template <template <typename...> class TupleT, typename... Tp, typename... Args>
532 void
533 mark_end(TupleT<Tp&...>&& obj, Args&&... args)
534 {
535  mark_end<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
536  std::forward<Args>(args)...);
537 }
538 //
539 //--------------------------------------------------------------------------------------//
540 // store
541 //--------------------------------------------------------------------------------------//
542 //
543 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
544  typename... Args>
545 void
546 store(TupleT<Tp...>& obj, Args&&... args)
547 {
548  invoke_impl::invoke<operation::store, ApiT>(obj, std::forward<Args>(args)...);
549 }
550 //
551 template <template <typename...> class TupleT, typename... Tp, typename... Args>
552 void
553 store(TupleT<Tp...>& obj, Args&&... args)
554 {
555  store<TIMEMORY_API>(obj, std::forward<Args>(args)...);
556 }
557 //
558 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
559  typename... Args>
560 void
561 store(TupleT<Tp&...>&& obj, Args&&... args)
562 {
563  invoke_impl::invoke<operation::store, ApiT>(std::forward<TupleT<Tp&...>>(obj),
564  std::forward<Args>(args)...);
565 }
566 //
567 template <template <typename...> class TupleT, typename... Tp, typename... Args>
568 void
569 store(TupleT<Tp&...>&& obj, Args&&... args)
570 {
571  store<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
572 }
573 //
574 //--------------------------------------------------------------------------------------//
575 // reset
576 //--------------------------------------------------------------------------------------//
577 //
578 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
579  typename... Args>
580 void
581 reset(TupleT<Tp...>& obj, Args&&... args)
582 {
583  invoke_impl::invoke<operation::reset, ApiT>(obj, std::forward<Args>(args)...);
584 }
585 //
586 template <template <typename...> class TupleT, typename... Tp, typename... Args>
587 void
588 reset(TupleT<Tp...>& obj, Args&&... args)
589 {
590  reset<TIMEMORY_API>(obj, std::forward<Args>(args)...);
591 }
592 //
593 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
594  typename... Args>
595 void
596 reset(TupleT<Tp&...>&& obj, Args&&... args)
597 {
598  invoke_impl::invoke<operation::reset, ApiT>(std::forward<TupleT<Tp&...>>(obj),
599  std::forward<Args>(args)...);
600 }
601 //
602 template <template <typename...> class TupleT, typename... Tp, typename... Args>
603 void
604 reset(TupleT<Tp&...>&& obj, Args&&... args)
605 {
606  reset<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
607 }
608 //
609 //--------------------------------------------------------------------------------------//
610 // record
611 //--------------------------------------------------------------------------------------//
612 //
613 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
614  typename... Args>
615 void
616 record(TupleT<Tp...>& obj, Args&&... args)
617 {
618  invoke_impl::invoke<operation::record, ApiT>(obj, std::forward<Args>(args)...);
619 }
620 //
621 template <template <typename...> class TupleT, typename... Tp, typename... Args>
622 void
623 record(TupleT<Tp...>& obj, Args&&... args)
624 {
625  record<TIMEMORY_API>(obj, std::forward<Args>(args)...);
626 }
627 //
628 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
629  typename... Args>
630 void
631 record(TupleT<Tp&...>&& obj, Args&&... args)
632 {
633  invoke_impl::invoke<operation::record, ApiT>(std::forward<TupleT<Tp&...>>(obj),
634  std::forward<Args>(args)...);
635 }
636 //
637 template <template <typename...> class TupleT, typename... Tp, typename... Args>
638 void
639 record(TupleT<Tp&...>&& obj, Args&&... args)
640 {
641  record<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
642 }
643 //
644 //--------------------------------------------------------------------------------------//
645 // measure
646 //--------------------------------------------------------------------------------------//
647 //
648 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
649  typename... Args>
650 void
651 measure(TupleT<Tp...>& obj, Args&&... args)
652 {
653  invoke_impl::invoke<operation::measure, ApiT>(obj, std::forward<Args>(args)...);
654 }
655 //
656 template <template <typename...> class TupleT, typename... Tp, typename... Args>
657 void
658 measure(TupleT<Tp...>& obj, Args&&... args)
659 {
660  measure<TIMEMORY_API>(obj, std::forward<Args>(args)...);
661 }
662 //
663 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
664  typename... Args>
665 void
666 measure(TupleT<Tp&...>&& obj, Args&&... args)
667 {
668  invoke_impl::invoke<operation::measure, ApiT>(std::forward<TupleT<Tp&...>>(obj),
669  std::forward<Args>(args)...);
670 }
671 //
672 template <template <typename...> class TupleT, typename... Tp, typename... Args>
673 void
674 measure(TupleT<Tp&...>&& obj, Args&&... args)
675 {
676  measure<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
677 }
678 //
679 //--------------------------------------------------------------------------------------//
680 // push
681 //--------------------------------------------------------------------------------------//
682 //
683 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
684  typename... Args>
685 void
686 push(TupleT<Tp...>& obj, Args&&... args)
687 {
688  invoke_impl::invoke<operation::push_node, ApiT>(obj, std::forward<Args>(args)...);
689 }
690 //
691 template <template <typename...> class TupleT, typename... Tp, typename... Args>
692 void
693 push(TupleT<Tp...>& obj, Args&&... args)
694 {
695  push<TIMEMORY_API>(obj, std::forward<Args>(args)...);
696 }
697 //
698 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
699  typename... Args>
700 void
701 push(TupleT<Tp&...>&& obj, Args&&... args)
702 {
703  invoke_impl::invoke<operation::push_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
704  std::forward<Args>(args)...);
705 }
706 //
707 template <template <typename...> class TupleT, typename... Tp, typename... Args>
708 void
709 push(TupleT<Tp&...>&& obj, Args&&... args)
710 {
711  push<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
712 }
713 //
714 //--------------------------------------------------------------------------------------//
715 // pop
716 //--------------------------------------------------------------------------------------//
717 //
718 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
719  typename... Args>
720 void
721 pop(TupleT<Tp...>& obj, Args&&... args)
722 {
723  invoke_impl::invoke<operation::pop_node, ApiT>(obj, std::forward<Args>(args)...);
724 }
725 //
726 template <template <typename...> class TupleT, typename... Tp, typename... Args>
727 void
728 pop(TupleT<Tp...>& obj, Args&&... args)
729 {
730  pop<TIMEMORY_API>(obj, std::forward<Args>(args)...);
731 }
732 //
733 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
734  typename... Args>
735 void
736 pop(TupleT<Tp&...>&& obj, Args&&... args)
737 {
738  invoke_impl::invoke<operation::pop_node, ApiT>(std::forward<TupleT<Tp&...>>(obj),
739  std::forward<Args>(args)...);
740 }
741 //
742 template <template <typename...> class TupleT, typename... Tp, typename... Args>
743 void
744 pop(TupleT<Tp&...>&& obj, Args&&... args)
745 {
746  pop<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
747 }
748 //
749 //--------------------------------------------------------------------------------------//
750 // set_prefix
751 //--------------------------------------------------------------------------------------//
752 //
753 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
754  typename... Args>
755 void
756 set_prefix(TupleT<Tp...>& obj, Args&&... args)
757 {
758  invoke_impl::invoke<operation::set_prefix, ApiT>(obj, std::forward<Args>(args)...);
759 }
760 //
761 template <template <typename...> class TupleT, typename... Tp, typename... Args>
762 void
763 set_prefix(TupleT<Tp...>& obj, Args&&... args)
764 {
765  set_prefix<TIMEMORY_API>(obj, std::forward<Args>(args)...);
766 }
767 //
768 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
769  typename... Args>
770 void
771 set_prefix(TupleT<Tp&...>&& obj, Args&&... args)
772 {
773  invoke_impl::invoke<operation::set_prefix, ApiT>(std::forward<TupleT<Tp&...>>(obj),
774  std::forward<Args>(args)...);
775 }
776 //
777 template <template <typename...> class TupleT, typename... Tp, typename... Args>
778 void
779 set_prefix(TupleT<Tp&...>&& obj, Args&&... args)
780 {
781  set_prefix<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
782  std::forward<Args>(args)...);
783 }
784 //
785 //--------------------------------------------------------------------------------------//
786 // set_scope
787 //--------------------------------------------------------------------------------------//
788 //
789 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
790  typename... Args>
791 void
792 set_scope(TupleT<Tp...>& obj, Args&&... args)
793 {
794  invoke_impl::invoke<operation::set_scope, ApiT>(obj, std::forward<Args>(args)...);
795 }
796 //
797 template <template <typename...> class TupleT, typename... Tp, typename... Args>
798 void
799 set_scope(TupleT<Tp...>& obj, Args&&... args)
800 {
801  set_scope<TIMEMORY_API>(obj, std::forward<Args>(args)...);
802 }
803 //
804 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
805  typename... Args>
806 void
807 set_scope(TupleT<Tp&...>&& obj, Args&&... args)
808 {
809  invoke_impl::invoke<operation::set_scope, ApiT>(std::forward<TupleT<Tp&...>>(obj),
810  std::forward<Args>(args)...);
811 }
812 //
813 template <template <typename...> class TupleT, typename... Tp, typename... Args>
814 void
815 set_scope(TupleT<Tp&...>&& obj, Args&&... args)
816 {
817  set_scope<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
818  std::forward<Args>(args)...);
819 }
820 //
821 //--------------------------------------------------------------------------------------//
822 // set_state
823 //--------------------------------------------------------------------------------------//
824 //
825 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
826  typename... Args>
827 void
828 set_state(TupleT<Tp...>& obj, Args&&... args)
829 {
830  invoke_impl::invoke_data<operation::set_state, ApiT>(obj,
831  std::forward<Args>(args)...);
832 }
833 //
834 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
835  typename... Args>
836 void
837 set_state(TupleT<Tp&...>&& obj, Args&&... args)
838 {
839  invoke_impl::invoke_data<operation::set_state, ApiT>(
840  std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
841 }
842 //
843 //--------------------------------------------------------------------------------------//
844 // assemble
845 //--------------------------------------------------------------------------------------//
846 //
847 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
848  typename... Args>
849 void
850 assemble(TupleT<Tp...>& obj, Args&&... args)
851 {
852  invoke_impl::invoke<operation::assemble, ApiT>(obj, std::forward<Args>(args)...);
853 }
854 //
855 template <template <typename...> class TupleT, typename... Tp, typename... Args>
856 void
857 assemble(TupleT<Tp...>& obj, Args&&... args)
858 {
859  assemble<TIMEMORY_API>(obj, std::forward<Args>(args)...);
860 }
861 //
862 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
863  typename... Args>
864 void
865 assemble(TupleT<Tp&...>&& obj, Args&&... args)
866 {
867  invoke_impl::invoke<operation::assemble, ApiT>(std::forward<TupleT<Tp&...>>(obj),
868  std::forward<Args>(args)...);
869 }
870 //
871 template <template <typename...> class TupleT, typename... Tp, typename... Args>
872 void
873 assemble(TupleT<Tp&...>&& obj, Args&&... args)
874 {
875  assemble<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
876  std::forward<Args>(args)...);
877 }
878 //
879 //--------------------------------------------------------------------------------------//
880 // derive
881 //--------------------------------------------------------------------------------------//
882 //
883 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
884  typename... Args>
885 void
886 derive(TupleT<Tp...>& obj, Args&&... args)
887 {
888  invoke_impl::invoke<operation::derive, ApiT>(obj, std::forward<Args>(args)...);
889 }
890 //
891 template <template <typename...> class TupleT, typename... Tp, typename... Args>
892 void
893 derive(TupleT<Tp...>& obj, Args&&... args)
894 {
895  derive<TIMEMORY_API>(obj, std::forward<Args>(args)...);
896 }
897 //
898 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
899  typename... Args>
900 void
901 derive(TupleT<Tp&...>&& obj, Args&&... args)
902 {
903  invoke_impl::invoke<operation::derive, ApiT>(std::forward<TupleT<Tp&...>>(obj),
904  std::forward<Args>(args)...);
905 }
906 //
907 template <template <typename...> class TupleT, typename... Tp, typename... Args>
908 void
909 derive(TupleT<Tp&...>&& obj, Args&&... args)
910 {
911  derive<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
912 }
913 //
914 //--------------------------------------------------------------------------------------//
915 // audit
916 //--------------------------------------------------------------------------------------//
917 //
918 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
919  typename... Args>
920 void
921 audit(TupleT<Tp...>& obj, Args&&... args)
922 {
923  invoke_impl::invoke<operation::audit, ApiT>(obj, std::forward<Args>(args)...);
924 }
925 //
926 template <template <typename...> class TupleT, typename... Tp, typename... Args>
927 void
928 audit(TupleT<Tp...>& obj, Args&&... args)
929 {
930  audit<TIMEMORY_API>(obj, std::forward<Args>(args)...);
931 }
932 //
933 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
934  typename... Args>
935 void
936 audit(TupleT<Tp&...>&& obj, Args&&... args)
937 {
938  invoke_impl::invoke<operation::audit, ApiT>(std::forward<TupleT<Tp&...>>(obj),
939  std::forward<Args>(args)...);
940 }
941 //
942 template <template <typename...> class TupleT, typename... Tp, typename... Args>
943 void
944 audit(TupleT<Tp&...>&& obj, Args&&... args)
945 {
946  audit<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj), std::forward<Args>(args)...);
947 }
948 //
949 //--------------------------------------------------------------------------------------//
950 // add_secondary
951 //--------------------------------------------------------------------------------------//
952 //
953 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
954  typename... Args>
955 void
956 add_secondary(TupleT<Tp...>& obj, Args&&... args)
957 {
958  invoke_impl::invoke<operation::add_secondary, ApiT>(obj, std::forward<Args>(args)...);
959 }
960 //
961 template <template <typename...> class TupleT, typename... Tp, typename... Args>
962 void
963 add_secondary(TupleT<Tp...>& obj, Args&&... args)
964 {
965  add_secondary<TIMEMORY_API>(obj, std::forward<Args>(args)...);
966 }
967 //
968 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
969  typename... Args>
970 void
971 add_secondary(TupleT<Tp&...>&& obj, Args&&... args)
972 {
973  invoke_impl::invoke<operation::add_secondary, ApiT>(std::forward<TupleT<Tp&...>>(obj),
974  std::forward<Args>(args)...);
975 }
976 //
977 template <template <typename...> class TupleT, typename... Tp, typename... Args>
978 void
979 add_secondary(TupleT<Tp&...>&& obj, Args&&... args)
980 {
981  add_secondary<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
982  std::forward<Args>(args)...);
983 }
984 //
985 //--------------------------------------------------------------------------------------//
986 // get
987 //--------------------------------------------------------------------------------------//
988 //
989 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
990  typename... Args>
991 auto
992 get(TupleT<Tp...>& obj, Args&&... args)
993 {
994  using data_type = TupleT<std::remove_pointer_t<Tp>...>;
995  using data_collect_type = mpl::get_data_type_t<data_type>;
996  using data_value_type = mpl::get_data_value_t<data_type>;
997 
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)...);
1002  return _data;
1003 }
1004 //
1005 template <template <typename...> class TupleT, typename... Tp, typename... Args>
1006 auto
1007 get(TupleT<Tp...>& obj, Args&&... args)
1008 {
1009  return ::tim::invoke::get<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1010 }
1011 //
1012 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1013  typename... Args>
1014 auto
1015 get(TupleT<Tp&...>&& obj, Args&&... args)
1016 {
1017  using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1018  using data_collect_type = mpl::get_data_type_t<data_type>;
1019  using data_value_type = mpl::get_data_value_t<data_type>;
1020 
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)...);
1025  return _data;
1026 }
1027 //
1028 template <template <typename...> class TupleT, typename... Tp, typename... Args>
1029 auto
1030 get(TupleT<Tp&...>&& obj, Args&&... args)
1031 {
1032  return ::tim::invoke::get<TIMEMORY_API>(std::forward<TupleT<Tp&...>>(obj),
1033  std::forward<Args>(args)...);
1034 }
1035 //
1036 template <typename ApiT, template <typename...> class TupleT, typename... Tp>
1037 auto
1038 get(TupleT<Tp...>& obj, void*& _ptr, size_t _hash)
1039 {
1040  invoke_impl::invoke<operation::get, ApiT>(obj, _ptr, _hash);
1041 }
1042 //
1043 template <template <typename...> class TupleT, typename... Tp>
1044 auto
1045 get(TupleT<Tp...>& obj, void*& _ptr, size_t _hash)
1046 {
1047  return ::tim::invoke::get<TIMEMORY_API>(obj, _ptr, _hash);
1048 }
1049 //
1050 //--------------------------------------------------------------------------------------//
1051 // get_labeled
1052 //--------------------------------------------------------------------------------------//
1053 //
1054 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1055  typename... Args>
1056 auto
1057 get_labeled(TupleT<Tp...>& obj, Args&&... args)
1058 {
1059  using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1060  using data_collect_type = mpl::get_data_type_t<data_type>;
1061  using data_label_type = mpl::get_data_label_t<data_type>;
1062 
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)...);
1067  return _data;
1068 }
1069 //
1070 template <template <typename...> class TupleT, typename... Tp, typename... Args>
1071 auto
1072 get_labeled(TupleT<Tp...>& obj, Args&&... args)
1073 {
1074  return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1075 }
1076 //
1077 template <typename ApiT, template <typename...> class TupleT, typename... Tp,
1078  typename... Args>
1079 auto
1080 get_labeled(TupleT<Tp&...>&& obj, Args&&... args)
1081 {
1082  using data_type = TupleT<std::remove_pointer_t<Tp>...>;
1083  using data_collect_type = mpl::get_data_type_t<data_type>;
1084  using data_label_type = mpl::get_data_label_t<data_type>;
1085 
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)...);
1090  return _data;
1091 }
1092 //
1093 template <template <typename...> class TupleT, typename... Tp, typename... Args>
1094 auto
1095 get_labeled(TupleT<Tp&...>&& obj, Args&&... args)
1096 {
1097  return get_labeled<TIMEMORY_API>(obj, std::forward<Args>(args)...);
1098 }
1099 //
1100 //--------------------------------------------------------------------------------------//
1101 // get_labeled
1102 //--------------------------------------------------------------------------------------//
1103 //
1104 namespace impl
1105 {
1106 template <typename ArchiveT, typename TupleT, size_t... Idx>
1107 auto
1108 serialize(ArchiveT& ar, TupleT& obj, std::index_sequence<Idx...>)
1109 {
1110  auto _serialize = [&ar](auto& _obj) {
1111  auto _label = _obj.label();
1112  ar(cereal::make_nvp(_label.c_str(), _obj));
1113  };
1114  TIMEMORY_FOLD_EXPRESSION(_serialize(std::get<Idx>(obj)));
1115 }
1116 //
1117 } // namespace impl
1118 //
1119 template <typename ArchiveT, template <typename...> class TupleT, typename... Tp>
1120 auto
1121 serialize(ArchiveT& ar, TupleT<Tp...>& obj)
1122 {
1123  impl::serialize(ar, obj, std::make_index_sequence<sizeof...(Tp)>{});
1124 }
1125 //
1126 template <typename ArchiveT, template <typename...> class TupleT, typename... Tp>
1127 auto
1128 serialize(ArchiveT& ar, TupleT<Tp&...>&& obj)
1129 {
1130  impl::serialize(ar, obj, std::make_index_sequence<sizeof...(Tp)>{});
1131 }
1132 //
1133 //--------------------------------------------------------------------------------------//
1134 // get_cache
1135 //--------------------------------------------------------------------------------------//
1136 //
1137 template <typename... BundleT>
1138 auto
1140 {
1141  return operation::construct_cache<std::tuple<BundleT...>>{}();
1142 }
1143 //
1144 //--------------------------------------------------------------------------------------//
1145 //
1146 // This is for multiple component bundlers, e.g.
1147 // start(comp_tuple<A...>, comp_tuple<B...>)
1148 //
1149 // MUST USE INDEX SEQUENCE. W/o index sequence multiple instances of same bundle
1150 // will give weird results
1151 //
1152 //--------------------------------------------------------------------------------------//
1153 //
1154 namespace disjoint
1155 {
1156 //
1157 #define TIMEMORY_DEFINE_DISJOINT_FUNCTION(FUNC) \
1158  namespace disjoint_impl \
1159  { \
1160  template <template <typename...> class TupleT, typename... Tp, size_t... Idx, \
1161  typename... Args> \
1162  void FUNC(TupleT<Tp...>&& obj, index_sequence<Idx...>, Args&&... args) \
1163  { \
1164  TIMEMORY_FOLD_EXPRESSION(std::get<Idx>(obj).FUNC(std::forward<Args>(args)...)); \
1165  } \
1166  } \
1167  \
1168  template <template <typename...> class TupleT, typename... Tp, typename... Args> \
1169  void FUNC(TupleT<Tp...>&& obj, Args&&... args) \
1170  { \
1171  disjoint_impl::FUNC(std::forward<TupleT<Tp...>>(obj), \
1172  make_index_sequence<sizeof...(Tp)>{}, \
1173  std::forward<Args>(args)...); \
1174  }
1175 
1193 
1194 #undef TIMEMORY_DEFINE_DISJOINT_FUNCTION
1195 
1196 // invoke is slightly different than the others
1197 namespace disjoint_impl
1198 {
1199 template <template <typename...> class TupleT, typename... Tp, typename FuncT,
1200  size_t... Idx, typename... Args>
1201 void
1202 invoke(TupleT<Tp...>&& obj, FuncT&& func, index_sequence<Idx...>, Args&&... args)
1203 {
1205  std::forward<FuncT>(func)(std::get<Idx>(obj), std::forward<Args>(args)...));
1206 }
1207 } // namespace disjoint_impl
1208 //
1209 template <template <typename...> class TupleT, typename... Tp, typename FuncT,
1210  typename... Args>
1211 void
1212 invoke(TupleT<Tp...>&& obj, FuncT&& func, Args&&... args)
1213 {
1214  disjoint_impl::invoke(std::forward<TupleT<Tp...>>(obj), std::forward<FuncT>(func),
1215  make_index_sequence<sizeof...(Tp)>{},
1216  std::forward<Args>(args)...);
1217 }
1218 } // namespace disjoint
1219 } // namespace invoke
1220 } // namespace tim
1221 
1222 #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
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:828
void set_scope(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:792
void assemble(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:850
auto construct(Args &&... args)
Definition: functional.cpp:253
void mark_begin(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:474
auto serialize(ArchiveT &ar, TupleT< Tp &... > &&obj)
void set_prefix(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:756
void audit(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:921
void store(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:546
auto serialize(ArchiveT &ar, TupleT< Tp... > &obj)
auto construct(Args &&... args)
Definition: functional.cpp:237
void record(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:616
auto get_cache()
void add_secondary(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:956
void derive(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:886
void pop(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:721
auto get(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:992
void invoke(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:178
void stop(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:368
void measure(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:651
auto get(TupleT< Tp... > &obj, void *&_ptr, size_t _hash)
void push(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:686
void mark_end(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:510
auto destroy(TupleT< Tp... > &obj)
Definition: functional.cpp:264
auto get_labeled(TupleT< Tp... > &obj, Args &&... args)
void mark(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:439
void reset(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:581
void print(std::ostream &os, Args &&... args)
Definition: functional.cpp:159
void start(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:298
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:454
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:428
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:436
typename impl::template get_data_tuple< TypeList >::value_type get_data_value_t
get the tuple of values
Definition: filters.hpp:432
std::bitset< scope_count > data_type
Definition: types.hpp:395
Definition: kokkosp.cpp:38
std::make_integer_sequence< size_t, Num > make_index_sequence
Alias template make_index_sequence.
Definition: types.hpp:182
typename std::remove_pointer< U >::type remove_pointer_t
Definition: types.hpp:530
impl::index_of< Tp, Type > index_of
Definition: types.hpp:536
typename std::decay< T >::type decay_t
Alias template for decay.
Definition: types.hpp:194
tim::mpl::apply< std::string > string
Definition: macros.hpp:52
std::integer_sequence< size_t, Idx... > index_sequence
Alias template index_sequence.
Definition: types.hpp:178
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...
#define TIMEMORY_FOLD_EXPRESSION(...)
Definition: types.hpp:55