#pragma once #include "stream.hpp" #include namespace openpower { namespace pels { /** * @class SectionHeader * * This header is at the start of every PEL section. It has a size * of 8 bytes. */ 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 pels } // namespace openpower