• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

STEllAR-GROUP / hpx / #849

08 Dec 2022 10:31PM UTC coverage: 85.715% (-0.7%) from 86.456%
#849

push

StellarBot
Merge #6102

6102: Prevent warnings generated by clang-cl r=hkaiser a=hkaiser

clang-cl does not support `[[no_unique_address]]` nor does it support `[[msvc::no_unique_address]]`. This PR fixes the related warning generated by it.

Co-authored-by: Hartmut Kaiser <hartmut.kaiser@gmail.com>

171602 of 200200 relevant lines covered (85.72%)

2048410.46 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.32
/libs/core/algorithms/tests/unit/container_algorithms/includes_range.cpp
1
//  Copyright (c) 2014-2020 Hartmut Kaiser
2
//
3
//  SPDX-License-Identifier: BSL-1.0
4
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
5
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6

7
#include <hpx/local/init.hpp>
8
#include <hpx/modules/testing.hpp>
9
#include <hpx/parallel/container_algorithms/includes.hpp>
10

11
#include <cstddef>
12
#include <iostream>
13
#include <iterator>
14
#include <numeric>
15
#include <random>
16
#include <string>
17
#include <vector>
18

19
#include "test_utils.hpp"
20

21
///////////////////////////////////////////////////////////////////////////////
22
int seed = std::random_device{}();
1✔
23
std::mt19937 gen(seed);
1✔
24

25
///////////////////////////////////////////////////////////////////////////////
26
template <typename IteratorTag>
27
void test_includes1(IteratorTag)
2✔
28
{
29
    typedef std::vector<std::size_t>::iterator base_iterator;
30
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
31

32
    std::vector<std::size_t> c1(10007);
2✔
33
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
2✔
34
    std::size_t start = dis(gen);
2✔
35
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
2✔
36
    std::size_t end = start + dist(gen);
2✔
37

38
    std::size_t first_value = gen();    //-V101
2✔
39
    std::iota(std::begin(c1), std::end(c1), first_value);
2✔
40

41
    HPX_TEST_LTE(start, end);
2✔
42

43
    base_iterator start_it = std::next(std::begin(c1), start);
2✔
44
    base_iterator end_it = std::next(std::begin(c1), end);
2✔
45

46
    {
47
        bool result = hpx::ranges::includes(
2✔
48
            iterator(std::begin(c1)), iterator(std::end(c1)), start_it, end_it);
2✔
49

50
        bool expected =
2✔
51
            std::includes(std::begin(c1), std::end(c1), start_it, end_it);
2✔
52

53
        // verify values
54
        HPX_TEST_EQ(result, expected);
2✔
55
    }
56

57
    {
58
        std::vector<std::size_t> c2;
2✔
59
        std::copy(start_it, end_it, std::back_inserter(c2));
2✔
60

61
        if (!c2.empty())
2✔
62
        {
63
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
2✔
64
            ++c2[dis(gen)];    //-V104
2✔
65

66
            bool result = hpx::ranges::includes(iterator(std::begin(c1)),
4✔
67
                iterator(std::end(c1)), std::begin(c2), std::end(c2));
2✔
68

69
            bool expected = std::includes(
2✔
70
                std::begin(c1), std::end(c1), std::begin(c2), std::end(c2));
2✔
71

72
            // verify values
73
            HPX_TEST_EQ(result, expected);
2✔
74
        }
2✔
75
    }
2✔
76
}
2✔
77

