HAL
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 {
35  namespace core_strings
36  {
45  template<class S, class T>
46  inline S to(const T& str)
47  {
48  if constexpr (std::is_same<S, T>::value)
49  {
50  return str;
51  }
52  else
53  {
54  return S(str.data());
55  }
56  }
57 
61  struct CaseInsensitiveCharTraits : public std::char_traits<char>
62  {
70  static bool eq(char c1, char c2)
71  {
72  return toupper(c1) == toupper(c2);
73  }
74 
82  static bool ne(char c1, char c2)
83  {
84  return toupper(c1) != toupper(c2);
85  }
86 
94  static bool lt(char c1, char c2)
95  {
96  return toupper(c1) < toupper(c2);
97  }
98 
107  static int compare(const char* s1, const char* s2, size_t n)
108  {
109  while (n-- != 0)
110  {
111  if (toupper(*s1) < toupper(*s2))
112  return -1;
113  if (toupper(*s1) > toupper(*s2))
114  return 1;
115  ++s1;
116  ++s2;
117  }
118  return 0;
119  }
120 
129  static const char* find(const char* s, int n, char a)
130  {
131  while (n-- > 0)
132  {
133  if (toupper(*s) == toupper(a))
134  {
135  return s;
136  }
137  ++s;
138  }
139  return nullptr;
140  }
141  };
142 
143  using CaseInsensitiveString = std::basic_string<char, CaseInsensitiveCharTraits>;
144  } // namespace core_strings
145 } // namespace hal
146 
147 namespace std
148 {
149  template<>
151  {
159  {
160  return std::hash<std::string>{}(std::string(s.data()));
161  }
162  };
163 
164 } // namespace std
S to(const T &str)
std::basic_string< char, CaseInsensitiveCharTraits > CaseInsensitiveString
n
Definition: test.py:6
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