SpECTRE Documentation Coverage Report
Current view: top level - ParallelAlgorithms/Initialization - MutateAssign.hpp Hit Total Coverage
Commit: 3c072f0ce967e2e56649d3fa12aa2a0e4fe2a42e Lines: 1 2 50.0 %
Date: 2024-04-23 20:50:18
Legend: Lines: hit not hit

          Line data    Source code
       1           0 : // Distributed under the MIT License.
       2             : // See LICENSE.txt for details.
       3             : 
       4             : #pragma once
       5             : 
       6             : #include <utility>
       7             : 
       8             : #include "DataStructures/DataBox/DataBox.hpp"
       9             : #include "Utilities/Gsl.hpp"
      10             : #include "Utilities/TMPL.hpp"
      11             : 
      12             : namespace Initialization {
      13             : namespace detail {
      14             : template <typename... MutateTags, typename BoxTags, typename... Args>
      15             : SPECTRE_ALWAYS_INLINE constexpr void mutate_assign_impl(
      16             :     // NOLINTNEXTLINE(readability-avoid-const-params-in-decls)
      17             :     const gsl::not_null<db::DataBox<BoxTags>*> box,
      18             :     tmpl::list<MutateTags...> /*meta*/, Args&&... args) {
      19             :   static_assert(sizeof...(MutateTags) == sizeof...(args),
      20             :                 "The number of arguments passed to `mutate_assign` must be "
      21             :                 "equal to the number of tags passed.");
      22             :   db::mutate<MutateTags...>(
      23             :       [&args...](const auto... box_args) {
      24             :         // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
      25             :         EXPAND_PACK_LEFT_TO_RIGHT((*box_args = std::forward<Args>(args)));
      26             :       },
      27             :       box);
      28             : }
      29             : }  // namespace detail
      30             : 
      31             : /*!
      32             :  * \ingroup DataBoxGroup
      33             :  * \brief Perform a mutation to the \ref DataBoxGroup `box`, assigning the
      34             :  * `args` to the tags in `MutateTagList` in order.
      35             :  */
      36             : template <typename MutateTagList, typename BoxTags, typename... Args>
      37           1 : SPECTRE_ALWAYS_INLINE constexpr void mutate_assign(
      38             :     // NOLINTNEXTLINE(readability-avoid-const-params-in-decls)
      39             :     const gsl::not_null<db::DataBox<BoxTags>*> box, Args&&... args) {
      40             :   // The impl works for zero tags, but we can skip it to improve
      41             :   // compilation performance.
      42             :   if constexpr (tmpl::size<MutateTagList>::value != 0) {
      43             :     detail::mutate_assign_impl(box, MutateTagList{},
      44             :                                std::forward<Args>(args)...);
      45             :   } else {
      46             :     (void)box;
      47             :     expand_pack(args...);
      48             :   }
      49             : }
      50             : }  // namespace Initialization

Generated by: LCOV version 1.14