00001
00072 #ifndef INC_MI32_RANGE_H
00073 #define INC_MI32_RANGE_H
00074
00075 #ifndef INC_MI32_INIDEFNS_H
00076 #include <mi32/inidefns.h>
00077 #endif
00078
00079 #ifndef INC_LIMITS
00080 #include <limits>
00081 #define INC_LIMITS
00082 #endif
00083
00086 template <class _CT> class RANGE {
00087 public:
00088
00090 RANGE (
00091 ) {
00092 SetInvalid();
00093 }
00094
00096 RANGE (
00097 _CT minval,
00098 _CT maxval
00099 ): m_min(minval), m_max(maxval)
00100 { }
00101
00103 explicit RANGE (
00104 _CT value
00105 ) : m_min(value), m_max(value)
00106 { }
00107
00109 RANGE& operator= (
00110 _CT value
00111 ) { m_min = m_max = value; return (*this); }
00112
00114 bool operator== (
00115 const RANGE& rhs
00116 ) const {
00117 return (m_min == rhs.m_min && m_max == rhs.m_max);
00118 }
00119
00121 bool operator!= (
00122 const RANGE& rhs
00123 ) const {
00124 return (!(*this == rhs));
00125 }
00126
00128 bool Contains (
00129 _CT value
00130 ) const {
00131 return (value >= m_min && value <= m_max);
00132 }
00133
00135 bool Contains (
00136 const RANGE& rhs
00137 ) const {
00138 return (rhs.m_min >= m_min && rhs.m_max <= m_max);
00139 }
00140
00142 bool Contains (
00143 _CT valuemin,
00144 _CT valuemax
00145 ) const {
00146 return (valuemin >= m_min && valuemax <= m_max);
00147 }
00148
00150 void Expand (
00151 _CT value
00152 ) {
00153 m_min -= value;
00154 m_max += value;
00155 }
00156
00158 void Extend (
00159 _CT value
00160 ) {
00161 if (value < m_min) m_min = value;
00162 if (value > m_max) m_max = value;
00163 }
00164
00166 void Extend (
00167 _CT minval,
00168 _CT maxval
00169 ) {
00170 if (minval < m_min) m_min = minval;
00171 if (maxval > m_max) m_max = maxval;
00172 }
00173
00175 void Extend (
00176 const RANGE& rhs
00177 ) {
00178 if (rhs.m_min < m_min) m_min = rhs.m_min;
00179 if (rhs.m_max > m_max) m_max = rhs.m_max;
00180 }
00181
00183 _CT GetCenter (
00184 ) const {
00185 return ((m_min + m_max) / 2);
00186 }
00187
00189 _CT GetMaximum (
00190 ) const {
00191 return (m_max);
00192 }
00193
00195 _CT GetMinimum (
00196 ) const {
00197 return (m_min);
00198 }
00199
00201 _CT GetSize (
00202 ) const { return (m_max - m_min); }
00203
00205 void IniRead (
00206 INIHANDLE hdl,
00207 const char *GroupName,
00208 const char *FieldNameMin,
00209 const char *FieldNameMax
00210 ) { ::IniRead(hdl,GroupName,FieldNameMin,m_min); ::IniRead(hdl,GroupName,FieldNameMax,m_max); }
00211
00213 void IniWrite (
00214 INIHANDLE hdl,
00215 const char *GroupName,
00216 const char *FieldNameMin,
00217 const char *FieldNameMax
00218 ) const { ::IniWrite(hdl,GroupName,FieldNameMin,m_min); ::IniWrite(hdl,GroupName,FieldNameMax,m_max); }
00219
00221 void Intersect (
00222 const RANGE& rhs
00223 ) {
00224 if (rhs.IsValid()) {
00225 if (rhs.m_min > m_min) m_min = rhs.m_min;
00226 if (rhs.m_max < m_max) m_max = rhs.m_max;
00227 }
00228 else {
00229 *this = rhs;
00230 }
00231 return;
00232 }
00233
00235 bool IsNonEmpty (
00236 ) const {
00237 return (m_min < m_max);
00238 }
00239
00241 bool IsValid (
00242 ) const {
00243 return (m_min <= m_max);
00244 }
00245
00249 _CT Limit (
00250 _CT value
00251 ) const {
00252 return ((value < m_min) ? m_min : ((value > m_max) ? m_max : value));
00253 }
00254
00256 bool Overlaps (
00257 const RANGE& rhs
00258 ) const {
00259 return (!(rhs.m_max < m_min || rhs.m_min > m_max));
00260 }
00261
00263 void SetInvalid (
00264 ) {
00265 m_min = std::numeric_limits<_CT>::max();
00266 m_max = -m_min;
00267 }
00268
00270 void Set (
00271 _CT minval,
00272 _CT maxval
00273 ) { m_min = minval; m_max = maxval; }
00274
00276 void SetMaximum (
00277 _CT val
00278 ) { m_max = val; }
00279
00281 void SetMinimum (
00282 _CT val
00283 ) { m_min = val; }
00284
00287 void ShiftFast (
00288 _CT value
00289 ) { m_min += value; m_max += value; }
00290
00291 void Validate (
00292 ) {
00293 if (IsValid()) return;
00294 _CT tmp = m_min;
00295 m_min = m_max;
00296 m_max = tmp;
00297 }
00298
00299 private:
00300 #ifndef GENERATING_DOXYGEN_OUTPUT
00301 _CT m_min;
00302 _CT m_max;
00303 #endif // GENERATING_DOXYGEN_OUTPUT
00304
00305 };
00306
00307 typedef RANGE<INT16> INT16_RANGE;
00308 typedef RANGE<INT32> INT32_RANGE;
00309 typedef RANGE<float> FLOAT_RANGE;
00310 typedef RANGE<double> DOUBLE_RANGE;
00311
00312 #endif