78
template <typename ExPolicy, typename IteratorTag>
79
void test_includes1(ExPolicy&& policy, IteratorTag)
6✔
80
{
81
    static_assert(hpx::is_execution_policy<ExPolicy>::value,
82
        "hpx::is_execution_policy<ExPolicy>::value");
83

84
    typedef std::vector<std::size_t>::iterator base_iterator;
85
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
86

87
    std::vector<std::size_t> c1(10007);
6✔
88
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
6✔
89
    std::size_t start = dis(gen);
6✔
90
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
6✔
91
    std::size_t end = start + dist(gen);
6✔
92

93
    std::size_t first_value = gen();    //-V101
6✔
94
    std::iota(std::begin(c1), std::end(c1), first_value);
6✔
95

96
    HPX_TEST_LTE(start, end);
6✔
97

98
    base_iterator start_it = std::next(std::begin(c1), start);
6✔
99
    base_iterator end_it = std::next(std::begin(c1), end);
6✔
100

101
    {
102
        bool result = hpx::ranges::includes(policy, iterator(std::begin(c1)),
12✔
103
            iterator(std::end(c1)), start_it, end_it);
6✔
104

105
        bool expected =
6✔
106
            std::includes(std::begin(c1), std::end(c1), start_it, end_it);
6✔
107

108
        // verify values
109
        HPX_TEST_EQ(result, expected);
6✔
110
    }
111

112
    {
113
        // make sure std::less is not violated by incrementing one of the
114
        // elements
115
        std::transform(std::begin(c1), std::end(c1), std::begin(c1),
6✔
116
            [](std::size_t val) { return 2 * val; });
60,042✔
117

118
        std::vector<std::size_t> c2;
6✔
119
        std::copy(start_it, end_it, std::back_inserter(c2));
6✔
120

121
        if (!c2.empty())
6✔
122
        {
123
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
6✔
124
            auto index = dis(gen);
6✔
125
            ++c2[index];    //-V104
6✔
126

127
            bool result =
6✔
128
                hpx::ranges::includes(policy, iterator(std::begin(c1)),
12✔
129
                    iterator(std::end(c1)), std::begin(c2), std::end(c2));
6✔
130

131
            bool expected = std::includes(
6✔
132
                std::begin(c1), std::end(c1), std::begin(c2), std::end(c2));
6✔
133

134
            // verify values
135
            HPX_TEST_EQ(result, expected);
6✔
136
        }
6✔
137
    }
6✔
138
}
6✔
139

140
template <typename ExPolicy, typename IteratorTag>
141
void test_includes1_async(ExPolicy&& p, IteratorTag)
4✔
142
{
143
    typedef std::vector<std::size_t>::iterator base_iterator;
144
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
145

146
    std::vector<std::size_t> c1(10007);
4✔
147
    std::size_t first_value = gen();    //-V101
4✔
148
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
149
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
150
    std::size_t start = dis(gen);
4✔
151
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
152
    std::size_t end = start + dist(gen);
4✔
153

154
    HPX_TEST_LTE(start, end);
4✔
155

156
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
157
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
158

159
    {
160
        hpx::future<bool> result = hpx::ranges::includes(p,
8✔
161
            iterator(std::begin(c1)), iterator(std::end(c1)), start_it, end_it);
4✔
162
        result.wait();
4✔
163

164
        bool expected =
4✔
165
            std::includes(std::begin(c1), std::end(c1), start_it, end_it);
4✔
166

167
        // verify values
168
        HPX_TEST_EQ(result.get(), expected);
4✔
169
    }
4✔
170

171
    {
172
        // make sure std::less is not violated by incrementing one of the
173
        // elements
174
        std::transform(std::begin(c1), std::end(c1), std::begin(c1),
4✔
175
            [](std::size_t val) { return 2 * val; });
40,028✔
176

177
        std::vector<std::size_t> c2;
4✔
178
        std::copy(start_it, end_it, std::back_inserter(c2));
4✔
179

180
        if (!c2.empty())
4✔
181
        {
182
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
4✔
183
            ++c2[dis(gen)];    //-V104
4✔
184

185
            hpx::future<bool> result =
186
                hpx::ranges::includes(p, iterator(std::begin(c1)),
8✔
187
                    iterator(std::end(c1)), std::begin(c2), std::end(c2));
4✔
188
            result.wait();
4✔
189

190
            bool expected = std::includes(
4✔
191
                std::begin(c1), std::end(c1), std::begin(c2), std::end(c2));
4✔
192

193
            // verify values
194
            HPX_TEST_EQ(result.get(), expected);
4✔
195
        }
4✔
196
    }
4✔
197
}
4✔
198

