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