Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <utility> 8 : 9 : #include "ParallelAlgorithms/Amr/Protocols/Projector.hpp" 10 : #include "Utilities/Gsl.hpp" 11 : #include "Utilities/TMPL.hpp" 12 : 13 : /// \cond 14 : template <size_t Dim> 15 : class Element; 16 : template <size_t Dim> 17 : class Mesh; 18 : /// \endcond 19 : 20 : namespace amr::projectors { 21 : 22 : /// \brief Value initialize the items corresponding to Tags 23 : /// 24 : /// There is a specialization for `DefaultInitialize<tmpl::list<Tags...>>` that 25 : /// can be used if a `tmpl::list` is available. 26 : /// 27 : /// \details For each item corresponding to each tag, value initialize 28 : /// the item by setting it equal to an object constructed with an 29 : /// empty initializer. This is the default state of mutable items in 30 : /// a DataBox if they are neither set from input file options, nor 31 : /// mutated by initialization actions. 32 : template <typename... Tags> 33 1 : struct DefaultInitialize : tt::ConformsTo<amr::protocols::Projector> { 34 0 : using return_tags = tmpl::list<Tags...>; 35 0 : using argument_tags = tmpl::list<>; 36 : 37 : template <size_t Dim> 38 0 : static void apply( 39 : const gsl::not_null<typename Tags::type*>... items, 40 : const std::pair<Mesh<Dim>, Element<Dim>>& /*old_mesh_and_element*/) { 41 : expand_pack((*items = std::decay_t<decltype(*items)>{})...); 42 : } 43 : 44 : template <typename FinalArg> 45 0 : static void apply(const gsl::not_null<typename Tags::type*>... /*items*/, 46 : const FinalArg& /*parent_or_children_items*/) { 47 : // Mutable items on newly created elements are already value initialized 48 : } 49 : }; 50 : 51 : /// \cond 52 : template <typename... Tags> 53 : struct DefaultInitialize<tmpl::list<Tags...>> 54 : : public DefaultInitialize<Tags...> {}; 55 : /// \endcond 56 : } // namespace amr::projectors