1 | /* |
2 | Copyright (c) 2005-2019 Intel Corporation |
3 | |
4 | Licensed under the Apache License, Version 2.0 (the "License"); |
5 | you may not use this file except in compliance with the License. |
6 | You may obtain a copy of the License at |
7 | |
8 | http://www.apache.org/licenses/LICENSE-2.0 |
9 | |
10 | Unless required by applicable law or agreed to in writing, software |
11 | distributed under the License is distributed on an "AS IS" BASIS, |
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | See the License for the specific language governing permissions and |
14 | limitations under the License. |
15 | */ |
16 | |
17 | #ifndef __TBB_blocked_range2d_H |
18 | #define __TBB_blocked_range2d_H |
19 | |
20 | #include "tbb_stddef.h" |
21 | #include "blocked_range.h" |
22 | |
23 | namespace tbb { |
24 | |
25 | //! A 2-dimensional range that models the Range concept. |
26 | /** @ingroup algorithms */ |
27 | template<typename RowValue, typename ColValue=RowValue> |
28 | class blocked_range2d { |
29 | public: |
30 | //! Type for size of an iteration range |
31 | typedef blocked_range<RowValue> row_range_type; |
32 | typedef blocked_range<ColValue> col_range_type; |
33 | |
34 | private: |
35 | row_range_type my_rows; |
36 | col_range_type my_cols; |
37 | |
38 | public: |
39 | |
40 | blocked_range2d( RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, |
41 | ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize ) : |
42 | my_rows(row_begin,row_end,row_grainsize), |
43 | my_cols(col_begin,col_end,col_grainsize) |
44 | {} |
45 | |
46 | blocked_range2d( RowValue row_begin, RowValue row_end, |
47 | ColValue col_begin, ColValue col_end ) : |
48 | my_rows(row_begin,row_end), |
49 | my_cols(col_begin,col_end) |
50 | {} |
51 | |
52 | //! True if range is empty |
53 | bool empty() const { |
54 | // Range is empty if at least one dimension is empty. |
55 | return my_rows.empty() || my_cols.empty(); |
56 | } |
57 | |
58 | //! True if range is divisible into two pieces. |
59 | bool is_divisible() const { |
60 | return my_rows.is_divisible() || my_cols.is_divisible(); |
61 | } |
62 | |
63 | blocked_range2d( blocked_range2d& r, split ) : |
64 | my_rows(r.my_rows), |
65 | my_cols(r.my_cols) |
66 | { |
67 | split split_obj; |
68 | do_split(r, split_obj); |
69 | } |
70 | |
71 | #if __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES |
72 | //! Static field to support proportional split |
73 | static const bool is_splittable_in_proportion = true; |
74 | |
75 | blocked_range2d( blocked_range2d& r, proportional_split& proportion ) : |
76 | my_rows(r.my_rows), |
77 | my_cols(r.my_cols) |
78 | { |
79 | do_split(r, proportion); |
80 | } |
81 | #endif /* __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES */ |
82 | |
83 | //! The rows of the iteration space |
84 | const row_range_type& rows() const {return my_rows;} |
85 | |
86 | //! The columns of the iteration space |
87 | const col_range_type& cols() const {return my_cols;} |
88 | |
89 | private: |
90 | |
91 | template <typename Split> |
92 | void do_split( blocked_range2d& r, Split& split_obj ) |
93 | { |
94 | if( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) { |
95 | my_cols.my_begin = col_range_type::do_split(r.my_cols, split_obj); |
96 | } else { |
97 | my_rows.my_begin = row_range_type::do_split(r.my_rows, split_obj); |
98 | } |
99 | } |
100 | }; |
101 | |
102 | } // namespace tbb |
103 | |
104 | #endif /* __TBB_blocked_range2d_H */ |
105 | |