00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __TBB_blocked_range2d_H
00022 #define __TBB_blocked_range2d_H
00023
00024 #include "tbb_stddef.h"
00025 #include "blocked_range.h"
00026
00027 namespace tbb {
00028
00030
00031 template<typename RowValue, typename ColValue=RowValue>
00032 class blocked_range2d {
00033 public:
00035 typedef blocked_range<RowValue> row_range_type;
00036 typedef blocked_range<ColValue> col_range_type;
00037
00038 private:
00039 row_range_type my_rows;
00040 col_range_type my_cols;
00041
00042 public:
00043
00044 blocked_range2d( RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize,
00045 ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize ) :
00046 my_rows(row_begin,row_end,row_grainsize),
00047 my_cols(col_begin,col_end,col_grainsize)
00048 {
00049 }
00050
00051 blocked_range2d( RowValue row_begin, RowValue row_end,
00052 ColValue col_begin, ColValue col_end ) :
00053 my_rows(row_begin,row_end),
00054 my_cols(col_begin,col_end)
00055 {
00056 }
00057
00059 bool empty() const {
00060
00061 return my_rows.empty() || my_cols.empty();
00062 }
00063
00065 bool is_divisible() const {
00066 return my_rows.is_divisible() || my_cols.is_divisible();
00067 }
00068
00069 blocked_range2d( blocked_range2d& r, split ) :
00070 my_rows(r.my_rows),
00071 my_cols(r.my_cols)
00072 {
00073 if( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {
00074 my_cols.my_begin = col_range_type::do_split(r.my_cols);
00075 } else {
00076 my_rows.my_begin = row_range_type::do_split(r.my_rows);
00077 }
00078 }
00079
00081 const row_range_type& rows() const {return my_rows;}
00082
00084 const col_range_type& cols() const {return my_cols;}
00085 };
00086
00087 }
00088
00089 #endif