HAL
enums.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Ruhr University Bochum, Chair for Embedded Security. All Rights reserved.
4 // Copyright (c) 2019 Marc Fyrbiak, Sebastian Wallat, Max Hoffmann ("ORIGINAL AUTHORS"). All rights reserved.
5 // Copyright (c) 2021 Max Planck Institute for Security and Privacy. All Rights reserved.
6 // Copyright (c) 2021 Jörn Langheinrich, Julian Speith, Nils Albartus, René Walendy, Simon Klix ("ORIGINAL AUTHORS"). All Rights reserved.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 
26 #pragma once
27 
28 #include "hal_core/defines.h"
29 
30 #include <iostream>
31 #include <map>
32 
33 namespace hal
34 {
39  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
40  struct EnumStrings
41  {
42  static std::map<T, std::string> data;
43  };
44 
51  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
52  std::string enum_to_string(T e)
53  {
54  if (auto it = EnumStrings<T>::data.find(e); it == EnumStrings<T>::data.end())
55  {
56  throw std::runtime_error("no string for enum with value '" + std::to_string(static_cast<size_t>(e)) + "'.");
57  }
58  else
59  {
60  return it->second;
61  }
62  }
63 
71  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
72  T enum_from_string(const std::string& str)
73  {
74  for (const auto& [e, s] : EnumStrings<T>::data)
75  {
76  if (s == str)
77  {
78  return e;
79  }
80  }
81 
82  throw std::runtime_error("no enum value for string `" + str + "` available.");
83  }
84 
93  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
94  T enum_from_string(const std::string& str, const T default_val) noexcept
95  {
96  for (const auto& [e, s] : EnumStrings<T>::data)
97  {
98  if (s == str)
99  {
100  return e;
101  }
102  }
103 
104  return default_val;
105  }
106 
113  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
114  bool is_valid_enum(const std::string& str) noexcept
115  {
116  for (const auto& [e, s] : EnumStrings<T>::data)
117  {
118  if (s == str)
119  {
120  return true;
121  }
122  }
123 
124  return false;
125  }
126 
134  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
135  std::ostream& operator<<(std::ostream& os, T e)
136  {
137  return os << enum_to_string(e);
138  }
139 } // namespace hal
T enum_from_string(const std::string &str)
Definition: enums.h:72
bool is_valid_enum(const std::string &str) noexcept
Definition: enums.h:114
std::ostream & operator<<(std::ostream &os, BooleanFunction::Value v)
std::string enum_to_string(T e)
Definition: enums.h:52
PinType type
static std::map< T, std::string > data
Definition: enums.h:42