7 #ifndef UTOPIA_DATAIO_HDFTYPEFACTORY_HH
8 #define UTOPIA_DATAIO_HDFTYPEFACTORY_HH
38 template <
typename T >
49 return H5T_NATIVE_FLOAT;
56 return H5T_NATIVE_DOUBLE;
62 return H5T_NATIVE_LDOUBLE;
68 return H5T_NATIVE_INT;
75 return H5T_NATIVE_SHORT;
81 return H5T_NATIVE_LONG;
87 return H5T_NATIVE_LLONG;
93 return H5T_NATIVE_UINT;
99 return H5T_NATIVE_UINT16;
105 return H5T_NATIVE_ULLONG;
112 return H5T_NATIVE_ULLONG;
119 return H5T_NATIVE_HBOOL;
125 return H5T_NATIVE_CHAR;
163 std::vector< float >,
164 std::vector< double >,
165 std::vector< long double >,
167 std::vector< short int >,
168 std::vector< long int >,
169 std::vector< long long int >,
170 std::vector< unsigned int >,
171 std::vector< unsigned short int >,
172 std::vector< std::size_t >,
173 std::vector< unsigned long long >,
176 std::vector< std::string >,
222 template <
typename T >
226 this->
_log->debug(
"Opening HDFType from existing object {}",
231 throw std::runtime_error(
232 "Error, cannot open HDFType while it's still bound to another "
233 "valid type object, close it first");
238 "datatype of " +
object.
get_path());
253 template <
typename T >
255 open(std::string name, hsize_t typesize)
257 this->
_log->debug(
"Opening HDFType from scratch");
261 throw std::runtime_error(
262 "Error, cannot open HDFType '" + name +
"' while it's still bound "
263 "to another valid type object! Close it first.");
267 if constexpr (Utils::is_container_v< T >)
272 Detail::get_type< typename T::value_type >()),
278 hsize_t dim[1] = { typesize };
281 Detail::get_type< typename T::value_type >(), 1, dim),
287 else if constexpr (Utils::is_string_v< T >)
289 hid_t type = H5Tcopy(H5T_C_S1);
293 H5Tset_size(type, H5T_VARIABLE);
297 H5Tset_size(type, typesize);
299 bind_to(std::move(type), &H5Tclose, name);
308 _id.
open(Detail::get_type< T >(),
309 [](hid_t) -> herr_t {
return 0; });
365 _mutable = std::move(other._mutable);
366 _classid = std::move(other._classid);
368 other._mutable =
false;
369 other._classid = H5T_NO_CLASS;
380 static_cast<Base&
>(*this) =
static_cast< Base&&
>(other);
381 _mutable = std::move(other._mutable);
382 _classid = std::move(other._classid);
384 other._mutable =
false;
385 other._classid = H5T_NO_CLASS;
427 template <
typename T >
429 std::enable_if_t< not std::is_same_v<
HDFType, std::decay_t< T > >,
int > = 0):
432 open(object_or_size);
463 throw std::runtime_error(
"Error when comparing dataspaces");
479 return not(lhs == rhs);
void open(hid_t id, std::function< herr_t(hid_t) > closing_func)
Open the object and bind it to another C-Level id.
Definition: hdfidentifier.hh:156
Common base class for all HDF5 classes in the DATAIO Module i.e., for all classes that wrap HDF5-C-Li...
Definition: hdfobject.hh:37
std::string _path
Name of the object.
Definition: hdfobject.hh:50
std::string get_path() const
Get the name or path object.
Definition: hdfobject.hh:88
void close()
Close function which takes care of correctly closing the object and managing the reference counter.
Definition: hdfobject.hh:161
virtual bool is_valid() const
Check if the object is still valid.
Definition: hdfobject.hh:143
std::shared_ptr< spdlog::logger > _log
pointer to the logger for dataio
Definition: hdfobject.hh:56
HDFIdentifier _id
Identifier object that binds an instance of this class to an HDF5 object.
Definition: hdfobject.hh:44
hid_t get_C_id() const
Get the C id object.
Definition: hdfobject.hh:120
void bind_to(hid_t id, std::function< herr_t(hid_t) > closing_func, std::string path={})
Open the object and bind it to a HDF5 object identified by 'id' with name 'path'. Object should be cr...
Definition: hdfobject.hh:186
Class which handles the conversion of C-types into hdf5types.
Definition: hdftype.hh:136
HDFType & operator=(const HDFType &other)=default
Copy assign type.
void open(T &&object)
Open the HDF5 type associated with an HDFObject, i.e., a dataset or an attribute.
Definition: hdftype.hh:224
void open(std::string name, hsize_t typesize)
Create an HDF datatype corresponding to the C datatype given as template argument.
Definition: hdftype.hh:255
HDFType(HDFType &&other)
Construct HDFType from the given arguments by move, deleted, because apparently incompatible with HDF...
Definition: hdftype.hh:363
virtual ~HDFType()
Destroy the HDFType object.
Definition: hdftype.hh:408
HDFType()
Construct HDFType from by default.
Definition: hdftype.hh:417
void close()
Construct close from the given arguments.
Definition: hdftype.hh:322
auto type_category() const
Get the type category of the held type, i.e., scala, string, varlen,...
Definition: hdftype.hh:199
HDFType(T &&object_or_size, std::enable_if_t< not std::is_same_v< HDFType, std::decay_t< T > >, int >=0)
Construct HDFType from the given arguments.
Definition: hdftype.hh:428
H5T_class_t _classid
Definition: hdftype.hh:143
std::size_t size() const
Size of the type held in bytes.
Definition: hdftype.hh:210
bool _mutable
Definition: hdftype.hh:140
bool is_mutable() const
Get if the type is mutable or not.
Definition: hdftype.hh:187
HDFType & operator=(HDFType &&other)
Move assign the type.
Definition: hdftype.hh:378
virtual bool is_valid() const override
Check if the held type identifier is still valid. Primitive types are valid by definition,...
Definition: hdftype.hh:342
std::variant< float, double, long double, int, short int, long int, long long int, unsigned int, unsigned short int, std::size_t, unsigned long long, bool, char, std::vector< float >, std::vector< double >, std::vector< long double >, std::vector< int >, std::vector< short int >, std::vector< long int >, std::vector< long long int >, std::vector< unsigned int >, std::vector< unsigned short int >, std::vector< std::size_t >, std::vector< unsigned long long >, std::vector< char >, std::vector< std::string >, std::string, const char * > Variant
Definition: hdftype.hh:178
HDFType(const HDFType &other)=default
Construct HDFType from the given arguments by copy.
bool operator!=(const HDFIdentifier &lhs, const HDFIdentifier &rhs)
Comparsion operator for inequality.
Definition: hdfidentifier.hh:275
bool operator==(const HDFIdentifier &lhs, const HDFIdentifier &rhs)
Comparsion operator for equality.
Definition: hdfidentifier.hh:262
hid_t open_type(Object &&object)
Depending on object category, invokes H5Dget_type or H5Aget_type.
Definition: hdfutilities.hh:261
This file provides metafunctions for automatically determining the nature of a C/C++ types at compile...
hid_t get_type< double >()
Definition: hdftype.hh:54
hid_t get_type< std::size_t >()
Definition: hdftype.hh:103
hid_t get_type< char >()
Definition: hdftype.hh:123
hid_t get_type< float >()
Definition: hdftype.hh:47
hid_t get_type< long long int >()
Definition: hdftype.hh:85
hid_t get_type()
Definition: hdftype.hh:39
hid_t get_type< unsigned short int >()
Definition: hdftype.hh:97
hid_t get_type< bool >()
Definition: hdftype.hh:117
hid_t get_type< short int >()
Definition: hdftype.hh:73
hid_t get_type< int >()
Definition: hdftype.hh:66
hid_t get_type< unsigned long long >()
Definition: hdftype.hh:110
hid_t get_type< unsigned int >()
Definition: hdftype.hh:91
hid_t get_type< long int >()
Definition: hdftype.hh:79
hid_t get_type< long double >()
Definition: hdftype.hh:60