151c0b2f7Stbbdev /*
2b15aabb3Stbbdev 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
1751c0b2f7Stbbdev // TODO: Add overlapping put / receive tests
1851c0b2f7Stbbdev
1951c0b2f7Stbbdev #include "common/config.h"
2051c0b2f7Stbbdev
2151c0b2f7Stbbdev #include "tbb/flow_graph.h"
22*552f342bSPavel #include "tbb/global_control.h"
2351c0b2f7Stbbdev
2451c0b2f7Stbbdev #include "common/test.h"
2551c0b2f7Stbbdev #include "common/utils.h"
2651c0b2f7Stbbdev #include "common/utils_assert.h"
2751c0b2f7Stbbdev #include "common/checktype.h"
2851c0b2f7Stbbdev #include "common/graph_utils.h"
2951c0b2f7Stbbdev #include "common/test_follows_and_precedes_api.h"
3051c0b2f7Stbbdev
3151c0b2f7Stbbdev #include <cstdio>
3251c0b2f7Stbbdev
3351c0b2f7Stbbdev
3451c0b2f7Stbbdev //! \file test_priority_queue_node.cpp
3551c0b2f7Stbbdev //! \brief Test for [flow_graph.priority_queue_node] specification
3651c0b2f7Stbbdev
3751c0b2f7Stbbdev
3851c0b2f7Stbbdev #define N 10
3951c0b2f7Stbbdev #define C 10
4051c0b2f7Stbbdev
4151c0b2f7Stbbdev template< typename T >
spin_try_get(tbb::flow::priority_queue_node<T> & q,T & value)4251c0b2f7Stbbdev void spin_try_get( tbb::flow::priority_queue_node<T> &q, T &value ) {
4351c0b2f7Stbbdev while ( q.try_get(value) != true ) ;
4451c0b2f7Stbbdev }
4551c0b2f7Stbbdev
4651c0b2f7Stbbdev template< typename T >
check_item(T * next_value,T & value)4751c0b2f7Stbbdev void check_item( T* next_value, T &value ) {
4851c0b2f7Stbbdev int tid = value / N;
4951c0b2f7Stbbdev int offset = value % N;
5051c0b2f7Stbbdev CHECK_MESSAGE( next_value[tid] == T(offset), "" );
5151c0b2f7Stbbdev ++next_value[tid];
5251c0b2f7Stbbdev }
5351c0b2f7Stbbdev
5451c0b2f7Stbbdev template< typename T >
5551c0b2f7Stbbdev struct parallel_puts : utils::NoAssign {
5651c0b2f7Stbbdev tbb::flow::priority_queue_node<T> &my_q;
parallel_putsparallel_puts5751c0b2f7Stbbdev parallel_puts( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
operator ()parallel_puts5851c0b2f7Stbbdev void operator()(int i) const {
5951c0b2f7Stbbdev for (int j = 0; j < N; ++j) {
6051c0b2f7Stbbdev bool msg = my_q.try_put( T(N*i + j) );
6151c0b2f7Stbbdev CHECK_MESSAGE( msg == true, "" );
6251c0b2f7Stbbdev }
6351c0b2f7Stbbdev }
6451c0b2f7Stbbdev };
6551c0b2f7Stbbdev
6651c0b2f7Stbbdev template< typename T >
6751c0b2f7Stbbdev struct parallel_gets : utils::NoAssign {
6851c0b2f7Stbbdev tbb::flow::priority_queue_node<T> &my_q;
parallel_getsparallel_gets6951c0b2f7Stbbdev parallel_gets( tbb::flow::priority_queue_node<T> &q) : my_q(q) {}
operator ()parallel_gets7051c0b2f7Stbbdev void operator()(int) const {
7151c0b2f7Stbbdev T prev;
7251c0b2f7Stbbdev spin_try_get( my_q, prev );
7351c0b2f7Stbbdev for (int j = 0; j < N-1; ++j) {
7451c0b2f7Stbbdev T v;
7551c0b2f7Stbbdev spin_try_get( my_q, v );
7651c0b2f7Stbbdev CHECK_MESSAGE(v < prev, "");
7751c0b2f7Stbbdev }
7851c0b2f7Stbbdev }
7951c0b2f7Stbbdev };
8051c0b2f7Stbbdev
8151c0b2f7Stbbdev template< typename T >
8251c0b2f7Stbbdev struct parallel_put_get : utils::NoAssign {
8351c0b2f7Stbbdev tbb::flow::priority_queue_node<T> &my_q;
parallel_put_getparallel_put_get8451c0b2f7Stbbdev parallel_put_get( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
operator ()parallel_put_get8551c0b2f7Stbbdev void operator()(int tid) const {
8651c0b2f7Stbbdev for ( int i = 0; i < N; i+=C ) {
8751c0b2f7Stbbdev int j_end = ( N < i + C ) ? N : i + C;
8851c0b2f7Stbbdev // dump about C values into the Q
8951c0b2f7Stbbdev for ( int j = i; j < j_end; ++j ) {
9051c0b2f7Stbbdev CHECK_MESSAGE( my_q.try_put( T (N*tid + j ) ) == true, "" );
9151c0b2f7Stbbdev }
9251c0b2f7Stbbdev // receive about C values from the Q
9351c0b2f7Stbbdev for ( int j = i; j < j_end; ++j ) {
9451c0b2f7Stbbdev T v;
9551c0b2f7Stbbdev spin_try_get( my_q, v );
9651c0b2f7Stbbdev }
9751c0b2f7Stbbdev }
9851c0b2f7Stbbdev }
9951c0b2f7Stbbdev };
10051c0b2f7Stbbdev
10151c0b2f7Stbbdev //
10251c0b2f7Stbbdev // Tests
10351c0b2f7Stbbdev //
10451c0b2f7Stbbdev // Item can be reserved, released, consumed ( single serial receiver )
10551c0b2f7Stbbdev //
10651c0b2f7Stbbdev template< typename T >
test_reservation(int)10751c0b2f7Stbbdev int test_reservation(int) {
10851c0b2f7Stbbdev tbb::flow::graph g;
10951c0b2f7Stbbdev
11051c0b2f7Stbbdev // Simple tests
11151c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q(g);
11251c0b2f7Stbbdev
11351c0b2f7Stbbdev {
11451c0b2f7Stbbdev
11551c0b2f7Stbbdev T bogus_value(-1);
11651c0b2f7Stbbdev
11751c0b2f7Stbbdev q.try_put(T(1));
11851c0b2f7Stbbdev q.try_put(T(2));
11951c0b2f7Stbbdev q.try_put(T(3));
12051c0b2f7Stbbdev g.wait_for_all();
12151c0b2f7Stbbdev
12251c0b2f7Stbbdev T v=bogus_value, w=bogus_value;
12351c0b2f7Stbbdev CHECK_MESSAGE( q.try_reserve(v) == true, "" );
12451c0b2f7Stbbdev CHECK_MESSAGE( v == T(3), "" );
12551c0b2f7Stbbdev CHECK_MESSAGE( q.try_release() == true, "" );
12651c0b2f7Stbbdev v = bogus_value;
12751c0b2f7Stbbdev g.wait_for_all();
12851c0b2f7Stbbdev CHECK_MESSAGE( q.try_reserve(v) == true, "" );
12951c0b2f7Stbbdev CHECK_MESSAGE( v == T(3), "" );
13051c0b2f7Stbbdev CHECK_MESSAGE( q.try_consume() == true, "" );
13151c0b2f7Stbbdev v = bogus_value;
13251c0b2f7Stbbdev g.wait_for_all();
13351c0b2f7Stbbdev
13451c0b2f7Stbbdev CHECK_MESSAGE( q.try_get(v) == true, "" );
13551c0b2f7Stbbdev CHECK_MESSAGE( v == T(2), "" );
13651c0b2f7Stbbdev v = bogus_value;
13751c0b2f7Stbbdev g.wait_for_all();
13851c0b2f7Stbbdev
13951c0b2f7Stbbdev CHECK_MESSAGE( q.try_reserve(v) == true, "" );
14051c0b2f7Stbbdev CHECK_MESSAGE( v == T(1), "" );
14151c0b2f7Stbbdev CHECK_MESSAGE( q.try_reserve(w) == false, "" );
14251c0b2f7Stbbdev CHECK_MESSAGE( w == bogus_value, "" );
14351c0b2f7Stbbdev CHECK_MESSAGE( q.try_get(w) == false, "" );
14451c0b2f7Stbbdev CHECK_MESSAGE( w == bogus_value, "" );
14551c0b2f7Stbbdev CHECK_MESSAGE( q.try_release() == true, "" );
14651c0b2f7Stbbdev v = bogus_value;
14751c0b2f7Stbbdev g.wait_for_all();
14851c0b2f7Stbbdev CHECK_MESSAGE( q.try_reserve(v) == true, "" );
14951c0b2f7Stbbdev CHECK_MESSAGE( v == T(1), "" );
15051c0b2f7Stbbdev CHECK_MESSAGE( q.try_consume() == true, "" );
15151c0b2f7Stbbdev v = bogus_value;
15251c0b2f7Stbbdev g.wait_for_all();
15351c0b2f7Stbbdev CHECK_MESSAGE( q.try_get(v) == false, "" );
15451c0b2f7Stbbdev }
15551c0b2f7Stbbdev return 0;
15651c0b2f7Stbbdev }
15751c0b2f7Stbbdev
15851c0b2f7Stbbdev //
15951c0b2f7Stbbdev // Tests
16051c0b2f7Stbbdev //
16151c0b2f7Stbbdev // multiple parallel senders, items in FIFO (relatively to sender) order
16251c0b2f7Stbbdev // multiple parallel senders, multiple parallel receivers, items in FIFO order (relative to sender/receiver) and all items received
16351c0b2f7Stbbdev // * overlapped puts / gets
16451c0b2f7Stbbdev // * all puts finished before any getS
16551c0b2f7Stbbdev //
16651c0b2f7Stbbdev template< typename T >
test_parallel(int num_threads)16751c0b2f7Stbbdev int test_parallel(int num_threads) {
16851c0b2f7Stbbdev tbb::flow::graph g;
16951c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q(g);
17051c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q2(g);
17151c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q3(g);
17251c0b2f7Stbbdev T bogus_value(-1);
17351c0b2f7Stbbdev T j = bogus_value;
17451c0b2f7Stbbdev
17551c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_puts<T>(q) );
17651c0b2f7Stbbdev for (int i = num_threads*N -1; i>=0; --i) {
17751c0b2f7Stbbdev spin_try_get( q, j );
17851c0b2f7Stbbdev CHECK_MESSAGE(j == i, "");
17951c0b2f7Stbbdev j = bogus_value;
18051c0b2f7Stbbdev }
18151c0b2f7Stbbdev g.wait_for_all();
18251c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
18351c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
18451c0b2f7Stbbdev
18551c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_puts<T>(q) );
18651c0b2f7Stbbdev g.wait_for_all();
18751c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_gets<T>(q) );
18851c0b2f7Stbbdev g.wait_for_all();
18951c0b2f7Stbbdev j = bogus_value;
19051c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
19151c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
19251c0b2f7Stbbdev
19351c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_put_get<T>(q) );
19451c0b2f7Stbbdev g.wait_for_all();
19551c0b2f7Stbbdev j = bogus_value;
19651c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
19751c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
19851c0b2f7Stbbdev
19951c0b2f7Stbbdev tbb::flow::make_edge( q, q2 );
20051c0b2f7Stbbdev tbb::flow::make_edge( q2, q3 );
20151c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_puts<T>(q) );
20251c0b2f7Stbbdev g.wait_for_all();
20351c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_gets<T>(q3) );
20451c0b2f7Stbbdev g.wait_for_all();
20551c0b2f7Stbbdev j = bogus_value;
20651c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
20751c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
20851c0b2f7Stbbdev CHECK_MESSAGE( q2.try_get( j ) == false, "" );
20951c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
21051c0b2f7Stbbdev CHECK_MESSAGE( q3.try_get( j ) == false, "" );
21151c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
21251c0b2f7Stbbdev
21351c0b2f7Stbbdev // test copy constructor
21451c0b2f7Stbbdev CHECK_MESSAGE( remove_successor(q, q2) == true, "" );
21551c0b2f7Stbbdev NativeParallelFor( num_threads, parallel_puts<T>(q) );
21651c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q_copy(q);
21751c0b2f7Stbbdev g.wait_for_all();
21851c0b2f7Stbbdev j = bogus_value;
21951c0b2f7Stbbdev CHECK_MESSAGE( q_copy.try_get( j ) == false, "" );
22051c0b2f7Stbbdev CHECK_MESSAGE( register_successor(q, q_copy) == true, "" );
22151c0b2f7Stbbdev for (int i = num_threads*N -1; i>=0; --i) {
22251c0b2f7Stbbdev spin_try_get( q_copy, j );
22351c0b2f7Stbbdev CHECK_MESSAGE(j == i, "");
22451c0b2f7Stbbdev j = bogus_value;
22551c0b2f7Stbbdev }
22651c0b2f7Stbbdev g.wait_for_all();
22751c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
22851c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
22951c0b2f7Stbbdev CHECK_MESSAGE( q_copy.try_get( j ) == false, "" );
23051c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
23151c0b2f7Stbbdev
23251c0b2f7Stbbdev return 0;
23351c0b2f7Stbbdev }
23451c0b2f7Stbbdev
23551c0b2f7Stbbdev //
23651c0b2f7Stbbdev // Tests
23751c0b2f7Stbbdev //
23851c0b2f7Stbbdev // Predecessors cannot be registered
23951c0b2f7Stbbdev // Empty Q rejects item requests
24051c0b2f7Stbbdev // Single serial sender, items in FIFO order
24151c0b2f7Stbbdev // Chained Qs ( 2 & 3 ), single sender, items at last Q in FIFO order
24251c0b2f7Stbbdev //
24351c0b2f7Stbbdev
24451c0b2f7Stbbdev template< typename T >
test_serial()24551c0b2f7Stbbdev int test_serial() {
24651c0b2f7Stbbdev tbb::flow::graph g;
24751c0b2f7Stbbdev T bogus_value(-1);
24851c0b2f7Stbbdev
24951c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q(g);
25051c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q2(g);
25151c0b2f7Stbbdev T j = bogus_value;
25251c0b2f7Stbbdev
25351c0b2f7Stbbdev //
25451c0b2f7Stbbdev // Rejects attempts to add / remove predecessor
25551c0b2f7Stbbdev // Rejects request from empty Q
25651c0b2f7Stbbdev //
25751c0b2f7Stbbdev CHECK_MESSAGE( register_predecessor(q, q2) == false, "" );
25851c0b2f7Stbbdev CHECK_MESSAGE( remove_predecessor(q, q2) == false, "" );
25951c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
26051c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
26151c0b2f7Stbbdev
26251c0b2f7Stbbdev //
26351c0b2f7Stbbdev // Simple puts and gets
26451c0b2f7Stbbdev //
26551c0b2f7Stbbdev
26651c0b2f7Stbbdev for (int i = 0; i < N; ++i)
26751c0b2f7Stbbdev CHECK_MESSAGE( q.try_put( T(i) ), "" );
26851c0b2f7Stbbdev for (int i = N-1; i >=0; --i) {
26951c0b2f7Stbbdev j = bogus_value;
27051c0b2f7Stbbdev spin_try_get( q, j );
27151c0b2f7Stbbdev CHECK_MESSAGE( i == j, "" );
27251c0b2f7Stbbdev }
27351c0b2f7Stbbdev j = bogus_value;
27451c0b2f7Stbbdev g.wait_for_all();
27551c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
27651c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
27751c0b2f7Stbbdev
27851c0b2f7Stbbdev tbb::flow::make_edge( q, q2 );
27951c0b2f7Stbbdev
28051c0b2f7Stbbdev for (int i = 0; i < N; ++i)
28151c0b2f7Stbbdev CHECK_MESSAGE( q.try_put( T(i) ), "" );
28251c0b2f7Stbbdev g.wait_for_all();
28351c0b2f7Stbbdev for (int i = N-1; i >= 0; --i) {
28451c0b2f7Stbbdev j = bogus_value;
28551c0b2f7Stbbdev spin_try_get( q2, j );
28651c0b2f7Stbbdev CHECK_MESSAGE( i == j, "" );
28751c0b2f7Stbbdev }
28851c0b2f7Stbbdev j = bogus_value;
28951c0b2f7Stbbdev g.wait_for_all();
29051c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
29151c0b2f7Stbbdev g.wait_for_all();
29251c0b2f7Stbbdev CHECK_MESSAGE( q2.try_get( j ) == false, "" );
29351c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
29451c0b2f7Stbbdev
29551c0b2f7Stbbdev tbb::flow::remove_edge( q, q2 );
29651c0b2f7Stbbdev CHECK_MESSAGE( q.try_put( 1 ) == true, "" );
29751c0b2f7Stbbdev g.wait_for_all();
29851c0b2f7Stbbdev CHECK_MESSAGE( q2.try_get( j ) == false, "" );
29951c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
30051c0b2f7Stbbdev g.wait_for_all();
30151c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == true, "" );
30251c0b2f7Stbbdev CHECK_MESSAGE( j == 1, "" );
30351c0b2f7Stbbdev
30451c0b2f7Stbbdev tbb::flow::priority_queue_node<T> q3(g);
30551c0b2f7Stbbdev tbb::flow::make_edge( q, q2 );
30651c0b2f7Stbbdev tbb::flow::make_edge( q2, q3 );
30751c0b2f7Stbbdev
30851c0b2f7Stbbdev for (int i = 0; i < N; ++i)
30951c0b2f7Stbbdev CHECK_MESSAGE( q.try_put( T(i) ), "" );
31051c0b2f7Stbbdev g.wait_for_all();
31151c0b2f7Stbbdev for (int i = N-1; i >= 0; --i) {
31251c0b2f7Stbbdev j = bogus_value;
31351c0b2f7Stbbdev spin_try_get( q3, j );
31451c0b2f7Stbbdev CHECK_MESSAGE( i == j, "" );
31551c0b2f7Stbbdev }
31651c0b2f7Stbbdev j = bogus_value;
31751c0b2f7Stbbdev g.wait_for_all();
31851c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == false, "" );
31951c0b2f7Stbbdev g.wait_for_all();
32051c0b2f7Stbbdev CHECK_MESSAGE( q2.try_get( j ) == false, "" );
32151c0b2f7Stbbdev g.wait_for_all();
32251c0b2f7Stbbdev CHECK_MESSAGE( q3.try_get( j ) == false, "" );
32351c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
32451c0b2f7Stbbdev
32551c0b2f7Stbbdev tbb::flow::remove_edge( q, q2 );
32651c0b2f7Stbbdev CHECK_MESSAGE( q.try_put( 1 ) == true, "" );
32751c0b2f7Stbbdev g.wait_for_all();
32851c0b2f7Stbbdev CHECK_MESSAGE( q2.try_get( j ) == false, "" );
32951c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
33051c0b2f7Stbbdev g.wait_for_all();
33151c0b2f7Stbbdev CHECK_MESSAGE( q3.try_get( j ) == false, "" );
33251c0b2f7Stbbdev CHECK_MESSAGE( j == bogus_value, "" );
33351c0b2f7Stbbdev g.wait_for_all();
33451c0b2f7Stbbdev CHECK_MESSAGE( q.try_get( j ) == true, "" );
33551c0b2f7Stbbdev CHECK_MESSAGE( j == 1, "" );
33651c0b2f7Stbbdev
33751c0b2f7Stbbdev return 0;
33851c0b2f7Stbbdev }
33951c0b2f7Stbbdev
34051c0b2f7Stbbdev #if __TBB_PREVIEW_FLOW_GRAPH_NODE_SET
34151c0b2f7Stbbdev #include <array>
34251c0b2f7Stbbdev #include <vector>
test_follows_and_precedes_api()34351c0b2f7Stbbdev void test_follows_and_precedes_api() {
34451c0b2f7Stbbdev std::array<int, 3> messages_for_follows = { {0, 1, 2} };
34551c0b2f7Stbbdev std::vector<int> messages_for_precedes = {0, 1, 2};
34651c0b2f7Stbbdev
34751c0b2f7Stbbdev follows_and_precedes_testing::test_follows <int, tbb::flow::priority_queue_node<int>>(messages_for_follows);
34851c0b2f7Stbbdev follows_and_precedes_testing::test_precedes <int, tbb::flow::priority_queue_node<int>>(messages_for_precedes);
34951c0b2f7Stbbdev }
35051c0b2f7Stbbdev #endif
35151c0b2f7Stbbdev
35251c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
test_deduction_guides()35351c0b2f7Stbbdev void test_deduction_guides() {
35451c0b2f7Stbbdev using namespace tbb::flow;
35551c0b2f7Stbbdev
35651c0b2f7Stbbdev graph g;
35751c0b2f7Stbbdev broadcast_node<int> br(g);
35851c0b2f7Stbbdev priority_queue_node<int> pq0(g);
35951c0b2f7Stbbdev
36051c0b2f7Stbbdev #if __TBB_PREVIEW_FLOW_GRAPH_NODE_SET
36151c0b2f7Stbbdev using compare_type = std::greater<void>;
36251c0b2f7Stbbdev priority_queue_node pq1(follows(br));
36351c0b2f7Stbbdev static_assert(std::is_same_v<decltype(pq1), priority_queue_node<int>>);
36451c0b2f7Stbbdev
36551c0b2f7Stbbdev priority_queue_node pq2(follows(br), compare_type());
36651c0b2f7Stbbdev static_assert(std::is_same_v<decltype(pq2), priority_queue_node<int, compare_type>>);
36751c0b2f7Stbbdev
36851c0b2f7Stbbdev priority_queue_node pq3(precedes(br));
36951c0b2f7Stbbdev static_assert(std::is_same_v<decltype(pq3), priority_queue_node<int>>);
37051c0b2f7Stbbdev
37151c0b2f7Stbbdev priority_queue_node pq4(precedes(br), compare_type());
37251c0b2f7Stbbdev static_assert(std::is_same_v<decltype(pq4), priority_queue_node<int, compare_type>>);
37351c0b2f7Stbbdev #endif
37451c0b2f7Stbbdev
37551c0b2f7Stbbdev priority_queue_node pq5(pq0);
37651c0b2f7Stbbdev static_assert(std::is_same_v<decltype(pq5), priority_queue_node<int>>);
37751c0b2f7Stbbdev g.wait_for_all();
37851c0b2f7Stbbdev }
37951c0b2f7Stbbdev #endif
38051c0b2f7Stbbdev
38151c0b2f7Stbbdev //! Test serial, parallel behavior and reservation under parallelism
38251c0b2f7Stbbdev //! \brief \ref requirement \ref error_guessing
38351c0b2f7Stbbdev TEST_CASE("Serial, parallel and reservation tests"){
38451c0b2f7Stbbdev for (int p = 2; p <= 4; ++p) {
385*552f342bSPavel tbb::global_control thread_limit(tbb::global_control::max_allowed_parallelism, p);
38651c0b2f7Stbbdev tbb::task_arena arena(p);
38751c0b2f7Stbbdev arena.execute(
__anonedcbfdd50102() 38851c0b2f7Stbbdev [&]() {
38951c0b2f7Stbbdev test_serial<int>();
39051c0b2f7Stbbdev test_reservation<int>(p);
39151c0b2f7Stbbdev test_reservation<CheckType<int> >(p);
39251c0b2f7Stbbdev test_parallel<int>(p);
39351c0b2f7Stbbdev }
39451c0b2f7Stbbdev );
39551c0b2f7Stbbdev }
39651c0b2f7Stbbdev }
39751c0b2f7Stbbdev
39851c0b2f7Stbbdev //! Test reset and cancellation
39951c0b2f7Stbbdev //! \brief \ref error_guessing
40051c0b2f7Stbbdev TEST_CASE("Reset tests"){
40151c0b2f7Stbbdev INFO("Testing resets\n");
40251c0b2f7Stbbdev test_resets<int,tbb::flow::priority_queue_node<int> >();
40351c0b2f7Stbbdev test_resets<float,tbb::flow::priority_queue_node<float> >();
40451c0b2f7Stbbdev }
40551c0b2f7Stbbdev
40651c0b2f7Stbbdev #if __TBB_PREVIEW_FLOW_GRAPH_NODE_SET
40751c0b2f7Stbbdev //! Test follows and precedes API
40851c0b2f7Stbbdev //! \brief \ref error_guessing
40951c0b2f7Stbbdev TEST_CASE("Test follows and precedes API"){
41051c0b2f7Stbbdev test_follows_and_precedes_api();
41151c0b2f7Stbbdev }
41251c0b2f7Stbbdev #endif
41351c0b2f7Stbbdev
41451c0b2f7Stbbdev #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT
41551c0b2f7Stbbdev //! Test decution guides
41651c0b2f7Stbbdev //! \brief \ref requirement
41751c0b2f7Stbbdev TEST_CASE("Test deduction guides"){
41851c0b2f7Stbbdev test_deduction_guides();
41951c0b2f7Stbbdev }
42051c0b2f7Stbbdev #endif
42151c0b2f7Stbbdev
422