Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <string> 7 : #include <type_traits> 8 : 9 : #include "DataStructures/DataBox/TagTraits.hpp" 10 : #include "Utilities/PrettyType.hpp" 11 : #include "Utilities/TypeTraits/CreateHasTypeAlias.hpp" 12 : #include "Utilities/TypeTraits/CreateIsCallable.hpp" 13 : 14 : /// \cond 15 : namespace db { 16 : struct PrefixTag; 17 : } // namespace db 18 : /// \endcond 19 : 20 : namespace db { 21 : 22 : namespace detail { 23 : CREATE_HAS_TYPE_ALIAS(base) 24 : CREATE_HAS_TYPE_ALIAS_V(base) 25 : CREATE_IS_CALLABLE(name) 26 : CREATE_IS_CALLABLE_V(name) 27 : } // namespace detail 28 : 29 : /*! 30 : * \ingroup DataBoxGroup 31 : * \brief Get the name of a DataBox tag, including prefixes 32 : * 33 : * \details 34 : * Given a DataBox tag returns the name of the DataBox tag as a std::string. If 35 : * the DataBox tag is also a PrefixTag then the prefix is added. 36 : * 37 : * \tparam Tag the DataBox tag whose name to get 38 : * \return string holding the DataBox tag's name 39 : */ 40 : template <typename Tag> 41 1 : std::string tag_name() { 42 : if constexpr (detail::is_name_callable_v<Tag>) { 43 : return Tag::name(); 44 : } else if constexpr (detail::has_base_v<Tag>) { 45 : return tag_name<typename Tag::base>(); 46 : } else if constexpr (std::is_base_of_v<db::PrefixTag, Tag>) { 47 : return pretty_type::short_name<Tag>() + "(" + 48 : tag_name<typename Tag::tag>() + ")"; 49 : } else { 50 : return pretty_type::short_name<Tag>(); 51 : } 52 : } 53 : } // namespace db