11 using std::string_view;
18 if (str ==
"1")
return true;
19 if ((str.size() == 4) && (strncasecmp(str.data(),
"true", 4) == 0))
21 if ((str.size() == 3) && (strncasecmp(str.data(),
"yes", 3) == 0))
35 return (total.size() >= part.size()) &&
36 (memcmp(total.data(), part.data(), part.size()) == 0);
40 return !total.empty() && (total.front() == part);
43 bool endsWith(string_view total, string_view part)
45 return (total.size() >= part.size()) &&
46 (memcmp(total.data() + total.size() - part.size(), part.data(), part.size()) == 0);
50 return !total.empty() && (total.back() == part);
55 if (
auto pos = str.find_last_not_of(chars); pos != string::npos) {
63 if (
auto pos = str.find_last_not_of(chars); pos != string::npos) {
71 while (!str.empty() && (chars.find(str.back()) != string_view::npos)) {
77 while (!str.empty() && (str.back() == chars)) {
84 str.erase(0, str.find_first_not_of(chars));
88 str.erase(0, str.find_first_not_of(chars));
90 void trimLeft(string_view& str, string_view chars)
92 while (!str.empty() && (chars.find(str.front()) != string_view::npos)) {
98 while (!str.empty() && (str.front() == chars)) {
103 void trim(string_view& str, string_view chars)
109 void trim(string_view& str,
char chars)
115 std::pair<string_view, string_view>
splitOnFirst(string_view str, string_view chars)
117 if (
auto pos = str.find_first_of(chars); pos == string_view::npos) {
118 return {str, string_view{}};
120 return {str.substr(0, pos), str.substr(pos + 1)};
123 std::pair<string_view, string_view>
splitOnFirst(string_view str,
char chars)
125 if (
auto pos = str.find_first_of(chars); pos == string_view::npos) {
126 return {str, string_view{}};
128 return {str.substr(0, pos), str.substr(pos + 1)};
132 std::pair<string_view, string_view>
splitOnLast(string_view str, string_view chars)
134 if (
auto pos = str.find_last_of(chars); pos == string_view::npos) {
135 return {string_view{}, str};
137 return {str.substr(0, pos), str.substr(pos + 1)};
140 std::pair<string_view, string_view>
splitOnLast(string_view str,
char chars)
142 if (
auto pos = str.find_last_of(chars); pos == string_view::npos) {
143 return {string_view{}, str};
145 return {str.substr(0, pos), str.substr(pos + 1)};
149 vector<string_view>
split(string_view str,
char chars)
151 vector<string_view> result;
152 while (!str.empty()) {
154 result.push_back(first);
160 static unsigned parseNumber(string_view str)
163 auto r = stringToBase<10, unsigned>(str);
170 static void insert(
unsigned x, vector<unsigned>& result,
unsigned min,
unsigned max)
176 (it ==
end(result)) || (*it !=
x)) {
177 result.insert(it,
x);
181 static void parseRange2(string_view str, vector<unsigned>& result,
182 unsigned min,
unsigned max)
186 if (str.empty())
return;
188 if (
auto pos = str.find(
'-'); pos == string_view::npos) {
189 insert(parseNumber(str), result,
min,
max);
191 unsigned begin = parseNumber(str.substr(0, pos));
192 unsigned end = parseNumber(str.substr(pos + 1));
196 for (
unsigned i =
begin; i <=
end; ++i) {
197 insert(i, result,
min,
max);
204 vector<unsigned> result;
206 auto next = str.find(
',');
207 string_view sub = (next == string_view::npos)
209 : str.substr(0, next++);
210 parseRange2(sub, result,
min,
max);
211 if (next == string_view::npos)
break;
212 str = str.substr(next);
217 #if defined(__APPLE__)
219 std::string fromCFString(CFStringRef str)
222 const char *cstr = CFStringGetCStringPtr(str, kCFStringEncodingUTF8);
225 return std::string(cstr);
229 CFIndex len = CFStringGetLength(str);
230 CFRange range = CFRangeMake(0, len);
231 CFIndex usedBufLen = 0;
233 str, range, kCFStringEncodingUTF8,
'?',
false,
nullptr, len, &usedBufLen);
234 UInt8 buffer[usedBufLen];
236 str, range, kCFStringEncodingUTF8,
'?',
false, buffer, len, &usedBufLen);
237 return std::string(
reinterpret_cast<const char *
>(buffer), usedBufLen);
void swap(openmsx::MemBuffer< T > &l, openmsx::MemBuffer< T > &r) noexcept
void trim(string_view &str, string_view chars)
bool stringToBool(string_view str)
std::pair< string_view, string_view > splitOnLast(string_view str, string_view chars)
vector< unsigned > parseRange(string_view str, unsigned min, unsigned max)
void trimRight(string &str, const char *chars)
std::pair< string_view, string_view > splitOnFirst(string_view str, string_view chars)
bool endsWith(string_view total, string_view part)
void trimLeft(string &str, const char *chars)
vector< string_view > split(string_view str, char chars)
bool startsWith(string_view total, string_view part)
constexpr vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr KeyMatrixPosition x
Keyboard bindings.
auto lower_bound(ForwardRange &&range, const T &value)
constexpr auto begin(const zstring_view &x)
constexpr auto end(const zstring_view &x)