blob: b3f30e6b8aa8bd9237b5f8fe00bcf95441cb7d36 [file] [log] [blame]
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -06001#pragma once
2
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -06003#include "defines.hpp"
4#include "types.hpp"
5
Joel Stanleyd934d4d2020-04-17 12:19:12 +09306#include <iostream>
Patrick Venturec83c4dc2018-11-01 16:29:18 -07007#include <string>
8#include <unordered_map>
9
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060010namespace openpower
11{
12namespace vpd
13{
14
15/** @brief Parsed VPD is represented as a dictionary of records, where
16 * each record in itself is a dictionary of keywords */
Patrick Venturec83c4dc2018-11-01 16:29:18 -070017using Parsed = std::unordered_map<std::string,
18 std::unordered_map<std::string, std::string>>;
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060019
20/** @class Store
21 * @brief Store for parsed OpenPOWER VPD
22 *
23 * A Store object stores parsed OpenPOWER VPD, and provides access
24 * to the VPD, specified by record and keyword. Parsed VPD is typically
25 * provided by the Parser class.
26 */
27class Store final
28{
Patrick Venturec83c4dc2018-11-01 16:29:18 -070029 public:
30 Store() = delete;
31 Store(const Store&) = delete;
32 Store& operator=(const Store&) = delete;
33 Store(Store&&) = default;
34 Store& operator=(Store&&) = default;
35 ~Store() = default;
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060036
Patrick Venturec83c4dc2018-11-01 16:29:18 -070037 /** @brief Construct a Store
38 *
39 * @param[in] vpdBuffer - A parsed VPD object
40 */
Patrick Williamsc78d8872023-05-10 07:50:56 -050041 explicit Store(Parsed&& vpdBuffer) : vpd(std::move(vpdBuffer)) {}
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060042
Alpana Kumari26a74af2019-09-10 23:53:58 -050043 /** @brief Retrieves VPD from Store as a Parsed object
44 *
45 * @returns VPD as a Parsed object
46 */
SunnySrivastava19849094d4f2020-08-05 09:32:29 -050047 inline Parsed& getVpdMap()
Alpana Kumari26a74af2019-09-10 23:53:58 -050048 {
49 return vpd;
50 }
51
Patrick Venturec83c4dc2018-11-01 16:29:18 -070052 /** @brief Retrieves VPD from Store
53 *
54 * @tparam R - VPD record
55 * @tparam K - VPD keyword
56 * @returns VPD stored in input record:keyword
57 */
58 template <Record R, record::Keyword K>
59 inline const std::string& get() const;
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060060
Patrick Venturec83c4dc2018-11-01 16:29:18 -070061 /** @brief Checks if VPD exists in store
62 *
63 * @tparam R - VPD record
64 * @tparam K - VPD keyword
65 * @returns true if {R,K} exists
66 */
67 template <Record R, record::Keyword K>
68 bool exists() const
69 {
70 static const std::string record = getRecord<R>();
71 static const std::string keyword = record::getKeyword<K>();
72 return vpd.count(record) && vpd.at(record).count(keyword);
73 }
Deepak Kodihalli7e7821c2017-09-11 23:32:01 -050074
Joel Stanleyd934d4d2020-04-17 12:19:12 +093075 /** @brief Displays all data in the store to stdout
76 */
77 void dump() const
78 {
Patrick Williamsc78d8872023-05-10 07:50:56 -050079 for (const auto& [vpdname, avpd] : vpd)
Joel Stanleyd934d4d2020-04-17 12:19:12 +093080 {
81 std::cout << vpdname << ": " << std::endl;
82
Patrick Williamsc78d8872023-05-10 07:50:56 -050083 for (const auto& [key, val] : avpd)
Joel Stanleyd934d4d2020-04-17 12:19:12 +093084 {
Joel Stanleyd934d4d2020-04-17 12:19:12 +093085 std::cout << "\t" << key << " : " << val << std::endl;
86 }
87 }
88 }
89
Patrick Venturec83c4dc2018-11-01 16:29:18 -070090 private:
91 /** @brief The store for parsed VPD */
92 Parsed vpd;
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -060093};
94
Patrick Venturec83c4dc2018-11-01 16:29:18 -070095template <Record R, record::Keyword K>
Deepak Kodihalli158c0462016-11-21 21:33:28 -060096inline const std::string& Store::get() const
97{
98 static const std::string record = getRecord<R>();
99 static const std::string keyword = record::getKeyword<K>();
100 static const std::string empty = "";
101 auto kw = vpd.find(record);
102 if (vpd.end() != kw)
103 {
104 auto value = (kw->second).find(keyword);
105 if ((kw->second).end() != value)
106 {
107 return value->second;
108 }
109 }
110 return empty;
111}
112
Deepak Kodihalli35c7fb12016-11-21 04:32:44 -0600113} // namespace vpd
114} // namespace openpower