azure-core
Loading...
Searching...
No Matches
strings.hpp
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
9#pragma once
10
11#include <algorithm>
12#include <cstring>
13#include <string>
14#include <vector>
15
16namespace Azure { namespace Core { namespace _internal {
17
22 struct StringExtensions final
23 {
24 static constexpr char ToUpper(char c) noexcept
25 {
26 return (c < 'a' || c > 'z') ? c : c - ('a' - 'A');
27 }
28
29 static constexpr char ToLower(char c) noexcept
30 {
31 return (c < 'A' || c > 'Z') ? c : c + ('a' - 'A');
32 }
33
34 static constexpr bool IsDigit(char c) noexcept { return c >= '0' && c <= '9'; }
35
36 static constexpr bool IsHexDigit(char c) noexcept
37 {
38 return IsDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
39 }
40
41 static constexpr bool IsAlpha(char c) noexcept
42 {
43 return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
44 }
45
46 static constexpr bool IsAlphaNumeric(char c) noexcept { return IsDigit(c) || IsAlpha(c); }
47
48 static constexpr bool IsSpace(char c) noexcept { return c == ' ' || (c >= '\t' && c <= '\r'); }
49
50 static constexpr bool IsPrintable(char c) noexcept { return c >= ' ' && c <= '~'; }
51
52 struct CaseInsensitiveComparator final
53 {
54 bool operator()(std::string const& lhs, std::string const& rhs) const
55 {
56 return std::lexicographical_compare(
57 lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), [](auto l, auto r) {
58 return ToLower(l) < ToLower(r);
59 });
60 }
61 };
62
63 static bool LocaleInvariantCaseInsensitiveEqual(
64 std::string const& lhs,
65 std::string const& rhs) noexcept
66 {
67 auto const rhsSize = rhs.size();
68 if (lhs.size() != rhsSize)
69 {
70 return false;
71 }
72
73 auto const lhsData = lhs.c_str();
74 auto const rhsData = rhs.c_str();
75 for (size_t i = 0; i < rhsSize; ++i)
76 {
77 if (ToLower(lhsData[i]) != ToLower(rhsData[i]))
78 {
79 return false;
80 }
81 }
82
83 return true;
84 }
85
86 static std::string ToLower(std::string src)
87 {
88 std::transform(src.begin(), src.end(), src.begin(), [](auto c) { return ToLower(c); });
89 return src;
90 }
91
92 static std::string ToUpper(std::string src)
93 {
94 std::transform(src.begin(), src.end(), src.begin(), [](auto c) { return ToUpper(c); });
95 return src;
96 }
97
98 static std::vector<std::string> Split(
99 const std::string& s,
100 char separator,
101 bool removeEmptyEntries = false)
102 {
103 std::vector<std::string> result;
104
105 const auto len = s.size();
106 size_t start = 0;
107 while (start < len)
108 {
109 auto end = s.find(separator, start);
110 if (end == std::string::npos)
111 {
112 end = len;
113 }
114 if (!removeEmptyEntries || start < end)
115 {
116 result.push_back(s.substr(start, end - start));
117 }
118
119 start = end + 1;
120 }
121
122 return result;
123 }
124
125 static std::string Trim(std::string s)
126 {
127 s.erase(s.begin(), std::find_if_not(s.begin(), s.end(), IsSpace));
128 s.erase(std::find_if_not(s.rbegin(), s.rend(), IsSpace).base(), s.end());
129 return s;
130 }
131 };
132
133}}} // namespace Azure::Core::_internal
Compute the hash value for the input binary data, using SHA256, SHA384 and SHA512.
Definition azure_assert.hpp:57