SpECTRE Documentation Coverage Report
Current view: top level - Parallel - Callback.hpp Hit Total Coverage
Commit: 3c072f0ce967e2e56649d3fa12aa2a0e4fe2a42e Lines: 5 40 12.5 %
Date: 2024-04-23 20:50:18
Legend: Lines: hit not hit

          Line data    Source code
       1           1 : // Distributed under the MIT License.
       2             : // See LICENSE.txt for details.
       3             : 
       4             : /// \file
       5             : /// Defines Parallel::Callback.
       6             : 
       7             : #pragma once
       8             : 
       9             : #include <pup.h>
      10             : #include <tuple>
      11             : #include <utility>
      12             : 
      13             : #include "Parallel/Invoke.hpp"
      14             : #include "Utilities/Serialization/CharmPupable.hpp"
      15             : #include "Utilities/Serialization/RegisterDerivedClassesWithCharm.hpp"
      16             : 
      17             : namespace Parallel {
      18             : /// An abstract base class, whose derived class holds a function that
      19             : /// can be invoked at a later time.  The function is intended to be
      20             : /// invoked only once.
      21           1 : class Callback : public PUP::able {
      22             :  public:
      23           0 :   WRAPPED_PUPable_abstract(Callback);  // NOLINT
      24           0 :   Callback() = default;
      25           0 :   Callback(const Callback&) = default;
      26           0 :   Callback& operator=(const Callback&) = default;
      27           0 :   Callback(Callback&&) = default;
      28           0 :   Callback& operator=(Callback&&) = default;
      29           0 :   ~Callback() override = default;
      30           0 :   explicit Callback(CkMigrateMessage* msg) : PUP::able(msg) {}
      31           0 :   virtual void invoke() = 0;
      32           0 :   virtual void register_with_charm() = 0;
      33             : };
      34             : 
      35             : /// Wraps a call to a simple action and its arguments.
      36             : /// Can be invoked only once.
      37             : template <typename SimpleAction, typename Proxy, typename... Args>
      38           1 : class SimpleActionCallback : public Callback {
      39             :  public:
      40           0 :   WRAPPED_PUPable_decl_template(SimpleActionCallback);  // NOLINT
      41           0 :   SimpleActionCallback() = default;
      42             :   // NOLINTNEXTLINE(google-explicit-constructor)
      43           0 :   SimpleActionCallback(Proxy proxy, std::decay_t<Args>... args)
      44             :       : proxy_(proxy), args_(std::move(args)...) {}
      45           0 :   SimpleActionCallback(CkMigrateMessage* msg) : Callback(msg) {}
      46             :   using PUP::able::register_constructor;
      47           0 :   void invoke() override {
      48             :     std::apply(
      49             :         [this](auto&&... args) {
      50             :           Parallel::simple_action<SimpleAction>(proxy_, args...);
      51             :         },
      52             :         std::move(args_));
      53             :   }
      54           0 :   void pup(PUP::er& p) override {
      55             :     p | proxy_;
      56             :     p | args_;
      57             :   }
      58             : 
      59           0 :   void register_with_charm() override {
      60             :     static bool done_registration{false};
      61             :     if (done_registration) {
      62             :       return;
      63             :     }
      64             :     done_registration = true;
      65             :     register_classes_with_charm<SimpleActionCallback>();
      66             :   }
      67             : 
      68             :  private:
      69           0 :   std::decay_t<Proxy> proxy_{};
      70           0 :   std::tuple<std::decay_t<Args>...> args_{};
      71             : };
      72             : 
      73             : /// Wraps a call to a simple action without arguments.
      74             : template <typename SimpleAction, typename Proxy>
      75           1 : class SimpleActionCallback<SimpleAction, Proxy> : public Callback {
      76             :  public:
      77           0 :   WRAPPED_PUPable_decl_template(SimpleActionCallback);  // NOLINT
      78           0 :   SimpleActionCallback() = default;
      79             :   // NOLINTNEXTLINE(google-explicit-constructor)
      80           0 :   SimpleActionCallback(Proxy proxy) : proxy_(proxy) {}
      81           0 :   SimpleActionCallback(CkMigrateMessage* msg) : Callback(msg) {}
      82             :   using PUP::able::register_constructor;
      83           0 :   void invoke() override { Parallel::simple_action<SimpleAction>(proxy_); }
      84             : 
      85           0 :   void pup(PUP::er& p) override { p | proxy_; }
      86             : 
      87           0 :   void register_with_charm() override {
      88             :     static bool done_registration{false};
      89             :     if (done_registration) {
      90             :       return;
      91             :     }
      92             :     done_registration = true;
      93             :     register_classes_with_charm<SimpleActionCallback>();
      94             :   }
      95             : 
      96             :  private:
      97           0 :   std::decay_t<Proxy> proxy_{};
      98             : };
      99             : 
     100             : /// Wraps a call to perform_algorithm.
     101             : template <typename Proxy>
     102           1 : class PerformAlgorithmCallback : public Callback {
     103             :  public:
     104           0 :   WRAPPED_PUPable_decl_template(PerformAlgorithmCallback);  // NOLINT
     105           0 :   PerformAlgorithmCallback() = default;
     106             :   // NOLINTNEXTLINE(google-explicit-constructor)
     107           0 :   PerformAlgorithmCallback(Proxy proxy) : proxy_(proxy) {}
     108           0 :   PerformAlgorithmCallback(CkMigrateMessage* msg) : Callback(msg) {}
     109             :   using PUP::able::register_constructor;
     110           0 :   void invoke() override { proxy_.perform_algorithm(); }
     111           0 :   void pup(PUP::er& p) override { p | proxy_; }
     112             : 
     113           0 :   void register_with_charm() override {
     114             :     static bool done_registration{false};
     115             :     if (done_registration) {
     116             :       return;
     117             :     }
     118             :     done_registration = true;
     119             :     register_classes_with_charm<PerformAlgorithmCallback>();
     120             :   }
     121             : 
     122             :  private:
     123           0 :   std::decay_t<Proxy> proxy_{};
     124             : };
     125             : 
     126             : /// \cond
     127             : template <typename Proxy>
     128             : PUP::able::PUP_ID PerformAlgorithmCallback<Proxy>::my_PUP_ID = 0;  // NOLINT
     129             : template <typename SimpleAction, typename Proxy, typename... Args>
     130             : PUP::able::PUP_ID
     131             :     SimpleActionCallback<SimpleAction, Proxy, Args...>::my_PUP_ID =
     132             :         0;  // NOLINT
     133             : template <typename SimpleAction, typename Proxy>
     134             : PUP::able::PUP_ID SimpleActionCallback<SimpleAction, Proxy>::my_PUP_ID =
     135             :     0;  // NOLINT
     136             : /// \endcond
     137             : 
     138             : }  // namespace Parallel

Generated by: LCOV version 1.14