#include "Bucket.hh" #include "../common/Crc.hpp" #include const uint32_t logging::Bucket::magic_key = 0xCAFEDEACul; const std::size_t logging::Bucket::buffer_capacity = logging::Bucket::buffer_size * sizeof(uint16_t); const std::size_t logging::Bucket::offset_of___crc = logging::Bucket::buffer_size * sizeof(uint16_t) - sizeof(uint32_t); const std::size_t logging::Bucket::data_capacity = logging::Bucket::buffer_size * sizeof(uint16_t) - sizeof(uint32_t) - offset_of___data; logging::Bucket::Bucket() { reset(); } uint32_t logging::Bucket::calc_crc() const { return common::crc::crcCalc( reinterpret_cast(buffer), buffer_capacity - sizeof(uint32_t) ); } void logging::Bucket::update_crc() { uint32_t crc = calc_crc(); std::memcpy(buffer + offset_of___crc, &crc, sizeof(uint32_t)); } void logging::Bucket::fill( const char * data, std::size_t size ) { uint16_t data_pointer = get_data_pointer(); std::memcpy(buffer + offset_of___data + data_pointer, data, size); set_data_pointer( data_pointer + size ); } void logging::Bucket::reset() { uint16_t data_pointer = 0; uint32_t crc = 0; std::memcpy(buffer + offset_of___magic_key, &magic_key, sizeof(uint32_t)); std::memcpy(buffer + offset_of___load, &data_pointer, sizeof(uint16_t)); std::memcpy(buffer + offset_of___crc, &crc, sizeof(uint32_t)); } std::size_t logging::Bucket::size() const { return buffer_capacity; } std::size_t logging::Bucket::allowed_space() const { return data_capacity; } std::size_t logging::Bucket::free_space() const { return data_capacity - get_data_pointer(); } uint32_t logging::Bucket::get_magic() const { uint32_t magic_key; std::memcpy(&magic_key, buffer + offset_of___magic_key, sizeof(uint32_t)); return magic_key; } std::pair logging::Bucket::serialize() const { return { reinterpret_cast< const char *>(buffer), buffer_capacity }; } uint16_t logging::Bucket::get_data_pointer() const { uint16_t data_pointer_in_8bit_bytes; std::memcpy(&data_pointer_in_8bit_bytes, buffer + offset_of___load, sizeof(uint16_t)); uint16_t data_pointer = data_pointer_in_8bit_bytes * 8 / CHAR_BIT; return data_pointer; } void logging::Bucket::set_data_pointer( uint16_t data_pointer ) { uint16_t data_pointer_in_8bit_bytes = data_pointer * CHAR_BIT / 8; std::memcpy(buffer + offset_of___load, &data_pointer_in_8bit_bytes, sizeof(uint16_t)); } bool logging::Bucket::check() const { return calc_crc() == get_crc() and magic_key == get_magic() and get_data_pointer() <= data_capacity; } uint32_t logging::Bucket::get_crc() const { uint32_t crc; std::memcpy(&crc, buffer + offset_of___crc, sizeof(uint32_t)); return crc; } std::pair logging::Bucket::data() const { std::size_t data_load = get_data_pointer(); return { reinterpret_cast(buffer + offset_of___data), data_load }; }