Skip to content
Snippets Groups Projects
Select Git revision
  • b6ba3cfadfb7cd7e775c14a88ef7541f7510d37a
  • master default protected
  • offload_trapping
  • script_devel
  • parallel_trapping
  • unify_iterations
  • containers-m10
  • magma_refinement
  • release9
  • enable_svd
  • parallel_angles_gmu
  • containers-m8
  • parallel_angles
  • profile_omp_leonardo
  • test_nvidia_profiler
  • containers
  • shaditest
  • test1
  • main
  • 3-error-in-run-the-program
  • experiment
  • NP_TMcode-M10a.03
  • NP_TMcode-M10a.02
  • NP_TMcode-M10a.01
  • NP_TMcode-M10a.00
  • NP_TMcode-M9.01
  • NP_TMcode-M9.00
  • NP_TMcode-M8.03
  • NP_TMcode-M8.02
  • NP_TMcode-M8.01
  • NP_TMcode-M8.00
  • NP_TMcode-M7.00
  • v0.0
33 results

file_io.h

Blame
  • file_io.h 5.60 KiB
    /*! \file file_io.h
     *
     * \brief Library to handle I/O operations with files.
     */
    #ifndef INCLUDE_FILE_IO_H_
    #define INCLUDE_FILE_IO_H_
    
    /*! \class FileSchema
     *
     * \brief File content descriptor.
     *
     * Accessing binary files requires detailed knowledge of their contents. The `FileSchema`
     * class is intended to encapsulate this information and use it as a wrapper to control
     * I/O operations towards different file formats. Any file can be thought of as a sequence
     * of records, which may further contain arbitrarily complex structures. By describing the
     * structure of records, it is possible to support virtually any type of format.
     */
    class FileSchema {
     protected:
      //! \brief Number of records conained in the file.
      int num_records;
      //! \brief Array of record names.
      std::string *record_names;
      //! \brief Array of record descriptors.
      std::string *record_types;
    
     public:
      /*! \brief FileSchema instance constructor.
       *
       * \param num_rec: `int` Number of records in the file.
       * \param rec_types: `string *` Description of the records in the file.
       * \param rec_names: `string *` Names of the records in the file.
       */
      FileSchema(int num_rec, std::string *rec_types, std::string *rec_names=NULL);
    
      /*! \brief FileSchema instance destroyer.
       */
      ~FileSchema();
    
      /*! \brief Get the number of records in file.
       *
       * \return num_records: `int` The number of records contained in the file.
       */
      int get_record_number() { return num_records; }
    
      /*! \brief Get a copy of the record types.
       *
       * \return rec_types: `string *` A new vector of strings with description of records.
       */
      std::string *get_record_names();
      /*! \brief Get a copy of the record names.
       *
       * \return rec_names: `string *` A new vector of strings with record names.
       */
      std::string *get_record_types();
    };
    
    /*! \class HDFFile
     *
     * \brief HDF5 I/O wrapper class.
     *
     * This class manages I/O operations toward HDF5 format files.
     */
    class HDFFile {
     protected:
      //! \brief Identifier list.
      List<hid_t> *id_list;
      //! \brief Name of the file.
      std::string file_name;
      //! \brief Flag for the open file status.
      bool file_open_flag;
      //! File identifier handle.
      hid_t file_id;
      //! Return status of the last operation.
      herr_t status;
    
     public:
      /*! \brief HDFFile instance constructor.
       *
       * \param name: `string` Name of the file.
       * \param flags: `unsigned int` File access flags (default is `H5F_ACC_EXCL`).
       * \param fcpl_id: `hid_t` File creation property list identifier (default is `H5P_DEFAULT`).
       * \param fapl_id: `hid_t` File access property list identifier (default is `H5P_DEFAULT`).
       */
      HDFFile(
    	  std::string name, unsigned int flags=H5F_ACC_EXCL,
    	  hid_t fcpl_id=H5P_DEFAULT, hid_t fapl_id=H5P_DEFAULT
      );
    
      /*! \brief HDFFile instance destroyer.
       */
      ~HDFFile();
      
      /*! \brief Close the current file.
       */
      herr_t close();
    
      /*! \brief Create an empty file from a `FileSchema` instance.
       *
       * \param schema: `FileSchema &` Reference to `FileSchema` instance.
       * \param name: `string` Name of the file.
       * \param flags: `unsigned int` File access flags (default is `H5F_ACC_EXCL`).
       * \param fcpl_id: `hid_t` File creation property list identifier (default is `H5P_DEFAULT`).
       * \param fapl_id: `hid_t` File access property list identifier (default is `H5P_DEFAULT`).
       * \return hdf_file: `HDFFile *` Pointer to a new, open HDF5 file.
       */
      static HDFFile* from_schema(
    			      FileSchema &schema, std::string name, unsigned int flags=H5F_ACC_EXCL,
    			      hid_t fcpl_id=H5P_DEFAULT, hid_t fapl_id=H5P_DEFAULT
      );
    
      /*! \brief Get current status.
       */
      hid_t get_file_id() { return file_id; }
      
      /*! \brief Get current status.
       */
      herr_t get_status() { return status; }
      
      /*! \brief Check whether the attached file is currently open.
       */
      bool is_open() { return file_open_flag; }
      
      /*! \brief Read data from attached file.
       *
       * \param dataset_name: `string` Name of the dataset to read from.
       * \param data_type: `string` Memory data type identifier.
       * \param buffer: `hid_t` Starting address of the memory sector to store the data.
       * \param mem_space_id: `hid_t` Memory data space identifier (defaults to `H5S_ALL`).
       * \param file_space_id: `hid_t` File space identifier (defaults to `H5S_ALL`).
       * \param dapl_id: `hid_t` Data access property list identifier (defaults to `H5P_DEFAULT`).
       * \param dxpl_id: `hid_t` Data transfer property list identifier (defaults to `H5P_DEFAULT`).
       * \return status: `herr_t` Exit status of the operation.
       */
      herr_t read(
    	       std::string dataset_name, std::string data_type, void *buffer,
    	       hid_t mem_space_id=H5S_ALL, hid_t file_space_id=H5S_ALL,
    	       hid_t dapl_id=H5P_DEFAULT, hid_t dxpl_id=H5P_DEFAULT
      );
    
      /*! \brief Write data to attached file.
       *
       * \param dataset_name: `string` Name of the dataset to write to.
       * \param data_type: `string` Memory data type identifier.
       * \param buffer: `hid_t` Starting address of the memory sector to be written.
       * \param mem_space_id: `hid_t` Memory data space identifier (defaults to `H5S_ALL`).
       * \param file_space_id: `hid_t` File space identifier (defaults to `H5S_ALL`).
       * \param dapl_id: `hid_t` Data access property list identifier (defaults to `H5P_DEFAULT`).
       * \param dxpl_id: `hid_t` Data transfer property list identifier (defaults to `H5P_DEFAULT`).
       * \return status: `herr_t` Exit status of the operation.
       */
      herr_t write(
    	       std::string dataset_name, std::string data_type, const void *buffer,
    	       hid_t mem_space_id=H5S_ALL, hid_t file_space_id=H5S_ALL,
    	       hid_t dapl_id=H5P_DEFAULT, hid_t dxpl_id=H5P_DEFAULT
      );
    };
    #endif