mirror of
https://git.gfz-potsdam.de/naaice/poet.git
synced 2025-12-16 12:54:50 +01:00
399 lines
11 KiB
C++
399 lines
11 KiB
C++
/*
|
|
* Copyright (c), 2017, Adrien Devresse <adrien.devresse@epfl.ch>
|
|
*
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*
|
|
*/
|
|
|
|
/// \brief
|
|
/// Read/dump DataSets or Attribute using a minimalistic syntax.
|
|
/// To this end, the functions are templated, and accept:
|
|
/// - Any type accepted by HighFive
|
|
/// - Eigen objects
|
|
/// - xtensor objects
|
|
/// - OpenCV objects
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// optionally enable xtensor plug-in and load the library
|
|
#ifdef XTENSOR_VERSION_MAJOR
|
|
#ifndef H5_USE_XTENSOR
|
|
#define H5_USE_XTENSOR
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef H5_USE_XTENSOR
|
|
#include "xtensor.hpp"
|
|
#endif
|
|
|
|
// optionally enable Eigen plug-in and load the library
|
|
#ifdef EIGEN_WORLD_VERSION
|
|
#ifndef H5_USE_EIGEN
|
|
#define H5_USE_EIGEN
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef H5_USE_EIGEN
|
|
#include <Eigen/Eigen>
|
|
#include "eigen.hpp"
|
|
#endif
|
|
|
|
// optionally enable OpenCV plug-in and load the library
|
|
#ifdef CV_MAJOR_VERSION
|
|
#ifndef H5_USE_OPENCV
|
|
#define H5_USE_OPENCV
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef H5_USE_OPENCV
|
|
#include <opencv2/opencv.hpp>
|
|
#include "experimental/opencv.hpp"
|
|
#endif
|
|
|
|
#include "H5File.hpp"
|
|
|
|
namespace H5Easy {
|
|
|
|
using HighFive::AtomicType;
|
|
using HighFive::Attribute;
|
|
using HighFive::Chunking;
|
|
using HighFive::DataSet;
|
|
using HighFive::DataSetCreateProps;
|
|
using HighFive::DataSpace;
|
|
using HighFive::Deflate;
|
|
using HighFive::Exception;
|
|
using HighFive::File;
|
|
using HighFive::ObjectType;
|
|
using HighFive::Shuffle;
|
|
|
|
///
|
|
/// \brief Write mode for DataSets
|
|
enum class DumpMode {
|
|
Create = 0, /*!< Dump only if DataSet does not exist, otherwise throw. */
|
|
Overwrite = 1 /*!< Create or overwrite if DataSet of correct shape exists, otherwise throw. */
|
|
};
|
|
|
|
///
|
|
/// \brief Signal to enable/disable automatic flushing after write operations.
|
|
enum class Flush {
|
|
False = 0, /*!< No automatic flushing. */
|
|
True = 1 /*!< Automatic flushing. */
|
|
};
|
|
|
|
///
|
|
/// \brief Signal to set compression level for written DataSets.
|
|
class Compression {
|
|
public:
|
|
///
|
|
/// \brief Enable compression with the highest compression level (9).
|
|
/// or disable compression (set compression level to 0).
|
|
///
|
|
/// \param enable ``true`` to enable with highest compression level
|
|
explicit Compression(bool enable = true);
|
|
|
|
///
|
|
/// \brief Set compression level.
|
|
///
|
|
/// \param level the compression level
|
|
template <class T>
|
|
Compression(T level);
|
|
|
|
///
|
|
/// \brief Return compression level.
|
|
inline unsigned get() const;
|
|
|
|
private:
|
|
unsigned m_compression_level;
|
|
};
|
|
|
|
///
|
|
/// \brief Define options for dumping data.
|
|
///
|
|
/// By default:
|
|
/// - DumpMode::Create
|
|
/// - Flush::True
|
|
/// - Compression: false
|
|
/// - ChunkSize: automatic
|
|
class DumpOptions {
|
|
public:
|
|
///
|
|
/// \brief Constructor: accept all default settings.
|
|
DumpOptions() = default;
|
|
|
|
///
|
|
/// \brief Constructor: overwrite (some of the) defaults.
|
|
/// \param args any of DumpMode(), Flush(), Compression() in arbitrary number and order.
|
|
template <class... Args>
|
|
DumpOptions(Args... args) {
|
|
set(args...);
|
|
}
|
|
|
|
///
|
|
/// \brief Overwrite H5Easy::DumpMode setting.
|
|
/// \param mode: DumpMode.
|
|
inline void set(DumpMode mode);
|
|
|
|
///
|
|
/// \brief Overwrite H5Easy::Flush setting.
|
|
/// \param mode Flush.
|
|
inline void set(Flush mode);
|
|
|
|
///
|
|
/// \brief Overwrite H5Easy::Compression setting.
|
|
/// \param level Compression.
|
|
inline void set(const Compression& level);
|
|
|
|
///
|
|
/// \brief Overwrite any setting(s).
|
|
/// \param arg any of DumpMode(), Flush(), Compression in arbitrary number and order.
|
|
/// \param args any of DumpMode(), Flush(), Compression in arbitrary number and order.
|
|
template <class T, class... Args>
|
|
inline void set(T arg, Args... args);
|
|
|
|
///
|
|
/// \brief Set chunk-size. If the input is rank (size) zero, automatic chunking is enabled.
|
|
/// \param shape Chunk size along each dimension.
|
|
template <class T>
|
|
inline void setChunkSize(const std::vector<T>& shape);
|
|
|
|
///
|
|
/// \brief Set chunk-size. If the input is rank (size) zero, automatic chunking is enabled.
|
|
/// \param shape Chunk size along each dimension.
|
|
inline void setChunkSize(std::initializer_list<size_t> shape);
|
|
|
|
///
|
|
/// \brief Get overwrite-mode.
|
|
/// \return bool
|
|
inline bool overwrite() const;
|
|
|
|
///
|
|
/// \brief Get flush-mode.
|
|
/// \return bool
|
|
inline bool flush() const;
|
|
|
|
///
|
|
/// \brief Get compress-mode.
|
|
/// \return bool
|
|
inline bool compress() const;
|
|
|
|
///
|
|
/// \brief Get compression level.
|
|
/// \return [0..9]
|
|
inline unsigned getCompressionLevel() const;
|
|
|
|
///
|
|
/// \brief Get chunking mode: ``true`` is manually set, ``false`` if chunk-size should be
|
|
/// computed automatically.
|
|
/// \return bool
|
|
inline bool isChunked() const;
|
|
|
|
///
|
|
/// \brief Get chunk size. Use DumpOptions::getChunkSize to check if chunk-size should
|
|
/// be automatically computed.
|
|
inline std::vector<hsize_t> getChunkSize() const;
|
|
|
|
private:
|
|
bool m_overwrite = false;
|
|
bool m_flush = true;
|
|
unsigned m_compression_level = 0;
|
|
std::vector<hsize_t> m_chunk_size = {};
|
|
};
|
|
|
|
///
|
|
/// \brief Get the size of an existing DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be readable)
|
|
/// \param path path of the DataSet
|
|
///
|
|
/// \return Size of the DataSet
|
|
inline size_t getSize(const File& file, const std::string& path);
|
|
|
|
///
|
|
/// \brief Get the shape of an existing DataSet in an readable file.
|
|
///
|
|
/// \param file opened file (has to be readable)
|
|
/// \param path Path of the DataSet
|
|
///
|
|
/// \return the shape of the DataSet
|
|
inline std::vector<size_t> getShape(const File& file, const std::string& path);
|
|
|
|
///
|
|
/// \brief Write object (templated) to a (new) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param mode write mode
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file,
|
|
const std::string& path,
|
|
const T& data,
|
|
DumpMode mode = DumpMode::Create);
|
|
|
|
///
|
|
/// \brief Write object (templated) to a (new) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param options dump options
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file, const std::string& path, const T& data, const DumpOptions& options);
|
|
|
|
///
|
|
/// \brief Write a scalar to a (new, extendible) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param idx the indices to which to write
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file,
|
|
const std::string& path,
|
|
const T& data,
|
|
const std::vector<size_t>& idx);
|
|
|
|
///
|
|
/// \brief Write a scalar to a (new, extendable) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file open File (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param idx the indices to which to write
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file,
|
|
const std::string& path,
|
|
const T& data,
|
|
const std::initializer_list<size_t>& idx);
|
|
|
|
///
|
|
/// \brief Write a scalar to a (new, extendible) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param idx the indices to which to write
|
|
/// \param options dump options
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file,
|
|
const std::string& path,
|
|
const T& data,
|
|
const std::vector<size_t>& idx,
|
|
const DumpOptions& options);
|
|
|
|
///
|
|
/// \brief Write a scalar to a (new, extendible) DataSet in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param data the data to write (any supported type)
|
|
/// \param idx the indices to which to write
|
|
/// \param options dump options
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline DataSet dump(File& file,
|
|
const std::string& path,
|
|
const T& data,
|
|
const std::initializer_list<size_t>& idx,
|
|
const DumpOptions& options);
|
|
|
|
///
|
|
/// \brief Load entry ``{i, j, ...}`` from a DataSet in an open HDF5 file to a scalar.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param idx the indices to load
|
|
/// \param path path of the DataSet
|
|
///
|
|
/// \return The read data
|
|
///
|
|
template <class T>
|
|
inline T load(const File& file, const std::string& path, const std::vector<size_t>& idx);
|
|
|
|
///
|
|
/// \brief Load a DataSet in an open HDF5 file to an object (templated).
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
///
|
|
/// \return The read data
|
|
///
|
|
template <class T>
|
|
inline T load(const File& file, const std::string& path);
|
|
|
|
///
|
|
/// \brief Write object (templated) to a (new) Attribute in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param key name of the attribute
|
|
/// \param data the data to write (any supported type)
|
|
/// \param mode write mode
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline Attribute dumpAttribute(File& file,
|
|
const std::string& path,
|
|
const std::string& key,
|
|
const T& data,
|
|
DumpMode mode = DumpMode::Create);
|
|
|
|
///
|
|
/// \brief Write object (templated) to a (new) Attribute in an open HDF5 file.
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param key name of the attribute
|
|
/// \param data the data to write (any supported type)
|
|
/// \param options dump options
|
|
///
|
|
/// \return The newly created DataSet
|
|
///
|
|
template <class T>
|
|
inline Attribute dumpAttribute(File& file,
|
|
const std::string& path,
|
|
const std::string& key,
|
|
const T& data,
|
|
const DumpOptions& options);
|
|
|
|
///
|
|
/// \brief Load a Attribute in an open HDF5 file to an object (templated).
|
|
///
|
|
/// \param file opened file (has to be writeable)
|
|
/// \param path path of the DataSet
|
|
/// \param key name of the attribute
|
|
///
|
|
/// \return The read data
|
|
///
|
|
template <class T>
|
|
inline T loadAttribute(const File& file, const std::string& path, const std::string& key);
|
|
|
|
} // namespace H5Easy
|
|
|
|
#include "h5easy_bits/H5Easy_Eigen.hpp"
|
|
#include "h5easy_bits/H5Easy_misc.hpp"
|
|
#include "h5easy_bits/H5Easy_public.hpp"
|
|
#include "h5easy_bits/H5Easy_scalar.hpp"
|