199
template <typename IteratorTag>
200
void test_includes1()
2✔
201
{
202
    using namespace hpx::execution;
203

204
    test_includes1(IteratorTag());
2✔
205

206
    test_includes1(seq, IteratorTag());
2✔
207
    test_includes1(par, IteratorTag());
2✔
208
    test_includes1(par_unseq, IteratorTag());
2✔
209

210
    test_includes1_async(seq(task), IteratorTag());
2✔
211
    test_includes1_async(par(task), IteratorTag());
2✔
212
}
2✔
213

214
void includes_test1()
1✔
215
{
216
    test_includes1<std::random_access_iterator_tag>();
1✔
217
    test_includes1<std::forward_iterator_tag>();
1✔
218
}
1✔
219

220
///////////////////////////////////////////////////////////////////////////////
221
template <typename IteratorTag>
222
void test_includes2(IteratorTag)
2✔
223
{
224
    typedef std::vector<std::size_t>::iterator base_iterator;
225
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
226

227
    std::vector<std::size_t> c1(10007);
2✔
228
    std::size_t first_value = gen();    //-V101
2✔
229
    std::iota(std::begin(c1), std::end(c1), first_value);
2✔
230

231
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
2✔
232
    std::size_t start = dis(gen);
2✔
233
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
2✔
234
    std::size_t end = start + dist(gen);
2✔
235

236
    HPX_TEST_LTE(start, end);
2✔
237

238
    base_iterator start_it = std::next(std::begin(c1), start);
2✔
239
    base_iterator end_it = std::next(std::begin(c1), end);
2✔
240

241
    {
242
        bool result = hpx::ranges::includes(iterator(std::begin(c1)),
4✔
243
            iterator(std::end(c1)), start_it, end_it, std::less<std::size_t>());
2✔
244

245
        bool expected = std::includes(std::begin(c1), std::end(c1), start_it,
2✔
246
            end_it, std::less<std::size_t>());
2✔
247

248
        // verify values
249
        HPX_TEST_EQ(result, expected);
2✔
250
    }
251

252
    {
253
        // make sure std::less is not violated by incrementing one of the
254
        // elements
255
        std::transform(std::begin(c1), std::end(c1), std::begin(c1),
2✔
256
            [](std::size_t val) { return 2 * val; });
20,014✔
257

258
        std::vector<std::size_t> c2;
2✔
259
        std::copy(start_it, end_it, std::back_inserter(c2));
2✔
260

261
        if (!c2.empty())
2✔
262
        {
263
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
2✔
264
            ++c2[dis(gen)];    //-V104
2✔
265

266
            bool result = hpx::ranges::includes(iterator(std::begin(c1)),
4✔
267
                iterator(std::end(c1)), std::begin(c2), std::end(c2),
2✔
268
                std::less<std::size_t>());
269

270
            bool expected = std::includes(std::begin(c1), std::end(c1),
4✔
271
                std::begin(c2), std::end(c2), std::less<std::size_t>());
2✔
272

273
            // verify values
274
            HPX_TEST_EQ(result, expected);
2✔
275
        }
2✔
276
    }
2✔
277
}
2✔
278

