From 9854500a6fef32bfbc0a68918c77c75d429a3c5e Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 2 Apr 2024 14:32:04 +0200 Subject: [PATCH 1/5] moving m_fname into respective class --- file_io/include/aare/FileInterface.h | 2 +- file_io/include/aare/FileInterface.hpp | 2 +- file_io/include/aare/NumpyFile.hpp | 8 ++++++-- file_io/include/aare/RawFile.hpp | 2 ++ file_io/src/NumpyFile.cpp | 28 ++++++++++++++------------ 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/file_io/include/aare/FileInterface.h b/file_io/include/aare/FileInterface.h index bb93393..fe02699 100644 --- a/file_io/include/aare/FileInterface.h +++ b/file_io/include/aare/FileInterface.h @@ -9,7 +9,7 @@ public: // - w writing (overwrites existing file) // - a appending (appends to existing file) // TODO! do we need to support w+, r+ and a+? - FileInterface(std::filesystem::path& fname, const char* opts="r" ){}; + FileInterface(const std::filesystem::path& fname, const char* opts="r" ){}; // write one frame virtual void write(Frame& frame) = 0; diff --git a/file_io/include/aare/FileInterface.hpp b/file_io/include/aare/FileInterface.hpp index 7e2dfb6..c8774af 100644 --- a/file_io/include/aare/FileInterface.hpp +++ b/file_io/include/aare/FileInterface.hpp @@ -83,7 +83,7 @@ class FileInterface { public: std::string mode; - std::filesystem::path m_fname; + // std::filesystem::path m_fname; std::filesystem::path m_base_path; std::string m_base_name, m_ext; int m_findex; diff --git a/file_io/include/aare/NumpyFile.hpp b/file_io/include/aare/NumpyFile.hpp index 7f8192f..90da019 100644 --- a/file_io/include/aare/NumpyFile.hpp +++ b/file_io/include/aare/NumpyFile.hpp @@ -4,15 +4,21 @@ #include "aare/defs.hpp" #include #include +#include namespace aare{ class NumpyFile : public FileInterface { FILE *fp = nullptr; size_t initial_header_len = 0; + public: + std::filesystem::path m_fname; //TO be made private! + + NumpyFile(const std::filesystem::path& fname); + NumpyFile(FileConfig, header_t); void write(Frame &frame) override; Frame read() override { return get_frame(this->current_frame++); } @@ -29,8 +35,6 @@ class NumpyFile : public FileInterface { ssize_t cols() const override { return header.shape[2]; } ssize_t bitdepth() const override { return header.dtype.bitdepth(); } - NumpyFile(std::filesystem::path fname); - NumpyFile(FileConfig, header_t); header_t header; uint8_t major_ver_{}; uint8_t minor_ver_{}; diff --git a/file_io/include/aare/RawFile.hpp b/file_io/include/aare/RawFile.hpp index 59300db..5630e40 100644 --- a/file_io/include/aare/RawFile.hpp +++ b/file_io/include/aare/RawFile.hpp @@ -9,8 +9,10 @@ namespace aare { class RawFile : public FileInterface { using config = RawFileConfig; + public: + std::filesystem::path m_fname; //TO be made private! void write(Frame &frame) override{}; Frame read() override { return get_frame(this->current_frame++); }; std::vector read(size_t n_frames) override; diff --git a/file_io/src/NumpyFile.cpp b/file_io/src/NumpyFile.cpp index 0d7df8d..9b4f63d 100644 --- a/file_io/src/NumpyFile.cpp +++ b/file_io/src/NumpyFile.cpp @@ -3,19 +3,8 @@ namespace aare{ -void NumpyFile::write(Frame &frame) { - if (fp == nullptr) { - throw std::runtime_error("File not open"); - } - if (not(mode == "w" or mode == "a")) { - throw std::runtime_error("File not open for writing"); - } - fseek(fp, 0, SEEK_END); - fwrite(frame._get_data(), frame.size(), 1, fp); -} - -NumpyFile::NumpyFile(std::filesystem::path fname_) { - this->m_fname = fname_; +NumpyFile::NumpyFile(const std::filesystem::path& fname) { + this->m_fname = fname; fp = fopen(this->m_fname.c_str(), "rb"); } NumpyFile::NumpyFile(FileConfig config, header_t header) { @@ -36,6 +25,19 @@ NumpyFile::NumpyFile(FileConfig config, header_t header) { aare::NumpyHelpers::write_header(std::filesystem::path(this->m_fname.c_str()), this->header); } +void NumpyFile::write(Frame &frame) { + if (fp == nullptr) { + throw std::runtime_error("File not open"); + } + if (not(mode == "w" or mode == "a")) { + throw std::runtime_error("File not open for writing"); + } + fseek(fp, 0, SEEK_END); + fwrite(frame._get_data(), frame.size(), 1, fp); +} + + + Frame NumpyFile::get_frame(size_t frame_number) { Frame frame(header.shape[1], header.shape[2], header.dtype.bitdepth()); get_frame_into(frame_number, frame._get_data()); From 390ceb02d80afda63278540c9fa4cf6b7c3e0a6a Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 2 Apr 2024 14:36:55 +0200 Subject: [PATCH 2/5] renamed NumpyFile member variable header to m_header --- file_io/include/aare/NumpyFile.hpp | 20 ++++++------- file_io/src/NumpyFile.cpp | 46 +++++++++++++++--------------- file_io/src/NumpyFileFactory.cpp | 2 +- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/file_io/include/aare/NumpyFile.hpp b/file_io/include/aare/NumpyFile.hpp index 90da019..9eba616 100644 --- a/file_io/include/aare/NumpyFile.hpp +++ b/file_io/include/aare/NumpyFile.hpp @@ -11,7 +11,9 @@ namespace aare{ class NumpyFile : public FileInterface { FILE *fp = nullptr; size_t initial_header_len = 0; - + size_t current_frame{}; + void get_frame_into(size_t, std::byte *); + Frame get_frame(size_t frame_number); public: @@ -30,12 +32,12 @@ class NumpyFile : public FileInterface { size_t pixels() override; void seek(size_t frame_number) override { this->current_frame = frame_number; } size_t tell() override { return this->current_frame; } - size_t total_frames() const override { return header.shape[0]; } - ssize_t rows() const override { return header.shape[1]; } - ssize_t cols() const override { return header.shape[2]; } - ssize_t bitdepth() const override { return header.dtype.bitdepth(); } + size_t total_frames() const override { return m_header.shape[0]; } + ssize_t rows() const override { return m_header.shape[1]; } + ssize_t cols() const override { return m_header.shape[2]; } + ssize_t bitdepth() const override { return m_header.dtype.bitdepth(); } - header_t header; + header_t m_header; uint8_t major_ver_{}; uint8_t minor_ver_{}; uint32_t header_len{}; @@ -44,10 +46,8 @@ class NumpyFile : public FileInterface { ~NumpyFile(); - private: - size_t current_frame{}; - void get_frame_into(size_t, std::byte *); - Frame get_frame(size_t frame_number); + + }; } // namespace aare \ No newline at end of file diff --git a/file_io/src/NumpyFile.cpp b/file_io/src/NumpyFile.cpp index 9b4f63d..d84e1e6 100644 --- a/file_io/src/NumpyFile.cpp +++ b/file_io/src/NumpyFile.cpp @@ -4,25 +4,25 @@ namespace aare{ NumpyFile::NumpyFile(const std::filesystem::path& fname) { - this->m_fname = fname; - fp = fopen(this->m_fname.c_str(), "rb"); + m_fname = fname; + fp = fopen(m_fname.c_str(), "rb"); } NumpyFile::NumpyFile(FileConfig config, header_t header) { - this->mode = "w"; - this->m_fname = config.fname; - this->m_bitdepth = config.dtype.bitdepth(); - this->m_rows = config.rows; - this->m_cols = config.cols; - this->header = header; - this->header.shape = {0, config.rows, config.cols}; + mode = "w"; + m_fname = config.fname; + m_bitdepth = config.dtype.bitdepth(); + m_rows = config.rows; + m_cols = config.cols; + m_header = header; + m_header.shape = {0, config.rows, config.cols}; - fp = fopen(this->m_fname.c_str(), "wb"); + fp = fopen(m_fname.c_str(), "wb"); if (!fp) { - throw std::runtime_error(fmt::format("Could not open: {} for reading", this->m_fname.c_str())); + throw std::runtime_error(fmt::format("Could not open: {} for reading", m_fname.c_str())); } - this->initial_header_len = - aare::NumpyHelpers::write_header(std::filesystem::path(this->m_fname.c_str()), this->header); + initial_header_len = + aare::NumpyHelpers::write_header(std::filesystem::path(m_fname.c_str()), header); } void NumpyFile::write(Frame &frame) { @@ -39,7 +39,7 @@ void NumpyFile::write(Frame &frame) { Frame NumpyFile::get_frame(size_t frame_number) { - Frame frame(header.shape[1], header.shape[2], header.dtype.bitdepth()); + Frame frame(m_header.shape[1], m_header.shape[2], m_header.dtype.bitdepth()); get_frame_into(frame_number, frame._get_data()); return frame; } @@ -47,7 +47,7 @@ void NumpyFile::get_frame_into(size_t frame_number, std::byte *image_buf) { if (fp == nullptr) { throw std::runtime_error("File not open"); } - if (frame_number > header.shape[0]) { + if (frame_number > m_header.shape[0]) { throw std::runtime_error("Frame number out of range"); } fseek(fp, header_size + frame_number * bytes_per_frame(), SEEK_SET); @@ -55,24 +55,24 @@ void NumpyFile::get_frame_into(size_t frame_number, std::byte *image_buf) { } size_t NumpyFile::pixels() { - return std::accumulate(header.shape.begin() + 1, header.shape.end(), 1, std::multiplies()); + return std::accumulate(m_header.shape.begin() + 1, m_header.shape.end(), 1, std::multiplies()); }; -size_t NumpyFile::bytes_per_frame() { return header.dtype.bitdepth() / 8 * pixels(); }; +size_t NumpyFile::bytes_per_frame() { return m_header.dtype.bitdepth() / 8 * pixels(); }; std::vector NumpyFile::read(size_t n_frames) { // TODO: implement this in a more efficient way std::vector frames; for (size_t i = 0; i < n_frames; i++) { - frames.push_back(this->get_frame(this->current_frame)); - this->current_frame++; + frames.push_back(get_frame(current_frame)); + current_frame++; } return frames; } void NumpyFile::read_into(std::byte *image_buf, size_t n_frames) { // TODO: implement this in a more efficient way for (size_t i = 0; i < n_frames; i++) { - this->get_frame_into(this->current_frame++, image_buf); - image_buf += this->bytes_per_frame(); + get_frame_into(current_frame++, image_buf); + image_buf += bytes_per_frame(); } } @@ -84,11 +84,11 @@ NumpyFile::~NumpyFile() { size_t data_size = file_size - initial_header_len; size_t n_frames = data_size / bytes_per_frame(); // update number of frames in header (first element of shape) - this->header.shape[0] = n_frames; + m_header.shape[0] = n_frames; fseek(fp, 0, SEEK_SET); // create string stream to contain header std::stringstream ss; - aare::NumpyHelpers::write_header(ss, this->header); + aare::NumpyHelpers::write_header(ss, m_header); std::string header_str = ss.str(); // write header fwrite(header_str.c_str(), header_str.size(), 1, fp); diff --git a/file_io/src/NumpyFileFactory.cpp b/file_io/src/NumpyFileFactory.cpp index 7d3681b..158a710 100644 --- a/file_io/src/NumpyFileFactory.cpp +++ b/file_io/src/NumpyFileFactory.cpp @@ -70,7 +70,7 @@ void NumpyFileFactory::parse_metadata(FileInterface *_file) { auto dim = static_cast(std::stoul(item)); shape.push_back(dim); } - file->header = {dtype, fortran_order, shape}; + file->m_header = {dtype, fortran_order, shape}; } NumpyFile *NumpyFileFactory::load_file_read() { From a6c0879de7b5743e61d573fc5bcd13da6929269a Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 2 Apr 2024 15:01:56 +0200 Subject: [PATCH 3/5] moved reading of metadata into NumpyFile --- file_io/include/aare/FileInterface.h | 56 ---------------- file_io/include/aare/NumpyFile.hpp | 4 +- file_io/include/aare/NumpyFileFactory.hpp | 2 +- file_io/src/NumpyFile.cpp | 78 +++++++++++++++++++++++ file_io/src/NumpyFileFactory.cpp | 68 -------------------- 5 files changed, 82 insertions(+), 126 deletions(-) delete mode 100644 file_io/include/aare/FileInterface.h diff --git a/file_io/include/aare/FileInterface.h b/file_io/include/aare/FileInterface.h deleted file mode 100644 index fe02699..0000000 --- a/file_io/include/aare/FileInterface.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -#include "aare/Frame.hpp" -#include -namespace aare { -class FileInterface { -public: - // options: - // - r reading - // - w writing (overwrites existing file) - // - a appending (appends to existing file) - // TODO! do we need to support w+, r+ and a+? - FileInterface(const std::filesystem::path& fname, const char* opts="r" ){}; - - // write one frame - virtual void write(Frame& frame) = 0; - - // write n_frames frames - virtual void write(std::vector& frames) = 0; - - // read one frame - virtual Frame read() = 0; - - // read n_frames frames - virtual std::vector read(size_t n_frames) = 0; //Is this the right interface? - - // read one frame into the provided buffer - virtual void read_into(std::byte* image_buf) = 0; - - // read n_frames frame into the provided buffer - virtual void read_into(std::byte* image_buf, size_t n_frames) = 0; - - // read the frame number on position frame_index - virtual size_t frame_number(size_t frame_index) = 0; - - // size of one frame, important fro teh read_into function - virtual size_t bytes_per_frame() const = 0; - - // goto frame number - virtual void seek(size_t frame_number) = 0; - - // return the position of the file pointer (in number of frames) - virtual size_t tell() = 0; - - // total number of frames in the file - virtual size_t total_frames() = 0; - - virtual size_t rows() const = 0; - - virtual size_t cols() const = 0; - - // function to query the data type of the file - /*virtual DataType dtype = 0; */ - - virtual ~FileInterface() = 0; -}; -} // namespace aare diff --git a/file_io/include/aare/NumpyFile.hpp b/file_io/include/aare/NumpyFile.hpp index 9eba616..7381e96 100644 --- a/file_io/include/aare/NumpyFile.hpp +++ b/file_io/include/aare/NumpyFile.hpp @@ -15,9 +15,11 @@ class NumpyFile : public FileInterface { void get_frame_into(size_t, std::byte *); Frame get_frame(size_t frame_number); + void load_metadata(); + std::filesystem::path m_fname; public: - std::filesystem::path m_fname; //TO be made private! + NumpyFile(const std::filesystem::path& fname); NumpyFile(FileConfig, header_t); diff --git a/file_io/include/aare/NumpyFileFactory.hpp b/file_io/include/aare/NumpyFileFactory.hpp index 8fb7a43..f78565e 100644 --- a/file_io/include/aare/NumpyFileFactory.hpp +++ b/file_io/include/aare/NumpyFileFactory.hpp @@ -13,7 +13,7 @@ class NumpyFileFactory : public FileFactory { public: NumpyFileFactory(std::filesystem::path fpath); - void parse_metadata(FileInterface *_file) override; + void parse_metadata(FileInterface *_file) override{/*TODO! remove after refactor*/}; NumpyFile* load_file_read() override; NumpyFile* load_file_write(FileConfig) override; void parse_fname(FileInterface*)override{}; diff --git a/file_io/src/NumpyFile.cpp b/file_io/src/NumpyFile.cpp index d84e1e6..d21429e 100644 --- a/file_io/src/NumpyFile.cpp +++ b/file_io/src/NumpyFile.cpp @@ -4,8 +4,13 @@ namespace aare{ NumpyFile::NumpyFile(const std::filesystem::path& fname) { + //TODO! add opts to constructor m_fname = fname; fp = fopen(m_fname.c_str(), "rb"); + if (!fp) { + throw std::runtime_error(fmt::format("Could not open: {} for reading", m_fname.c_str())); + } + load_metadata(); } NumpyFile::NumpyFile(FileConfig config, header_t header) { mode = "w"; @@ -102,4 +107,77 @@ NumpyFile::~NumpyFile() { } } +void NumpyFile::load_metadata(){ + + // auto file = dynamic_cast(_file); + // // open ifsteam to file + // f = std::ifstream(file->m_fname, std::ios::binary); + // // check if file exists + // if (!f.is_open()) { + // throw std::runtime_error(fmt::format("Could not open: \"{}\" for reading", file->m_fname.c_str())); + // } + + // read magic number + std::array tmp{}; + fread(tmp.data(), tmp.size(), 1, fp); + if (tmp != aare::NumpyHelpers::magic_str) { + for (auto item : tmp) + fmt::print("{}, ", int(item)); + fmt::print("\n"); + throw std::runtime_error("Not a numpy file"); + } + + // read version + fread(reinterpret_cast(&major_ver_),sizeof(major_ver_), 1,fp); + fread(reinterpret_cast(&minor_ver_), sizeof(minor_ver_),1,fp); + + if (major_ver_ == 1) { + header_len_size = 2; + } else if (major_ver_ == 2) { + header_len_size = 4; + } else { + throw std::runtime_error("Unsupported numpy version"); + } + + // read header length + fread(reinterpret_cast(&header_len), header_len_size,1, fp); + header_size = aare::NumpyHelpers::magic_string_length + 2 + header_len_size + header_len; + if (header_size % 16 != 0) { + fmt::print("Warning: header length is not a multiple of 16\n"); + } + // read header + auto buf_v = std::vector(header_len); + fread(buf_v.data(), header_len,1,fp); + std::string header(buf_v.data(), header_len); + + // parse header + + std::vector keys{"descr", "fortran_order", "shape"}; + aare::logger::debug("original header: \"header\""); + + auto dict_map = aare::NumpyHelpers::parse_dict(header, keys); + if (dict_map.size() == 0) + throw std::runtime_error("invalid dictionary in header"); + + std::string descr_s = dict_map["descr"]; + std::string fortran_s = dict_map["fortran_order"]; + std::string shape_s = dict_map["shape"]; + + std::string descr = aare::NumpyHelpers::parse_str(descr_s); + aare::DType dtype = aare::NumpyHelpers::parse_descr(descr); + + // convert literal Python bool to C++ bool + bool fortran_order = aare::NumpyHelpers::parse_bool(fortran_s); + + // parse the shape tuple + auto shape_v = aare::NumpyHelpers::parse_tuple(shape_s); + shape_t shape; + for (auto item : shape_v) { + auto dim = static_cast(std::stoul(item)); + shape.push_back(dim); + } + m_header = {dtype, fortran_order, shape}; +} + + } // namespace aare \ No newline at end of file diff --git a/file_io/src/NumpyFileFactory.cpp b/file_io/src/NumpyFileFactory.cpp index 158a710..e9646a1 100644 --- a/file_io/src/NumpyFileFactory.cpp +++ b/file_io/src/NumpyFileFactory.cpp @@ -4,78 +4,10 @@ namespace aare { NumpyFileFactory::NumpyFileFactory(std::filesystem::path fpath) { this->m_fpath = fpath; } -void NumpyFileFactory::parse_metadata(FileInterface *_file) { - auto file = dynamic_cast(_file); - // open ifsteam to file - f = std::ifstream(file->m_fname, std::ios::binary); - // check if file exists - if (!f.is_open()) { - throw std::runtime_error(fmt::format("Could not open: {} for reading", file->m_fname.c_str())); - } - // read magic number - std::array tmp{}; - f.read(tmp.data(), tmp.size()); - if (tmp != aare::NumpyHelpers::magic_str) { - for (auto item : tmp) - fmt::print("{}, ", int(item)); - fmt::print("\n"); - throw std::runtime_error("Not a numpy file"); - } - // read version - f.read(reinterpret_cast(&file->major_ver_), 1); - f.read(reinterpret_cast(&file->minor_ver_), 1); - - if (file->major_ver_ == 1) { - file->header_len_size = 2; - } else if (file->major_ver_ == 2) { - file->header_len_size = 4; - } else { - throw std::runtime_error("Unsupported numpy version"); - } - // read header length - f.read(reinterpret_cast(&file->header_len), file->header_len_size); - file->header_size = aare::NumpyHelpers::magic_string_length + 2 + file->header_len_size + file->header_len; - if (file->header_size % 16 != 0) { - fmt::print("Warning: header length is not a multiple of 16\n"); - } - // read header - auto buf_v = std::vector(file->header_len); - f.read(buf_v.data(), file->header_len); - std::string header(buf_v.data(), file->header_len); - - // parse header - - std::vector keys{"descr", "fortran_order", "shape"}; - aare::logger::debug("original header: \"header\""); - - auto dict_map = aare::NumpyHelpers::parse_dict(header, keys); - if (dict_map.size() == 0) - throw std::runtime_error("invalid dictionary in header"); - - std::string descr_s = dict_map["descr"]; - std::string fortran_s = dict_map["fortran_order"]; - std::string shape_s = dict_map["shape"]; - - std::string descr = aare::NumpyHelpers::parse_str(descr_s); - aare::DType dtype = aare::NumpyHelpers::parse_descr(descr); - - // convert literal Python bool to C++ bool - bool fortran_order = aare::NumpyHelpers::parse_bool(fortran_s); - - // parse the shape tuple - auto shape_v = aare::NumpyHelpers::parse_tuple(shape_s); - shape_t shape; - for (auto item : shape_v) { - auto dim = static_cast(std::stoul(item)); - shape.push_back(dim); - } - file->m_header = {dtype, fortran_order, shape}; -} NumpyFile *NumpyFileFactory::load_file_read() { NumpyFile *file = new NumpyFile(this->m_fpath); - parse_metadata(file); return file; }; From e59940aa0196d66cb18d4cfdcb1554c14e486ee2 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 2 Apr 2024 15:05:09 +0200 Subject: [PATCH 4/5] formatting --- file_io/src/NumpyFile.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/file_io/src/NumpyFile.cpp b/file_io/src/NumpyFile.cpp index d21429e..44f452b 100644 --- a/file_io/src/NumpyFile.cpp +++ b/file_io/src/NumpyFile.cpp @@ -109,14 +109,6 @@ NumpyFile::~NumpyFile() { void NumpyFile::load_metadata(){ - // auto file = dynamic_cast(_file); - // // open ifsteam to file - // f = std::ifstream(file->m_fname, std::ios::binary); - // // check if file exists - // if (!f.is_open()) { - // throw std::runtime_error(fmt::format("Could not open: \"{}\" for reading", file->m_fname.c_str())); - // } - // read magic number std::array tmp{}; fread(tmp.data(), tmp.size(), 1, fp); @@ -128,8 +120,8 @@ void NumpyFile::load_metadata(){ } // read version - fread(reinterpret_cast(&major_ver_),sizeof(major_ver_), 1,fp); - fread(reinterpret_cast(&minor_ver_), sizeof(minor_ver_),1,fp); + fread(reinterpret_cast(&major_ver_), sizeof(major_ver_), 1,fp); + fread(reinterpret_cast(&minor_ver_), sizeof(minor_ver_), 1,fp); if (major_ver_ == 1) { header_len_size = 2; @@ -145,13 +137,13 @@ void NumpyFile::load_metadata(){ if (header_size % 16 != 0) { fmt::print("Warning: header length is not a multiple of 16\n"); } + // read header auto buf_v = std::vector(header_len); fread(buf_v.data(), header_len,1,fp); std::string header(buf_v.data(), header_len); // parse header - std::vector keys{"descr", "fortran_order", "shape"}; aare::logger::debug("original header: \"header\""); From d196eb5a2e35217e6dd89ca5fbedcae9865b4a78 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Tue, 2 Apr 2024 15:09:16 +0200 Subject: [PATCH 5/5] made member variables private in NumpyFile --- file_io/include/aare/NumpyFile.hpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/file_io/include/aare/NumpyFile.hpp b/file_io/include/aare/NumpyFile.hpp index 7381e96..b319378 100644 --- a/file_io/include/aare/NumpyFile.hpp +++ b/file_io/include/aare/NumpyFile.hpp @@ -12,11 +12,17 @@ class NumpyFile : public FileInterface { FILE *fp = nullptr; size_t initial_header_len = 0; size_t current_frame{}; - void get_frame_into(size_t, std::byte *); - Frame get_frame(size_t frame_number); + std::filesystem::path m_fname; + uint32_t header_len{}; + uint8_t header_len_size{}; + ssize_t header_size{}; + header_t m_header; + uint8_t major_ver_{}; + uint8_t minor_ver_{}; void load_metadata(); - std::filesystem::path m_fname; + void get_frame_into(size_t, std::byte *); + Frame get_frame(size_t frame_number); public: @@ -39,17 +45,7 @@ class NumpyFile : public FileInterface { ssize_t cols() const override { return m_header.shape[2]; } ssize_t bitdepth() const override { return m_header.dtype.bitdepth(); } - header_t m_header; - uint8_t major_ver_{}; - uint8_t minor_ver_{}; - uint32_t header_len{}; - uint8_t header_len_size{}; - ssize_t header_size{}; - ~NumpyFile(); - - - }; } // namespace aare \ No newline at end of file