File: error_id_test.cpp

package info (click to toggle)
boost1.83 1.83.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 545,632 kB
  • sloc: cpp: 3,857,086; xml: 125,552; ansic: 34,414; python: 25,887; asm: 5,276; sh: 4,799; ada: 1,681; makefile: 1,629; perl: 1,212; pascal: 1,139; sql: 810; yacc: 478; ruby: 102; lisp: 24; csh: 6
file content (127 lines) | stat: -rw-r--r-- 3,387 bytes parent folder | download | duplicates (6)
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
// Copyright 2018-2022 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::leaf_detail::new_id();
        BOOST_TEST_NE(id&1, 0);
        int last = leaf::leaf_detail::current_id();
        BOOST_TEST_EQ(last, leaf::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(), 1);
        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(), 5);
        BOOST_TEST(e2);
        BOOST_TEST_EQ(e2.value(), 9);
        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(), 13);
        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; 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));
    }
#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();
}