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();
}
|