diff --git a/core-writer/include/MetadataBuffer.hpp b/core-writer/include/MetadataBuffer.hpp index 9b72223..790d676 100644 --- a/core-writer/include/MetadataBuffer.hpp +++ b/core-writer/include/MetadataBuffer.hpp @@ -8,19 +8,28 @@ class MetadataBuffer { - const uint64_t n_images; - const std::shared_ptr> header_values_type; + typedef std::unordered_map header_map; + + const uint64_t n_slots_; + const header_map& header_values_type_; protected: std::unordered_map> metadata_buffer; std::unordered_map metadata_length_bytes; public: - MetadataBuffer(uint64_t n_images, std::shared_ptr> 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 get_metadata_values(std::string name); - std::shared_ptr> get_header_values_type(); - uint64_t get_n_images(); + const header_map& get_header_values_type(); + uint64_t get_n_slots(); }; #endif diff --git a/core-writer/src/writer/MetadataBuffer.cpp b/core-writer/src/writer/MetadataBuffer.cpp index 13777fa..c494116 100644 --- a/core-writer/src/writer/MetadataBuffer.cpp +++ b/core-writer/src/writer/MetadataBuffer.cpp @@ -6,46 +6,59 @@ using namespace std; -MetadataBuffer::MetadataBuffer(uint64_t n_images, shared_ptr> 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 buffer(new char[buffer_size_bytes](), std::default_delete()); - metadata_buffer.insert({name, buffer}); - metadata_length_bytes.insert({name, bytes_size_per_frame}); - } + shared_ptr buffer( + new char[buffer_size_bytes](), std::default_delete()); + + 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 MetadataBuffer::get_metadata_values(string name) @@ -62,23 +75,26 @@ shared_ptr 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> 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_; } \ No newline at end of file