1d3335dfaSMatt Spinler #pragma once
2d3335dfaSMatt Spinler #include "section_header.hpp"
3d3335dfaSMatt Spinler 
4d3335dfaSMatt Spinler namespace openpower
5d3335dfaSMatt Spinler {
6d3335dfaSMatt Spinler namespace pels
7d3335dfaSMatt Spinler {
8d3335dfaSMatt Spinler 
9d3335dfaSMatt Spinler /**
10d3335dfaSMatt Spinler  * @class Section
11d3335dfaSMatt Spinler  *
12d3335dfaSMatt Spinler  * The base class for a PEL section.  It contains the SectionHeader
13d3335dfaSMatt Spinler  * as all sections start with it.
14d3335dfaSMatt Spinler  *
15d3335dfaSMatt Spinler  */
16d3335dfaSMatt Spinler class Section
17d3335dfaSMatt Spinler {
18d3335dfaSMatt Spinler   public:
19d3335dfaSMatt Spinler     Section() = default;
20d3335dfaSMatt Spinler     virtual ~Section() = default;
21d3335dfaSMatt Spinler     Section(const Section&) = default;
22d3335dfaSMatt Spinler     Section& operator=(const Section&) = default;
23d3335dfaSMatt Spinler     Section(Section&&) = default;
24d3335dfaSMatt Spinler     Section& operator=(Section&&) = default;
25d3335dfaSMatt Spinler 
26d3335dfaSMatt Spinler     /**
27d3335dfaSMatt Spinler      * @brief Returns a reference to the SectionHeader
28d3335dfaSMatt Spinler      */
29*0688545bSMatt Spinler     const SectionHeader& header() const
30d3335dfaSMatt Spinler     {
31d3335dfaSMatt Spinler         return _header;
32d3335dfaSMatt Spinler     }
33d3335dfaSMatt Spinler 
34d3335dfaSMatt Spinler     /**
35d3335dfaSMatt Spinler      * @brief Says if the section is valid.
36d3335dfaSMatt Spinler      */
37d3335dfaSMatt Spinler     bool valid() const
38d3335dfaSMatt Spinler     {
39d3335dfaSMatt Spinler         return _valid;
40d3335dfaSMatt Spinler     }
41d3335dfaSMatt Spinler 
42cf5a8d0fSMatt Spinler     /**
43cf5a8d0fSMatt Spinler      * @brief Flatten the section into the stream
44cf5a8d0fSMatt Spinler      *
45cf5a8d0fSMatt Spinler      * @param[in] stream - The stream to write to
46cf5a8d0fSMatt Spinler      */
47*0688545bSMatt Spinler     virtual void flatten(Stream& stream) const = 0;
48cf5a8d0fSMatt Spinler 
49d3335dfaSMatt Spinler   protected:
50d3335dfaSMatt Spinler     /**
51d3335dfaSMatt Spinler      * @brief Returns the flattened size of the section header
52d3335dfaSMatt Spinler      */
53d3335dfaSMatt Spinler     static constexpr size_t flattenedSize()
54d3335dfaSMatt Spinler     {
55d3335dfaSMatt Spinler         return SectionHeader::flattenedSize();
56d3335dfaSMatt Spinler     }
57d3335dfaSMatt Spinler 
58d3335dfaSMatt Spinler     /**
59d3335dfaSMatt Spinler      * @brief Used to validate the section.
60d3335dfaSMatt Spinler      *
61d3335dfaSMatt Spinler      * Implemented by derived classes.
62d3335dfaSMatt Spinler      */
63d3335dfaSMatt Spinler     virtual void validate() = 0;
64d3335dfaSMatt Spinler 
65d3335dfaSMatt Spinler     /**
66d3335dfaSMatt Spinler      * @brief The section header structure.
67d3335dfaSMatt Spinler      *
68d3335dfaSMatt Spinler      * Filled in by derived classes.
69d3335dfaSMatt Spinler      */
70d3335dfaSMatt Spinler     SectionHeader _header;
71d3335dfaSMatt Spinler 
72d3335dfaSMatt Spinler     /**
73d3335dfaSMatt Spinler      * @brief The section valid flag.
74d3335dfaSMatt Spinler      *
75d3335dfaSMatt Spinler      * This is determined by the derived class.
76d3335dfaSMatt Spinler      */
77d3335dfaSMatt Spinler     bool _valid = false;
78d3335dfaSMatt Spinler };
79d3335dfaSMatt Spinler } // namespace pels
80d3335dfaSMatt Spinler } // namespace openpower
81