279
template <typename ExPolicy, typename IteratorTag>
280
void test_includes2(ExPolicy&& policy, IteratorTag)
6✔
281
{
282
    static_assert(hpx::is_execution_policy<ExPolicy>::value,
283
        "hpx::is_execution_policy<ExPolicy>::value");
284

285
    typedef std::vector<std::size_t>::iterator base_iterator;
286
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
287

288
    std::vector<std::size_t> c1(10007);
6✔
289
    std::size_t first_value = gen();    //-V101
6✔
290
    std::iota(std::begin(c1), std::end(c1), first_value);
6✔
291

292
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
6✔
293
    std::size_t start = dis(gen);
6✔
294
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
6✔
295
    std::size_t end = start + dist(gen);
6✔
296

297
    HPX_TEST_LTE(start, end);
6✔
298

299
    base_iterator start_it = std::next(std::begin(c1), start);
6✔
300
    base_iterator end_it = std::next(std::begin(c1), end);
6✔
301

302
    {
303
        bool result = hpx::ranges::includes(policy, iterator(std::begin(c1)),
12✔
304
            iterator(std::end(c1)), start_it, end_it, std::less<std::size_t>());
6✔
305

306
        bool expected = std::includes(std::begin(c1), std::end(c1), start_it,
6✔
307
            end_it, std::less<std::size_t>());
6✔
308

309
        // verify values
310
        HPX_TEST_EQ(result, expected);
6✔
311
    }
312

313
    {
314
        // make sure std::less is not violated by incrementing one of the
315
        // elements
316
        std::transform(std::begin(c1), std::end(c1), std::begin(c1),
6✔
317
            [](std::size_t val) { return 2 * val; });
60,042✔
318

319
        std::vector<std::size_t> c2;
6✔
320
        std::copy(start_it, end_it, std::back_inserter(c2));
6✔
321

322
        if (!c2.empty())
6✔
323
        {
324
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
6✔
325
            ++c2[dis(gen)];    //-V104
6✔
326

327
            bool result = hpx::ranges::includes(policy,
12✔
328
                iterator(std::begin(c1)), iterator(std::end(c1)),
6✔
329
                std::begin(c2), std::end(c2), std::less<std::size_t>());
6✔
330

331
            bool expected = std::includes(std::begin(c1), std::end(c1),
12✔
332
                std::begin(c2), std::end(c2), std::less<std::size_t>());
6✔
333

334
            // verify values
335
            HPX_TEST_EQ(result, expected);
6✔
336
        }
6✔
337
    }
6✔
338
}
6✔
339

340
template <typename ExPolicy, typename IteratorTag>
341
void test_includes2_async(ExPolicy&& p, IteratorTag)
4✔
342
{
343
    typedef std::vector<std::size_t>::iterator base_iterator;
344
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
345

346
    std::vector<std::size_t> c1(10007);
4✔
347
    std::size_t first_value = gen();    //-V101
4✔
348
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
349

350
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
351
    std::size_t start = dis(gen);
4✔
352
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
353
    std::size_t end = start + dist(gen);
4✔
354

355
    HPX_TEST_LTE(start, end);
4✔
356

357
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
358
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
359

360
    {
361
        hpx::future<bool> result = hpx::ranges::includes(p,
8✔
362
            iterator(std::begin(c1)), iterator(std::end(c1)), start_it, end_it,
4✔
363
            std::less<std::size_t>());
364
        result.wait();
4✔
365

366
        bool expected = std::includes(std::begin(c1), std::end(c1), start_it,
4✔
367
            end_it, std::less<std::size_t>());
4✔
368

369
        // verify values
370
        HPX_TEST_EQ(result.get(), expected);
4✔
371
    }
4✔
372

373
    {
374
        // make sure std::less is not violated by incrementing one of the
375
        // elements
376
        std::transform(std::begin(c1), std::end(c1), std::begin(c1),
4✔
377
            [](std::size_t val) { return 2 * val; });
40,028✔
378

379
        std::vector<std::size_t> c2;
4✔
380
        std::copy(start_it, end_it, std::back_inserter(c2));
4✔
381

382
        if (!c2.empty())
4✔
383
        {
384
            std::uniform_int_distribution<> dis(0, c2.size() - 1);
4✔
385
            ++c2[dis(gen)];    //-V104
4✔
386

387
            hpx::future<bool> result = hpx::ranges::includes(p,
8✔
388
                iterator(std::begin(c1)), iterator(std::end(c1)),
4✔
389
                std::begin(c2), std::end(c2), std::less<std::size_t>());
4✔
390
            result.wait();
4✔
391

392
            bool expected = std::includes(std::begin(c1), std::end(c1),
8✔
393
                std::begin(c2), std::end(c2), std::less<std::size_t>());
4✔
394

395
            // verify values
396
            HPX_TEST_EQ(result.get(), expected);
4✔
397
        }
4✔
398
    }
4✔
399
}
4✔
400

