00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef __TBB_blocked_range3d_H
00030 #define __TBB_blocked_range3d_H
00031
00032 #include "tbb_stddef.h"
00033 #include "blocked_range.h"
00034
00035 namespace tbb {
00036
00038
00039 template<typename PageValue, typename RowValue=PageValue, typename ColValue=RowValue>
00040 class blocked_range3d {
00041 public:
00043 typedef blocked_range<PageValue> page_range_type;
00044 typedef blocked_range<RowValue> row_range_type;
00045 typedef blocked_range<ColValue> col_range_type;
00046
00047 private:
00048 page_range_type my_pages;
00049 row_range_type my_rows;
00050 col_range_type my_cols;
00051
00052 public:
00053
00054 blocked_range3d( PageValue page_begin, PageValue page_end,
00055 RowValue row_begin, RowValue row_end,
00056 ColValue col_begin, ColValue col_end ) :
00057 my_pages(page_begin,page_end),
00058 my_rows(row_begin,row_end),
00059 my_cols(col_begin,col_end)
00060 {
00061 }
00062
00063 blocked_range3d( PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize,
00064 RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize,
00065 ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize ) :
00066 my_pages(page_begin,page_end,page_grainsize),
00067 my_rows(row_begin,row_end,row_grainsize),
00068 my_cols(col_begin,col_end,col_grainsize)
00069 {
00070 }
00071
00073 bool empty() const {
00074
00075 return my_pages.empty() || my_rows.empty() || my_cols.empty();
00076 }
00077
00079 bool is_divisible() const {
00080 return my_pages.is_divisible() || my_rows.is_divisible() || my_cols.is_divisible();
00081 }
00082
00083 blocked_range3d( blocked_range3d& r, split ) :
00084 my_pages(r.my_pages),
00085 my_rows(r.my_rows),
00086 my_cols(r.my_cols)
00087 {
00088 if( my_pages.size()*double(my_rows.grainsize()) < my_rows.size()*double(my_pages.grainsize()) ) {
00089 if ( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {
00090 my_cols.my_begin = col_range_type::do_split(r.my_cols);
00091 } else {
00092 my_rows.my_begin = row_range_type::do_split(r.my_rows);
00093 }
00094 } else {
00095 if ( my_pages.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_pages.grainsize()) ) {
00096 my_cols.my_begin = col_range_type::do_split(r.my_cols);
00097 } else {
00098 my_pages.my_begin = page_range_type::do_split(r.my_pages);
00099 }
00100 }
00101 }
00102
00104 const page_range_type& pages() const {return my_pages;}
00105
00107 const row_range_type& rows() const {return my_rows;}
00108
00110 const col_range_type& cols() const {return my_cols;}
00111
00112 };
00113
00114 }
00115
00116 #endif