| |
1 #pragma once |
| |
2 #include "basics.h" |
| |
3 |
| |
4 namespace utility |
| |
5 { |
| |
6 template<typename T, std::size_t N> |
| |
7 constexpr std::size_t countof(T(&)[N]) |
| |
8 { |
| |
9 return N; |
| |
10 } |
| |
11 |
| |
12 // http://stackoverflow.com/a/18204188/3629665 |
| |
13 template<typename T> |
| |
14 inline T rotl10(T x) |
| |
15 { |
| |
16 return (x << 10) | ((x >> 22) & 0x000000ff); |
| |
17 } |
| |
18 |
| |
19 template<typename T> |
| |
20 inline T rotl20(T x) |
| |
21 { |
| |
22 return (x << 20) | ((x >> 12) & 0x000000ff); |
| |
23 } |
| |
24 |
| |
25 inline QString format(const QString& format_string) |
| |
26 { |
| |
27 return format_string; |
| |
28 } |
| |
29 |
| |
30 template<typename T, typename... Rest> |
| |
31 QString format(const QString& format_string, T&& arg, Rest&&... rest) |
| |
32 { |
| |
33 return format(format_string.arg(arg), std::forward<Rest>(rest)...); |
| |
34 } |
| |
35 |
| |
36 inline QString quoted(QString string) |
| |
37 { |
| |
38 if (string.contains("'")) |
| |
39 { |
| |
40 string.replace("\"", "\\\""); |
| |
41 string = "\"" + string + "\""; |
| |
42 } |
| |
43 else |
| |
44 { |
| |
45 string = "'" + string + "'"; |
| |
46 } |
| |
47 return string; |
| |
48 } |
| |
49 |
| |
50 template<typename T, typename R> |
| |
51 bool contains(T&& container, R&& value) |
| |
52 { |
| |
53 return std::find(std::begin(container), std::end(container), value) != std::end(container); |
| |
54 } |
| |
55 } |