401
template <typename IteratorTag>
402
void test_includes2()
2✔
403
{
404
    using namespace hpx::execution;
405

406
    test_includes2(IteratorTag());
2✔
407

408
    test_includes2(seq, IteratorTag());
2✔
409
    test_includes2(par, IteratorTag());
2✔
410
    test_includes2(par_unseq, IteratorTag());
2✔
411

412
    test_includes2_async(seq(task), IteratorTag());
2✔
413
    test_includes2_async(par(task), IteratorTag());
2✔
414
}
2✔
415

416
void includes_test2()
1✔
417
{
418
    test_includes2<std::random_access_iterator_tag>();
1✔
419
    test_includes2<std::forward_iterator_tag>();
1✔
420
}
1✔
421

422
///////////////////////////////////////////////////////////////////////////////
423
template <typename IteratorTag>
424
void test_includes_exception(IteratorTag)
2✔
425
{
426
    typedef std::vector<std::size_t>::iterator base_iterator;
427
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
428

429
    std::vector<std::size_t> c1(10007);
2✔
430
    std::size_t first_value = gen();    //-V101
2✔
431
    std::iota(std::begin(c1), std::end(c1), first_value);
2✔
432

433
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
2✔
434
    std::size_t start = dis(gen);
2✔
435
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
2✔
436
    std::size_t end = start + dist(gen);
2✔
437

438
    HPX_TEST_LTE(start, end);
2✔
439

440
    if (start == end)
2✔
441
        ++end;
×
442

443
    HPX_TEST_LTE(end, c1.size());
2✔
444

445
    base_iterator start_it = std::next(std::begin(c1), start);
2✔
446
    base_iterator end_it = std::next(std::begin(c1), end);
2✔
447

448
    bool caught_exception = false;
2✔
449
    try
450
    {
451
        hpx::ranges::includes(iterator(std::begin(c1)), iterator(std::end(c1)),
2✔
452
            start_it, end_it, [](std::size_t, std::size_t) {
2✔
453
                return throw std::runtime_error("test"), true;
2✔
454
            });
×
455

456
        HPX_TEST(false);
×
457
    }
2✔
458
    catch (hpx::exception_list const& e)
459
    {
460
        caught_exception = true;
2✔
461
        test::test_num_exceptions<hpx::execution::sequenced_policy,
2✔
462
            IteratorTag>::call(hpx::execution::seq, e);
2✔
463
    }
2✔
464
    catch (...)
465
    {
466
        HPX_TEST(false);
×
467
    }
2✔
468

469
    HPX_TEST(caught_exception);
2✔
470
}
4✔
471

