00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __MYGUI_TRECT_H__
00024 #define __MYGUI_TRECT_H__
00025
00026 #include "MyGUI_Prerequest.h"
00027
00028 namespace MyGUI
00029 {
00030 namespace types
00031 {
00032
00033 template< typename T > struct TRect
00034 {
00035 T left, top, right, bottom;
00036
00037 TRect() : left( 0 ), top( 0 ), right( 0 ), bottom( 0 ) { }
00038 TRect( T const& l, T const& t, T const& r, T const& b ) : left( l ), top( t ), right( r ), bottom( b ) { }
00039 TRect( TRect const& o ) : left( o.left ), top( o.top ), right( o.right ), bottom( o.bottom ) { }
00040
00041 TRect& operator-=( TRect const& o )
00042 {
00043 left -= o.left;
00044 top -= o.top;
00045 right -= o.right;
00046 bottom -= o.bottom;
00047 return *this;
00048 }
00049
00050 TRect& operator+=( TRect const& o )
00051 {
00052 left += o.left;
00053 top += o.top;
00054 right += o.right;
00055 bottom += o.bottom;
00056 return *this;
00057 }
00058
00059 TRect operator-( TRect const& o ) const
00060 {
00061 return TRect(left - o.left, top - o.top, right - o.right, bottom - o.bottom);
00062 }
00063
00064 TRect operator+( TRect const& o ) const
00065 {
00066 return TRect(left + o.left, top + o.top, right + o.right, bottom + o.bottom);
00067 }
00068
00069 TRect& operator=( TRect const& o )
00070 {
00071 left = o.left;
00072 top = o.top;
00073 right = o.right;
00074 bottom = o.bottom;
00075 return *this;
00076 }
00077
00078 template< typename U >
00079 TRect& operator=( TRect<U> const& o )
00080 {
00081 left = o.left;
00082 top = o.top;
00083 right = o.right;
00084 bottom = o.bottom;
00085 return *this;
00086 }
00087
00088 bool operator==( TRect const& o ) const
00089 {
00090 return ((left == o.left) && (top == o.top) && (right == o.right) && (bottom == o.bottom));
00091 }
00092
00093 bool operator!=( TRect const& o ) const
00094 {
00095 return ! ((left == o.left) && (top == o.top) && (right == o.right) && (bottom == o.bottom));
00096 }
00097
00098 T width() const
00099 {
00100 return right - left;
00101 }
00102
00103 T height() const
00104 {
00105 return bottom - top;
00106 }
00107
00108 void clear()
00109 {
00110 left = top = right = bottom = 0;
00111 }
00112
00113 void set( T const& l, T const& t, T const& r, T const& b )
00114 {
00115 left = l;
00116 top = t;
00117 right = r;
00118 bottom = b;
00119 }
00120
00121 void swap(TRect& _value)
00122 {
00123 TRect tmp = _value;
00124 _value = *this;
00125 *this = tmp;
00126 }
00127
00128 bool empty() const
00129 {
00130 return ((left == 0) && (top == 0) && (right == 0) && (bottom == 0));
00131 }
00132
00133 bool inside(const TRect<T>& _value) const
00134 {
00135 return ( (_value.left >= left) && (_value.right <= right) && (_value.top >= top) && (_value.bottom <= bottom) );
00136 }
00137
00138 bool intersect(const TRect<T>& _value) const
00139 {
00140 return ( (_value.left <= right) && (_value.right >= left) && (_value.top <= bottom) && (_value.bottom >= top) );
00141 }
00142
00143 bool inside(const TPoint<T>& _value) const
00144 {
00145 return ( (_value.left >= left) && (_value.left <= right) && (_value.top >= top) && (_value.top <= bottom) );
00146 }
00147
00148 std::string print() const
00149 {
00150 std::ostringstream stream;
00151 stream << *this;
00152 return stream.str();
00153 }
00154
00155 static TRect<T> parse(const std::string& _value)
00156 {
00157 TRect<T> result;
00158 std::istringstream stream(_value);
00159 stream >> result.left >> result.top >> result.right >> result.bottom;
00160 if (stream.fail()) return TRect<T>();
00161 else
00162 {
00163 int item = stream.get();
00164 while (item != -1)
00165 {
00166 if (item != ' ' && item != '\t') return TRect<T>();
00167 item = stream.get();
00168 };
00169 }
00170 return result;
00171 }
00172
00173 friend std::ostream& operator << ( std::ostream& _stream, const TRect<T>& _value )
00174 {
00175 _stream << _value.left << " " << _value.top << " " << _value.right << " " << _value.bottom;
00176 return _stream;
00177 }
00178
00179 friend std::istream& operator >> ( std::istream& _stream, TRect<T>& _value )
00180 {
00181 _stream >> _value.left >> _value.top >> _value.right >> _value.bottom;
00182 if (_stream.fail()) _value.clear();
00183 return _stream;
00184 }
00185
00186 };
00187
00188 }
00189 }
00190
00191 #endif // __MYGUI_TRECT_H__