Small refactoring of BufferedWriter

This commit is contained in:
2020-04-06 14:25:36 +02:00
parent 70062e3f14
commit b826ed30b4
2 changed files with 50 additions and 63 deletions
+15 -38
View File
@@ -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
+35 -25
View File
@@ -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));
}
}