C++ Library Extensions 2022.12.09
To help learn modern C++ programming
030-premature_exit.cpp
Go to the documentation of this file.
2
5
7{
8 size_t count = 10;
9
10 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
11
12 std::vector<int> v; v.reserve(count);
13
14 for(size_t i = 0; i < count; ++i)
15 v.emplace_back(generator());
16
17 stream << v << endl;
18 std::atomic<bool> failed(false);
19
20 std::transform(std::execution::par_unseq, v.begin(), v.end(), v.begin(),
21 [&generator, &failed](auto& e)
22 {
23 auto rlt = e;
24
25 try
26 {
27 rlt = tpf::safe_type::safe_div(e, generator());
28
29 }
30 catch(std::exception&)
31 {
32 // stream << e << endl;
33 failed = true;
34 }
35
36 return rlt;
37 }
38
39 );
40
41 stream << "Okay done " << failed << endl;
42}
43
44template<typename Policy, typename IteratorBegin, typename IteratorEnd, typename Callback>
45bool my_for_each(Policy&& policy, IteratorBegin&& begin, IteratorEnd&& end, Callback&& callback)
46{
47 std::atomic<bool> operation_result{true};
48
49 std::for_each(std::forward<Policy>(policy),
50 std::forward<IteratorBegin>(begin),
51 std::forward<IteratorEnd>(end),
52 [&callback, &operation_result](auto&& e)
53 {
54 try
55 {
56 callback(std::forward<decltype(e)>(e));
57 }
58 catch(...)
59 {
60 operation_result = false;
61 }
62 });
63
64 return operation_result;
65}
66
67
69{
70 size_t count = 10;
71
72 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
73
74 std::vector<int> v; v.reserve(count);
75
76 for(size_t i = 0; i < count; ++i)
77 v.emplace_back(generator());
78
79 // tpf::sstream stream;
80 // auto endl = tpf::endl;
81
82 auto result =
83 my_for_each(std::execution::par_unseq, v.begin(), v.end(),
84 [&generator](auto& e)
85 {
86 e = tpf::safe_type::safe_div(e, generator());
87 });
88
89 if(result)
90 {
91 stream << "Okay successful!" << endl;
92 }
93 else
94 {
95 stream << "Operation failed" << endl;
96 }
97}
98
99template<typename Policy, typename IteratorBegin, typename IteratorEnd, typename Callback>
100void safe_for_each(Policy&& policy, IteratorBegin&& begin, IteratorEnd&& end, Callback&& callback)
101{
102 std::exception_ptr exception_ptr{nullptr};
103
104 std::for_each(std::forward<Policy>(policy),
105 std::forward<IteratorBegin>(begin),
106 std::forward<IteratorEnd>(end),
107 [&callback, &exception_ptr](auto&& e)
108 {
109 try
110 {
111 callback(std::forward<decltype(e)>(e));
112 }
113 catch(...)
114 {
115 exception_ptr = std::current_exception();
116 }
117 });
118
119 if(exception_ptr) std::rethrow_exception(exception_ptr);
120}
121
122template<typename Policy, typename IteratorBegin, typename IteratorEnd, typename Callback>
123void go_parallel(Policy&& policy, IteratorBegin&& begin, IteratorEnd&& end, Callback&& callback)
124{
125 std::exception_ptr exception_ptr{nullptr};
126
127 std::for_each(std::forward<Policy>(policy),
128 std::forward<IteratorBegin>(begin),
129 std::forward<IteratorEnd>(end),
130 [&callback, &exception_ptr](auto&& e)
131 {
132 try
133 {
134 callback(std::forward<decltype(e)>(e));
135 }
136 catch(...)
137 {
138 exception_ptr = std::current_exception();
139 }
140 });
141
142 if(exception_ptr) std::rethrow_exception(exception_ptr);
143}
144
146{
147 size_t count = 10;
148
149 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
150
151 std::vector<int> v; v.reserve(count);
152
153 for(size_t i = 0; i < count; ++i)
154 v.emplace_back(generator());
155
156 stream << "Before: " << v << endl;
157
158 try
159 {
160 safe_for_each(std::execution::par_unseq, v.begin(), v.end(),
161 [&generator](auto& e)
162 {
163 e = tpf::safe_type::safe_div(e, generator());
164 });
165
166 stream << "After: " << v << endl;
167 }
168 catch(const std::exception& e)
169 {
170 stream << "---- Operation Failed with Exception ----" << endl;
171
172 stream << e << endl;
173 }
174}
175
177{
178 size_t count = 10;
179
180 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
181
182 std::vector<int> v; v.reserve(count);
183
184 for(size_t i = 0; i < count; ++i)
185 v.emplace_back(generator());
186
187 stream << "Before: " << v << endl;
188
189 auto callback = [&generator](auto& e)
190 {
191 e = tpf::safe_type::safe_div(e, generator());
192 };
193
194 Tpf_GoParallel(success, std::for_each, callback,
195 std::execution::par_unseq, v.begin(), v.end());
196
197 if(success)
198 {
199 stream << "After: " << v << endl;
200 }
201 else
202 {
203 stream <<"Operaion failed" << endl;
204 }
205}
206
208{
209 size_t count = 10;
210
211 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
212
213 std::vector<int> v; v.reserve(count);
214
215 for(size_t i = 0; i < count; ++i)
216 v.emplace_back(generator());
217
218 stream << "Before: " << v << endl;
219
220 auto find_value = v.back();
221
222 auto callback = [&find_value](auto& e)
223 {
224 return find_value == e;
225 };
226
227 Tpf_GoParallel_Return(success, itr, std::find_if, callback,
228 std::execution::par_unseq, v.begin(), v.end());
229
230 if(success)
231 {
232 stream << "Found: " << *itr << endl;
233 }
234 else
235 {
236 stream <<"Operaion failed" << endl;
237 }
238}
239
240
242{
243 size_t count = 10;
244
245 auto generator = tpf::chrono_random::random_generator<int>(0, 10);
246
247 std::vector<int> v; v.reserve(count);
248
249 for(size_t i = 0; i < count; ++i)
250 v.emplace_back(generator());
251
252 stream << "Before: " << v << endl;
253
254 auto callback = [&generator](auto& e)
255 {
256 e = tpf::safe_type::safe_div(e, generator());
257 };
258
259 try
260 {
261 Tpf_GoParallel_Throw(std::for_each, callback,
262 std::execution::par_unseq, v.begin(), v.end());
263
264 stream << "After: " << v << endl;
265 }
266 catch(const std::exception& e)
267 {
268 stream << "\n" << e << endl;
269 }
270
271}
272
273
274int main()
275{
279
282
284
285
286}
std::atomic< int > count
Definition: 022-mutex.cpp:10
void serial_algorithm()
tpf::sstream stream
void safe_for_each(Policy &&policy, IteratorBegin &&begin, IteratorEnd &&end, Callback &&callback)
void safe_parallel_algorithm_throw()
void safe_parallel_algorithm_bool()
void safe_serial_algorithm()
void go_parallel(Policy &&policy, IteratorBegin &&begin, IteratorEnd &&end, Callback &&callback)
void safe_parallel_algorithm()
auto endl
bool my_for_each(Policy &&policy, IteratorBegin &&begin, IteratorEnd &&end, Callback &&callback)
void safe_parallel_algorithm_return()
int main()
types::enable_if_integral_t< Type > safe_div(Type a, Type b)
Safe division of integral types.
constexpr auto endl
Definition: tpf_output.hpp:973