generated from mod-cpp/pacman
-
Notifications
You must be signed in to change notification settings - Fork 2
/
44_exercises.cpp
103 lines (84 loc) · 2.04 KB
/
44_exercises.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <catch2/catch_all.hpp>
// To enable a test remove [.] from the tags on the test
// 44. Concepts- Intermediate
namespace exercises_44 {
enum class color {
blue,
red,
green,
purple
};
enum class shape {
triangle,
square,
circle
};
template<color C, shape S>
struct shape_t {
static constexpr auto color = C;
static constexpr auto shape = S;
};
template<color C>
struct circle : shape_t<C, shape::circle> {};
template<color C>
struct square : shape_t<C, shape::square> {};
template<color C>
struct triangle : shape_t<C, shape::triangle> {};
template<typename T>
concept is_shape = true;
template<typename T>
concept is_circle = (is_shape<T> && T::shape == shape::circle);
template<typename T>
concept is_red = (is_shape<T> && T::color == color::red);
template<typename T>
concept is_red_circle = is_circle<T> && is_red<T>;
enum class ReturnValue {
First,
Second,
Third,
Fourth,
Wrong
};
ReturnValue process(is_shape auto) {
return ReturnValue::First;
}
ReturnValue process(is_circle auto) {
return ReturnValue::Second;
}
ReturnValue process(is_red auto) {
return ReturnValue::Third;
}
ReturnValue process(is_red_circle auto) {
return ReturnValue::Fourth;
}
TEST_CASE("Exercise 441 : Reason about conjunction", "[.][44]") {
{
auto red_circle = circle<color::red>{};
CHECK(process(red_circle) == ReturnValue::Wrong);
}
{
auto green_circle = circle<color::green>{};
CHECK(process(green_circle) == ReturnValue::Wrong);
}
{
auto blue_circle = circle<color::blue>{};
CHECK(process(blue_circle) == ReturnValue::Wrong);
}
{
auto red_square = square<color::red>{};
CHECK(process(red_square) == ReturnValue::Wrong);
}
{
auto purple_square = square<color::purple>{};
CHECK(process(purple_square) == ReturnValue::Wrong);
}
{
auto red_triangle = triangle<color::red>{};
CHECK(process(red_triangle) == ReturnValue::Wrong);
}
{
auto blue_triangle = triangle<color::blue>{};
CHECK(process(blue_triangle) == ReturnValue::Wrong);
}
}
} // namespace exercises_44