HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
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 {
40  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
41  struct EnumStrings
42  {
43  static std::map<T, std::string> data;
44  };
45 
52  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
53  std::string enum_to_string(T e)
54  {
55  if (auto it = EnumStrings<T>::data.find(e); it == EnumStrings<T>::data.end())
56  {
57  throw std::runtime_error("no string for enum with value '" + std::to_string(static_cast<size_t>(e)) + "'.");
58  }
59  else
60  {
61  return it->second;
62  }
63  }
64 
72  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
73  T enum_from_string(const std::string& str)
74  {
75  for (const auto& [e, s] : EnumStrings<T>::data)
76  {
77  if (s == str)
78  {
79  return e;
80  }
81  }
82 
83  throw std::runtime_error("no enum value for string `" + str + "` available.");
84  }
85 
94  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
95  T enum_from_string(const std::string& str, const T default_val) noexcept
96  {
97  for (const auto& [e, s] : EnumStrings<T>::data)
98  {
99  if (s == str)
100  {
101  return e;
102  }
103  }
104 
105  return default_val;
106  }
107 
114  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
115  bool is_valid_enum(const std::string& str) noexcept
116  {
117  for (const auto& [e, s] : EnumStrings<T>::data)
118  {
119  if (s == str)
120  {
121  return true;
122  }
123  }
124 
125  return false;
126  }
127 
135  template<typename T, typename = typename std::enable_if<std::is_enum<T>::value, T>::type>
136  std::ostream& operator<<(std::ostream& os, T e)
137  {
138  return os << enum_to_string(e);
139  }
140 } // namespace hal
Definition: defines.h:45
T enum_from_string(const std::string &str)
Definition: enums.h:73
bool is_valid_enum(const std::string &str) noexcept
Definition: enums.h:115
std::ostream & operator<<(std::ostream &os, T e)
Definition: enums.h:136
std::string enum_to_string(T e)
Definition: enums.h:53
PinType type
static std::map< T, std::string > data
Definition: enums.h:43