forked from BowenFu/matchit.cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsymmetric.cpp
48 lines (44 loc) · 1.52 KB
/
symmetric.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
#include "matchit.h"
#include <iostream>
template <typename Range>
constexpr bool recursiveSymmetric(Range const &range)
{
using namespace matchit;
Id<int32_t> i;
Id<SubrangeT<Range const>> subrange;
return match(range)(
// clang-format off
pattern | ds(i, subrange.at(ooo), i) = [&] { return recursiveSymmetric(*subrange); },
pattern | ds(_, ooo, _) = expr(false),
pattern | _ = expr(true)
// clang-format on
);
}
constexpr bool symmetricArray(std::array<int32_t, 5> const &arr)
{
using namespace matchit;
Id<int32_t> i, j;
return match(arr)(
// clang-format off
pattern | ds(i, j, _, j, i) = expr(true),
pattern | _ = expr(false)
// clang-format on
);
}
static_assert(symmetricArray(std::array<int32_t, 5>{5, 0, 3, 7, 10}) == false);
static_assert(symmetricArray(std::array<int32_t, 5>{5, 0, 3, 0, 5}) == true);
static_assert(symmetricArray(std::array<int32_t, 5>{5, 1, 3, 0, 5}) == false);
int32_t main()
{
std::cout << recursiveSymmetric(std::array<int32_t, 5>{5, 0, 3, 7, 10})
<< std::endl;
std::cout << recursiveSymmetric(std::array<int32_t, 5>{5, 0, 3, 0, 5})
<< std::endl;
std::cout << recursiveSymmetric(std::array<int32_t, 4>{5, 0, 0, 5})
<< std::endl;
std::cout << recursiveSymmetric(std::array<int32_t, 4>{5, 0, 0, 4})
<< std::endl;
std::cout << recursiveSymmetric(std::array<int32_t, 4>{5, 1, 0, 5})
<< std::endl;
return 0;
}