10 #include "DataStructures/DataBox/TagTraits.hpp"
15 namespace db::detail {
19 enum class ItemType { Mutable, Compute, Reference, Invalid };
22 template <
typename Tag, ItemType = db::is_mutable_item_tag_v<Tag>
24 : (db::is_compute_tag_v<Tag>
26 : (db::is_reference_tag_v<Tag>
28 : ItemType::Inval
id))>
31 db::is_non_base_tag_v<Tag>,
32 "The Tag of an Item in the Databox must be derived from db::SimpleTag");
43 template <
typename Tag>
44 class Item<Tag, ItemType::Mutable> {
46 static constexpr ItemType item_type = ItemType::Mutable;
48 using value_type =
typename Tag::type;
50 constexpr Item() =
default;
51 constexpr Item(Item
const&) =
default;
52 constexpr Item(Item&&) =
default;
53 constexpr Item& operator=(Item
const&) =
default;
54 constexpr Item& operator=(Item&&) =
default;
57 explicit Item(value_type value) noexcept : value_(std::move(value)) {}
59 const value_type&
get() const noexcept {
return value_; }
61 value_type&
mutate() noexcept {
return value_; }
88 template <
typename Tag>
89 class Item<Tag, ItemType::Compute> {
91 static constexpr ItemType item_type = ItemType::Compute;
93 using value_type =
typename Tag::type;
95 constexpr Item() =
default;
96 constexpr Item(Item
const&) =
default;
97 constexpr Item(Item&&) =
default;
98 constexpr Item& operator=(Item
const&) =
default;
99 constexpr Item& operator=(Item&&) =
default;
102 const value_type&
get() const noexcept {
return value_; }
104 bool evaluated() const noexcept {
return evaluated_; }
106 void reset() noexcept { evaluated_ =
false; }
108 template <
typename... Args>
109 void evaluate(
const Args&... args)
const noexcept {
115 void pup(PUP::er& p) noexcept {
123 mutable value_type value_{};
124 mutable bool evaluated_{
false};
135 template <
typename Tag>
136 class Item<Tag, ItemType::Reference> {
138 static constexpr ItemType item_type = ItemType::Reference;
140 constexpr Item() =
default;
141 constexpr Item(Item
const&) =
default;
142 constexpr Item(Item&&) =
default;
143 constexpr Item& operator=(Item
const&) =
default;
144 constexpr Item& operator=(Item&&) =
default;
148 void pup(PUP::er& ) noexcept {}