#pragma once #include "stream.hpp" #include namespace attn { namespace pel { /** * @class SectionHeader * * @brief This 8-byte header is at the start of every PEL section. * * |--------+------------+------------+-----------+------------| * | length | byte0 | byte1 | byte2 | byte3 | * |--------+------------+------------+-----------+------------| * | 4 | Section ID | Section Length | * |--------+------------+-------------------------------------| * | 4 | Version | Sub-type | Component ID | * |--------+--------------------------------------------------| * * Section ID: * A two-ASCII character field which uniquely identifies the type of section. * * Section length: * Length in bytes of the section, including the entire section header. * * Section Version: * A one byte integer intended to identify differences in header structures. * * Section sub-type: * Optional. Additional identifier describing the section. * * Component IDs: * Optional. By convention the creator's component ID is placed in the * component ID field of the Private Header and the committing component * ID is placed in the component ID field of the User Header. */ struct SectionHeader { public: /** * @brief Constructor */ SectionHeader() : id(0), size(0), version(0), subType(0), componentID(0) {} /** * @brief Constructor * * @param[in] id - the ID field * @param[in] size - the size field * @param[in] version - the version field * @param[in] subType - the sub-type field * @param[in] componentID - the component ID field */ SectionHeader(uint16_t id, uint16_t size, uint8_t version, uint8_t subType, uint16_t componentID) : id(id), size(size), version(version), subType(subType), componentID(componentID) {} /** * @brief A two character ASCII field which identifies the section type. */ uint16_t id; /** * @brief The size of the section in bytes, including this section header. */ uint16_t size; /** * @brief The section format version. */ uint8_t version; /** * @brief The section sub-type. */ uint8_t subType; /** * @brief The component ID, which has various meanings depending on the * section. */ uint16_t componentID; /** * @brief Returns the size of header when flattened into a PEL. * * @return size_t - the size of the header */ static constexpr size_t flattenedSize() { return sizeof(id) + sizeof(size) + sizeof(version) + sizeof(subType) + sizeof(componentID); } }; /** * @brief Stream extraction operator for the SectionHeader * * @param[in] s - the stream * @param[out] header - the SectionHeader object */ inline Stream& operator>>(Stream& s, SectionHeader& header) { s >> header.id >> header.size >> header.version >> header.subType >> header.componentID; return s; } /** * @brief Stream insertion operator for the section header * * @param[out] s - the stream * @param[in] header - the SectionHeader object */ inline Stream& operator<<(Stream& s, const SectionHeader& header) { s << header.id << header.size << header.version << header.subType << header.componentID; return s; } } // namespace pel } // namespace attn