25 #ifndef TIMEMORY_VARIADIC_BUNDLE_CPP_
26 #define TIMEMORY_VARIADIC_BUNDLE_CPP_
29 #include "timemory/backends/dmp.hpp"
33 #include "timemory/tpls/cereal/cereal.hpp"
43 template <
typename Tag,
typename BundleT,
typename TupleT>
53 template <
typename Tag,
typename BundleT,
typename TupleT>
56 update_last_instance(&get_this_type(), get_last_instance(),
58 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
64 template <
typename Tag,
typename BundleT,
typename TupleT>
65 template <
typename... T>
71 update_last_instance(&get_this_type(), get_last_instance(),
73 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
80 template <
typename Tag,
typename BundleT,
typename TupleT>
81 template <
typename... T>
87 update_last_instance(&get_this_type(), get_last_instance(),
89 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
96 template <
typename Tag,
typename BundleT,
typename TupleT>
97 template <
typename... T>
104 update_last_instance(&get_this_type(), get_last_instance(),
106 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
113 template <
typename Tag,
typename BundleT,
typename TupleT>
114 template <
typename... T>
121 update_last_instance(&get_this_type(), get_last_instance(),
123 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
130 template <
typename Tag,
typename BundleT,
typename TupleT>
131 template <
typename... T>
138 update_last_instance(&get_this_type(), get_last_instance(),
140 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
147 template <
typename Tag,
typename BundleT,
typename TupleT>
153 update_last_instance(&get_this_type(), get_last_instance(),
155 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
161 template <
typename Tag,
typename BundleT,
typename TupleT>
166 update_last_instance(&get_this_type(), get_last_instance(),
168 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
174 template <
typename Tag,
typename BundleT,
typename TupleT>
179 update_last_instance(&get_this_type(), get_last_instance(),
181 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
187 template <
typename Tag,
typename BundleT,
typename TupleT>
192 update_last_instance(&get_this_type(), get_last_instance(),
194 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
200 template <
typename Tag,
typename BundleT,
typename TupleT>
205 update_last_instance(&get_this_type(), get_last_instance(),
207 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
213 template <
typename Tag,
typename BundleT,
typename TupleT>
218 update_last_instance(&get_this_type(), get_last_instance(),
220 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
226 template <
typename Tag,
typename BundleT,
typename TupleT>
229 if(get_last_instance() == &get_this_type())
230 update_last_instance(
nullptr, get_last_instance(),
false);
240 #if defined(DEBUG) && !defined(NDEBUG)
246 invoke::destroy<Tag>(m_data);
252 template <
typename Tag,
typename BundleT,
typename TupleT>
257 IF_CONSTEXPR(optional_count() > 0) { apply_v::set_value(m_data,
nullptr); }
258 apply_v::access2<copy_oper_t>(m_data, rhs.m_data);
263 template <
typename Tag,
typename BundleT,
typename TupleT>
269 bundle_type::operator=(rhs);
270 invoke::destroy<Tag>(m_data);
271 invoke::invoke_impl::invoke_data<operation::copy, Tag>(m_data, rhs.m_data);
274 return get_this_type();
280 template <
typename Tag,
typename BundleT,
typename TupleT>
285 invoke::invoke_impl::invoke_data<operation::minus, Tag>(m_data, rhs.m_data);
286 return get_this_type();
291 template <
typename Tag,
typename BundleT,
typename TupleT>
295 bundle_type::operator+=(
static_cast<const bundle_type&
>(rhs));
296 invoke::invoke_impl::invoke_data<operation::plus, Tag>(m_data, rhs.m_data);
297 return get_this_type();
302 template <
typename Tag,
typename BundleT,
typename TupleT>
308 tmp.m_scope = _scope;
314 template <
typename Tag,
typename BundleT,
typename TupleT>
318 static thread_local
bool _once = []() {
319 apply_v::type_access<operation::init_storage, mpl::non_quirk_t<reference_type>>();
328 template <
typename Tag,
typename BundleT,
typename TupleT>
333 return get_this_type();
338 invoke::reset<Tag>(m_data);
342 invoke::push<Tag>(m_data, m_scope, m_hash);
344 return get_this_type();
350 template <
typename Tag,
typename BundleT,
typename TupleT>
351 template <
typename... Tp>
356 return get_this_type();
360 invoke::invoke<operation::reset, Tag>(pw_type{}, m_data);
362 invoke::invoke<operation::push_node, Tag>(pw_type{}, m_data, m_scope, m_hash);
363 return get_this_type();
369 template <
typename Tag,
typename BundleT,
typename TupleT>
370 template <
typename... Tp>
375 return get_this_type();
379 invoke::invoke<operation::reset, Tag>(pw_type{}, m_data);
381 invoke::invoke<operation::push_node, Tag>(pw_type{}, m_data, _scope, m_hash);
382 return get_this_type();
388 template <
typename Tag,
typename BundleT,
typename TupleT>
393 return get_this_type();
398 invoke::pop<Tag>(m_data);
402 return get_this_type();
408 template <
typename Tag,
typename BundleT,
typename TupleT>
409 template <
typename... Tp>
414 return get_this_type();
418 invoke::invoke<operation::pop_node, Tag>(pw_type{}, m_data);
419 return get_this_type();
425 template <
typename Tag,
typename BundleT,
typename TupleT>
426 template <
typename... Args>
430 return invoke<operation::measure>(std::forward<Args>(args)...);
436 template <
typename Tag,
typename BundleT,
typename TupleT>
437 template <
typename... Args>
441 return invoke<operation::sample>(std::forward<Args>(args)...);
447 template <
typename Tag,
typename BundleT,
typename TupleT>
448 template <
typename... Args>
453 return get_this_type();
456 invoke::start<Tag>(m_data, std::forward<Args>(args)...);
458 return get_this_type();
463 template <
typename Tag,
typename BundleT,
typename TupleT>
464 template <
typename... Args>
469 return get_this_type();
471 invoke::stop<Tag>(m_data, std::forward<Args>(args)...);
476 return get_this_type();
482 template <
typename Tag,
typename BundleT,
typename TupleT>
483 template <
typename... Tp,
typename... Args>
488 return get_this_type();
497 if(m_store() && !bundle_type::m_explicit_push())
505 auto&& _data = mpl::get_reference_tuple<select_tuple_t>(m_data);
506 invoke::invoke<operation::standard_start, Tag>(_data, std::forward<Args>(args)...);
507 return get_this_type();
512 template <
typename Tag,
typename BundleT,
typename TupleT>
513 template <
typename... Tp,
typename... Args>
518 return get_this_type();
523 auto&& _data = mpl::get_reference_tuple<select_tuple_t>(m_data);
524 invoke::invoke<operation::standard_start, Tag>(_data, std::forward<Args>(args)...);
529 if(m_store() && !bundle_type::m_explicit_pop())
535 return get_this_type();
541 template <
typename Tag,
typename BundleT,
typename TupleT>
542 template <
typename... Args>
547 return get_this_type();
553 if(m_store() && !bundle_type::m_explicit_push())
559 return get_this_type();
564 template <
typename Tag,
typename BundleT,
typename TupleT>
565 template <
typename... Args>
570 return get_this_type();
579 if(m_store() && !bundle_type::m_explicit_pop())
582 return get_this_type();
588 template <
typename Tag,
typename BundleT,
typename TupleT>
589 template <
typename... Args>
594 return get_this_type();
597 return invoke<operation::record>(std::forward<Args>(args)...);
603 template <
typename Tag,
typename BundleT,
typename TupleT>
604 template <
typename... Args>
609 return invoke<operation::reset>(std::forward<Args>(args)...);
615 template <
typename Tag,
typename BundleT,
typename TupleT>
620 invoke::invoke<operation::generic_counter>(m_data, std::ref(_count));
627 template <
typename Tag,
typename BundleT,
typename TupleT>
628 template <
typename... Args>
634 return invoke<operation::construct>(std::forward<Args>(_args)...);
640 template <
typename Tag,
typename BundleT,
typename TupleT>
641 template <
typename... Args>
645 return invoke<operation::assemble>(std::forward<Args>(_args)...);
651 template <
typename Tag,
typename BundleT,
typename TupleT>
652 template <
typename... Args>
656 return invoke<operation::derive>(std::forward<Args>(_args)...);
662 template <
typename Tag,
typename BundleT,
typename TupleT>
663 template <
typename... Args>
667 return invoke<operation::mark>(std::forward<Args>(_args)...);
673 template <
typename Tag,
typename BundleT,
typename TupleT>
674 template <
typename... Args>
678 return invoke<operation::mark_begin>(std::forward<Args>(_args)...);
684 template <
typename Tag,
typename BundleT,
typename TupleT>
685 template <
typename... Args>
689 return invoke<operation::mark_end>(std::forward<Args>(_args)...);
695 template <
typename Tag,
typename BundleT,
typename TupleT>
696 template <
typename... Args>
701 return get_this_type();
704 invoke<operation::store>(std::forward<Args>(_args)...);
706 return get_this_type();
712 template <
typename Tag,
typename BundleT,
typename TupleT>
713 template <
typename... Args>
717 return invoke<operation::audit>(std::forward<Args>(_args)...);
723 template <
typename Tag,
typename BundleT,
typename TupleT>
724 template <
typename... Args>
728 return invoke<operation::add_secondary>(std::forward<Args>(_args)...);
734 template <
typename Tag,
typename BundleT,
typename TupleT>
735 template <
template <
typename>
class OpT,
typename... Args>
740 return get_this_type();
742 invoke::invoke<OpT, Tag>(m_data, std::forward<Args>(_args)...);
743 return get_this_type();
749 template <
typename Tag,
typename BundleT,
typename TupleT>
750 template <
template <
typename>
class OpT,
typename... Tp,
typename... Args>
755 return get_this_type();
758 this->get<Tp>(), std::forward<Args>(_args)...));
759 return get_this_type();
765 template <
typename Tag,
typename BundleT,
typename TupleT>
766 template <
typename... Args>
770 return invoke::get<Tag>(m_data, std::forward<Args>(args)...);
776 template <
typename Tag,
typename BundleT,
typename TupleT>
777 template <
typename... Args>
781 return invoke::get_labeled<Tag>(m_data, std::forward<Args>(args)...);
786 template <
typename Tag,
typename BundleT,
typename TupleT>
795 template <
typename Tag,
typename BundleT,
typename TupleT>
805 template <
typename Tag,
typename BundleT,
typename TupleT>
810 return get_this_type();
812 tim::variadic::impl::get<Tag>(m_data, ptr, _hash);
813 return get_this_type();
819 template <
typename Tag,
typename BundleT,
typename TupleT>
820 template <
typename... Tail>
825 this->get_reference<Tail>() });
826 return get_this_type();
832 template <
typename Tag,
typename BundleT,
typename TupleT>
833 template <
typename... T,
typename... Args>
834 std::array<bool,
sizeof...(T)>
838 return std::array<
bool,
sizeof...(T)>{};
840 constexpr
auto N =
sizeof...(T);
846 template <
typename Tag,
typename BundleT,
typename TupleT>
847 template <
typename T,
typename Func,
typename... Args,
853 return get_this_type();
855 auto* _obj = get<T>();
857 ((*_obj).*(_func))(std::forward<Args>(_args)...);
858 return get_this_type();
863 template <
typename Tag,
typename BundleT,
typename TupleT>
864 template <
typename T,
typename Func,
typename... Args,
869 return get_this_type();
874 template <
typename Tag,
typename BundleT,
typename TupleT>
881 invoke::set_prefix<Tag>(m_data, m_hash, _key);
886 template <
typename Tag,
typename BundleT,
typename TupleT>
891 return get_this_type();
895 invoke::set_prefix<Tag>(m_data, _hash, itr->second);
896 return get_this_type();
901 template <
typename Tag,
typename BundleT,
typename TupleT>
910 template <
typename Tag,
typename BundleT,
typename TupleT>
915 return get_this_type();
918 invoke::set_scope<Tag>(m_data, m_scope);
919 return get_this_type();
924 template <
typename Tag,
typename BundleT,
typename TupleT>
933 template <
typename Tag,
typename BundleT,
typename TupleT>
943 template <
typename Tag,
typename BundleT,
typename TupleT>
944 template <
typename T>
953 PrefixOpT(obj, m_hash, _key);
958 template <
typename Tag,
typename BundleT,
typename TupleT>
959 template <
typename T>
967 PrefixOpT(obj, m_scope);
972 template <
typename Tag,
typename BundleT,
typename TupleT>
973 template <
bool Pr
intPrefix,
bool Pr
intLaps>
977 using printer_t =
typename bundle_type::print_type;
978 if(size() == 0 || m_hash == 0)
979 return get_this_type();
980 std::stringstream ss_data;
981 apply_v::access_with_indices<printer_t>(m_data, std::ref(ss_data),
false);
984 bundle_type::update_width();
985 std::stringstream ss_prefix;
986 std::stringstream ss_id;
987 ss_id << get_prefix() <<
" " << std::left << key();
988 ss_prefix << std::setw(bundle_type::output_width()) << std::left << ss_id.str()
990 os << ss_prefix.str();
993 if(m_laps > 0 && PrintLaps)
994 os <<
" [laps: " << m_laps <<
"]";
997 return get_this_type();
1002 template <
typename Tag,
typename BundleT,
typename TupleT>
1003 template <
typename Archive>
1010 _key = keyitr->second;
1012 ar(cereal::make_nvp(
"hash", m_hash), cereal::make_nvp(
"key", _key),
1013 cereal::make_nvp(
"laps", m_laps));
1020 PRINT_HERE(
"Warning! Hash for '%s' (%llu) != %llu", _key.c_str(),
1021 (
unsigned long long) _hash, (
unsigned long long) m_hash);
1025 ar.setNextName(
"data");
Example: bundle<Tag, component_bundle<Foo>, mixed_wrapper_types<concat<Bar, Baz>>> will use Tag + tra...
typename TupleT::template data_type< Tag > data_type
typename TupleT::type_list_type type_list_type
tim::variadic::impl::quirk_config< T, reference_type, U... > quirk_config
typename bundle_type::string_t string_t
typename TupleT::template this_type< BundleT > this_type
std::function< void(this_type &)> initializer_type
#define IF_CONSTEXPR(...)
void serialize(std::string fname, exec_data< Counter > &obj)
void set_scope(TupleT< Tp... > &obj, Args &&... args)
void assemble(TupleT< Tp... > &obj, Args &&... args)
void mark_begin(TupleT< Tp... > &obj, Args &&... args)
void set_prefix(TupleT< Tp... > &obj, Args &&... args)
void audit(TupleT< Tp... > &obj, Args &&... args)
void store(TupleT< Tp... > &obj, Args &&... args)
auto serialize(ArchiveT &ar, TupleT< Tp... > &obj)
void record(TupleT< Tp... > &obj, Args &&... args)
void derive(TupleT< Tp... > &obj, Args &&... args)
void pop(TupleT< Tp... > &obj, Args &&... args)
void stop(TupleT< Tp... > &obj, Args &&... args)
void measure(TupleT< Tp... > &obj, Args &&... args)
void push(TupleT< Tp... > &obj, Args &&... args)
void mark_end(TupleT< Tp... > &obj, Args &&... args)
void mark(TupleT< Tp... > &obj, Args &&... args)
void reset(TupleT< Tp... > &obj, Args &&... args)
void print(std::ostream &os, Args &&... args)
void start(TupleT< Tp... > &obj, Args &&... args)
impl::filter_false_after_decay_t< trait::is_available, type_list< Types... > > implemented_t
filter out any types that are not available
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
a generic type for indicating that function call or constructor should be as lightweight as possible.
Ret invoke(string_view_t &&label, Func &&func, Args &&... args)
std::array< Tp, N > & operator-=(std::array< Tp, N > &lhs, const std::array< Tp, N > &rhs)
A light-weight alternative to std::function. Pass any callback - including capturing lambdas - cheapl...
typename impl::convert_each< T, U... >::type convert_each_t
typename std::remove_pointer< U >::type remove_pointer_t
void consume_parameters(ArgsT &&...) TIMEMORY_HIDDEN
impl::index_of< Tp, Type > index_of
typename std::enable_if< B, T >::type enable_if_t
Alias template for enable_if.
auto get_labeled(const auto_bundle< Tag, Types... > &_obj)
string_view_t get_hash_identifier_fast(hash_value_t _hash)
this does not check other threads or aliases. Only call this function when you know that the hash exi...
void init(Args &&... args)
hash_map_ptr_t & get_hash_ids()
tim::mpl::apply< std::string > string
hash_value_t add_hash_id(hash_map_ptr_t &_hash_map, const string_view_t &_prefix)
add an string to the given hash-map (if it doesn't already exist) and return the hash
auto get(const auto_bundle< Tag, Types... > &_obj)
typename impl::convert< T, U >::type convert_t
Static polymorphic base class for component bundlers.
The declaration for the types for settings without definitions.
This operation class is similar to pointer_operator but can handle non-pointer types.
a variadic type which holds zero or more quirks that are passed to the constructor of a component bun...
this data type encodes the options of storage scope. The default is hierarchical (tree) scope....
const hash_value_t & get_hash() const
trait that designates whether there is a priority when starting the type w.r.t. other types....
trait that designates whether there is a priority when stopping the type w.r.t. other types....
#define TIMEMORY_FOLD_EXPRESSION(...)
#define TIMEMORY_FOLD_EXPANSION(TYPE, SIZE,...)