mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-05-09 08:02:04 +02:00
Refactor MetadataBuffer
This commit is contained in:
@@ -8,19 +8,28 @@
|
||||
|
||||
class MetadataBuffer
|
||||
{
|
||||
const uint64_t n_images;
|
||||
const std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type;
|
||||
typedef std::unordered_map<std::string, HeaderDataType> header_map;
|
||||
|
||||
const uint64_t n_slots_;
|
||||
const header_map& header_values_type_;
|
||||
|
||||
protected:
|
||||
std::unordered_map<std::string, std::shared_ptr<char>> metadata_buffer;
|
||||
std::unordered_map<std::string, size_t> metadata_length_bytes;
|
||||
|
||||
public:
|
||||
MetadataBuffer(uint64_t n_images, std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> header_values_type);
|
||||
void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data);
|
||||
MetadataBuffer(
|
||||
const uint64_t n_slots,
|
||||
const header_map& header_values_type);
|
||||
|
||||
void add_metadata_to_buffer(
|
||||
const std::string& name,
|
||||
const uint64_t frame_index,
|
||||
const char* data);
|
||||
|
||||
std::shared_ptr<char> get_metadata_values(std::string name);
|
||||
std::shared_ptr<std::unordered_map<std::string, HeaderDataType>> get_header_values_type();
|
||||
uint64_t get_n_images();
|
||||
const header_map& get_header_values_type();
|
||||
uint64_t get_n_slots();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,46 +6,59 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
MetadataBuffer::MetadataBuffer(uint64_t n_images, shared_ptr<unordered_map<string, HeaderDataType>> header_values_type) :
|
||||
n_images(n_images), header_values_type(header_values_type)
|
||||
MetadataBuffer::MetadataBuffer(
|
||||
const uint64_t n_slots,
|
||||
const header_map& header_values_type) :
|
||||
n_slots_(n_slots),
|
||||
header_values_type_(header_values_type)
|
||||
{
|
||||
if (header_values_type) {
|
||||
for (const auto& header_type : *header_values_type) {
|
||||
auto& name = header_type.first;
|
||||
auto& header_data_type = header_type.second;
|
||||
for (const auto& header_type : header_values_type_) {
|
||||
auto& name = header_type.first;
|
||||
auto& header_data_type = header_type.second;
|
||||
|
||||
size_t bytes_size_per_frame = header_data_type.value_shape * header_data_type.value_bytes_size;
|
||||
size_t buffer_size_bytes = n_images * bytes_size_per_frame;
|
||||
size_t bytes_size_per_frame =
|
||||
header_data_type.value_shape * header_data_type.value_bytes_size;
|
||||
size_t buffer_size_bytes = n_slots_ * bytes_size_per_frame;
|
||||
|
||||
shared_ptr<char> buffer(new char[buffer_size_bytes](), std::default_delete<char[]>());
|
||||
metadata_buffer.insert({name, buffer});
|
||||
metadata_length_bytes.insert({name, bytes_size_per_frame});
|
||||
}
|
||||
shared_ptr<char> buffer(
|
||||
new char[buffer_size_bytes](), std::default_delete<char[]>());
|
||||
|
||||
metadata_buffer.insert({name, buffer});
|
||||
metadata_length_bytes.insert({name, bytes_size_per_frame});
|
||||
}
|
||||
}
|
||||
|
||||
void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, const char* data)
|
||||
void MetadataBuffer::add_metadata_to_buffer(
|
||||
const string& name,
|
||||
const uint64_t frame_index,
|
||||
const char* data)
|
||||
{
|
||||
if (frame_index >= n_images) {
|
||||
stringstream error_message;
|
||||
using namespace date;
|
||||
error_message << "[" << std::chrono::system_clock::now() << "] ";
|
||||
error_message << "Requested frame_index " << frame_index << " ";
|
||||
error_message << "for metadata " << name << " in metadata buffer is out of range. ";
|
||||
error_message << "Number of available slots: " << n_images << endl;
|
||||
if (frame_index >= n_slots_) {
|
||||
stringstream err_msg;
|
||||
|
||||
throw runtime_error(error_message.str());
|
||||
using namespace date;
|
||||
using namespace chrono;
|
||||
err_msg << "[" << system_clock::now() << "] ";
|
||||
err_msg << "[MetadataBuffer::add_metadata_to_buffer]";
|
||||
err_msg << " Requested frame_index " << frame_index ;
|
||||
err_msg << " is out of range.";
|
||||
err_msg << " Available n_slots_ " << n_slots_ << endl;
|
||||
|
||||
throw runtime_error(err_msg.str());
|
||||
}
|
||||
|
||||
auto metadata = metadata_buffer.find(name);
|
||||
|
||||
if (metadata == metadata_buffer.end()) {
|
||||
stringstream error_message;
|
||||
using namespace date;
|
||||
error_message << "[" << std::chrono::system_clock::now() << "] ";
|
||||
error_message << "Cannot add data to metadata buffer because '" << name << "' is not declared."<< endl;
|
||||
stringstream err_msg;
|
||||
|
||||
throw runtime_error(error_message.str());
|
||||
using namespace date;
|
||||
using namespace chrono;
|
||||
err_msg << "[" << system_clock::now() << "] ";
|
||||
err_msg << "[MetadataBuffer::add_metadata_to_buffer]";
|
||||
err_msg << " Undeclared header metadata " << name << endl;
|
||||
|
||||
throw runtime_error(err_msg.str());
|
||||
}
|
||||
|
||||
size_t bytes_size_per_frame = metadata_length_bytes.at(name);
|
||||
@@ -54,7 +67,7 @@ void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, c
|
||||
char* buffer = metadata->second.get();
|
||||
buffer += buffer_offset;
|
||||
|
||||
memcpy(buffer, data, bytes_size_per_frame);
|
||||
memcpy(buffer, data, bytes_size_per_frame);
|
||||
}
|
||||
|
||||
shared_ptr<char> MetadataBuffer::get_metadata_values(string name)
|
||||
@@ -62,23 +75,26 @@ shared_ptr<char> MetadataBuffer::get_metadata_values(string name)
|
||||
auto metadata = metadata_buffer.find(name);
|
||||
|
||||
if (metadata == metadata_buffer.end()) {
|
||||
stringstream error_message;
|
||||
using namespace date;
|
||||
error_message << "[" << std::chrono::system_clock::now() << "] ";
|
||||
error_message << "Cannot get data from metadata buffer because '" << name << "' is not declared."<< endl;
|
||||
stringstream err_msg;
|
||||
|
||||
throw runtime_error(error_message.str());
|
||||
using namespace date;
|
||||
using namespace chrono;
|
||||
err_msg << "[" << system_clock::now() << "] ";
|
||||
err_msg << "[MetadataBuffer::get_metadata_values]";
|
||||
err_msg << " Undeclared header metadata " << name << endl;
|
||||
|
||||
throw runtime_error(err_msg.str());
|
||||
}
|
||||
|
||||
return metadata->second;
|
||||
}
|
||||
|
||||
shared_ptr<unordered_map<string, HeaderDataType>> MetadataBuffer::get_header_values_type()
|
||||
const MetadataBuffer::header_map& MetadataBuffer::get_header_values_type()
|
||||
{
|
||||
return header_values_type;
|
||||
return header_values_type_;
|
||||
}
|
||||
|
||||
uint64_t MetadataBuffer::get_n_images()
|
||||
uint64_t MetadataBuffer::get_n_slots()
|
||||
{
|
||||
return n_images;
|
||||
return n_slots_;
|
||||
}
|
||||
Reference in New Issue
Block a user