File: section17.cc

package info (click to toggle)
c%2B%2B-annotations 12.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 13,044 kB
  • sloc: cpp: 24,337; makefile: 1,517; ansic: 165; sh: 121; perl: 90
file content (155 lines) | stat: -rw-r--r-- 3,150 bytes parent folder | download | duplicates (4)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
    template <typename Type = int, int N = 10>
    concept bool C3 = true;

    template <typename Type>
    concept bool ID()
    {
        return true;
    }

    template <typename Type>
    concept bool IncAndDec()
    {
        return
            requires(Type par)
            {
                ++par;          // `Type' variables/objects must
                --par;          // support pre- and postfix
                par++;          // increment and decrement
                par--;          // operators
            };
    }

    template <typename Type>
    concept bool ReturnTypes()
    {
        return
            requires(Type par)
            {
                { ++par } -> Type &;    // prefix inc. returns a Type &
                { par[0] } -> char;     // the index operator returns a char
            };
    }

    template <typename Type>
    concept bool MultiArgs()
    {
        return
            requires(Type lhs, Type rhs)
            {
                { lhs + rhs   } -> Type;
                { lhs += rhs  } -> Type &;
                { lhs.c_str() } -> char const *;
            };
    }

    template <typename Type>
    concept bool CombiOps()
    {
        return
            requires(Type lhs, Type rhs)
            {
                { lhs + rhs   } -> Type;
                { lhs += rhs  } -> Type &;
            }
            and
            requires(Type lhs)
            {
                { lhs.c_str() } -> char const *;
            };
    }

    template <typename Type>
    concept bool ValueType()
    {
        return
            requires()
            {
                typename Type::value_type;
            };
    }

    template <ValueType Type>
    class Data
    {
    };

    struct EnumStruct
    {
        enum value_type
        {
            VALUE
        };
    };

    template <typename Type>
    concept bool InputIterator()
    {
        return true;
    }

    template <typename Type>
    concept bool OutputIterator()
    {
        return true;
    }

    template <typename Type>
    concept bool ForwardIterator()
    {
        return
            requires
            {
                requires InputIterator<Type>();
                requires OutputIterator<Type>();
            };
    }

    template <typename Type>
    concept bool BidirectionalIterator()
    {
        return
            requires
            {
                requires ForwardIterator<Type>();
                requires IncAndDec<Type>();
            };
    }

    template <typename Type>
    concept bool RandomAccessIterator()
    {
        return
            requires
            {
                requires BidirectionalIterator<Type>();
            }
            and
            requires(Type lhs, Type rhs)
            {
                { lhs + rhs };
                { lhs - rhs };
            };
    }

    template <BidirectionalIterator Type>
    struct Iterator
    {
        void fun();
    };

    template <RandomAccessIterator RAI>
    void rSort(RAI begin, RAI end)
    {}

int main()
{
//    Data<EnumStruct> data;

    Iterator<int> iter;
    iter = iter;

    rSort(10, 20);

    iter.fun();
}