SpECTRE Documentation Coverage Report
Current view: top level - Utilities/TypeTraits - IsStreamable.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 75.0 % 4 3
Test Date: 2026-10-22 17:29:42
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              : 
       8              : #include "Utilities/Requires.hpp"
       9              : #include "Utilities/StlStreamDeclarations.hpp"
      10              : 
      11              : namespace tt {
      12              : /// @{
      13              : /// \ingroup TypeTraitsGroup
      14              : /// \brief Check if type `T` has operator<<(`S`, `T`) defined.
      15              : ///
      16              : /// \details
      17              : /// Inherits from std::true_type if the type `T` has operator<<(`S`, `T`)
      18              : /// defined for a stream `S`, otherwise inherits from std::false_type
      19              : ///
      20              : /// \usage
      21              : /// For any type `T` and stream type `S`,
      22              : /// \code
      23              : /// using result = tt::is_streamable<S, T>;
      24              : /// \endcode
      25              : ///
      26              : /// \metareturns
      27              : /// std::bool_constant
      28              : ///
      29              : /// \semantics
      30              : /// If the type `T` has operator<<(`S`, `T`) defined for stream `S`, then
      31              : /// \code
      32              : /// typename result::type = std::true_type;
      33              : /// \endcode
      34              : /// otherwise
      35              : /// \code
      36              : /// typename result::type = std::false_type;
      37              : /// \endcode
      38              : ///
      39              : /// \example
      40              : /// \snippet Test_IsStreamable.cpp is_streamable_example
      41              : /// \see std::cout std::ifstream std::sstream std::ostream
      42              : /// \tparam S the stream type, e.g. std::stringstream or std::ostream
      43              : /// \tparam T the type we want to know if it has operator<<
      44              : template <typename S, typename T, typename = std::void_t<>>
      45            1 : struct is_streamable : std::false_type {};
      46              : 
      47              : /// \cond
      48              : template <typename S, typename T>
      49              : struct is_streamable<
      50              :     S, T,
      51              :     std::void_t<decltype(std::declval<std::add_lvalue_reference_t<S>>()
      52              :                          << std::declval<T>()),
      53              :                 Requires<not std::is_same<S, T>::value>>> : std::true_type {};
      54              : /// \endcond
      55              : 
      56              : /// \see is_streamable
      57              : template <typename S, typename T>
      58            1 : constexpr bool is_streamable_v = is_streamable<S, T>::value;
      59              : 
      60              : /// \see is_streamable
      61              : template <typename S, typename T>
      62            1 : using is_streamable_t = typename is_streamable<S, T>::type;
      63              : /// @}
      64              : }  // namespace tt
        

Generated by: LCOV version 2.0-1