00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_IRANGE_INCLUDE
00013 #define MTL_IRANGE_INCLUDE
00014
00015 #include <limits>
00016
00017
00018 namespace mtl {
00019
00021 const std::size_t imax= std::numeric_limits<std::size_t>::max();
00022
00024 class irange
00025 {
00026 public:
00027
00028 typedef std::size_t size_type;
00029
00031 explicit irange(size_type start, size_type finish) : my_start(start), my_finish(finish) {}
00032
00034 explicit irange(size_type finish) : my_start(0), my_finish(finish) {}
00035
00037 irange() : my_start(0), my_finish(imax) {}
00038
00040 irange& set(size_type start, size_type finish)
00041 {
00042 my_start= start; my_finish= finish; return *this;
00043 }
00044
00046 irange& set(size_type finish)
00047 {
00048 my_start= 0; my_finish= finish; return *this;
00049 }
00050
00052 size_type start() const { return my_start; }
00054 size_type finish() const { return my_finish; }
00056 size_type size() const { return my_finish > my_start ? my_finish - my_start : 0; }
00057
00058 bool empty() const { return my_finish <= my_start; }
00059
00060 private:
00061 size_type my_start, my_finish;
00062 };
00064 namespace {
00065 irange iall;
00066 }
00067
00068 irange inline intersection(irange const& r1, irange const& r2)
00069 {
00070 return irange(std::max(r1.start(), r2.start()), std::min(r1.finish(), r2.finish()));
00071 }
00072
00073
00074 }
00075
00076
00077
00078 #endif // MTL_IRANGE_INCLUDE