// MIT License // // Copyright (c) 2023-2025 Advanced Micro Devices, Inc. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include "lib/common/details/mpl.hpp" #include #include #include #include #include namespace rocprofiler { namespace common { namespace mpl { // dummy tuple with low instantiation cost template using type_list = impl::type_list; /// get the index of a type in expansion template struct index_of; template class Tuple, typename... Types> struct index_of> { static constexpr size_t value = 0; }; template class Tuple, typename... Tail> struct index_of> { static constexpr size_t value = 1 + index_of>::value; }; /// get the index of a type in expansion template struct size_of; template struct size_of> { static constexpr size_t value = sizeof...(Tp); }; template struct size_of> { static constexpr size_t value = sizeof...(Tp); }; // check if type is in expansion // template struct is_one_of { static constexpr bool value = false; }; template class Tuple, typename... T> struct is_one_of> { static constexpr bool value = std::is_same::value || is_one_of>::value; }; template class Tuple, typename... T> struct is_one_of> { static constexpr bool value = is_one_of>::value; }; template struct is_pair_impl { static constexpr auto value = false; }; template struct is_pair_impl> { static constexpr auto value = true; }; template struct is_pair : is_pair_impl>>> {}; template struct is_string_type_impl { static constexpr auto value = is_one_of>::value; }; template struct is_string_type : is_string_type_impl>>> {}; template constexpr bool is_type_complete_v = false; // NOLINT(misc-definitions-in-headers) template // NOLINTNEXTLINE(misc-definitions-in-headers) constexpr bool is_type_complete_v> = true; template struct indirection_level_impl_n { using value_type = std::conditional_t::value, Tp, std::decay_t>; static_assert(!std::is_pointer::value, "missing overload"); static constexpr size_t value = N; }; template struct indirection_level_impl_n : indirection_level_impl_n {}; template struct indirection_level_impl_n : indirection_level_impl_n {}; template struct indirection_level : indirection_level_impl_n>>, 0> {}; template struct unqualified_type { using type = std::remove_reference_t>>; }; template using unqualified_type_t = typename unqualified_type::type; template struct assert_false { static constexpr auto value = false; }; template using reverse = typename impl::reverse::type; template using function_traits = impl::function_traits; template using function_args_t = typename impl::function_traits::args_type; } // namespace mpl } // namespace common } // namespace rocprofiler