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 <cstdint> 20 #include <map> 21 #include <string> 22 #include <tuple> 23 #include <utility> 24 #include <variant> 25 #include <vector> 26 27 namespace ipmi 28 { 29 30 using Association = std::tuple<std::string, std::string, std::string>; 31 32 using DbusVariant = 33 std::variant<std::string, bool, uint8_t, uint16_t, int16_t, uint32_t, 34 int32_t, uint64_t, int64_t, double, std::vector<Association>, 35 std::vector<std::string>, std::vector<uint8_t>, 36 std::vector<uint64_t>>; 37 38 using GetSubTreeType = std::vector< 39 std::pair<std::string, 40 std::vector<std::pair<std::string, std::vector<std::string>>>>>; 41 42 using SensorMap = std::map<std::string, std::map<std::string, DbusVariant>>; 43 44 namespace types 45 { 46 namespace details 47 { 48 49 template <typename U> 50 using underlying_t = 51 typename std::conditional_t<std::is_enum_v<U>, std::underlying_type<U>, 52 std::enable_if<true, U>>::type; 53 } // namespace details 54 55 /** 56 * @brief Converts a number or enum class to another 57 * @tparam R - The output type 58 * @tparam T - The input type 59 * @param t - An enum or integer value to cast 60 * @return The value in R form 61 */ 62 template <typename R, typename T> 63 inline R enum_cast(T t) 64 { 65 auto tu = static_cast<details::underlying_t<T>>(t); 66 auto ru = static_cast<details::underlying_t<R>>(tu); 67 return static_cast<R>(ru); 68 } 69 70 } // namespace types 71 72 } // namespace ipmi 73