Sat, 15 Sep 2018 15:57:56 +0300
refactor
1428
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
1 | #pragma once |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
2 | #include <array> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
3 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
4 | namespace detail |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
5 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
6 | template<typename T, typename Vt> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
7 | constexpr bool oneOfCompare(const T& value, Vt *first, Vt *last) |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
8 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
9 | return (first == last) |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
10 | ? false |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
11 | : (*first) == value |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
12 | ? true |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
13 | : detail::oneOfCompare(value, first + 1, last); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
14 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
15 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
16 | template<typename Vt, std::size_t N> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
17 | struct OneOfClass |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
18 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
19 | std::array<Vt, N> parameters; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
20 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
21 | template<typename... Ts> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
22 | constexpr OneOfClass(Ts&&... parameters) : |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
23 | parameters {{parameters...}} {} |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
24 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
25 | template<typename T> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
26 | constexpr bool operator==(const T& value) const |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
27 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
28 | return detail::oneOfCompare(value, ¶meters[0], ¶meters[N]); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
29 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
30 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
31 | template<typename T> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
32 | constexpr bool operator!=(const T& value) const |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
33 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
34 | return !(*this == value); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
35 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
36 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
37 | template<typename T> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
38 | constexpr friend bool operator==(const T& value, const OneOfClass<Vt, N>& array) |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
39 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
40 | return array == value; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
41 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
42 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
43 | template<typename T> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
44 | constexpr friend bool operator!=(const T& value, const OneOfClass<Vt, N>& array) |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
45 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
46 | return array != value; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
47 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
48 | }; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
49 | }; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
50 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
51 | /* |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
52 | * Returns such an object that compares equal to some value if and only if any of the parameters do. |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
53 | * Example: (x == any(1, 2, 3)) is equivalent to (x == 1 || x == 2 || x == 3) other than the lack of lazy-evaluation |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
54 | */ |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
55 | template<typename... Ts> |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
56 | constexpr auto oneOf(Ts&&... parameters) |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
57 | { |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
58 | using Vt = typename std::common_type<Ts...>::type; |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
59 | return detail::OneOfClass<Vt, sizeof...(Ts)>({parameters...}); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
60 | } |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
61 | |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
62 | static_assert(oneOf(1,2,3) == 3, "oneOf unit test"); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
63 | static_assert(oneOf(1,2,3) != 5, "oneOf unit test"); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
64 | static_assert(3 == oneOf(1,2,3), "oneOf unit test"); |
ece049033adc
fixed a crash when trying to open a document for the 3rd time after closing it 2 times
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
65 | static_assert(5 != oneOf(1,2,3), "oneOf unit test"); |