blob: 5ee2187709394b7b59e6d21954cab23f7e47bc16 [file] [log] [blame]
John Wangb754eee2020-02-15 16:10:25 +08001#pragma once
2
George Liu6492f522020-06-16 10:34:05 +08003#include "libpldm/bios_table.h"
4
John Wangb754eee2020-02-15 16:10:25 +08005#include <cstring>
6#include <memory>
7#include <type_traits>
8#include <vector>
9
John Wangb754eee2020-02-15 16:10:25 +080010namespace pldm
11{
12namespace bios
13{
14namespace utils
15{
16
17using Table = std::vector<uint8_t>;
18
19/** @class BIOSTableIter
20 * @brief Const Iterator of a BIOS Table
21 */
22template <pldm_bios_table_types tableType>
23class BIOSTableIter
24{
25 public:
26 /** @struct EndSentinel
27 * @brief Auxiliary struct to delimit a range
28 */
29 struct EndSentinel
George Liu6492f522020-06-16 10:34:05 +080030 {};
John Wangb754eee2020-02-15 16:10:25 +080031
32 /** @struct iterator
33 * @brief iterator owns the BIOS table
34 */
35 class iterator
36 {
37 public:
38 /** @brief Get entry type by specifying \p tableType
39 */
40 using T = typename std::conditional<
41 tableType == PLDM_BIOS_STRING_TABLE, pldm_bios_string_table_entry,
42 typename std::conditional<
43 tableType == PLDM_BIOS_ATTR_TABLE, pldm_bios_attr_table_entry,
44 typename std::conditional<tableType == PLDM_BIOS_ATTR_VAL_TABLE,
45 pldm_bios_attr_val_table_entry,
46 void>::type>::type>::type;
47 static_assert(!std::is_void<T>::value);
48
49 /** @brief Constructors iterator
50 *
51 * @param[in] data - Pointer to a table
52 * @param[in] length - The length of the table
53 */
54 explicit iterator(const void* data, size_t length) noexcept :
55 iter(pldm_bios_table_iter_create(data, length, tableType),
56 pldm_bios_table_iter_free)
George Liu6492f522020-06-16 10:34:05 +080057 {}
John Wangb754eee2020-02-15 16:10:25 +080058
59 /** @brief Get the entry pointed by the iterator
60 *
61 * @return Poiner to the entry
62 */
63 const T* operator*() const
64 {
65 return reinterpret_cast<const T*>(
66 pldm_bios_table_iter_value(iter.get()));
67 }
68
69 /** @brief Make the iterator point to the next entry
70 *
71 * @return The iterator itself
72 */
73 iterator& operator++()
74 {
75 pldm_bios_table_iter_next(iter.get());
76 return *this;
77 }
78
79 /** @brief Check if the iterator ends
80 *
81 * @return True if the iterator ends
82 */
83 bool operator==(const EndSentinel&) const
84 {
85 return pldm_bios_table_iter_is_end(iter.get());
86 }
87
88 /** @brief Check if the iterator ends
89 *
90 * @return False if the iterator ends
91 */
92 bool operator!=(const EndSentinel& endSentinel) const
93 {
94 return !operator==(endSentinel);
95 }
96
97 private:
98 std::unique_ptr<pldm_bios_table_iter,
99 decltype(&pldm_bios_table_iter_free)>
100 iter;
101 };
102
103 /** @brief Constructors BIOSTableIterator
104 *
105 * @param[in] data - Pointer to a table
106 * @param[in] length - The length of the table
107 */
108 BIOSTableIter(const void* data, size_t length) noexcept :
109 tableData(data), tableSize(length)
George Liu6492f522020-06-16 10:34:05 +0800110 {}
John Wangb754eee2020-02-15 16:10:25 +0800111
112 /** @brief Get the iterator to the beginning
113 *
114 * @return An iterator to the beginning
115 */
116 iterator begin()
117 {
118 return iterator(tableData, tableSize);
119 }
120
121 /** @brief Get the iterator to the end
122 *
123 * @return An iterator to the end
124 */
125 EndSentinel end()
126 {
127 return {};
128 }
129
130 private:
131 const void* tableData;
132 size_t tableSize;
133};
134
135} // namespace utils
136} // namespace bios
137} // namespace pldm