-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
166 lines (125 loc) · 5.52 KB
/
main.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
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
156
157
158
159
160
161
162
163
164
165
166
/**
* @author : huxiaoer
* @create time: 2021-7-25
* @explain:
* Test file;
*/
#include "iostream"
#include "SwitchIf/MultIf.hpp"
#include "SwitchIf/MultSwitchStrict.hpp"
#include "SwitchIf/MultSwitchLoose.hpp"
bool no() { return false; }
bool yes() { return true; }
void all_yes() { std::cout << "all yes" << std::endl; }
void all_no(){std::cout << "all no" << std::endl;}
void yes_no(){std::cout << "yes no" << std::endl;}
void no_yes(){std::cout << "no yes" << std::endl;}
void yes_and_no(){std::cout << "yes and no" << std::endl;}
void first_is_no() {std::cout << "first is no" << std::endl;}
void first_is_yes() { std::cout << "first is yes" << std::endl; }
int main() {
//1. MultIf right-value-object
std::cout << "MultIf right-value-object:" << std::endl;
MultIf<bool, 2>(yes(), no()).
ifdo({ true,true }, [] {all_yes(); }).
ifdo({ false,false }, [] {all_no(); }).
ifdo({ true,false }, [] {yes_no(); }). //to paint
ifdo({ false,true }, [] {no_yes(); });
MultIf<bool, 2>{yes(), no()}.
ifdo({ true,true }, [] {all_yes(); }).
ifdo({ false,false }, [] {all_no(); }).
elsedo([] {yes_and_no();}); //to paint
//2. MultIf left-value-object
std::cout << "MultIf left-value-object:" << std::endl;
MultIf<bool, 2> lif;
lif.setExpression(no(), yes()).
ifdo({ true,true }, [] {all_yes(); }).
ifdo({ false,false }, [] {all_no(); }).
ifdo({ true,false }, [] {yes_no(); }).
ifdo({ false,true }, [] {no_yes(); }). //to paint
//left-value-object finish shoud be call end()/elsedo(lambda) to prevent the next judgment is not interrupted
end();
lif.setExpression(yes(),yes()). //set new expression will reset
ifdo({ true,true }, [] {all_yes(); }). //to paint
ifdo({ false,false }, [] {all_no(); }).
elsedo([] {yes_and_no(); });
//3. MultIf peculiarly-code
std::cout << "MultIf peculiarly-code:" << std::endl;
lif.setExpression(no(), no()); //remember reset
lif.ifdo({ true,true }, [] {all_yes(); });
lif.ifdo({ false,false }, [] {all_no(); }); //to paint
lif.elsedo([] {yes_and_no();});
//4. MultSwitchStrict right-value-obj
std::cout << "MultSwitchStrict right-value-obj:" << std::endl;
MultSwitchStrict<bool, 2>(no(), yes()).
//real args is {true,bool{}} -> {true,false}
//Use the default construct to complete the parameters
casedo({ true }, [] {yes_no(); }).
casedo({ false,true }, [] {no_yes(); }). //to paint
casedo({ true,true }, [] {all_yes(); }). //to paint
defaultdo([] {all_no(); }); //to paint
MultSwitchStrict<bool, 2>(no(), yes()).
//real args is {true,bool{}} -> {true,false}
//Use the default construct to complete the parameters
casedo({ true }, [] {yes_no(); }, CaseMod::Break).
casedo({ false,true }, [] {no_yes(); }, CaseMod::Break). //to paint
casedo({ true,true }, [] {all_yes(); }, CaseMod::Break).
defaultdo([] {all_no(); });
//5. MultSwitchLoose right-value-obj
std::cout << "MultSwitchLoose right-value-obj:" << std::endl;
MultSwitchLoose<bool, 2>(yes(), no()).
//{true} is included {true,true} and {true,false}
//Loose Mode Matches only the first N of a given number
casedo({ true }, [] {first_is_yes(); }). //to paint
casedo({ false,true }, [] {yes_no(); }). //to paint
defaultdo([] {all_no(); }); //to paint
MultSwitchLoose<bool, 2>(yes(), yes()).
//{true} is included {true,true} and {true,false}
//Loose Mode Matches only the first N of a given number
casedo({ true }, [] {first_is_yes(); }, CaseMod::Break). //to paint
casedo({ false,true }, [] {yes_no(); }, CaseMod::Break).
defaultdo([] {all_no(); });
//6. MultSwitchStrict left-value-obj
std::cout << "MultSwitchStrict left-value-obj:" << std::endl;
MultSwitchStrict<bool, 2> mss;
mss.setExpression(no(), yes()).
casedo({ true }, [] {yes_no(); }).
casedo({ false,true }, [] {no_yes(); }). //to paint
casedo({ true,true }, [] {all_yes(); }). //to paint
defaultdo([] {all_no(); }); //to paint
mss.setExpression(no(), yes()).
casedo({ true }, [] {yes_no(); }, CaseMod::Break).
casedo({ false,true }, [] {no_yes(); }, CaseMod::Break). //to paint
casedo({ true,true }, [] {all_yes(); }, CaseMod::Break).
//finished should be call end() or default()
end();
//7. MultSwitchLoose left-value-obj
std::cout << "MultSwitchLoose left-value-obj:" << std::endl;
MultSwitchLoose<bool, 2> msl;
msl.setExpression(yes(), no()).
//{true} is included {true,true} and {true,false}
//Loose Mode Matches only the first N of a given number
casedo({ true }, [] {first_is_yes(); }). //to paint
casedo({ false,true }, [] {yes_no(); }). //to paint
defaultdo([] {all_no(); }); //to paint
//{true} is included {true,true} and {true,false}
//Loose Mode Matches only the first N of a given number
msl.setExpression(yes(), yes());
msl.casedo({ true }, [] {first_is_yes(); }, CaseMod::Break); //to paint
msl.casedo({ false,true }, [] {yes_no(); }, CaseMod::Break);
msl.defaultdo([] {all_no(); });
//8. MultSwitchLoose and MultSwitchStrict casedo() step by step
std::cout << "MultSwitchLoose and MultSwitchStrict casedo() step by step:" << std::endl;
//In the case of a few expressions,should be use MultSwitchStrict to reduce space footprint
MultSwitchStrict<int, 1>(5).
//casedo({ArgsList},bool is_break = CaseMod::NotBreak) is casedo({ArgsList},Lambda = nullptr ,bool is_break = CaseMod::NotBreak)
casedo({ 1 }).
casedo({ 2 }).
casedo({ 3 }, [] {std::cout << "x <=3 " << std::endl; }, CaseMod::Break). //to print
casedo({ 4 }).
casedo({ 5 }).
casedo({ 6 }, [] {std::cout << "3< x <=6" << std::endl; },CaseMod::Break).
defaultdo([] {std::cout << "6 < x" << std::endl;});
std::cin.get();
return 0;
}