// Copyright (c) 2018-2021 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 #endif #include "lightweight_test.hpp" #include #include #include #include namespace leaf = boost::leaf; constexpr int ids_per_thread = 10000; std::vector generate_ids() { std::vector 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 all_ids = generate_ids(); #else constexpr int thread_count = 100; using thread_ids = std::future>; std::vector fut; fut.reserve(thread_count); std::generate_n( std::back_inserter(fut), thread_count, [=] { return std::async(std::launch::async, &generate_ids); }); std::vector 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(); }