151c0b2f7Stbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-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 
17*b15aabb3Stbbdev #if __INTEL_COMPILER && _MSC_VER
18*b15aabb3Stbbdev #pragma warning(disable : 2586) // decorated name length exceeded, name was truncated
19*b15aabb3Stbbdev #endif
20*b15aabb3Stbbdev 
21*b15aabb3Stbbdev 
2249e08aacStbbdev #include "oneapi/tbb/concurrent_unordered_set.h"
2351c0b2f7Stbbdev #include <common/test.h>
2451c0b2f7Stbbdev #include <common/utils.h>
2551c0b2f7Stbbdev #include <common/concurrent_unordered_common.h>
2651c0b2f7Stbbdev #include <memory>
2751c0b2f7Stbbdev #include <type_traits>
2851c0b2f7Stbbdev 
2951c0b2f7Stbbdev //! \file conformance_concurrent_unordered_set.cpp
3051c0b2f7Stbbdev //! \brief Test for [containers.concurrent_unordered_set containers.concurrent_unordered_multiset] specifications
3151c0b2f7Stbbdev 
3251c0b2f7Stbbdev template <typename... Args>
3349e08aacStbbdev struct AllowMultimapping<oneapi::tbb::concurrent_unordered_multiset<Args...>> : std::true_type {};
3451c0b2f7Stbbdev 
3551c0b2f7Stbbdev template <typename Key>
3651c0b2f7Stbbdev using Allocator = LocalCountingAllocator<std::allocator<Key>>;
3751c0b2f7Stbbdev 
3849e08aacStbbdev using set_type = oneapi::tbb::concurrent_unordered_set<int, std::hash<int>, std::equal_to<int>, Allocator<int>>;
3949e08aacStbbdev using multiset_type = oneapi::tbb::concurrent_unordered_multiset<int, std::hash<int>, std::equal_to<int>, Allocator<int>>;
4051c0b2f7Stbbdev 
4151c0b2f7Stbbdev template <template <typename...> class ContainerType>
test_member_types()4251c0b2f7Stbbdev void test_member_types() {
4351c0b2f7Stbbdev     using default_container_type = ContainerType<int>;
4451c0b2f7Stbbdev     static_assert(std::is_same<typename default_container_type::hasher, std::hash<int>>::value,
4551c0b2f7Stbbdev                   "Incorrect default template hasher");
4651c0b2f7Stbbdev     static_assert(std::is_same<typename default_container_type::key_equal, std::equal_to<int>>::value,
4751c0b2f7Stbbdev                   "Incorrect default template key equality");
4849e08aacStbbdev     static_assert(std::is_same<typename default_container_type::allocator_type, oneapi::tbb::tbb_allocator<int>>::value,
4951c0b2f7Stbbdev                   "Incorrect default template allocator");
5051c0b2f7Stbbdev 
5151c0b2f7Stbbdev     auto test_hasher = [](const int&)->std::size_t { return 0; };
5251c0b2f7Stbbdev     auto test_equality = [](const int&, const int&)->bool { return true; };
5351c0b2f7Stbbdev     using test_allocator_type = std::allocator<int>;
5451c0b2f7Stbbdev 
5551c0b2f7Stbbdev     using container_type = ContainerType<int, decltype(test_hasher), decltype(test_equality), test_allocator_type>;
5651c0b2f7Stbbdev 
5751c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::key_type, int>::value,
5851c0b2f7Stbbdev                   "Incorrect container key_type member type");
5951c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::value_type, int>::value,
6051c0b2f7Stbbdev                   "Incorrect container value_type member type");
6151c0b2f7Stbbdev 
6251c0b2f7Stbbdev     static_assert(std::is_unsigned<typename container_type::size_type>::value,
6351c0b2f7Stbbdev                   "Incorrect container size_type member type");
6451c0b2f7Stbbdev     static_assert(std::is_signed<typename container_type::difference_type>::value,
6551c0b2f7Stbbdev                   "Incorrect container difference_type member type");
6651c0b2f7Stbbdev 
6751c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::hasher, decltype(test_hasher)>::value,
6851c0b2f7Stbbdev                   "Incorrect container hasher member type");
6951c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::key_equal, decltype(test_equality)>::value,
7051c0b2f7Stbbdev                   "Incorrect container key_equal member type");
7151c0b2f7Stbbdev 
7251c0b2f7Stbbdev     using transparent_container_type = ContainerType<int, hasher_with_transparent_key_equal,
7351c0b2f7Stbbdev                                                      std::equal_to<int>, test_allocator_type>;
7451c0b2f7Stbbdev 
7551c0b2f7Stbbdev     static_assert(std::is_same<typename transparent_container_type::key_equal, transparent_key_equality>::value,
7651c0b2f7Stbbdev                   "Incorrect container key_equal member type");
7751c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::allocator_type, test_allocator_type>::value,
7851c0b2f7Stbbdev                   "Incorrect container allocator_type member type");
7951c0b2f7Stbbdev 
8051c0b2f7Stbbdev     using value_type = typename container_type::value_type;
8151c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::reference, value_type&>::value,
8251c0b2f7Stbbdev                   "Incorrect container reference member type");
8351c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::const_reference, const value_type&>::value,
8451c0b2f7Stbbdev                   "Incorrect container const_reference member type");
8551c0b2f7Stbbdev     using allocator_type = typename container_type::allocator_type;
8651c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::pointer, typename std::allocator_traits<allocator_type>::pointer>::value,
8751c0b2f7Stbbdev                   "Incorrect container pointer member type");
8851c0b2f7Stbbdev     static_assert(std::is_same<typename container_type::const_pointer, typename std::allocator_traits<allocator_type>::const_pointer>::value,
8951c0b2f7Stbbdev                   "Incorrect container const_pointer member type");
9051c0b2f7Stbbdev 
9151c0b2f7Stbbdev     static_assert(utils::is_forward_iterator<typename container_type::iterator>::value,
9251c0b2f7Stbbdev                   "Incorrect container iterator member type");
9351c0b2f7Stbbdev     static_assert(!std::is_const<typename container_type::iterator::value_type>::value,
9451c0b2f7Stbbdev                   "Incorrect container iterator member type");
9551c0b2f7Stbbdev     static_assert(utils::is_forward_iterator<typename container_type::const_iterator>::value,
9651c0b2f7Stbbdev                   "Incorrect container const_iterator member type");
9751c0b2f7Stbbdev     static_assert(std::is_const<typename container_type::const_iterator::value_type>::value,
9851c0b2f7Stbbdev                   "Incorrect container iterator member type");
9951c0b2f7Stbbdev     static_assert(utils::is_forward_iterator<typename container_type::local_iterator>::value,
10051c0b2f7Stbbdev                   "Incorrect container local_iterator member type");
10151c0b2f7Stbbdev     static_assert(!std::is_const<typename container_type::local_iterator::value_type>::value,
10251c0b2f7Stbbdev                   "Incorrect container local_iterator member type");
10351c0b2f7Stbbdev     static_assert(utils::is_forward_iterator<typename container_type::const_local_iterator>::value,
10451c0b2f7Stbbdev                   "Incorrect container const_local_iterator member type");
10551c0b2f7Stbbdev     static_assert(std::is_const<typename container_type::const_local_iterator::value_type>::value,
10651c0b2f7Stbbdev                   "Incorrect container const_local_iterator member type");
10751c0b2f7Stbbdev }
10851c0b2f7Stbbdev 
10951c0b2f7Stbbdev struct CusetTraits : UnorderedMoveTraitsBase {
11051c0b2f7Stbbdev     template <typename T, typename Allocator>
11149e08aacStbbdev     using container_type = oneapi::tbb::concurrent_unordered_set<T, std::hash<T>, std::equal_to<T>, Allocator>;
11251c0b2f7Stbbdev 
11351c0b2f7Stbbdev     template <typename T>
11451c0b2f7Stbbdev     using container_value_type = T;
11551c0b2f7Stbbdev 
11651c0b2f7Stbbdev     using init_iterator_type = move_support_tests::FooIterator;
11751c0b2f7Stbbdev }; // struct CusetTraits
11851c0b2f7Stbbdev 
11951c0b2f7Stbbdev struct CumultisetTraits : UnorderedMoveTraitsBase {
12051c0b2f7Stbbdev     template <typename T, typename Allocator>
12149e08aacStbbdev     using container_type = oneapi::tbb::concurrent_unordered_multiset<T, std::hash<T>, std::equal_to<T>, Allocator>;
12251c0b2f7Stbbdev 
12351c0b2f7Stbbdev     template <typename T>
12451c0b2f7Stbbdev     using container_value_type = T;
12551c0b2f7Stbbdev 
12651c0b2f7Stbbdev     using init_iterator_type = move_support_tests::FooIterator;
12751c0b2f7Stbbdev }; // struct CumultisetTraits
12851c0b2f7Stbbdev 
12951c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
13051c0b2f7Stbbdev template <template <typename ...> typename TSet>
test_deduction_guides()13151c0b2f7Stbbdev void test_deduction_guides() {
13251c0b2f7Stbbdev     using ComplexType = const std::string *;
13351c0b2f7Stbbdev     std::vector<ComplexType> v;
13451c0b2f7Stbbdev     std::string s = "s";
13551c0b2f7Stbbdev     auto l = { ComplexType(&s), ComplexType(&s)};
13651c0b2f7Stbbdev     using custom_allocator_type = std::allocator<ComplexType>;
13751c0b2f7Stbbdev 
13851c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator)
13951c0b2f7Stbbdev     TSet s1(v.begin(), v.end());
14051c0b2f7Stbbdev     static_assert(std::is_same<decltype(s1), TSet<ComplexType>>::value);
14151c0b2f7Stbbdev 
14251c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator, size_t, Hasher)
14351c0b2f7Stbbdev     TSet s2(v.begin(), v.end(), 5, degenerate_hash<ComplexType>());
14451c0b2f7Stbbdev     static_assert(std::is_same<decltype(s2), TSet<ComplexType, degenerate_hash<ComplexType>>>::value);
14551c0b2f7Stbbdev 
14651c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator, size_t, Hasher, Equality)
14751c0b2f7Stbbdev     TSet s3(v.begin(), v.end(), 5, degenerate_hash<ComplexType>(), std::less<ComplexType>());
14851c0b2f7Stbbdev     static_assert(std::is_same<decltype(s3), TSet<ComplexType, degenerate_hash<ComplexType>,
14951c0b2f7Stbbdev         std::less<ComplexType>>>::value);
15051c0b2f7Stbbdev 
15151c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator, size_t, Hasher, Equality, Allocator)
15251c0b2f7Stbbdev     TSet s4(v.begin(), v.end(), 5, degenerate_hash<ComplexType>(), std::less<ComplexType>(),
15351c0b2f7Stbbdev             custom_allocator_type{});
15451c0b2f7Stbbdev     static_assert(std::is_same<decltype(s4), TSet<ComplexType, degenerate_hash<ComplexType>,
15551c0b2f7Stbbdev         std::less<ComplexType>, custom_allocator_type>>::value);
15651c0b2f7Stbbdev 
15751c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator, size_t, Allocator)
15851c0b2f7Stbbdev     TSet s5(v.begin(), v.end(), 5, custom_allocator_type{});
15951c0b2f7Stbbdev     static_assert(std::is_same<decltype(s5), TSet<ComplexType, std::hash<ComplexType>,
16051c0b2f7Stbbdev         std::equal_to<ComplexType>, custom_allocator_type>>::value);
16151c0b2f7Stbbdev 
16251c0b2f7Stbbdev     // check TSet(InputIterator,InputIterator, size_t, Hasher, Allocator)
16351c0b2f7Stbbdev     TSet s6(v.begin(), v.end(), 5, degenerate_hash<ComplexType>(), custom_allocator_type{});
16451c0b2f7Stbbdev     static_assert(std::is_same<decltype(s6), TSet<ComplexType, degenerate_hash<ComplexType>,
16551c0b2f7Stbbdev         std::equal_to<ComplexType>, custom_allocator_type>>::value);
16651c0b2f7Stbbdev 
16751c0b2f7Stbbdev     // check TSet(std::initializer_list)
16851c0b2f7Stbbdev     TSet s7(l);
16951c0b2f7Stbbdev     static_assert(std::is_same<decltype(s7), TSet<ComplexType>>::value);
17051c0b2f7Stbbdev 
17151c0b2f7Stbbdev     // check TSet(std::initializer_list, size_t, Hasher)
17251c0b2f7Stbbdev     TSet s8(l, 5, degenerate_hash<ComplexType>());
17351c0b2f7Stbbdev     static_assert(std::is_same<decltype(s8), TSet<ComplexType, degenerate_hash<ComplexType>>>::value);
17451c0b2f7Stbbdev 
17551c0b2f7Stbbdev     // check TSet(std::initializer_list, size_t, Hasher, Equality)
17651c0b2f7Stbbdev     TSet s9(l, 5, degenerate_hash<ComplexType>(), std::less<ComplexType>());
17751c0b2f7Stbbdev     static_assert(std::is_same<decltype(s9), TSet<ComplexType, degenerate_hash<ComplexType>,
17851c0b2f7Stbbdev         std::less<ComplexType>>>::value);
17951c0b2f7Stbbdev 
18051c0b2f7Stbbdev     // check TSet(std::initializer_list, size_t, Hasher, Equality, Allocator)
18151c0b2f7Stbbdev     TSet s10(l, 5, degenerate_hash<ComplexType>(), std::less<ComplexType>(), custom_allocator_type{});
18251c0b2f7Stbbdev     static_assert(std::is_same<decltype(s10), TSet<ComplexType, degenerate_hash<ComplexType>,
18351c0b2f7Stbbdev         std::less<ComplexType>, custom_allocator_type>>::value);
18451c0b2f7Stbbdev 
18551c0b2f7Stbbdev     // check TSet(std::initializer_list, size_t, Allocator)
18651c0b2f7Stbbdev     TSet s11(l, 5, custom_allocator_type{});
18751c0b2f7Stbbdev     static_assert(std::is_same<decltype(s11), TSet<ComplexType, std::hash<ComplexType>,
18851c0b2f7Stbbdev         std::equal_to<ComplexType>, custom_allocator_type>>::value);
18951c0b2f7Stbbdev 
19051c0b2f7Stbbdev     // check TSet(std::initializer_list, size_t, Hasher, Allocator)
19151c0b2f7Stbbdev     TSet s12(l, 5, std::hash<ComplexType>(), custom_allocator_type{});
19251c0b2f7Stbbdev     static_assert(std::is_same<decltype(s12), TSet<ComplexType, std::hash<ComplexType>,
19351c0b2f7Stbbdev         std::equal_to<ComplexType>, custom_allocator_type>>::value);
19451c0b2f7Stbbdev 
19551c0b2f7Stbbdev     // check TSet(TSet &)
19651c0b2f7Stbbdev     TSet s13(s1);
19751c0b2f7Stbbdev     static_assert(std::is_same<decltype(s13), decltype(s1)>::value);
19851c0b2f7Stbbdev 
19951c0b2f7Stbbdev     // check TSet(TSet &, Allocator)
20051c0b2f7Stbbdev     TSet s14(s5, custom_allocator_type{});
20151c0b2f7Stbbdev     // TODO: investigate why no implicit deduction guides generated for this ctor
20251c0b2f7Stbbdev     static_assert(std::is_same<decltype(s14), decltype(s5)>::value);
20351c0b2f7Stbbdev 
20451c0b2f7Stbbdev     // check TSet(TSet &&)
20551c0b2f7Stbbdev     TSet s15(std::move(s1));
20651c0b2f7Stbbdev     static_assert(std::is_same<decltype(s15), decltype(s1)>::value);
20751c0b2f7Stbbdev 
20851c0b2f7Stbbdev     // check TSet(TSet &&, Allocator)
20951c0b2f7Stbbdev     TSet s16(std::move(s5), custom_allocator_type{});
21051c0b2f7Stbbdev     // TODO: investigate why no implicit deduction guides generated for this ctor
21151c0b2f7Stbbdev     static_assert(std::is_same<decltype(s16), decltype(s5)>::value);
21251c0b2f7Stbbdev }
21351c0b2f7Stbbdev #endif // __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
21451c0b2f7Stbbdev 
21551c0b2f7Stbbdev //! Testing concurrent_unordered_set member types
21651c0b2f7Stbbdev //! \brief \ref interface \ref requirement
21751c0b2f7Stbbdev TEST_CASE("concurrent_unordered_set member types") {
21849e08aacStbbdev     test_member_types<oneapi::tbb::concurrent_unordered_set>();
21951c0b2f7Stbbdev }
22051c0b2f7Stbbdev 
22151c0b2f7Stbbdev //! Testing requirements of concurrent_unordered_set
22251c0b2f7Stbbdev //! \brief \ref interface \ref requirement
22351c0b2f7Stbbdev TEST_CASE("concurrent_unordered_set requirements") {
22451c0b2f7Stbbdev     test_basic<set_type>();
22551c0b2f7Stbbdev }
22651c0b2f7Stbbdev 
22751c0b2f7Stbbdev //! Testing multithreading support in concurrent_unordered_set
22851c0b2f7Stbbdev //! \brief \ref requirement
22951c0b2f7Stbbdev TEST_CASE("concurrent_unordered_set multithreading support") {
23051c0b2f7Stbbdev     test_concurrent<set_type>();
23151c0b2f7Stbbdev }
23251c0b2f7Stbbdev 
23351c0b2f7Stbbdev //! Testing move constructors and assignment operator in concurrent_unordered_set
23451c0b2f7Stbbdev //! \brief \ref interface \ref requirement
23551c0b2f7Stbbdev TEST_CASE("concurrent_unordered_set move semantics support") {
23651c0b2f7Stbbdev     test_rvalue_ref_support<CusetTraits>();
23751c0b2f7Stbbdev }
23851c0b2f7Stbbdev 
23951c0b2f7Stbbdev //! Testing std::initializer_list constructors and modifiers in concurrent_unordered_set
24051c0b2f7Stbbdev //! \brief \ref interface \ref requirement
24151c0b2f7Stbbdev TEST_CASE("std::initializer_list support in concurrent_unordered_set") {
24251c0b2f7Stbbdev     test_initializer_list_support<set_type>({1, 2, 3, 4, 5});
24351c0b2f7Stbbdev }
24451c0b2f7Stbbdev 
24551c0b2f7Stbbdev //! Testing node handling in concurrent_unordered_set
24651c0b2f7Stbbdev //! \brief \ref interface \ref requirement
24751c0b2f7Stbbdev TEST_CASE("node handling support in concurrent_unordered_set") {
24851c0b2f7Stbbdev     node_handling_tests::test_node_handling_support<set_type>();
24951c0b2f7Stbbdev }
25051c0b2f7Stbbdev 
25151c0b2f7Stbbdev //! Testing std::allocator_traits support in concurrent_unordered_set
25251c0b2f7Stbbdev //! \brief \ref interface \ref requirement
25351c0b2f7Stbbdev TEST_CASE("std::allocator_traits support in concurrent_unordered_set") {
25451c0b2f7Stbbdev     test_allocator_traits_support<CusetTraits>();
25551c0b2f7Stbbdev }
25651c0b2f7Stbbdev 
25751c0b2f7Stbbdev //! Testing heterogeneous overloads in concurrent_unordered_set
25851c0b2f7Stbbdev //! \brief \ref interface \ref requirement
25951c0b2f7Stbbdev TEST_CASE("heterogeneous overloads in concurrent_unordered_set") {
26049e08aacStbbdev     check_heterogeneous_functions_key_int<oneapi::tbb::concurrent_unordered_set, int>();
26149e08aacStbbdev     check_heterogeneous_functions_key_string<oneapi::tbb::concurrent_unordered_set, std::string>();
26251c0b2f7Stbbdev }
26351c0b2f7Stbbdev 
26451c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
26551c0b2f7Stbbdev //! Testing Class Template Argument Deduction in concurrent_unordered_set
26651c0b2f7Stbbdev //! \brief \ref interface \ref requirement
26751c0b2f7Stbbdev TEST_CASE("CTAD support in concurrent_unordered_set") {
26849e08aacStbbdev     test_deduction_guides<oneapi::tbb::concurrent_unordered_set>();
26951c0b2f7Stbbdev }
27051c0b2f7Stbbdev #endif
27151c0b2f7Stbbdev 
272*b15aabb3Stbbdev //! Testing comparisons in concurrent_unordered_set
273*b15aabb3Stbbdev //! \brief \ref interface \ref requirement
274*b15aabb3Stbbdev TEST_CASE("concurrent_unordered_set comparisons") {
275*b15aabb3Stbbdev     test_set_comparisons<oneapi::tbb::concurrent_unordered_set>();
276*b15aabb3Stbbdev }
277*b15aabb3Stbbdev 
27851c0b2f7Stbbdev //! Testing concurrent_unordered_multiset member types
27951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
280*b15aabb3Stbbdev TEST_CASE("concurrent_unordered_multiset member types") {
28149e08aacStbbdev     test_member_types<oneapi::tbb::concurrent_unordered_multiset>();
28251c0b2f7Stbbdev }
28351c0b2f7Stbbdev 
28451c0b2f7Stbbdev //! Testing requirements of concurrent_unordered_multiset
28551c0b2f7Stbbdev //! \brief \ref interface \ref requirement
28651c0b2f7Stbbdev TEST_CASE("concurrent_unordered_multiset requirements") {
28751c0b2f7Stbbdev     test_basic<multiset_type>();
28851c0b2f7Stbbdev }
28951c0b2f7Stbbdev 
29051c0b2f7Stbbdev //! Testing move constructors and assignment operator in concurrent_unordered_multiset
29151c0b2f7Stbbdev //! \brief \ref requirement
29251c0b2f7Stbbdev TEST_CASE("concurrent_unordered_multiset multithreading support") {
29351c0b2f7Stbbdev     test_concurrent<multiset_type>();
29451c0b2f7Stbbdev }
29551c0b2f7Stbbdev 
29651c0b2f7Stbbdev //! Testing move constructors and assignment operator in concurrent_unordered_multiset
29751c0b2f7Stbbdev //! \brief \ref interface \ref requirement
29851c0b2f7Stbbdev TEST_CASE("concurrent_unordered_multiset move semantics support") {
29951c0b2f7Stbbdev     test_rvalue_ref_support<CumultisetTraits>();
30051c0b2f7Stbbdev }
30151c0b2f7Stbbdev 
30251c0b2f7Stbbdev //! Testing std::initializer_list constructors and modifiers in concurrent_unordered_multiset
30351c0b2f7Stbbdev //! \brief \ref interface \ref requirement
30451c0b2f7Stbbdev TEST_CASE("std::initializer_list support in concurrent_unordered_multiset") {
30551c0b2f7Stbbdev     test_initializer_list_support<multiset_type>({1, 2, 3, 4, 5, 5});
30651c0b2f7Stbbdev }
30751c0b2f7Stbbdev 
30851c0b2f7Stbbdev //! Testing node handling support in concurrent_unordered_multiset
30951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
31051c0b2f7Stbbdev TEST_CASE("node handling support in concurrent_unordered_multiset") {
31151c0b2f7Stbbdev     node_handling_tests::test_node_handling_support<multiset_type>();
31251c0b2f7Stbbdev }
31351c0b2f7Stbbdev 
31451c0b2f7Stbbdev //! Testing std::allocator_traits support in concurrent_unordered_multiset
31551c0b2f7Stbbdev //! \brief \ref interface \ref requirement
31651c0b2f7Stbbdev TEST_CASE("std::allocator_traits support in concurrent_unordered_multiset") {
31751c0b2f7Stbbdev     test_allocator_traits_support<CumultisetTraits>();
31851c0b2f7Stbbdev }
31951c0b2f7Stbbdev 
32051c0b2f7Stbbdev //! Testing heterogeneous overloads in concurrent_unordered_multiset
32151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
32251c0b2f7Stbbdev TEST_CASE("heterogeneous overloads in concurrent_unordered_multiset") {
32349e08aacStbbdev     check_heterogeneous_functions_key_int<oneapi::tbb::concurrent_unordered_multiset, int>();
32449e08aacStbbdev     check_heterogeneous_functions_key_string<oneapi::tbb::concurrent_unordered_multiset, std::string>();
32551c0b2f7Stbbdev }
32651c0b2f7Stbbdev 
32751c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
32851c0b2f7Stbbdev //! Testing Class Template Argument Deduction in concurrent_unordered_multiset
32951c0b2f7Stbbdev //! \brief \ref interface \ref requirement
33051c0b2f7Stbbdev TEST_CASE("CTAD support in concurrent_unordered_multiset") {
33149e08aacStbbdev     test_deduction_guides<oneapi::tbb::concurrent_unordered_multiset>();
33251c0b2f7Stbbdev }
33351c0b2f7Stbbdev #endif
33451c0b2f7Stbbdev 
335*b15aabb3Stbbdev //! Testing comparisons in concurrent_unordered_multiset
336*b15aabb3Stbbdev //! \brief \ref interface \ref requirement
337*b15aabb3Stbbdev TEST_CASE("concurrent_unordered_multiset comparisons") {
338*b15aabb3Stbbdev     test_set_comparisons<oneapi::tbb::concurrent_unordered_multiset>();
339*b15aabb3Stbbdev }
340*b15aabb3Stbbdev 
34151c0b2f7Stbbdev //! Testing of merge operation in concurrent_unordered_set and concurrent_unordered_multiset
34251c0b2f7Stbbdev //! \brief \ref interface \ref requirement
34351c0b2f7Stbbdev TEST_CASE("merge operations") {
34451c0b2f7Stbbdev     node_handling_tests::test_merge<set_type, multiset_type>(1000);
34551c0b2f7Stbbdev }
346