472
template <typename ExPolicy, typename IteratorTag>
473
void test_includes_exception(ExPolicy&& policy, IteratorTag)
4✔
474
{
475
    static_assert(hpx::is_execution_policy<ExPolicy>::value,
476
        "hpx::is_execution_policy<ExPolicy>::value");
477

478
    typedef std::vector<std::size_t>::iterator base_iterator;
479
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
480

481
    std::vector<std::size_t> c1(10007);
4✔
482
    std::size_t first_value = gen();    //-V101
4✔
483
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
484

485
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
486
    std::size_t start = dis(gen);
4✔
487
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
488
    std::size_t end = start + dist(gen);
4✔
489

490
    HPX_TEST_LTE(start, end);
4✔
491

492
    if (start == end)
4✔
493
        ++end;
×
494

495
    HPX_TEST_LTE(end, c1.size());
4✔
496

497
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
498
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
499

500
    bool caught_exception = false;
4✔
501
    try
502
    {
503
        hpx::ranges::includes(policy, iterator(std::begin(c1)),
8✔
504
            iterator(std::end(c1)), start_it, end_it,
4✔
505
            [](std::size_t, std::size_t) {
27✔
506
                return throw std::runtime_error("test"), true;
27✔
507
            });
×
508

509
        HPX_TEST(false);
×
510
    }
4✔
511
    catch (hpx::exception_list const& e)
512
    {
513
        caught_exception = true;
4✔
514
        test::test_num_exceptions<ExPolicy, IteratorTag>::call(policy, e);
4✔
515
    }
4✔
516
    catch (...)
517
    {
518
        HPX_TEST(false);
×
519
    }
4✔
520

521
    HPX_TEST(caught_exception);
4✔
522
}
8✔
523

524
template <typename ExPolicy, typename IteratorTag>
525
void test_includes_exception_async(ExPolicy&& p, IteratorTag)
4✔
526
{
527
    typedef std::vector<std::size_t>::iterator base_iterator;
528
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
529

530
    std::vector<std::size_t> c1(10007);
4✔
531
    std::size_t first_value = gen();    //-V101
4✔
532
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
533

534
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
535
    std::size_t start = dis(gen);
4✔
536
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
537
    std::size_t end = start + dist(gen);
4✔
538

539
    HPX_TEST_LTE(start, end);
4✔
540

541
    if (start == end)
4✔
542
        ++end;
×
543

544
    HPX_TEST_LTE(end, c1.size());
4✔
545

546
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
547
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
548

549
    bool caught_exception = false;
4✔
550
    bool returned_from_algorithm = false;
4✔
551
    try
552
    {
553
        hpx::future<bool> f = hpx::ranges::includes(p, iterator(std::begin(c1)),
8✔
554
            iterator(std::end(c1)), start_it, end_it,
4✔
555
            [](std::size_t, std::size_t) {
28✔
556
                return throw std::runtime_error("test"), true;
28✔
557
            });
×
558
        returned_from_algorithm = true;
4✔
559
        f.get();
4✔
560

561
        HPX_TEST(false);
×
562
    }
4✔
563
    catch (hpx::exception_list const& e)
564
    {
565
        caught_exception = true;
4✔
566
        test::test_num_exceptions<ExPolicy, IteratorTag>::call(p, e);
4✔
567
    }
4✔
568
    catch (...)
569
    {
570
        HPX_TEST(false);
×
571
    }
4✔
572

573
    HPX_TEST(caught_exception);
4✔
574
    HPX_TEST(returned_from_algorithm);
4✔
575
}
8✔
576

577
template <typename IteratorTag>
578
void test_includes_exception()
2✔
579
{
580
    using namespace hpx::execution;
581

582
    test_includes_exception(IteratorTag());
2✔
583

584
    // If the execution policy object is of type vector_execution_policy,
585
    // std::terminate shall be called. therefore we do not test exceptions
586
    // with a vector execution policy
587
    test_includes_exception(seq, IteratorTag());
2✔
588
    test_includes_exception(par, IteratorTag());
2✔
589

590
    test_includes_exception_async(seq(task), IteratorTag());
2✔
591
    test_includes_exception_async(par(task), IteratorTag());
2✔
592
}
2✔
593

594
void includes_exception_test()
1✔
595
{
596
    test_includes_exception<std::random_access_iterator_tag>();
1✔
597
    test_includes_exception<std::forward_iterator_tag>();
1✔
598
}
1✔
599

