SpECTRE Documentation Coverage Report
Current view: top level - IO/H5 - Type.hpp Hit Total Coverage
Commit: 9ddc33268b29014a4956c8f0c24ca90b397463e1 Lines: 3 3 100.0 %
Date: 2024-04-26 20:00:04
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 function for retrieving the HDF5 type for a template parameter
       6             : 
       7             : #pragma once
       8             : 
       9             : #include <hdf5.h>
      10             : #include <string>
      11             : #include <type_traits>
      12             : 
      13             : #include "IO/H5/CheckH5.hpp"
      14             : #include "Utilities/ForceInline.hpp"
      15             : 
      16             : namespace h5 {
      17             : /*!
      18             :  * \ingroup HDF5Group
      19             :  * \brief Returns the HDF5 datatype for the corresponding type `T`
      20             :  *
      21             :  * \requires `T` is a valid type with a corresponding HDF5 datatype, i.e.
      22             :  * a fundamental or a std::string
      23             :  * \returns the HDF5 datatype for the corresponding type `T`
      24             :  *
      25             :  * \note For strings, the returned type must be released with H5Tclose
      26             :  */
      27             : template <typename T>
      28           1 : SPECTRE_ALWAYS_INLINE hid_t h5_type();
      29             : /// \cond HIDDEN_SYMBOLS
      30             : template <>
      31             : SPECTRE_ALWAYS_INLINE hid_t h5_type<float>() {
      32             :   return H5T_NATIVE_FLOAT;  // LCOV_EXCL_LINE
      33             : }
      34             : template <>
      35             : SPECTRE_ALWAYS_INLINE hid_t h5_type<double>() {
      36             :   return H5T_NATIVE_DOUBLE;  // LCOV_EXCL_LINE
      37             : }
      38             : template <>
      39             : SPECTRE_ALWAYS_INLINE hid_t h5_type<short>() {
      40             :   return H5T_NATIVE_SHORT;  // LCOV_EXCL_LINE
      41             : }
      42             : template <>
      43             : SPECTRE_ALWAYS_INLINE hid_t h5_type<unsigned short>() {
      44             :   return H5T_NATIVE_USHORT;  // LCOV_EXCL_LINE
      45             : }
      46             : template <>
      47             : SPECTRE_ALWAYS_INLINE hid_t h5_type<int>() {
      48             :   return H5T_NATIVE_INT;  // LCOV_EXCL_LINE
      49             : }
      50             : template <>
      51             : SPECTRE_ALWAYS_INLINE hid_t h5_type<unsigned int>() {
      52             :   return H5T_NATIVE_UINT;  // LCOV_EXCL_LINE
      53             : }
      54             : template <>
      55             : SPECTRE_ALWAYS_INLINE hid_t h5_type<long>() {
      56             :   return H5T_NATIVE_LONG;  // LCOV_EXCL_LINE
      57             : }
      58             : template <>
      59             : SPECTRE_ALWAYS_INLINE hid_t h5_type<unsigned long>() {
      60             :   return H5T_NATIVE_ULONG;  // LCOV_EXCL_LINE
      61             : }
      62             : template <>
      63             : SPECTRE_ALWAYS_INLINE hid_t h5_type<long long>() {
      64             :   return H5T_NATIVE_LLONG;  // LCOV_EXCL_LINE
      65             : }
      66             : template <>
      67             : SPECTRE_ALWAYS_INLINE hid_t h5_type<unsigned long long>() {
      68             :   return H5T_NATIVE_ULLONG;  // LCOV_EXCL_LINE
      69             : }
      70             : template <>
      71             : SPECTRE_ALWAYS_INLINE hid_t h5_type<char>() {
      72             :   // Work around issue https://github.com/sxs-collaboration/spectre/issues/5029
      73             :   // by always writing/reading signed chars. See issue for more suggestions for
      74             :   // more permanent solutions.
      75             :   return H5T_NATIVE_SCHAR;  // LCOV_EXCL_LINE
      76             : }
      77             : template <>
      78             : SPECTRE_ALWAYS_INLINE hid_t h5_type<bool>() {
      79             :   return H5T_NATIVE_HBOOL;  // LCOV_EXCL_LINE
      80             : }
      81             : template <>
      82             : SPECTRE_ALWAYS_INLINE hid_t h5_type<std::string>() {
      83             :   hid_t datatype = H5Tcopy(H5T_C_S1);
      84             :   CHECK_H5(datatype, "Failed to allocate string.");
      85             : #pragma GCC diagnostic push
      86             : #pragma GCC diagnostic ignored "-Wold-style-cast"
      87             :   CHECK_H5(H5Tset_size(datatype, H5T_VARIABLE),
      88             :            "Failed to set size of string.");
      89             :   CHECK_H5(H5Tset_cset(datatype, H5T_CSET_ASCII),
      90             :            "Failed to set string to ASCII encoding.");
      91             :   CHECK_H5(H5Tset_strpad(datatype, H5T_STR_NULLTERM),
      92             :            "Failed to set string to null terminate");
      93             : #pragma GCC diagnostic pop
      94             :   return datatype;
      95             : }
      96             : /// \endcond
      97             : 
      98             : /*!
      99             :  * \ingroup HDF5Group
     100             :  * \brief Create an H5 FORTRAN string.
     101             :  */
     102           1 : SPECTRE_ALWAYS_INLINE hid_t fortran_string() {
     103             :   hid_t datatype = H5Tcopy(H5T_FORTRAN_S1);
     104             :   CHECK_H5(datatype, "Failed to allocate string.");
     105             : #pragma GCC diagnostic push
     106             : #pragma GCC diagnostic ignored "-Wold-style-cast"
     107             :   CHECK_H5(H5Tset_size(datatype, H5T_VARIABLE),
     108             :            "Failed to set size of string.");
     109             : #pragma GCC diagnostic pop
     110             :   return datatype;
     111             : }
     112             : }  // namespace h5

Generated by: LCOV version 1.14