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