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_range_H
00030 #define __TBB_blocked_range_H
00031
00032 #include "tbb_stddef.h"
00033
00034 namespace tbb {
00035
00045
00046
00047 template<typename Value>
00048 class blocked_range {
00049 public:
00051
00053 typedef Value const_iterator;
00054
00056 typedef std::size_t size_type;
00057
00059
00060 blocked_range() : my_end(), my_begin() {}
00061
00063 blocked_range( Value begin_, Value end_, size_type grainsize_=1 ) :
00064 my_end(end_), my_begin(begin_), my_grainsize(grainsize_)
00065 {
00066 __TBB_ASSERT( my_grainsize>0, "grainsize must be positive" );
00067 }
00068
00070 const_iterator begin() const {return my_begin;}
00071
00073 const_iterator end() const {return my_end;}
00074
00076
00077 size_type size() const {
00078 __TBB_ASSERT( !(end()<begin()), "size() unspecified if end()<begin()" );
00079 return size_type(my_end-my_begin);
00080 }
00081
00083 size_type grainsize() const {return my_grainsize;}
00084
00085
00086
00087
00088
00090 bool empty() const {return !(my_begin<my_end);}
00091
00093
00094 bool is_divisible() const {return my_grainsize<size();}
00095
00097
00099 blocked_range( blocked_range& r, split ) :
00100 my_end(r.my_end),
00101 my_begin(do_split(r)),
00102 my_grainsize(r.my_grainsize)
00103 {}
00104
00105 private:
00107 Value my_end;
00108 Value my_begin;
00109 size_type my_grainsize;
00110
00112
00113 static Value do_split( blocked_range& r ) {
00114 __TBB_ASSERT( r.is_divisible(), "cannot split blocked_range that is not divisible" );
00115 Value middle = r.my_begin + (r.my_end-r.my_begin)/2u;
00116 r.my_end = middle;
00117 return middle;
00118 }
00119
00120 template<typename RowValue, typename ColValue>
00121 friend class blocked_range2d;
00122
00123 template<typename RowValue, typename ColValue, typename PageValue>
00124 friend class blocked_range3d;
00125 };
00126
00127 }
00128
00129 #endif