summaryrefslogtreecommitdiff
path: root/graphs/cpp/implements/implements.hh
blob: bd80d8e35c533a803cd7d4cdf112250829e50e65 (plain)
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
#pragma once

template <typename T, typename T2 = T>
concept impl_basic_op = requires(T a, T2 b) {
    +a;
    -a;

    -b;
    +b;

    a + b;
    a - b;
    a* b;
    a / b;

    b + a;
    b - a;
    b* a;
    b / a;
};

template <typename T, typename T2 = T>
concept impl_modulo = requires(T a, T2 b) {
    a % b;
    b % a;
};

template <typename T, typename T2 = T>
concept impl_bitwise_op = requires(T a, T2 b) {
    ~a;
    ~b;
    a & b;
    a | b;
    a ^ b;
    a << b;
    a >> b;

    b & a;
    b | a;
    b ^ a;
    b << a;
    b >> a;
};

template <typename T, typename T2 = T>
concept impl_arith_op =
    impl_basic_op<T, T2> && impl_modulo<T, T2> && impl_bitwise_op<T, T2>;