Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-29 09:12:12

0001 /*
0002  *  Copyright (c), 2017, Adrien Devresse <adrien.devresse@epfl.ch>
0003  *
0004  *  Distributed under the Boost Software License, Version 1.0.
0005  *    (See accompanying file LICENSE_1_0.txt or copy at
0006  *          http://www.boost.org/LICENSE_1_0.txt)
0007  *
0008  */
0009 #pragma once
0010 
0011 #include <string>
0012 #include <type_traits>
0013 
0014 #include "H5Object.hpp"
0015 #include "H5PropertyList.hpp"
0016 #include "bits/H5Annotate_traits.hpp"
0017 #include "bits/H5Node_traits.hpp"
0018 
0019 namespace HighFive {
0020 
0021 
0022 ///
0023 /// \brief File class
0024 ///
0025 class File: public Object, public NodeTraits<File>, public AnnotateTraits<File> {
0026   public:
0027     const static ObjectType type = ObjectType::File;
0028 
0029     enum class AccessMode {
0030         None = 0x00u,
0031         /// Open flag: Read only access
0032         ReadOnly = 0x01u,
0033         /// Open flag: Read Write access
0034         ReadWrite = 0x02u,
0035         /// Open flag: Truncate a file if already existing
0036         Truncate = 0x04u,
0037         /// Open flag: Open will fail if file already exist
0038         Excl = 0x08u,
0039         /// Open flag: Open in debug mode
0040         Debug = 0x10u,
0041         /// Open flag: Create non existing file
0042         Create = 0x20u,
0043         /// Open flag: Open in SWMR read
0044         ReadSWMR = 0x40u,
0045         /// Open flag: Open in SWMR write
0046         WriteSWMR = 0x80u,
0047         /// Derived open flag: common write mode (=ReadWrite|Create|Truncate)
0048         Overwrite = Truncate,
0049         /// Derived open flag: Opens RW or exclusively creates
0050         OpenOrCreate = ReadWrite | Create
0051     };
0052 
0053     constexpr static AccessMode ReadOnly = AccessMode::ReadOnly;
0054     constexpr static AccessMode ReadWrite = AccessMode::ReadWrite;
0055     constexpr static AccessMode Truncate = AccessMode::Truncate;
0056     constexpr static AccessMode Excl = AccessMode::Excl;
0057     constexpr static AccessMode Debug = AccessMode::Debug;
0058     constexpr static AccessMode Create = AccessMode::Create;
0059     constexpr static AccessMode Overwrite = AccessMode::Overwrite;
0060     constexpr static AccessMode OpenOrCreate = AccessMode::OpenOrCreate;
0061     constexpr static AccessMode ReadSWMR = AccessMode::ReadSWMR;
0062     constexpr static AccessMode WriteSWMR = AccessMode::WriteSWMR;
0063 
0064     ///
0065     /// \brief File
0066     /// \param filename: filepath of the HDF5 file
0067     /// \param openFlags: Open mode / flags ( ReadOnly, ReadWrite)
0068     /// \param fileAccessProps: the file access properties
0069     ///
0070     /// Open or create a new HDF5 file
0071     explicit File(const std::string& filename,
0072                   AccessMode openFlags = ReadOnly,
0073                   const FileAccessProps& fileAccessProps = FileAccessProps::Default());
0074 
0075     ///
0076     /// \brief File
0077     /// \param filename: filepath of the HDF5 file
0078     /// \param access_mode: Open mode / flags ( ReadOnly, ReadWrite, etc.)
0079     /// \param fileCreateProps: the file create properties
0080     /// \param fileAccessProps: the file access properties
0081     ///
0082     /// Open or create a new HDF5 file
0083     File(const std::string& filename,
0084          AccessMode access_mode,
0085          const FileCreateProps& fileCreateProps,
0086          const FileAccessProps& fileAccessProps = FileAccessProps::Default());
0087 
0088     /// \brief Keeps reference count constant, and invalidates other.
0089     File(File&& other) noexcept = default;
0090 
0091     /// \brief Keeps reference count constant, and invalidates other.
0092     File& operator=(File&& other) = default;
0093 
0094     /// \brief Increments reference count, keeps other valid.
0095     File(const File& other) = default;
0096 
0097     /// \brief Increments reference count, keeps other valid.
0098     File& operator=(const File& other) = default;
0099 
0100     ///
0101     /// \brief Return the name of the file
0102     ///
0103     const std::string& getName() const;
0104 
0105     /// \brief Object path of a File is always "/"
0106     std::string getPath() const noexcept {
0107         return "/";
0108     }
0109 
0110     /// \brief Returns the block size for metadata in bytes
0111     hsize_t getMetadataBlockSize() const;
0112 
0113     /// \brief Returns the HDF5 version compatibility bounds
0114     std::pair<H5F_libver_t, H5F_libver_t> getVersionBounds() const;
0115 
0116 #if H5_VERSION_GE(1, 10, 1)
0117     /// \brief Returns the HDF5 file space strategy.
0118     H5F_fspace_strategy_t getFileSpaceStrategy() const;
0119 
0120     /// \brief Returns the page size, if paged allocation is used.
0121     hsize_t getFileSpacePageSize() const;
0122 #endif
0123 
0124     ///
0125     /// \brief flush
0126     ///
0127     /// Flushes all buffers associated with a file to disk
0128     ///
0129     void flush();
0130 
0131 #if H5_VERSION_GE(1, 10, 0)
0132     /// \brief Switches file to SWMR write mode
0133     void startSWMRWrite();
0134 #endif
0135 
0136     /// \brief Get the list of properties for creation of this file
0137     FileCreateProps getCreatePropertyList() const {
0138         return details::get_plist<FileCreateProps>(*this, H5Fget_create_plist);
0139     }
0140 
0141     /// \brief Get the list of properties for accession of this file
0142     FileAccessProps getAccessPropertyList() const {
0143         return details::get_plist<FileAccessProps>(*this, H5Fget_access_plist);
0144     }
0145 
0146     /// \brief Get the size of this file in bytes
0147     size_t getFileSize() const;
0148 
0149     /// \brief Get the amount of tracked, unused space in bytes.
0150     ///
0151     /// Note, this is a wrapper for `H5Fget_freespace` and returns the number
0152     /// bytes in the free space manager. This might be different from the total
0153     /// amount of unused space in the HDF5 file, since the free space manager
0154     /// might not track everything or not track across open-close cycles.
0155     size_t getFreeSpace() const;
0156 
0157   protected:
0158     File() = default;
0159     using Object::Object;
0160 
0161   private:
0162     mutable std::string _filename{};
0163 
0164     template <typename>
0165     friend class PathTraits;
0166 };
0167 
0168 inline File::AccessMode operator|(File::AccessMode lhs, File::AccessMode rhs) {
0169     using int_t = std::underlying_type<File::AccessMode>::type;
0170     return static_cast<File::AccessMode>(static_cast<int_t>(lhs) | static_cast<int_t>(rhs));
0171 }
0172 
0173 inline File::AccessMode operator&(File::AccessMode lhs, File::AccessMode rhs) {
0174     using int_t = std::underlying_type<File::AccessMode>::type;
0175     return static_cast<File::AccessMode>(static_cast<int_t>(lhs) & static_cast<int_t>(rhs));
0176 }
0177 
0178 inline File::AccessMode operator^(File::AccessMode lhs, File::AccessMode rhs) {
0179     using int_t = std::underlying_type<File::AccessMode>::type;
0180     return static_cast<File::AccessMode>(static_cast<int_t>(lhs) ^ static_cast<int_t>(rhs));
0181 }
0182 
0183 inline File::AccessMode operator~(File::AccessMode mode) {
0184     using int_t = std::underlying_type<File::AccessMode>::type;
0185     return static_cast<File::AccessMode>(~static_cast<int_t>(mode));
0186 }
0187 
0188 inline const File::AccessMode& operator|=(File::AccessMode& lhs, File::AccessMode rhs) {
0189     lhs = lhs | rhs;
0190     return lhs;
0191 }
0192 
0193 inline File::AccessMode operator&=(File::AccessMode& lhs, File::AccessMode rhs) {
0194     lhs = lhs & rhs;
0195     return lhs;
0196 }
0197 
0198 inline File::AccessMode operator^=(File::AccessMode& lhs, File::AccessMode rhs) {
0199     lhs = lhs ^ rhs;
0200     return lhs;
0201 }
0202 
0203 inline bool any(File::AccessMode mode) {
0204     return mode != File::AccessMode::None;
0205 }
0206 
0207 
0208 }  // namespace HighFive
0209 
0210 // H5File is the main user constructible -> bring in implementation headers
0211 #include "bits/H5Annotate_traits_misc.hpp"
0212 #include "bits/H5File_misc.hpp"
0213 #include "bits/H5Node_traits_misc.hpp"
0214 #include "bits/H5Path_traits_misc.hpp"