Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <concepts> 7 : #include <type_traits> 8 : 9 : /// \cond 10 : namespace db { 11 : struct SimpleTag; 12 : struct ComputeTag; 13 : struct ReferenceTag; 14 : } // namespace db 15 : namespace Parallel::Tags { 16 : struct Metavariables; 17 : } // namespace Parallel::Tags 18 : /// \endcond 19 : 20 : namespace db { 21 : /*! 22 : * \ingroup DataBoxGroup 23 : * \brief Check if `Tag` derives off of db::ComputeTag. 24 : * 25 : * \see is_compute_tag_v ComputeTag 26 : */ 27 : template <typename Tag> 28 1 : struct is_compute_tag : std::is_base_of<db::ComputeTag, Tag> {}; 29 : 30 : /// \ingroup DataBoxGroup 31 : /// \brief True if `Tag` derives from db::ComputeTag. 32 : template <typename Tag> 33 1 : constexpr bool is_compute_tag_v = is_compute_tag<Tag>::value; 34 : 35 : /*! 36 : * \ingroup DataBoxGroup 37 : * \brief Check if `Tag` derives off of db::ReferenceTag. 38 : * 39 : * \see is_reference_tag_v ReferenceTag 40 : */ 41 : template <typename Tag> 42 1 : struct is_reference_tag : std::is_base_of<db::ReferenceTag, Tag> {}; 43 : 44 : /// \ingroup DataBoxGroup 45 : /// \brief True if `Tag` derives from db::ReferenceTag. 46 : template <typename Tag> 47 1 : constexpr bool is_reference_tag_v = is_reference_tag<Tag>::value; 48 : 49 : /*! 50 : * \ingroup DataBoxGroup 51 : * \brief Check if `Tag` is a DataBox tag for an immutable item, i.e. a 52 : * ComputeTag or ReferenceTag 53 : * 54 : * \see is_immutable_item_tag_v 55 : */ 56 : template <typename Tag> 57 1 : struct is_immutable_item_tag 58 : : std::bool_constant<std::is_base_of_v<db::ReferenceTag, Tag> or 59 : std::is_base_of_v<db::ComputeTag, Tag>> {}; 60 : 61 : /// \ingroup DataBoxGroup 62 : /// \brief True if `Tag` is a DataBox tag for an immutable item, i.e. a 63 : /// ComputeTag or ReferenceTag. 64 : template <typename Tag> 65 1 : constexpr bool is_immutable_item_tag_v = is_immutable_item_tag<Tag>::value; 66 : 67 : /*! 68 : * \ingroup DataBoxGroup 69 : * \brief Check if `Tag` is a DataBox tag for a mutable item, i.e. a SimpleTag 70 : * 71 : * \see is_mutable_item_tag_v 72 : */ 73 : template <typename Tag> 74 1 : struct is_mutable_item_tag 75 : : std::bool_constant<std::is_base_of_v<db::SimpleTag, Tag> and 76 : not is_compute_tag_v<Tag> and 77 : not is_reference_tag_v<Tag>> {}; 78 : 79 : /// \ingroup DataBoxGroup 80 : /// \brief True if `Tag` is a DataBox tag for a mutable item, i.e. a SimpleTag 81 : template <typename Tag> 82 1 : constexpr bool is_mutable_item_tag_v = is_mutable_item_tag<Tag>::value; 83 : 84 : /*! 85 : * \ingroup DataBoxGroup 86 : * \brief Check if `Tag` is a simple tag. 87 : * 88 : * \details This is done by deriving from std::true_type if `Tag` is derived 89 : * from db::SimpleTag, but not from db::ComputeTag or db::ReferenceTag. 90 : * 91 : * \see is_simple_tag_v SimpleTag 92 : */ 93 : template <typename Tag> 94 1 : struct is_simple_tag 95 : : std::bool_constant<std::is_base_of_v<db::SimpleTag, Tag> and 96 : not is_compute_tag_v<Tag> and 97 : not is_reference_tag_v<Tag>> {}; 98 : 99 : /// \ingroup DataBoxGroup 100 : /// \brief True if `Tag` is a simple tag. 101 : template <typename Tag> 102 1 : constexpr bool is_simple_tag_v = is_simple_tag<Tag>::value; 103 : 104 : /*! 105 : * \ingroup DataBoxGroup 106 : * \brief Check if `Tag` is a simple, compute, or reference tag. 107 : * 108 : * \see is_non_base_tag_v BaseTag 109 : */ 110 : template <typename Tag> 111 1 : struct is_creation_tag : std::is_base_of<db::SimpleTag, Tag> {}; 112 : 113 : /// \ingroup DataBoxGroup 114 : /// \brief True if `Tag` is not a base tag. 115 : template <typename Tag> 116 1 : constexpr bool is_creation_tag_v = is_creation_tag<Tag>::value; 117 : 118 : /*! 119 : * \ingroup DataBoxGroup 120 : * \brief Check if `Tag` is a DataBox tag, i.e. a SimpleTag, ComputeTag, 121 : * ReferenceTag, or the special tag Parallel::Tags::Metavariables. 122 : * 123 : * \see is_tag_v 124 : */ 125 : template <typename Tag> 126 1 : struct is_tag 127 : : std::bool_constant<std::is_base_of_v<db::SimpleTag, Tag> or 128 : std::is_same_v<Tag, Parallel::Tags::Metavariables>> {}; 129 : 130 : /// \ingroup DataBoxGroup 131 : /// \brief True if `Tag` is a DataBox tag. 132 : template <typename Tag> 133 1 : constexpr bool is_tag_v = is_tag<Tag>::value; 134 : 135 : /*! 136 : * \ingroup DataBoxGroup 137 : * Concept for a SimpleTag. 138 : * 139 : * \see is_simple_tag 140 : */ 141 : template <typename Tag> 142 : concept simple_tag = is_simple_tag_v<Tag>; 143 : 144 : /*! 145 : * \ingroup DataBoxGroup 146 : * Concept for a ComputeTag. 147 : * 148 : * \see is_compute_tag 149 : */ 150 : template <typename Tag> 151 : concept compute_tag = is_compute_tag_v<Tag>; 152 : 153 : /*! 154 : * \ingroup DataBoxGroup 155 : * Concept for a ReferenceTag. 156 : * 157 : * \see is_reference_tag 158 : */ 159 : template <typename Tag> 160 : concept reference_tag = is_reference_tag_v<Tag>; 161 : 162 : /*! 163 : * \ingroup DataBoxGroup 164 : * Concept for an immutable item tag. 165 : * 166 : * \see is_immutable_item_tag 167 : */ 168 : template <typename Tag> 169 : concept immutable_item_tag = reference_tag<Tag> or compute_tag<Tag>; 170 : 171 : /*! 172 : * \ingroup DataBoxGroup 173 : * Concept for a mutable item tag. 174 : * 175 : * \see is_mutable_item_tag 176 : */ 177 : template <typename Tag> 178 : concept mutable_item_tag = simple_tag<Tag>; 179 : 180 : /*! 181 : * \ingroup DataBoxGroup 182 : * Concept for a DataBox tag. 183 : * 184 : * \see is_tag 185 : */ 186 : template <typename Tag> 187 : concept tag = immutable_item_tag<Tag> or mutable_item_tag<Tag> or 188 : std::same_as<Tag, Parallel::Tags::Metavariables>; 189 : } // namespace db