151c0b2f7Stbbdev /*
2*b15aabb3Stbbdev Copyright (c) 2019-2021 Intel Corporation
351c0b2f7Stbbdev
451c0b2f7Stbbdev Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev you may not use this file except in compliance with the License.
651c0b2f7Stbbdev You may obtain a copy of the License at
751c0b2f7Stbbdev
851c0b2f7Stbbdev http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev
1051c0b2f7Stbbdev Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev See the License for the specific language governing permissions and
1451c0b2f7Stbbdev limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev
1751c0b2f7Stbbdev #ifndef NOMINMAX
1851c0b2f7Stbbdev #define NOMINMAX
1951c0b2f7Stbbdev #endif
2049e08aacStbbdev #include "oneapi/tbb/concurrent_set.h"
2151c0b2f7Stbbdev #include <common/test.h>
2251c0b2f7Stbbdev #include <common/utils.h>
2351c0b2f7Stbbdev #include <common/concurrent_ordered_common.h>
2451c0b2f7Stbbdev #include <memory>
2551c0b2f7Stbbdev #include <type_traits>
2651c0b2f7Stbbdev
2751c0b2f7Stbbdev //! \file conformance_concurrent_set.cpp
2851c0b2f7Stbbdev //! \brief Test for [containers.concurrent_set containers.concurrent_multiset] specifications
2951c0b2f7Stbbdev
3051c0b2f7Stbbdev template <typename... Args>
3149e08aacStbbdev struct AllowMultimapping<oneapi::tbb::concurrent_multiset<Args...>> : std::true_type {};
3251c0b2f7Stbbdev
3351c0b2f7Stbbdev template <typename Key>
3451c0b2f7Stbbdev using Allocator = LocalCountingAllocator<std::allocator<Key>>;
3551c0b2f7Stbbdev
3649e08aacStbbdev using set_type = oneapi::tbb::concurrent_set<int, std::less<int>, Allocator<int>>;
3749e08aacStbbdev using multiset_type = oneapi::tbb::concurrent_multiset<int, std::less<int>, Allocator<int>>;
3851c0b2f7Stbbdev
3951c0b2f7Stbbdev template <template <typename...> class ContainerType>
test_member_types()4051c0b2f7Stbbdev void test_member_types() {
4151c0b2f7Stbbdev using default_container_type = ContainerType<int>;
4251c0b2f7Stbbdev static_assert(std::is_same<typename default_container_type::key_compare, std::less<int>>::value,
4351c0b2f7Stbbdev "Incorrect default template comparator");
4449e08aacStbbdev static_assert(std::is_same<typename default_container_type::allocator_type, oneapi::tbb::tbb_allocator<int>>::value,
4551c0b2f7Stbbdev "Incorrect default template allocator");
4651c0b2f7Stbbdev
4751c0b2f7Stbbdev auto test_comparator = [](const int&, const int&)->bool { return true; };
4851c0b2f7Stbbdev using test_allocator_type = std::allocator<int>;
4951c0b2f7Stbbdev
5051c0b2f7Stbbdev using container_type = ContainerType<int, decltype(test_comparator), test_allocator_type>;
5151c0b2f7Stbbdev
5251c0b2f7Stbbdev static_assert(std::is_same<typename container_type::key_type, int>::value,
5351c0b2f7Stbbdev "Incorrect container key_type member type");
5451c0b2f7Stbbdev static_assert(std::is_same<typename container_type::value_type, int>::value,
5551c0b2f7Stbbdev "Incorrect container value_type member type");
5651c0b2f7Stbbdev
5751c0b2f7Stbbdev static_assert(std::is_unsigned<typename container_type::size_type>::value,
5851c0b2f7Stbbdev "Incorrect container size_type member type");
5951c0b2f7Stbbdev static_assert(std::is_signed<typename container_type::difference_type>::value,
6051c0b2f7Stbbdev "Incorrect container difference_type member type");
6151c0b2f7Stbbdev
6251c0b2f7Stbbdev static_assert(std::is_same<typename container_type::key_compare, decltype(test_comparator)>::value,
6351c0b2f7Stbbdev "Incorrect container key_compare member type");
6451c0b2f7Stbbdev static_assert(std::is_same<typename container_type::allocator_type, test_allocator_type>::value,
6551c0b2f7Stbbdev "Incorrect container allocator_type member type");
6651c0b2f7Stbbdev
6751c0b2f7Stbbdev using value_type = typename container_type::value_type;
6851c0b2f7Stbbdev static_assert(std::is_same<typename container_type::reference, value_type&>::value,
6951c0b2f7Stbbdev "Incorrect container reference member type");
7051c0b2f7Stbbdev static_assert(std::is_same<typename container_type::const_reference, const value_type&>::value,
7151c0b2f7Stbbdev "Incorrect container const_reference member type");
7251c0b2f7Stbbdev using allocator_type = typename container_type::allocator_type;
7351c0b2f7Stbbdev static_assert(std::is_same<typename container_type::pointer, typename std::allocator_traits<allocator_type>::pointer>::value,
7451c0b2f7Stbbdev "Incorrect container pointer member type");
7551c0b2f7Stbbdev static_assert(std::is_same<typename container_type::const_pointer, typename std::allocator_traits<allocator_type>::const_pointer>::value,
7651c0b2f7Stbbdev "Incorrect container const_pointer member type");
7751c0b2f7Stbbdev
7851c0b2f7Stbbdev static_assert(utils::is_forward_iterator<typename container_type::iterator>::value,
7951c0b2f7Stbbdev "Incorrect container iterator member type");
8051c0b2f7Stbbdev static_assert(!std::is_const<typename container_type::iterator::value_type>::value,
8151c0b2f7Stbbdev "Incorrect container iterator member type");
8251c0b2f7Stbbdev static_assert(utils::is_forward_iterator<typename container_type::const_iterator>::value,
8351c0b2f7Stbbdev "Incorrect container const_iterator member type");
8451c0b2f7Stbbdev static_assert(std::is_const<typename container_type::const_iterator::value_type>::value,
8551c0b2f7Stbbdev "Incorrect container const_iterator member type");
8651c0b2f7Stbbdev }
8751c0b2f7Stbbdev
8851c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
8951c0b2f7Stbbdev template <template <typename ...> typename TSet>
test_deduction_guides()9051c0b2f7Stbbdev void test_deduction_guides() {
9151c0b2f7Stbbdev std::vector<int> vc({1, 2, 3});
9251c0b2f7Stbbdev TSet set(vc.begin(), vc.end());
9351c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set), TSet<int>>, "Wrong");
9451c0b2f7Stbbdev
9551c0b2f7Stbbdev std::greater<int> compare;
9651c0b2f7Stbbdev std::allocator<int> allocator;
9751c0b2f7Stbbdev
9851c0b2f7Stbbdev TSet set2(vc.begin(), vc.end(), compare);
9951c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set2), TSet<int, decltype(compare)>>, "Wrong");
10051c0b2f7Stbbdev
10151c0b2f7Stbbdev TSet set3(vc.begin(), vc.end(), allocator);
10251c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set3), TSet<int, std::less<int>, decltype(allocator)>>, "Wrong");
10351c0b2f7Stbbdev
10451c0b2f7Stbbdev TSet set4(vc.begin(), vc.end(), compare, allocator);
10551c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set4), TSet<int, decltype(compare), decltype(allocator)>>, "Wrong");
10651c0b2f7Stbbdev
10751c0b2f7Stbbdev auto init_list = { int(1), int(2), int(3) };
108d86ed7fbStbbdev
10951c0b2f7Stbbdev TSet set5(init_list);
11051c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set5), TSet<int>>, "Wrong");
11151c0b2f7Stbbdev
11251c0b2f7Stbbdev TSet set6(init_list, compare);
11351c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set6), TSet<int, decltype(compare)>>, "Wrong");
11451c0b2f7Stbbdev
11551c0b2f7Stbbdev TSet set7(init_list, allocator);
11651c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set7), TSet<int, std::less<int>, decltype(allocator)>>, "Wrong");
11751c0b2f7Stbbdev
11851c0b2f7Stbbdev TSet set8(init_list, compare, allocator);
11951c0b2f7Stbbdev static_assert(std::is_same_v<decltype(set8), TSet<int, decltype(compare), decltype(allocator)>>, "Wrong");
12051c0b2f7Stbbdev }
12151c0b2f7Stbbdev #endif /*__TBB_CPP17_DEDUCTION_GUIDES_PRESENT*/
12251c0b2f7Stbbdev
12351c0b2f7Stbbdev template <template <typename...> class SetType>
test_heterogeneous_functions()12451c0b2f7Stbbdev void test_heterogeneous_functions() {
12551c0b2f7Stbbdev check_heterogeneous_functions_key_int<SetType, int>();
12651c0b2f7Stbbdev check_heterogeneous_functions_key_string<SetType, std::string>();
12751c0b2f7Stbbdev check_heterogeneous_bound_functions<SetType<int, TransparentLess>>();
12851c0b2f7Stbbdev }
12951c0b2f7Stbbdev
13051c0b2f7Stbbdev struct COSetTraits : OrderedMoveTraitsBase {
13151c0b2f7Stbbdev template <typename T, typename Allocator>
13249e08aacStbbdev using container_type = oneapi::tbb::concurrent_set<T, std::less<T>, Allocator>;
13351c0b2f7Stbbdev
13451c0b2f7Stbbdev template <typename T>
13551c0b2f7Stbbdev using container_value_type = T;
13651c0b2f7Stbbdev
13751c0b2f7Stbbdev using init_iterator_type = move_support_tests::FooIterator;
13851c0b2f7Stbbdev }; // struct COSetTraits
13951c0b2f7Stbbdev
14051c0b2f7Stbbdev struct COMultisetTraits : OrderedMoveTraitsBase {
14151c0b2f7Stbbdev template <typename T, typename Allocator>
14249e08aacStbbdev using container_type = oneapi::tbb::concurrent_multiset<T, std::less<T>, Allocator>;
14351c0b2f7Stbbdev
14451c0b2f7Stbbdev template <typename T>
14551c0b2f7Stbbdev using container_value_type = T;
14651c0b2f7Stbbdev
14751c0b2f7Stbbdev using init_iterator_type = move_support_tests::FooIterator;
14851c0b2f7Stbbdev }; // struct COMultisetTraits
14951c0b2f7Stbbdev
15051c0b2f7Stbbdev //! Testing concurrent_set member types
15151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
15251c0b2f7Stbbdev TEST_CASE("concurrent_set member types") {
15349e08aacStbbdev test_member_types<oneapi::tbb::concurrent_set>();
15451c0b2f7Stbbdev }
15551c0b2f7Stbbdev
15651c0b2f7Stbbdev //! Testing multithreading support in concurrent_set
15751c0b2f7Stbbdev //! \brief \ref requirement
15851c0b2f7Stbbdev TEST_CASE("concurrent_set multithreading support") {
15951c0b2f7Stbbdev test_concurrent<set_type>();
16051c0b2f7Stbbdev }
16151c0b2f7Stbbdev
16251c0b2f7Stbbdev //! Testing move constructors and assignment operator in concurrent_set
16351c0b2f7Stbbdev //! \brief \ref interface \ref requirement
16451c0b2f7Stbbdev TEST_CASE("concurrent_set move semantics support") {
16551c0b2f7Stbbdev test_rvalue_ref_support<COSetTraits>();
16651c0b2f7Stbbdev }
16751c0b2f7Stbbdev
16851c0b2f7Stbbdev //! Testing std::initializer_list constructors and modifiers in concurrent_set
16951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
17051c0b2f7Stbbdev TEST_CASE("std::initializer_list support in concurrent_set") {
17151c0b2f7Stbbdev test_initializer_list_support<set_type>({1, 2, 3, 4});
17251c0b2f7Stbbdev }
17351c0b2f7Stbbdev
17451c0b2f7Stbbdev //! Testing node handling in concurrent_set
17551c0b2f7Stbbdev //! \brief \ref interface \ref requirement
17651c0b2f7Stbbdev TEST_CASE("node handling support in concurrent_set") {
17751c0b2f7Stbbdev node_handling_tests::test_node_handling_support<set_type>();
17851c0b2f7Stbbdev }
17951c0b2f7Stbbdev
18051c0b2f7Stbbdev //! Testing std::allocator_traits support in concurrent_set
18151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
18251c0b2f7Stbbdev TEST_CASE("std::allocator_traits support in concurrent_set") {
18351c0b2f7Stbbdev test_allocator_traits_support<COSetTraits>();
18451c0b2f7Stbbdev }
18551c0b2f7Stbbdev
18651c0b2f7Stbbdev //! Testing heterogeneous overloads in concurrent_set
18751c0b2f7Stbbdev //! \brief \ref interface \ref requirement
18851c0b2f7Stbbdev TEST_CASE("heterogeneous overloads in concurrent_set") {
18949e08aacStbbdev test_heterogeneous_functions<oneapi::tbb::concurrent_set>();
19051c0b2f7Stbbdev }
19151c0b2f7Stbbdev
19251c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
19351c0b2f7Stbbdev //! Testing Class Template Argument Deduction in concurrent_set
19451c0b2f7Stbbdev //! \brief \ref interface \ref requirement
19551c0b2f7Stbbdev TEST_CASE("CTAD support in concurrent_set") {
19649e08aacStbbdev test_deduction_guides<oneapi::tbb::concurrent_set>();
19751c0b2f7Stbbdev }
19851c0b2f7Stbbdev #endif // __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
19951c0b2f7Stbbdev
20051c0b2f7Stbbdev //! Testing comparison operators in concurrent_set
20151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
20251c0b2f7Stbbdev TEST_CASE("test concurrent_set comparisons") {
20349e08aacStbbdev test_set_comparisons<oneapi::tbb::concurrent_set>();
20451c0b2f7Stbbdev }
20551c0b2f7Stbbdev
20651c0b2f7Stbbdev //! Testing concurrent_multiset member types
20751c0b2f7Stbbdev //! \brief \ref interface \ref requirement
20851c0b2f7Stbbdev TEST_CASE("concurrent_multiset member types") {
20949e08aacStbbdev test_member_types<oneapi::tbb::concurrent_multiset>();
21051c0b2f7Stbbdev }
21151c0b2f7Stbbdev
21251c0b2f7Stbbdev //! Testing requirements of concurrent_multiset
21351c0b2f7Stbbdev //! \brief \ref interface \ref requirement
21451c0b2f7Stbbdev TEST_CASE("concurrent_multiset requirements") {
21551c0b2f7Stbbdev test_basic<multiset_type>();
21651c0b2f7Stbbdev }
21751c0b2f7Stbbdev
21851c0b2f7Stbbdev //! Testing multithreading support in concurrent_multiset
21951c0b2f7Stbbdev //! \brief \ref requirement
22051c0b2f7Stbbdev TEST_CASE("concurrent_multiset multithreading support") {
22151c0b2f7Stbbdev test_concurrent<multiset_type>();
22251c0b2f7Stbbdev }
22351c0b2f7Stbbdev
22451c0b2f7Stbbdev //! Testing move constructors and assignment operator in concurrent_multiset
22551c0b2f7Stbbdev //! \brief \ref interface \ref requirement
22651c0b2f7Stbbdev TEST_CASE("concurrent_multiset multithreading support") {
22751c0b2f7Stbbdev test_rvalue_ref_support<COMultisetTraits>();
22851c0b2f7Stbbdev }
22951c0b2f7Stbbdev
23051c0b2f7Stbbdev //! Testing std::initializer_list constructors and modifiers in concurrent_multiset
23151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
23251c0b2f7Stbbdev TEST_CASE("std::initializer_list support in concurrent_multimap") {
23351c0b2f7Stbbdev test_initializer_list_support<multiset_type>({1, 2, 3, 4, 4});
23451c0b2f7Stbbdev }
23551c0b2f7Stbbdev
23651c0b2f7Stbbdev //! Testing node handling support in concurrent_multiset
23751c0b2f7Stbbdev //! \brief \ref interface \ref requirement
23851c0b2f7Stbbdev TEST_CASE("node handling support in concurrent_multiset") {
23951c0b2f7Stbbdev node_handling_tests::test_node_handling_support<multiset_type>();
24051c0b2f7Stbbdev }
24151c0b2f7Stbbdev
24251c0b2f7Stbbdev //! Testing std::allocator_traits support in concurrent_multiset
24351c0b2f7Stbbdev //! \brief \ref interface \ref requirement
24451c0b2f7Stbbdev TEST_CASE("std::allocator_traits support in concurrent_multiset") {
24551c0b2f7Stbbdev test_allocator_traits_support<COMultisetTraits>();
24651c0b2f7Stbbdev }
24751c0b2f7Stbbdev
24851c0b2f7Stbbdev //! Testing heterogeneous overloads in concurrent_multiset
24951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
25051c0b2f7Stbbdev TEST_CASE("heterogeneous overloads in concurrent_multiset") {
25149e08aacStbbdev test_heterogeneous_functions<oneapi::tbb::concurrent_multiset>();
25251c0b2f7Stbbdev }
25351c0b2f7Stbbdev
25451c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
25551c0b2f7Stbbdev //! Testing Class Template Argument Deduction in concurrent_multiset
25651c0b2f7Stbbdev //! \brief \ref interface \ref requirement
25751c0b2f7Stbbdev TEST_CASE("CTAD support in concurrent_multiset") {
25849e08aacStbbdev test_deduction_guides<oneapi::tbb::concurrent_multiset>();
25951c0b2f7Stbbdev }
26051c0b2f7Stbbdev #endif // __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
26151c0b2f7Stbbdev
26251c0b2f7Stbbdev //! Testing comparison operators in concurrent_multiset
26351c0b2f7Stbbdev //! \brief \ref interface \ref requirement
26451c0b2f7Stbbdev TEST_CASE("test concurrent_set comparisons") {
26549e08aacStbbdev test_set_comparisons<oneapi::tbb::concurrent_multiset>();
26651c0b2f7Stbbdev }
26751c0b2f7Stbbdev
26851c0b2f7Stbbdev //! Testing of merge operations in concurrent_set and concurrent_multiset
26951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
27051c0b2f7Stbbdev TEST_CASE("merge operations") {
27151c0b2f7Stbbdev node_handling_tests::test_merge<set_type, multiset_type>(1000);
27251c0b2f7Stbbdev }
273