File: error_id_test.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (126 lines) | stat: -rw-r--r-- 3,414 bytes parent folder | download | duplicates (5)
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
// Copyright 2018-2024 Emil Dotchevski and Reverge Studios, Inc.
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#ifdef BOOST_LEAF_TEST_SINGLE_HEADER
#   include "leaf.hpp"
#else
#   include <boost/leaf/error.hpp>
#endif

#include "lightweight_test.hpp"
#include <future>
#include <vector>
#include <algorithm>
#include <iterator>

namespace leaf = boost::leaf;

constexpr int ids_per_thread = 10000;

std::vector<int> generate_ids()
{
    std::vector<int> ids;
    ids.reserve(ids_per_thread);
    for(int i=0; i!=ids_per_thread-1; ++i)
    {
        int id = leaf::detail::new_id();
        BOOST_TEST_NE(id&1, 0);
        int last = leaf::detail::current_id();
        BOOST_TEST_EQ(last, leaf::detail::current_id());
        BOOST_TEST_NE(last&1, 0);
        BOOST_TEST_EQ(last, id);
        ids.push_back(id);
    }
    return ids;
}

int main()
{
    {
        leaf::error_id e1;
        leaf::error_id e2;
        BOOST_TEST(!e1);
        BOOST_TEST_EQ(e1.value(), 0);
        BOOST_TEST(!e2);
        BOOST_TEST_EQ(e2.value(), 0);
        BOOST_TEST(e1 == e2);
        BOOST_TEST(!(e1 != e2));
        BOOST_TEST(!(e1 < e2));
        BOOST_TEST(!(e2 < e1));
    }
    {
        leaf::error_id e1;
        leaf::error_id e2 = leaf::new_error();
        BOOST_TEST(!e1);
        BOOST_TEST_EQ(e1.value(), 0);
        BOOST_TEST(e2);
        BOOST_TEST_EQ(e2.value(), 5);
        BOOST_TEST(!(e1 == e2));
        BOOST_TEST(e1 != e2);
        BOOST_TEST(e1 < e2);
        BOOST_TEST(!(e2 < e1));
    }
    {
        leaf::error_id e1 = leaf::new_error();
        leaf::error_id e2 = leaf::new_error();
        BOOST_TEST(e1);
        BOOST_TEST_EQ(e1.value(), 9);
        BOOST_TEST(e2);
        BOOST_TEST_EQ(e2.value(), 13);
        BOOST_TEST(!(e1 == e2));
        BOOST_TEST(e1 != e2);
        BOOST_TEST(e1 < e2);
        BOOST_TEST(!(e2 < e1));
    }
    {
        leaf::error_id e1 = leaf::new_error();
        leaf::error_id e2 = e1;
        BOOST_TEST(e1);
        BOOST_TEST_EQ(e1.value(), 17);
        BOOST_TEST(e2);
        BOOST_TEST_EQ(e2.value(), 17);
        BOOST_TEST(e1 == e2);
        BOOST_TEST(!(e1 != e2));
        BOOST_TEST(!(e1 < e2));
        BOOST_TEST(!(e2 < e1));
    }
    {
        leaf::error_id e1 = leaf::new_error();
        leaf::error_id e2; e2 = e1;
        BOOST_TEST(e1);
        BOOST_TEST_EQ(e1.value(), 21);
        BOOST_TEST(e2);
        BOOST_TEST_EQ(e2.value(), 21);
        BOOST_TEST(e1 == e2);
        BOOST_TEST(!(e1 != e2));
        BOOST_TEST(!(e1 < e2));
        BOOST_TEST(!(e2 < e1));
    }
#ifdef BOOST_LEAF_NO_THREADS
    std::vector<int> all_ids = generate_ids();
#else
    constexpr int thread_count = 100;
    using thread_ids = std::future<std::vector<int>>;
    std::vector<thread_ids> fut;
    fut.reserve(thread_count);
    std::generate_n(
        std::back_inserter(fut),
        thread_count,
        [=]
        {
            return std::async(std::launch::async, &generate_ids);
        });
    std::vector<int> all_ids;
    for(auto & f : fut)
    {
        auto fv = f.get();
        all_ids.insert(all_ids.end(), fv.begin(), fv.end());
    }
#endif
    std::sort(all_ids.begin(), all_ids.end());
    auto u = std::unique(all_ids.begin(), all_ids.end());
    BOOST_TEST(u == all_ids.end());

    return boost::report_errors();
}