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