SpECTRE Documentation Coverage Report
Current view: top level - Utilities/TypeTraits - FastPointerCast.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 <type_traits>
       7             : #include <utility>
       8             : 
       9             : #include "Utilities/Requires.hpp"
      10             : 
      11             : namespace tt {
      12             : namespace detail {
      13             : template <typename T, typename U, typename = void>
      14             : struct can_static_cast : std::false_type {};
      15             : 
      16             : template <typename T, typename U>
      17             : struct can_static_cast<T, U,
      18             :                        std::void_t<decltype(static_cast<U>(std::declval<T>()))>>
      19             :     : std::true_type {};
      20             : 
      21             : template <typename T, typename U>
      22             : static constexpr bool can_static_cast_v = can_static_cast<T, U>::value;
      23             : }  // namespace detail
      24             : 
      25             : /*!
      26             :  * \brief Cast `t` which is of type `T*` to a `U`. If a `static_cast<U>(t)` is
      27             :  * possible, use that, otherwise use `dynamic_cast<U>(t)`.
      28             :  */
      29             : template <typename U, typename T>
      30           1 : U fast_pointer_cast(T* t) {
      31             :   if constexpr (detail::can_static_cast_v<T*, U>) {
      32             :     return static_cast<U>(t);
      33             :   } else {
      34             :     return dynamic_cast<U>(t);
      35             :   }
      36             : }
      37             : }  // namespace tt

Generated by: LCOV version 1.14