#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include #include #include #include // -------------------------------------------------------- // Testcase: PassiveVector // -------------------------------------------------------- TEST_CASE("PassiveVector" * doctest::timeout(300)) { SUBCASE("constructor") { tf::PassiveVector vec1; REQUIRE(vec1.size() == 0); REQUIRE(vec1.empty() == true); tf::PassiveVector vec2; REQUIRE(vec2.size() == 0); REQUIRE(vec2.empty() == true); REQUIRE(vec2.capacity() == 8); } SUBCASE("constructor_n") { for(int N=0; N<=65536; ++N) { tf::PassiveVector vec(N); REQUIRE(vec.size() == N); REQUIRE(vec.empty() == (N == 0)); REQUIRE(vec.max_size() >= vec.size()); REQUIRE(vec.capacity() >= vec.size()); } } SUBCASE("copy_constructor") { for(int N=0; N<=65536; N = (N ? N << 1 : 1)) { tf::PassiveVector vec1(N); for(auto& item : vec1) { item = N; } tf::PassiveVector vec2(vec1); REQUIRE(vec1.size() == N); REQUIRE(vec2.size() == N); for(size_t i=0; i vec1(N); for(auto& item : vec1) { item = N; } tf::PassiveVector vec2(std::move(vec1)); REQUIRE(vec1.size() == 0); REQUIRE(vec1.empty() == true); REQUIRE(vec2.size() == N); for(size_t i=0; i vec; size_t pcap {0}; size_t ncap {0}; for(int n=0; n= pcap); pcap = ncap; } for(int n=0; n vec; for(int N=0; N<=65536; ++N) { vec.push_back(N); ++size; REQUIRE(vec.size() == size); if(N % 4 == 0) { vec.pop_back(); --size; REQUIRE(vec.size() == size); } ncap = vec.capacity(); REQUIRE(ncap >= pcap); pcap = ncap; } REQUIRE(vec.size() == size); for(size_t i=0; i vec; for(int n=0; n vec(N); REQUIRE_THROWS(vec.at(N)); REQUIRE_THROWS(vec.at(N+1)); for(int n=0; n vec(N); auto cap = vec.capacity(); REQUIRE(vec.size() == N); vec.clear(); REQUIRE(vec.size() == 0); REQUIRE(vec.capacity() == cap); } } SUBCASE("comparison") { for(int N=0; N<=65536; N = (N ? N << 1 : 1)) { tf::PassiveVector vec1; for(int i=0; i vec2(vec1); REQUIRE(vec1 == vec2); } } } // -------------------------------------------------------- // Testcase: ObjectPool.Sequential // -------------------------------------------------------- TEST_CASE("ObjectPool.Sequential" * doctest::timeout(300)) { struct Foo { std::string str; std::vector vec; int a; char b; }; for(unsigned w=1; w<=4; w++) { tf::ObjectPool pool(w); REQUIRE(pool.num_heaps() > 0); REQUIRE(pool.num_local_heaps() > 0); REQUIRE(pool.num_global_heaps() > 0); REQUIRE(pool.num_bins_per_local_heap() > 0); REQUIRE(pool.num_objects_per_bin() > 0); REQUIRE(pool.num_objects_per_block() > 0); REQUIRE(pool.emptiness_threshold() > 0); // fill out all object objects int N = 1000*pool.num_objects_per_block(); std::set set; for(int i=0; i void threaded_objectpool(unsigned W) { tf::ObjectPool pool; std::vector threads; for(unsigned w=0; w items; for(int i=0; i<65536; ++i) { auto item = pool.allocate(); new (item) T(); items.push_back(item); } for(auto item : items) { item->~T(); pool.deallocate(item); } }); } for(auto& thread : threads) { thread.join(); } REQUIRE(pool.num_allocated_objects() == 0); REQUIRE(pool.num_available_objects() == pool.capacity()); } TEST_CASE("ObjectPool.1thread" * doctest::timeout(300)) { threaded_objectpool(1); threaded_objectpool(1); threaded_objectpool(1); threaded_objectpool(1); threaded_objectpool(1); } TEST_CASE("ObjectPool.2threads" * doctest::timeout(300)) { threaded_objectpool(2); threaded_objectpool(2); threaded_objectpool(2); threaded_objectpool(2); threaded_objectpool(2); } TEST_CASE("ObjectPool.3threads" * doctest::timeout(300)) { threaded_objectpool(3); threaded_objectpool(3); threaded_objectpool(3); threaded_objectpool(3); threaded_objectpool(3); } TEST_CASE("ObjectPool.4threads" * doctest::timeout(300)) { threaded_objectpool(4); threaded_objectpool(4); threaded_objectpool(4); threaded_objectpool(4); threaded_objectpool(4); } TEST_CASE("ObjectPool.5threads" * doctest::timeout(300)) { threaded_objectpool(5); threaded_objectpool(5); threaded_objectpool(5); threaded_objectpool(5); threaded_objectpool(5); } TEST_CASE("ObjectPool.6threads" * doctest::timeout(300)) { threaded_objectpool(6); threaded_objectpool(6); threaded_objectpool(6); threaded_objectpool(6); threaded_objectpool(6); } TEST_CASE("ObjectPool.7threads" * doctest::timeout(300)) { threaded_objectpool(7); threaded_objectpool(7); threaded_objectpool(7); threaded_objectpool(7); threaded_objectpool(7); } TEST_CASE("ObjectPool.8threads" * doctest::timeout(300)) { threaded_objectpool(8); threaded_objectpool(8); threaded_objectpool(8); threaded_objectpool(8); threaded_objectpool(8); } TEST_CASE("ObjectPool.9threads" * doctest::timeout(300)) { threaded_objectpool(9); threaded_objectpool(9); threaded_objectpool(9); threaded_objectpool(9); threaded_objectpool(9); } TEST_CASE("ObjectPool.10threads" * doctest::timeout(300)) { threaded_objectpool(10); threaded_objectpool(10); threaded_objectpool(10); threaded_objectpool(10); threaded_objectpool(10); } TEST_CASE("ObjectPool.11threads" * doctest::timeout(300)) { threaded_objectpool(11); threaded_objectpool(11); threaded_objectpool(11); threaded_objectpool(11); threaded_objectpool(11); } TEST_CASE("ObjectPool.12threads" * doctest::timeout(300)) { threaded_objectpool(12); threaded_objectpool(12); threaded_objectpool(12); threaded_objectpool(12); threaded_objectpool(12); } TEST_CASE("ObjectPool.13threads" * doctest::timeout(300)) { threaded_objectpool(13); threaded_objectpool(13); threaded_objectpool(13); threaded_objectpool(13); threaded_objectpool(13); } TEST_CASE("ObjectPool.14threads" * doctest::timeout(300)) { threaded_objectpool(14); threaded_objectpool(14); threaded_objectpool(14); threaded_objectpool(14); threaded_objectpool(14); } TEST_CASE("ObjectPool.15threads" * doctest::timeout(300)) { threaded_objectpool(15); threaded_objectpool(15); threaded_objectpool(15); threaded_objectpool(15); threaded_objectpool(15); } TEST_CASE("ObjectPool.16threads" * doctest::timeout(300)) { threaded_objectpool(16); threaded_objectpool(16); threaded_objectpool(16); threaded_objectpool(16); threaded_objectpool(16); } // -------------------------------------------------------- // Testcase: FunctionTraits // -------------------------------------------------------- void func1() { } int func2(int, double, float, char) { return 0; } TEST_CASE("FunctionTraits" * doctest::timeout(300)) { SUBCASE("func1") { using func1_traits = tf::function_traits; static_assert(std::is_same::value, ""); static_assert(func1_traits::arity == 0, ""); } SUBCASE("func2") { using func2_traits = tf::function_traits; static_assert(std::is_same::value, ""); static_assert(func2_traits::arity == 4, ""); static_assert(std::is_same, int>::value, ""); static_assert(std::is_same, double>::value,""); static_assert(std::is_same, float>::value, ""); static_assert(std::is_same, char>::value, ""); } SUBCASE("lambda1") { auto lambda1 = [] () mutable { return 1; }; using lambda1_traits = tf::function_traits; static_assert(std::is_same::value, ""); static_assert(lambda1_traits::arity == 0, ""); } SUBCASE("lambda2") { auto lambda2 = [] (int, double, char&) { }; using lambda2_traits = tf::function_traits; static_assert(std::is_same::value, ""); static_assert(lambda2_traits::arity == 3, ""); static_assert(std::is_same, int>::value, ""); static_assert(std::is_same, double>::value, ""); static_assert(std::is_same, char&>::value, ""); } SUBCASE("class") { struct foo { int operator ()(int, float) const; }; using foo_traits = tf::function_traits; static_assert(std::is_same::value, ""); static_assert(foo_traits::arity == 2, ""); static_assert(std::is_same, int>::value, ""); static_assert(std::is_same, float>::value, ""); } SUBCASE("std-function") { using ft1 = tf::function_traits>; static_assert(std::is_same::value, ""); static_assert(ft1::arity == 0, ""); using ft2 = tf::function_traits&>; static_assert(std::is_same::value, ""); static_assert(ft2::arity == 2, ""); static_assert(std::is_same, int&>::value, ""); static_assert(std::is_same, double&&>::value, ""); using ft3 = tf::function_traits&&>; static_assert(std::is_same::value, ""); static_assert(ft3::arity == 2, ""); static_assert(std::is_same, int&>::value, ""); static_assert(std::is_same, double&&>::value, ""); using ft4 = tf::function_traits&>; static_assert(std::is_same::value, ""); static_assert(ft4::arity == 1, ""); static_assert(std::is_same, int>::value, ""); } }