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 #include "storage/XmlFile.h"
00029
00030
00031 namespace storage
00032 {
00033
00034 class Region
00035 {
00036 public:
00037
00038 Region() : s(0), l(0) {}
00039 Region(unsigned long long start, unsigned long long len) : s(start), l(len) {}
00040
00041 bool doIntersect( const Region& r ) const
00042 { return( r.start() <= end() && r.end() >= start() ); }
00043 Region intersect( const Region& r ) const
00044 {
00045 if (doIntersect(r))
00046 {
00047 unsigned long long s = std::max(r.start(), start());
00048 unsigned long long e = std::min(r.end(), end());
00049 return Region(s, e - s + 1);
00050 }
00051 return Region(0, 0);
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
00064 unsigned long long start() const { return s; }
00065 unsigned long long len() const { return l; }
00066 unsigned long long end() const { return s + l - 1; }
00067
00068 bool empty() const { return l == 0; }
00069
00070 void setStart(unsigned long long start) { s = start; }
00071 void setLen(unsigned long long len) { l = len; }
00072
00073 template <typename Type> friend
00074 Region operator*(Type i, const Region& r)
00075 {
00076 static_assert(std::is_integral<Type>::value, "not integral");
00077 return Region(i * r.s, i * r.l);
00078 }
00079
00080 template <typename Type> friend
00081 Region operator/(const Region& r, Type i)
00082 {
00083 static_assert(std::is_integral<Type>::value, "not integral");
00084 return Region(r.s / i, r.l / i);
00085 }
00086
00087 friend std::ostream& operator<<(std::ostream& s, const Region& p);
00088
00089 friend bool getChildValue(const xmlNode* node, const char* name, Region& value);
00090 friend void setChildValue(xmlNode* node, const char* name, const Region& value);
00091
00092 protected:
00093
00094 unsigned long long s;
00095 unsigned long long l;
00096
00097 };
00098
00099 }
00100
00101 #endif