00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef REGION_H
00024 #define REGION_H
00025
00026 #include <algorithm>
00027
00028 namespace storage
00029 {
00030
00031 class Region
00032 {
00033 public:
00034 Region() : s(0), l(0) {}
00035 Region( unsigned long start, unsigned long len ) : s(start), l(len) {}
00036 Region( const Region& x )
00037 { *this = x; }
00038 Region& operator=(const Region& r)
00039 { s = r.start(); l = r.len(); return( *this ); }
00040 bool doIntersect( const Region& r ) const
00041 { return( r.start() <= end() && r.end() >= start() ); }
00042 Region intersect( const Region& r ) const
00043 {
00044 Region ret;
00045 if (doIntersect(r))
00046 {
00047 unsigned long s = std::max( r.start(), start() );
00048 unsigned long e = std::min( r.end(), end() );
00049 ret = Region( s, e-s+1 );
00050 }
00051 return( ret );
00052 }
00053 bool inside( const Region& r ) const
00054 { return( start()>=r.start() && end() <= r.end() ); }
00055 bool operator==(const Region& r) const
00056 { return( r.start()==s && r.len()==l ); }
00057 bool operator!=(const Region& r) const
00058 { return( ! (*this==r) ); }
00059 bool operator<(const Region& r) const
00060 { return( s < r.start() ); }
00061 bool operator>(const Region& r) const
00062 { return( s > r.start() ); }
00063 unsigned long start() const { return( s ); }
00064 unsigned long end() const { return( s+l-1 ); }
00065 unsigned long len() const { return( l ); }
00066 protected:
00067 unsigned long s;
00068 unsigned long l;
00069 };
00070
00071 inline std::ostream& operator<< (std::ostream& s, const Region &p )
00072 {
00073 s << "[" << p.start() << "," << p.len() << "]";
00074 return( s );
00075 }
00076
00077 inline std::istream& operator>> (std::istream& s, Region &p )
00078 {
00079 unsigned long start, len;
00080 s >> start >> len;
00081 p = Region( start, len );
00082 return( s );
00083 }
00084
00085 }
00086
00087 #endif