mirror of
https://git.gfz-potsdam.de/naaice/poet.git
synced 2025-12-16 04:48:23 +01:00
204 lines
6.6 KiB
C++
204 lines
6.6 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)
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <type_traits>
|
|
|
|
#include "H5Object.hpp"
|
|
#include "H5PropertyList.hpp"
|
|
#include "bits/H5Annotate_traits.hpp"
|
|
#include "bits/H5Node_traits.hpp"
|
|
|
|
namespace HighFive {
|
|
|
|
|
|
///
|
|
/// \brief File class
|
|
///
|
|
class File: public Object, public NodeTraits<File>, public AnnotateTraits<File> {
|
|
public:
|
|
const static ObjectType type = ObjectType::File;
|
|
|
|
enum class AccessMode {
|
|
None = 0x00u,
|
|
/// Open flag: Read only access
|
|
ReadOnly = 0x01u,
|
|
/// Open flag: Read Write access
|
|
ReadWrite = 0x02u,
|
|
/// Open flag: Truncate a file if already existing
|
|
Truncate = 0x04u,
|
|
/// Open flag: Open will fail if file already exist
|
|
Excl = 0x08u,
|
|
/// Open flag: Open in debug mode
|
|
Debug = 0x10u,
|
|
/// Open flag: Create non existing file
|
|
Create = 0x20u,
|
|
/// Derived open flag: common write mode (=ReadWrite|Create|Truncate)
|
|
Overwrite = Truncate,
|
|
/// Derived open flag: Opens RW or exclusively creates
|
|
OpenOrCreate = ReadWrite | Create
|
|
};
|
|
|
|
constexpr static AccessMode ReadOnly = AccessMode::ReadOnly;
|
|
constexpr static AccessMode ReadWrite = AccessMode::ReadWrite;
|
|
constexpr static AccessMode Truncate = AccessMode::Truncate;
|
|
constexpr static AccessMode Excl = AccessMode::Excl;
|
|
constexpr static AccessMode Debug = AccessMode::Debug;
|
|
constexpr static AccessMode Create = AccessMode::Create;
|
|
constexpr static AccessMode Overwrite = AccessMode::Overwrite;
|
|
constexpr static AccessMode OpenOrCreate = AccessMode::OpenOrCreate;
|
|
|
|
///
|
|
/// \brief File
|
|
/// \param filename: filepath of the HDF5 file
|
|
/// \param openFlags: Open mode / flags ( ReadOnly, ReadWrite)
|
|
/// \param fileAccessProps: the file access properties
|
|
///
|
|
/// Open or create a new HDF5 file
|
|
explicit File(const std::string& filename,
|
|
AccessMode openFlags = ReadOnly,
|
|
const FileAccessProps& fileAccessProps = FileAccessProps::Default());
|
|
|
|
///
|
|
/// \brief File
|
|
/// \param filename: filepath of the HDF5 file
|
|
/// \param access_mode: Open mode / flags ( ReadOnly, ReadWrite, etc.)
|
|
/// \param fileCreateProps: the file create properties
|
|
/// \param fileAccessProps: the file access properties
|
|
///
|
|
/// Open or create a new HDF5 file
|
|
File(const std::string& filename,
|
|
AccessMode access_mode,
|
|
const FileCreateProps& fileCreateProps,
|
|
const FileAccessProps& fileAccessProps = FileAccessProps::Default());
|
|
|
|
/// \brief Keeps reference count constant, and invalidates other.
|
|
File(File&& other) noexcept = default;
|
|
|
|
/// \brief Keeps reference count constant, and invalidates other.
|
|
File& operator=(File&& other) = default;
|
|
|
|
/// \brief Increments reference count, keeps other valid.
|
|
File(const File& other) = default;
|
|
|
|
/// \brief Increments reference count, keeps other valid.
|
|
File& operator=(const File& other) = default;
|
|
|
|
///
|
|
/// \brief Return the name of the file
|
|
///
|
|
const std::string& getName() const;
|
|
|
|
/// \brief Object path of a File is always "/"
|
|
std::string getPath() const noexcept {
|
|
return "/";
|
|
}
|
|
|
|
/// \brief Returns the block size for metadata in bytes
|
|
hsize_t getMetadataBlockSize() const;
|
|
|
|
/// \brief Returns the HDF5 version compatibility bounds
|
|
std::pair<H5F_libver_t, H5F_libver_t> getVersionBounds() const;
|
|
|
|
#if H5_VERSION_GE(1, 10, 1)
|
|
/// \brief Returns the HDF5 file space strategy.
|
|
H5F_fspace_strategy_t getFileSpaceStrategy() const;
|
|
|
|
/// \brief Returns the page size, if paged allocation is used.
|
|
hsize_t getFileSpacePageSize() const;
|
|
#endif
|
|
|
|
///
|
|
/// \brief flush
|
|
///
|
|
/// Flushes all buffers associated with a file to disk
|
|
///
|
|
void flush();
|
|
|
|
/// \brief Get the list of properties for creation of this file
|
|
FileCreateProps getCreatePropertyList() const {
|
|
return details::get_plist<FileCreateProps>(*this, H5Fget_create_plist);
|
|
}
|
|
|
|
/// \brief Get the list of properties for accession of this file
|
|
FileAccessProps getAccessPropertyList() const {
|
|
return details::get_plist<FileAccessProps>(*this, H5Fget_access_plist);
|
|
}
|
|
|
|
/// \brief Get the size of this file in bytes
|
|
size_t getFileSize() const;
|
|
|
|
/// \brief Get the amount of tracked, unused space in bytes.
|
|
///
|
|
/// Note, this is a wrapper for `H5Fget_freespace` and returns the number
|
|
/// bytes in the free space manager. This might be different from the total
|
|
/// amount of unused space in the HDF5 file, since the free space manager
|
|
/// might not track everything or not track across open-close cycles.
|
|
size_t getFreeSpace() const;
|
|
|
|
protected:
|
|
File() = default;
|
|
using Object::Object;
|
|
|
|
private:
|
|
mutable std::string _filename{};
|
|
|
|
template <typename>
|
|
friend class PathTraits;
|
|
};
|
|
|
|
inline File::AccessMode operator|(File::AccessMode lhs, File::AccessMode rhs) {
|
|
using int_t = std::underlying_type<File::AccessMode>::type;
|
|
return static_cast<File::AccessMode>(static_cast<int_t>(lhs) | static_cast<int_t>(rhs));
|
|
}
|
|
|
|
inline File::AccessMode operator&(File::AccessMode lhs, File::AccessMode rhs) {
|
|
using int_t = std::underlying_type<File::AccessMode>::type;
|
|
return static_cast<File::AccessMode>(static_cast<int_t>(lhs) & static_cast<int_t>(rhs));
|
|
}
|
|
|
|
inline File::AccessMode operator^(File::AccessMode lhs, File::AccessMode rhs) {
|
|
using int_t = std::underlying_type<File::AccessMode>::type;
|
|
return static_cast<File::AccessMode>(static_cast<int_t>(lhs) ^ static_cast<int_t>(rhs));
|
|
}
|
|
|
|
inline File::AccessMode operator~(File::AccessMode mode) {
|
|
using int_t = std::underlying_type<File::AccessMode>::type;
|
|
return static_cast<File::AccessMode>(~static_cast<int_t>(mode));
|
|
}
|
|
|
|
inline const File::AccessMode& operator|=(File::AccessMode& lhs, File::AccessMode rhs) {
|
|
lhs = lhs | rhs;
|
|
return lhs;
|
|
}
|
|
|
|
inline File::AccessMode operator&=(File::AccessMode& lhs, File::AccessMode rhs) {
|
|
lhs = lhs & rhs;
|
|
return lhs;
|
|
}
|
|
|
|
inline File::AccessMode operator^=(File::AccessMode& lhs, File::AccessMode rhs) {
|
|
lhs = lhs ^ rhs;
|
|
return lhs;
|
|
}
|
|
|
|
inline bool any(File::AccessMode mode) {
|
|
return mode != File::AccessMode::None;
|
|
}
|
|
|
|
|
|
} // namespace HighFive
|
|
|
|
// H5File is the main user constructible -> bring in implementation headers
|
|
#include "bits/H5Annotate_traits_misc.hpp"
|
|
#include "bits/H5File_misc.hpp"
|
|
#include "bits/H5Node_traits_misc.hpp"
|
|
#include "bits/H5Path_traits_misc.hpp"
|