SpECTRE Documentation Coverage Report
Current view: top level - Time - Slab.hpp Hit Total Coverage
Commit: 37c384043430860f87787999aa7399d01bb3d213 Lines: 19 32 59.4 %
Date: 2024-04-20 02:24:02
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 class Slab
       6             : 
       7             : #pragma once
       8             : 
       9             : #include <cstddef>
      10             : #include <functional>
      11             : #include <iosfwd>
      12             : #include <limits>
      13             : 
      14             : class Time;
      15             : class TimeDelta;
      16             : 
      17             : namespace PUP {
      18             : class er;
      19             : }  // namespace PUP
      20             : 
      21             : /// \ingroup TimeGroup
      22             : ///
      23             : /// A chunk of time.  Every element must reach slab boundaries
      24             : /// exactly, no matter how it actually takes time steps to get there.
      25             : /// The simulation can only be assumed to have global data available
      26             : /// at slab boundaries.
      27           1 : class Slab {
      28             :  public:
      29             :   /// Default constructor gives an invalid Slab.
      30           1 :   Slab() = default;
      31             : 
      32             :   /// Construct a slab running between two times (exactly).
      33           1 :   Slab(double start, double end);
      34             : 
      35             :   /// Construct a slab with a given start time and duration.  The
      36             :   /// actual duration may differ by roundoff from the supplied value.
      37           1 :   static Slab with_duration_from_start(double start, double duration);
      38             : 
      39             :   /// Construct a slab with a given end time and duration.  The
      40             :   /// actual duration may differ by roundoff from the supplied value.
      41           1 :   static Slab with_duration_to_end(double end, double duration);
      42             : 
      43           0 :   Time start() const;
      44           0 :   Time end() const;
      45           0 :   TimeDelta duration() const;
      46             : 
      47             :   /// Create a new slab immediately following this one with the same
      48             :   /// (up to roundoff) duration.
      49           1 :   Slab advance() const;
      50             : 
      51             :   /// Create a new slab immediately preceeding this one with the same
      52             :   /// (up to roundoff) duration.
      53           1 :   Slab retreat() const;
      54             : 
      55             :   /// Create a slab adjacent to this one in the direction indicated by
      56             :   /// the argument, as with advance() or retreat().
      57           1 :   Slab advance_towards(const TimeDelta& dt) const;
      58             : 
      59             :   /// Create a new slab with the same start time as this one with the
      60             :   /// given duration (up to roundoff).
      61           1 :   Slab with_duration_from_start(double duration) const;
      62             : 
      63             :   /// Create a new slab with the same end time as this one with the
      64             :   /// given duration (up to roundoff).
      65           1 :   Slab with_duration_to_end(double duration) const;
      66             : 
      67             :   /// Check if this slab is immediately followed by the other slab.
      68           1 :   bool is_followed_by(const Slab& other) const;
      69             : 
      70             :   /// Check if this slab is immediately preceeded by the other slab.
      71           1 :   bool is_preceeded_by(const Slab& other) const;
      72             : 
      73             :   /// Check if slabs overlap.  Abutting slabs do not overlap.
      74           1 :   bool overlaps(const Slab& other) const;
      75             : 
      76             :   // NOLINTNEXTLINE(google-runtime-references)
      77           0 :   void pup(PUP::er& p);
      78             : 
      79             :  private:
      80           0 :   double start_ = std::numeric_limits<double>::signaling_NaN();
      81           0 :   double end_ = std::numeric_limits<double>::signaling_NaN();
      82             : 
      83           0 :   friend class Time;
      84           0 :   friend class TimeDelta;
      85             : 
      86           0 :   friend bool operator==(const Slab& a, const Slab& b);
      87           1 :   friend bool operator<(const Slab& a, const Slab& b);
      88           0 :   friend bool operator==(const Time& a, const Time& b);
      89             : };
      90             : 
      91           0 : bool operator!=(const Slab& a, const Slab& b);
      92             : 
      93             : /// Slab comparison operators give the time ordering.  Overlapping
      94             : /// unequal slabs should not be compared (and will trigger an
      95             : /// assertion).
      96             : /// @{
      97             : // NOLINTNEXTLINE(readability-redundant-declaration) redeclared for docs
      98           1 : bool operator<(const Slab& a, const Slab& b);
      99           1 : bool operator>(const Slab& a, const Slab& b);
     100           1 : bool operator<=(const Slab& a, const Slab& b);
     101           1 : bool operator>=(const Slab& a, const Slab& b);
     102             : /// @}
     103             : 
     104           0 : std::ostream& operator<<(std::ostream& os, const Slab& s);
     105             : 
     106           0 : size_t hash_value(const Slab& s);
     107             : 
     108             : namespace std {
     109             : template <>
     110             : struct hash<Slab> {
     111             :   size_t operator()(const Slab& s) const;
     112             : };
     113             : }  // namespace std
     114             : 
     115             : // Needs to be included so various return types are complete, but
     116             : // cannot be included at the top because Time.hpp includes this file.
     117             : #include "Time/Time.hpp"

Generated by: LCOV version 1.14