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.
available.hpp
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#pragma once
26
30
31#include <tuple>
32
33namespace tim
34{
35namespace mpl
36{
37namespace impl
38{
39//======================================================================================//
40//
41// filter if predicate evaluates to false (result)
42//
43//======================================================================================//
44
45template <bool, typename T>
46struct filter_if_false_result;
47
48//--------------------------------------------------------------------------------------//
49
50template <typename T>
51struct filter_if_false_result<true, T>
52{
53 using type = std::tuple<T>;
54 template <template <typename...> class Op>
55 using operation_type = Op<T>;
56};
57
58//--------------------------------------------------------------------------------------//
59
60template <typename T>
61struct filter_if_false_result<false, T>
62{
63 using type = std::tuple<>;
64 template <template <typename...> class Op>
65 using operation_type = std::tuple<>;
66};
67
68//======================================================================================//
69//
70// filter if predicate evaluates to true (result)
71//
72//======================================================================================//
73
74template <bool, typename T>
75struct filter_if_true_result;
76
77template <typename T>
78struct filter_if_true_result<false, T>
79{
80 using type = std::tuple<T>;
81 template <template <typename...> class Op>
82 using operation_type = Op<T>;
83};
84
85//--------------------------------------------------------------------------------------//
86
87template <typename T>
88struct filter_if_true_result<true, T>
89{
90 using type = std::tuple<>;
91 template <template <typename...> class Op>
92 using operation_type = std::tuple<>;
93};
94
95//======================================================================================//
96//
97// filter if predicate evaluates to false (operator)
98//
99//======================================================================================//
100
101template <template <typename> class Predicate, typename Sequence>
102struct filter_if_false;
103
104//--------------------------------------------------------------------------------------//
105
106template <template <typename> class Predicate, typename... Ts>
107struct filter_if_false<Predicate, std::tuple<Ts...>>
108{
109 using type = tuple_concat_t<
110 conditional_t<Predicate<Ts>::value, std::tuple<Ts>, std::tuple<>>...>;
111};
112
113//--------------------------------------------------------------------------------------//
114
115template <template <typename> class Predicate, typename... Ts>
116struct filter_if_false<Predicate, type_list<Ts...>>
117{
118 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
119 std::tuple<Ts>, std::tuple<>>...>,
120 type_list<>>;
121};
122
123//--------------------------------------------------------------------------------------//
124
125template <template <typename> class Predicate, typename... Ts>
126struct filter_if_false<Predicate, component_list<Ts...>>
127{
128 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
129 std::tuple<Ts>, std::tuple<>>...>,
130 component_list<>>;
131};
132
133//--------------------------------------------------------------------------------------//
134
135template <template <typename> class Predicate, typename... Ts>
136struct filter_if_false<Predicate, component_tuple<Ts...>>
137{
138 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
139 std::tuple<Ts>, std::tuple<>>...>,
140 component_tuple<>>;
141};
142
143//--------------------------------------------------------------------------------------//
144
145template <template <typename> class Predicate, typename... Ts>
146struct filter_if_false<Predicate, auto_list<Ts...>>
147{
148 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
149 std::tuple<Ts>, std::tuple<>>...>,
150 auto_list<>>;
151};
152
153//--------------------------------------------------------------------------------------//
154
155template <template <typename> class Predicate, typename... Ts>
156struct filter_if_false<Predicate, auto_tuple<Ts...>>
157{
158 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
159 std::tuple<Ts>, std::tuple<>>...>,
160 auto_tuple<>>;
161};
162
163//--------------------------------------------------------------------------------------//
164
165template <template <typename> class Predicate, typename Sequence>
166using filter_false = typename filter_if_false<Predicate, Sequence>::type;
167
168//======================================================================================//
169//
170/// \struct tim::impl::filter_if_false_after_decay
171/// \brief Removes types if predicate evaluates to false. Applies
172/// decay_t<remove_pointer_t<T>> before evaluating predicate
173//
174//======================================================================================//
175
176template <template <typename> class Predicate, typename Sequence>
177struct filter_if_false_after_decay;
178
179//--------------------------------------------------------------------------------------//
180
181template <template <typename> class Predicate, typename... Ts>
182struct filter_if_false_after_decay<Predicate, std::tuple<Ts...>>
183{
184 using type =
185 tuple_concat_t<conditional_t<Predicate<decay_t<remove_pointer_t<Ts>>>::value,
186 std::tuple<Ts>, std::tuple<>>...>;
187};
188
189//--------------------------------------------------------------------------------------//
190
191template <template <typename> class Predicate, typename... Ts>
192struct filter_if_false_after_decay<Predicate, type_list<Ts...>>
193{
194 using type = convert_t<
195 tuple_concat_t<conditional_t<Predicate<decay_t<remove_pointer_t<Ts>>>::value,
196 std::tuple<Ts>, std::tuple<>>...>,
197 type_list<>>;
198};
199
200//--------------------------------------------------------------------------------------//
201
202template <template <typename> class Predicate, typename Sequence>
203using filter_false_after_decay_t =
204 typename filter_if_false_after_decay<Predicate, Sequence>::type;
205
206//======================================================================================//
207//
208// filter if predicate evaluates to true (operator)
209//
210//======================================================================================//
211
212template <template <typename> class Predicate, typename... Ts>
213struct filter_if_true
214{
215 using type = tuple_concat_t<
216 conditional_t<Predicate<Ts>::value, std::tuple<>, std::tuple<Ts>>...>;
217};
218
219//--------------------------------------------------------------------------------------//
220
221template <template <typename> class Predicate, typename... Ts>
222struct filter_if_true<Predicate, std::tuple<Ts...>>
223{
224 using type = tuple_concat_t<
225 conditional_t<Predicate<Ts>::value, std::tuple<>, std::tuple<Ts>>...>;
226};
227
228//--------------------------------------------------------------------------------------//
229
230template <template <typename> class Predicate, typename... Ts>
231struct filter_if_true<Predicate, type_list<Ts...>>
232{
233 using type = convert_t<tuple_concat_t<conditional_t<Predicate<Ts>::value,
234 std::tuple<>, std::tuple<Ts>>...>,
235 type_list<>>;
236};
237
238template <template <typename> class Predicate, typename Sequence>
239using filter_true = typename filter_if_true<Predicate, Sequence>::type;
240
241//======================================================================================//
242//
243} // namespace impl
244
245//======================================================================================//
246
247template <template <typename> class Predicate, typename Sequence>
248using filter_true_t = impl::filter_true<Predicate, Sequence>;
249
250template <template <typename> class Predicate, typename Sequence>
251using filter_false_t = impl::filter_false<Predicate, Sequence>;
252
253///
254/// generic alias for extracting all types with a specified trait enabled
255///
256template <template <typename> class Predicate, typename... Sequence>
258{
259 using type = impl::filter_false<Predicate, std::tuple<Sequence...>>;
260};
261
262template <template <typename> class Predicate, typename... Sequence>
263struct get_true_types<Predicate, std::tuple<Sequence...>>
264{
265 using type = impl::filter_false<Predicate, std::tuple<Sequence...>>;
266};
267
268template <template <typename> class Predicate, typename... Sequence>
269struct get_true_types<Predicate, type_list<Sequence...>>
270{
271 using type =
272 convert_t<impl::filter_false<Predicate, std::tuple<Sequence...>>, type_list<>>;
273};
274
275template <template <typename> class Predicate, typename... Sequence>
276using get_true_types_t = typename get_true_types<Predicate, Sequence...>::type;
277
278///
279/// generic alias for extracting all types with a specified trait disabled
280///
281template <template <typename> class Predicate, typename... Sequence>
283{
284 using type = impl::filter_true<Predicate, std::tuple<Sequence...>>;
285};
286
287template <template <typename> class Predicate, typename... Sequence>
288struct get_false_types<Predicate, std::tuple<Sequence...>>
289{
290 using type = impl::filter_true<Predicate, std::tuple<Sequence...>>;
291};
292
293template <template <typename> class Predicate, typename... Sequence>
294struct get_false_types<Predicate, type_list<Sequence...>>
295{
296 using type =
297 convert_t<impl::filter_true<Predicate, std::tuple<Sequence...>>, type_list<>>;
298};
299
300template <template <typename> class Predicate, typename... Sequence>
301using get_false_types_t = typename get_false_types<Predicate, Sequence...>::type;
302
303//======================================================================================//
304//
305// determines if storage should be implemented
306//
307//======================================================================================//
308
309template <typename T>
310using non_quirk_t = impl::filter_true<concepts::is_quirk_type, T>;
311
312template <typename T>
313using non_placeholder_t = impl::filter_true<concepts::is_placeholder, T>;
314
315/// filter out any types that are not available
316template <typename... Types>
318 impl::filter_false_after_decay_t<trait::is_available, type_list<Types...>>;
319
320template <typename T>
321using implemented_list_t = impl::filter_false_after_decay_t<trait::is_available, T>;
322
323template <typename T>
324using available_t = impl::filter_false<trait::is_available, T>;
325
326//--------------------------------------------------------------------------------------//
327} // namespace mpl
328//
329template <typename... T>
330using stl_tuple_t = convert_t<mpl::available_t<concat<T...>>, std::tuple<>>;
331
332template <typename... T>
334
335template <typename Tag, typename... T>
338
339template <typename... T>
341
342template <typename... T>
344
345template <typename... T>
347
348template <typename... T>
350
351template <typename Tag, typename... T>
353
354template <typename... T>
357//
358} // namespace tim
This is a variadic component wrapper where all components are optional at runtime....
Definition: auto_list.hpp:91
This is a variadic component wrapper where all components are allocated on the stack and cannot be di...
Definition: auto_tuple.hpp:65
This is a variadic component wrapper where all components are optional at runtime....
This is a variadic component wrapper where all components are allocated on the stack and cannot be di...
This is a variadic component wrapper which provides the least amount of runtime and compilation overh...
STL namespace.
return false
Definition: definition.hpp:326
impl::filter_false< Predicate, std::tuple< Sequence... > > type
Definition: available.hpp:259
impl::filter_true< concepts::is_quirk_type, T > non_quirk_t
Definition: available.hpp:310
impl::filter_false_after_decay_t< trait::is_available, type_list< Types... > > implemented_t
filter out any types that are not available
Definition: available.hpp:318
convert_t< impl::filter_false< Predicate, std::tuple< Sequence... > >, type_list<> > type
Definition: available.hpp:272
impl::filter_false< Predicate, Sequence > filter_false_t
Definition: available.hpp:251
impl::filter_false_after_decay_t< trait::is_available, T > implemented_list_t
Definition: available.hpp:321
typename get_true_types< Predicate, Sequence... >::type get_true_types_t
Definition: available.hpp:276
typename get_false_types< Predicate, Sequence... >::type get_false_types_t
Definition: available.hpp:301
convert_t< impl::filter_true< Predicate, std::tuple< Sequence... > >, type_list<> > type
Definition: available.hpp:297
impl::filter_false< trait::is_available, T > available_t
Definition: available.hpp:324
impl::filter_true< concepts::is_placeholder, T > non_placeholder_t
Definition: available.hpp:313
impl::filter_true< Predicate, Sequence > filter_true_t
Definition: available.hpp:248
impl::filter_true< Predicate, std::tuple< Sequence... > > type
Definition: available.hpp:284
generic alias for extracting all types with a specified trait disabled
Definition: available.hpp:283
generic alias for extracting all types with a specified trait enabled
Definition: available.hpp:258
Definition: kokkosp.cpp:39
typename impl::concat< Types... >::type concat
Definition: types.hpp:707
convert_t< mpl::available_t< type_list< T... > >, auto_bundle< Tag > > auto_bundle_t
Definition: available.hpp:352
typename impl::tuple_concat< Ts... >::type tuple_concat_t
Definition: types.hpp:563
convert_t< mpl::available_t< type_list< T... > >, component_bundle< Tag > > component_bundle_t
Definition: available.hpp:337
convert_t< mpl::available_t< concat< T... > >, component_tuple<> > component_tuple_t
Definition: available.hpp:340
convert_t< mpl::available_t< concat< T... > >, auto_tuple<> > auto_tuple_t
Definition: available.hpp:346
convert_t< mpl::available_t< concat< T... > >, auto_list<> > auto_list_t
Definition: available.hpp:349
convert_t< mpl::available_t< concat< T... > >, std::tuple<> > stl_tuple_t
Definition: available.hpp:330
convert_t< mpl::available_t< concat< T... > >, type_list<> > type_list_t
Definition: available.hpp:333
typename impl::convert< T, U >::type convert_t
Definition: types.hpp:855
convert_t< mpl::available_t< concat< T... > >, component_list<> > component_list_t
Definition: available.hpp:343
convert_t< mpl::available_t< concat< T... > >, lightweight_tuple<> > lightweight_tuple_t
Definition: available.hpp:356
lightweight tuple-alternative for meta-programming logic
Definition: types.hpp:233
This is a variadic component wrapper which combines the features of tim::component_tuple<T....
Definition: types.hpp:63
This is a variadic component wrapper which combines the features of tim::auto_tuple<T....
Definition: types.hpp:75
trait that signifies that an implementation for the component is available. When this is set to false...
Definition: types.hpp:355
type_list
Definition: types.hpp:211