600
///////////////////////////////////////////////////////////////////////////////
601
template <typename IteratorTag>
602
void test_includes_bad_alloc(IteratorTag)
2✔
603
{
604
    typedef std::vector<std::size_t>::iterator base_iterator;
605
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
606

607
    std::vector<std::size_t> c1(10007);
2✔
608
    std::size_t first_value = gen();    //-V101
2✔
609
    std::iota(std::begin(c1), std::end(c1), first_value);
2✔
610

611
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
2✔
612
    std::size_t start = dis(gen);
2✔
613
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
2✔
614
    std::size_t end = start + dist(gen);
2✔
615

616
    HPX_TEST_LTE(start, end);
2✔
617

618
    if (start == end)
2✔
619
        ++end;
×
620

621
    HPX_TEST_LTE(end, c1.size());
2✔
622

623
    base_iterator start_it = std::next(std::begin(c1), start);
2✔
624
    base_iterator end_it = std::next(std::begin(c1), end);
2✔
625

626
    bool caught_bad_alloc = false;
2✔
627
    try
628
    {
629
        hpx::ranges::includes(iterator(std::begin(c1)), iterator(std::end(c1)),
2✔
630
            start_it, end_it, [](std::size_t, std::size_t) {
2✔
631
                return throw std::bad_alloc(), true;
2✔
632
            });
633

634
        HPX_TEST(false);
×
635
    }
2✔
636
    catch (std::bad_alloc const&)
637
    {
638
        caught_bad_alloc = true;
2✔
639
    }
2✔
640
    catch (...)
641
    {
642
        HPX_TEST(false);
×
643
    }
2✔
644

645
    HPX_TEST(caught_bad_alloc);
2✔
646
}
4✔
647

648
template <typename ExPolicy, typename IteratorTag>
649
void test_includes_bad_alloc(ExPolicy&& policy, IteratorTag)
4✔
650
{
651
    static_assert(hpx::is_execution_policy<ExPolicy>::value,
652
        "hpx::is_execution_policy<ExPolicy>::value");
653

654
    typedef std::vector<std::size_t>::iterator base_iterator;
655
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
656

657
    std::vector<std::size_t> c1(10007);
4✔
658
    std::size_t first_value = gen();    //-V101
4✔
659
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
660

661
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
662
    std::size_t start = dis(gen);
4✔
663
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
664
    std::size_t end = start + dist(gen);
4✔
665

666
    HPX_TEST_LTE(start, end);
4✔
667

668
    if (start == end)
4✔
669
        ++end;
×
670

671
    HPX_TEST_LTE(end, c1.size());
4✔
672

673
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
674
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
675

676
    bool caught_bad_alloc = false;
4✔
677
    try
678
    {
679
        hpx::ranges::includes(policy, iterator(std::begin(c1)),
8✔
680
            iterator(std::end(c1)), start_it, end_it,
4✔
681
            [](std::size_t, std::size_t) {
25✔
682
                return throw std::bad_alloc(), true;
25✔
683
            });
684

685
        HPX_TEST(false);
×
686
    }
4✔
687
    catch (std::bad_alloc const&)
688
    {
689
        caught_bad_alloc = true;
4✔
690
    }
4✔
691
    catch (...)
692
    {
693
        HPX_TEST(false);
×
694
    }
4✔
695

696
    HPX_TEST(caught_bad_alloc);
4✔
697
}
8✔
698

