xref: /openbmc/intel-ipmi-oem/include/types.hpp (revision b37abfb2)
1 /*
2 // Copyright (c) 2017 2018 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 
17 #pragma once
18 
19 #include <map>
20 #include <string>
21 #include <tuple>
22 #include <utility>
23 #include <variant>
24 #include <vector>
25 
26 namespace ipmi
27 {
28 
29 using Association = std::tuple<std::string, std::string, std::string>;
30 
31 using DbusVariant =
32     std::variant<std::string, bool, uint8_t, uint16_t, int16_t, uint32_t,
33                  int32_t, uint64_t, int64_t, double, std::vector<Association>,
34                  std::vector<std::string>, std::vector<uint8_t>,
35                  std::vector<uint64_t>>;
36 
37 using GetSubTreeType = std::vector<
38     std::pair<std::string,
39               std::vector<std::pair<std::string, std::vector<std::string>>>>>;
40 
41 using SensorMap = std::map<std::string, std::map<std::string, DbusVariant>>;
42 
43 namespace types
44 {
45 namespace details
46 {
47 
48 template <typename U>
49 using underlying_t =
50     typename std::conditional_t<std::is_enum_v<U>, std::underlying_type<U>,
51                                 std::enable_if<true, U>>::type;
52 } // namespace details
53 
54 /**
55  * @brief Converts a number or enum class to another
56  * @tparam R - The output type
57  * @tparam T - The input type
58  * @param t - An enum or integer value to cast
59  * @return The value in R form
60  */
61 template <typename R, typename T>
62 inline R enum_cast(T t)
63 {
64     auto tu = static_cast<details::underlying_t<T>>(t);
65     auto ru = static_cast<details::underlying_t<R>>(tu);
66     return static_cast<R>(ru);
67 }
68 
69 } // namespace types
70 
71 } // namespace ipmi
72