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