HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
special_strings.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 <string>
29 
30 namespace hal
31 {
37  namespace core_strings
38  {
47  template<class S, class T>
48  inline S to(const T& str)
49  {
50  if constexpr (std::is_same<S, T>::value)
51  {
52  return str;
53  }
54  else
55  {
56  return S(str.data());
57  }
58  }
59 
63  struct CaseInsensitiveCharTraits : public std::char_traits<char>
64  {
72  static bool eq(char c1, char c2)
73  {
74  return toupper(c1) == toupper(c2);
75  }
76 
84  static bool ne(char c1, char c2)
85  {
86  return toupper(c1) != toupper(c2);
87  }
88 
96  static bool lt(char c1, char c2)
97  {
98  return toupper(c1) < toupper(c2);
99  }
100 
109  static int compare(const char* s1, const char* s2, size_t n)
110  {
111  while (n-- != 0)
112  {
113  if (toupper(*s1) < toupper(*s2))
114  return -1;
115  if (toupper(*s1) > toupper(*s2))
116  return 1;
117  ++s1;
118  ++s2;
119  }
120  return 0;
121  }
122 
131  static const char* find(const char* s, int n, char a)
132  {
133  while (n-- > 0)
134  {
135  if (toupper(*s) == toupper(a))
136  {
137  return s;
138  }
139  ++s;
140  }
141  return nullptr;
142  }
143  };
144 
145  using CaseInsensitiveString = std::basic_string<char, CaseInsensitiveCharTraits>;
146  } // namespace core_strings
147 } // namespace hal
148 
149 namespace std
150 {
154  template<>
156  {
164  {
165  return std::hash<std::string>{}(std::string(s.data()));
166  }
167  };
168 
169 } // namespace std
S to(const T &str)
std::basic_string< char, CaseInsensitiveCharTraits > CaseInsensitiveString
Definition: defines.h:45
static int compare(const char *s1, const char *s2, size_t n)
static const char * find(const char *s, int n, char a)
std::size_t operator()(const hal::core_strings::CaseInsensitiveString &s) const