mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-05-11 08:42:04 +02:00
Small refactoring of BufferedWriter
This commit is contained in:
@@ -6,47 +6,24 @@
|
||||
|
||||
class BufferedWriter : public H5Writer
|
||||
{
|
||||
size_t total_frames;
|
||||
std::unique_ptr<MetadataBuffer> metadata_buffer;
|
||||
const size_t total_frames;
|
||||
MetadataBuffer& metadata_buffer;
|
||||
|
||||
public:
|
||||
BufferedWriter(const std::string& filename, size_t total_frames, std::unique_ptr<MetadataBuffer>&& metadata_buffer,
|
||||
hsize_t frames_per_file=0, hsize_t initial_dataset_size=1000, hsize_t dataset_increase_step=1000);
|
||||
virtual void cache_metadata(std::string name, uint64_t frame_index, const char* data);
|
||||
BufferedWriter(
|
||||
const std::string& filename,
|
||||
const size_t total_frames,
|
||||
MetadataBuffer& metadata_buffer,
|
||||
hsize_t frames_per_file=0,
|
||||
hsize_t initial_dataset_size=1000,
|
||||
hsize_t dataset_increase_step=1000);
|
||||
|
||||
virtual void cache_metadata(
|
||||
const std::string& name,
|
||||
const uint64_t frame_index,
|
||||
const char* data);
|
||||
|
||||
virtual void write_metadata_to_file();
|
||||
};
|
||||
|
||||
class DummyBufferedWriter : public BufferedWriter, public DummyH5Writer
|
||||
{
|
||||
public:
|
||||
DummyBufferedWriter() : BufferedWriter("/dev/null", 0, 0, 0, 0) {}
|
||||
void cache_metadata(std::string name, uint64_t frame_index, const char* data) override {}
|
||||
void write_metadata_to_file() override {}
|
||||
|
||||
bool is_file_open() const override
|
||||
{ return DummyH5Writer::is_file_open(); }
|
||||
|
||||
void create_file(const hsize_t frame_chunk=1) override
|
||||
{ return DummyH5Writer::create_file(frame_chunk); }
|
||||
|
||||
void close_file() override
|
||||
{ return DummyH5Writer::close_file(); }
|
||||
|
||||
void write_data(const std::string& dataset_name, const size_t data_index, const char* data, const std::vector<size_t>& data_shape,
|
||||
const size_t data_bytes_size, const std::string& data_type, const std::string& endianness) override
|
||||
{
|
||||
return DummyH5Writer::write_data (
|
||||
dataset_name, data_index, data, data_shape, data_bytes_size, data_type, endianness );
|
||||
}
|
||||
|
||||
H5::H5File& get_h5_file() override
|
||||
{ return DummyH5Writer::get_h5_file(); }
|
||||
|
||||
bool is_data_for_current_file(const size_t data_index) override
|
||||
{ return DummyH5Writer::is_data_for_current_file(data_index); }
|
||||
};
|
||||
|
||||
std::unique_ptr<BufferedWriter> get_buffered_writer(const std::string& filename, size_t total_frames,
|
||||
std::unique_ptr<MetadataBuffer> metadata_buffer, hsize_t frames_per_file=0, hsize_t dataset_increase_step=1000);
|
||||
|
||||
#endif
|
||||
@@ -6,10 +6,20 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
BufferedWriter::BufferedWriter(const std::string& filename, size_t total_frames, unique_ptr<MetadataBuffer>&& metadata_buffer,
|
||||
hsize_t frames_per_file, hsize_t initial_dataset_size, hsize_t dataset_increase_step) :
|
||||
H5Writer(filename, frames_per_file, initial_dataset_size, dataset_increase_step),
|
||||
total_frames(total_frames), metadata_buffer(move(metadata_buffer))
|
||||
BufferedWriter::BufferedWriter(
|
||||
const std::string& filename,
|
||||
size_t total_frames,
|
||||
MetadataBuffer& metadata_buffer,
|
||||
hsize_t frames_per_file,
|
||||
hsize_t initial_dataset_size,
|
||||
hsize_t dataset_increase_step) :
|
||||
H5Writer(
|
||||
filename,
|
||||
frames_per_file,
|
||||
initial_dataset_size,
|
||||
dataset_increase_step),
|
||||
total_frames(total_frames),
|
||||
metadata_buffer(metadata_buffer)
|
||||
{
|
||||
#ifdef DEBUG_OUTPUT
|
||||
using namespace date;
|
||||
@@ -23,15 +33,20 @@ BufferedWriter::BufferedWriter(const std::string& filename, size_t total_frames,
|
||||
#endif
|
||||
}
|
||||
|
||||
void BufferedWriter::cache_metadata(string name, uint64_t frame_index, const char* data)
|
||||
void BufferedWriter::cache_metadata(
|
||||
const string& name,
|
||||
const uint64_t frame_index,
|
||||
const char* data)
|
||||
{
|
||||
auto relative_frame_index = get_relative_data_index(static_cast<const size_t>(frame_index));
|
||||
metadata_buffer->add_metadata_to_buffer(name, relative_frame_index, data);
|
||||
auto relative_frame_index =
|
||||
get_relative_data_index(static_cast<const size_t>(frame_index));
|
||||
|
||||
metadata_buffer.add_metadata_to_buffer(name, relative_frame_index, data);
|
||||
}
|
||||
|
||||
void BufferedWriter::write_metadata_to_file()
|
||||
{
|
||||
auto header_values_type = metadata_buffer->get_header_values_type();
|
||||
auto header_values_type = metadata_buffer.get_header_values_type();
|
||||
|
||||
if (header_values_type) {
|
||||
for (const auto& header_type : *header_values_type) {
|
||||
@@ -40,27 +55,22 @@ void BufferedWriter::write_metadata_to_file()
|
||||
|
||||
vector<size_t> data_shape = {header_data_type.value_shape};
|
||||
|
||||
create_dataset(dataset_name, data_shape, header_data_type.type, header_data_type.endianness, false,
|
||||
metadata_buffer->get_n_images());
|
||||
create_dataset(
|
||||
dataset_name,
|
||||
data_shape,
|
||||
header_data_type.type,
|
||||
header_data_type.endianness,
|
||||
false,
|
||||
metadata_buffer.get_n_images());
|
||||
|
||||
H5::AtomType dataset_data_type(H5FormatUtils::get_dataset_data_type(header_data_type.type));
|
||||
H5::AtomType dataset_data_type(
|
||||
H5FormatUtils::get_dataset_data_type(header_data_type.type));
|
||||
dataset_data_type.setOrder(H5T_ORDER_LE);
|
||||
|
||||
auto& dataset = datasets.at(dataset_name);
|
||||
dataset.write(metadata_buffer->get_metadata_values(dataset_name).get(), dataset_data_type);
|
||||
dataset.write(
|
||||
metadata_buffer.get_metadata_values(dataset_name).get(),
|
||||
dataset_data_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<BufferedWriter> get_buffered_writer(const string& filename, size_t total_frames,
|
||||
std::unique_ptr<MetadataBuffer> metadata_buffer, hsize_t frames_per_file, hsize_t dataset_increase_step)
|
||||
{
|
||||
size_t initial_dataset_size = frames_per_file != 0 ? frames_per_file : total_frames;
|
||||
|
||||
if (filename == "/dev/null") {
|
||||
return unique_ptr<BufferedWriter>(new DummyBufferedWriter());
|
||||
} else {
|
||||
return unique_ptr<BufferedWriter>(new BufferedWriter(filename, total_frames, move(metadata_buffer),
|
||||
frames_per_file, initial_dataset_size, dataset_increase_step));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user