699
template <typename ExPolicy, typename IteratorTag>
700
void test_includes_bad_alloc_async(ExPolicy&& p, IteratorTag)
4✔
701
{
702
    typedef std::vector<std::size_t>::iterator base_iterator;
703
    typedef test::test_iterator<base_iterator, IteratorTag> iterator;
704

705
    std::vector<std::size_t> c1(10007);
4✔
706
    std::size_t first_value = gen();    //-V101
4✔
707
    std::iota(std::begin(c1), std::end(c1), first_value);
4✔
708

709
    std::uniform_int_distribution<> dis(0, c1.size() - 1);
4✔
710
    std::size_t start = dis(gen);
4✔
711
    std::uniform_int_distribution<> dist(0, c1.size() - start - 1);
4✔
712
    std::size_t end = start + dist(gen);
4✔
713

714
    HPX_TEST_LTE(start, end);
4✔
715

716
    if (start == end)
4✔
717
        ++end;
×
718

719
    HPX_TEST_LTE(end, c1.size());
4✔
720

721
    base_iterator start_it = std::next(std::begin(c1), start);
4✔
722
    base_iterator end_it = std::next(std::begin(c1), end);
4✔
723

724
    bool caught_bad_alloc = false;
4✔
725
    bool returned_from_algorithm = false;
4✔
726
    try
727
    {
728
        hpx::future<bool> f = hpx::ranges::includes(p, iterator(std::begin(c1)),
8✔
729
            iterator(std::end(c1)), start_it, end_it,
4✔
730
            [](std::size_t, std::size_t) {
25✔
731
                return throw std::bad_alloc(), true;
25✔
732
            });
733
        returned_from_algorithm = true;
4✔
734
        f.get();
4✔
735

736
        HPX_TEST(false);
×
737
    }
4✔
738
    catch (std::bad_alloc const&)
739
    {
740
        caught_bad_alloc = true;
4✔
741
    }
4✔
742
    catch (...)
743
    {
744
        HPX_TEST(false);
×
745
    }
4✔
746

747
    HPX_TEST(caught_bad_alloc);
4✔
748
    HPX_TEST(returned_from_algorithm);
4✔
749
}
8✔
750

751
template <typename IteratorTag>
752
void test_includes_bad_alloc()
2✔
753
{
754
    using namespace hpx::execution;
755

756
    test_includes_bad_alloc(IteratorTag());
2✔
757

758
    // If the execution policy object is of type vector_execution_policy,
759
    // std::terminate shall be called. therefore we do not test exceptions
760
    // with a vector execution policy
761
    test_includes_bad_alloc(seq, IteratorTag());
2✔
762
    test_includes_bad_alloc(par, IteratorTag());
2✔
763

764
    test_includes_bad_alloc_async(seq(task), IteratorTag());
2✔
765
    test_includes_bad_alloc_async(par(task), IteratorTag());
2✔
766
}
2✔
767

768
void includes_bad_alloc_test()
1✔
769
{
770
    test_includes_bad_alloc<std::random_access_iterator_tag>();
1✔
771
    test_includes_bad_alloc<std::forward_iterator_tag>();
1✔
772
}
1✔
773

774
///////////////////////////////////////////////////////////////////////////////
775
int hpx_main(hpx::program_options::variables_map& vm)
1✔
776
{
777
    if (vm.count("seed"))
1✔
778
    {
779
        seed = vm["seed"].as<unsigned int>();
×
780
        gen.seed(seed);
×
781
    }
×
782
    std::cout << "using seed: " << seed << std::endl;
1✔
783

784
    includes_test1();
1✔
785
    includes_test2();
1✔
786
    includes_exception_test();
1✔
787
    includes_bad_alloc_test();
1✔
788
    return hpx::local::finalize();
1✔
789
}
×
790

791
int main(int argc, char* argv[])
1✔
792
{
793
    // add command line option which controls the random number generator seed
794
    using namespace hpx::program_options;
795
    options_description desc_commandline(
1✔
796
        "Usage: " HPX_APPLICATION_STRING " [options]");
1✔
797

798
    desc_commandline.add_options()("seed,s", value<unsigned int>(),
1✔
799
        "the random number generator seed to use for this run");
800

801
    // By default this test should run on all available cores
802
    std::vector<std::string> const cfg = {"hpx.os_threads=all"};
1✔
803

804
    // Initialize and run HPX
805
    hpx::local::init_params init_args;
1✔
806
    init_args.desc_cmdline = desc_commandline;
1✔
807
    init_args.cfg = cfg;
1✔
808

809
    HPX_TEST_EQ_MSG(hpx::local::init(hpx_main, argc, argv, init_args), 0,
1✔
810
        "HPX main exited with non-zero status");
811

812
    return hpx::util::report_errors();
1✔
813
}
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc