Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Defines metafunctions for manipulating Tags that refer to Tensors 6 : 7 : #pragma once 8 : 9 : #include "DataStructures/Tensor/IndexType.hpp" 10 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp" 11 : #include "Utilities/TMPL.hpp" 12 : 13 : namespace TensorMetafunctions { 14 : /// \ingroup TensorGroup 15 : /// \brief Replaces Tag with an equivalent Tag but in frame NewFrame 16 : template <typename Tag, typename NewFrame> 17 1 : struct replace_frame_in_tag { 18 : // Base definition, for tags with no template parameters, 19 : // like some scalars. 20 0 : using type = Tag; 21 : }; 22 : // Specialization for tensors in gr::Tags / gh::Tags 23 : template <template <typename, size_t, typename> typename Tag, size_t Dim, 24 : typename Frame, typename DataType, typename NewFrame> 25 0 : struct replace_frame_in_tag<Tag<DataType, Dim, Frame>, NewFrame> { 26 0 : using type = Tag<DataType, Dim, NewFrame>; 27 : }; 28 : // Specialization for scalars in gr::Tags (which have a DataType). 29 : template <template <typename> typename Tag, typename DataType, 30 : typename NewFrame> 31 0 : struct replace_frame_in_tag<Tag<DataType>, NewFrame> { 32 0 : using type = Tag<DataType>; 33 : }; 34 : // Specialization for Tags::deriv<Tag> with Tag in gh::Tags 35 : template <template <typename, size_t, typename> typename Tag, typename DataType, 36 : size_t Dim, typename Frame, typename NewFrame> 37 0 : struct replace_frame_in_tag< 38 : ::Tags::deriv<Tag<DataType, Dim, Frame>, tmpl::size_t<Dim>, Frame>, 39 : NewFrame> { 40 0 : using type = 41 : ::Tags::deriv<Tag<DataType, Dim, NewFrame>, tmpl::size_t<Dim>, NewFrame>; 42 : }; 43 : 44 : /// \ingroup TensorGroup 45 : /// \brief Replaces Tag with an equivalent Tag but in frame NewFrame 46 : template <typename Tag, typename NewFrame> 47 1 : using replace_frame_in_tag_t = 48 : typename replace_frame_in_tag<Tag, NewFrame>::type; 49 : 50 : /// \ingroup TensorGroup 51 : /// \brief Replaces every Tag in Taglist with an equivalent Tag 52 : /// but in frame NewFrame 53 : template <typename TagList, typename NewFrame> 54 1 : using replace_frame_in_taglist = 55 : tmpl::transform<TagList, 56 : tmpl::bind<replace_frame_in_tag_t, tmpl::_1, NewFrame>>; 57 : } // namespace TensorMetafunctions