00001
00002
00003
00004
00005
00006
00007 #ifndef MRAMRANGE_H
00008 #define MRAMRANGE_H
00009
00010 #ifdef USE_STD
00011 #include <iostream>
00012 using namespace std;
00013 #else
00014 #include <iostream.h>
00015 #endif
00016
00017 #include "BufferBase.h"
00018 #include "MRAmlevel.h"
00019
00020 class MRAmrange {
00021
00022 public:
00023
00024 static const int goodbit = 0x01;
00025 static const int failbit = 0x02;
00026 static const int baddimbit = 0x04;
00027 static const int fragbit = 0x08;
00028
00029 MRAmlevel mmin, mmax;
00030
00031 MRAmrange( const MRAmrange& );
00032 MRAmrange();
00033 MRAmrange( int dim );
00034 MRAmrange( const MRAmlevel& mmin2, const MRAmlevel& mmax2 );
00035 MRAmrange( MRAmlevel );
00036
00037 MRAmrange& copy( const MRAmrange& );
00038 MRAmrange& operator = ( const MRAmrange& );
00039
00040 MRAmrange& operator () ( const MRAmrange& );
00041 MRAmrange& operator () ();
00042 MRAmrange& operator () ( int dim );
00043 MRAmrange& operator () ( const MRAmlevel& mmin2, const MRAmlevel& mmax2 );
00044
00045 void set_null();
00046 bool is_null();
00047 bool operator ! ();
00048
00049 void set_empty();
00050 bool is_empty();
00051
00052 void clear();
00053 void setstate(int);
00054 void clrstate(int);
00055 int rdstate( int = 0xFF );
00056 bool good();
00057 bool fail();
00058 bool baddim();
00059 bool frag();
00060
00061 MRAmrange& Union( MRAmrange );
00062 MRAmrange& operator += ( MRAmrange );
00063
00064 MRAmrange& Intersection( MRAmrange );
00065 MRAmrange& operator *= ( MRAmrange );
00066
00067 MRAmrange& Difference( MRAmrange );
00068 MRAmrange& operator -= ( MRAmrange );
00069
00070 int dim();
00071
00072 int sizeb();
00073
00074 void report( ostream& os = cout );
00075
00076 void write( BufferBase& );
00077 MRAmrange& operator << ( BufferBase& );
00078 void read( BufferBase& );
00079 MRAmrange& operator >> ( BufferBase& );
00080
00081 void write( istream& );
00082 void read( ostream& );
00083
00084 protected:
00085 int _state;
00086 int _dim;
00087
00088 friend bool equal( MRAmrange, MRAmrange );
00089 friend bool operator == ( MRAmrange, MRAmrange );
00090 friend bool operator != ( MRAmrange, MRAmrange );
00091 friend bool contains( MRAmrange, MRAmrange );
00092 friend bool operator < ( MRAmrange, MRAmrange );
00093 friend bool operator > ( MRAmrange, MRAmrange );
00094 friend bool operator <= ( MRAmrange, MRAmrange );
00095 friend bool operator >= ( MRAmrange, MRAmrange );
00096 friend bool disjoint( MRAmrange, MRAmrange );
00097 friend bool connected( MRAmrange, MRAmrange );
00098 friend bool interior( MRAmrange, MRAmrange );
00099 friend MRAmrange Union( MRAmrange, MRAmrange );
00100 friend MRAmrange operator + ( MRAmrange, MRAmrange );
00101 friend MRAmrange Intersection( MRAmrange, MRAmrange );
00102 friend MRAmrange operator * ( MRAmrange, MRAmrange );
00103 friend MRAmrange Difference( MRAmrange, MRAmrange );
00104 friend MRAmrange operator - ( MRAmrange, MRAmrange );
00105
00106 friend BufferBase& operator << ( BufferBase&, MRAmrange& );
00107 friend BufferBase& operator >> ( BufferBase&, MRAmrange& );
00108 friend ostream& operator << ( ostream&, MRAmrange& );
00109 friend istream& operator >> ( istream&, MRAmrange& );
00110
00111 };
00112
00113
00114
00115 bool equal( MRAmrange, MRAmrange );
00116
00117 inline
00118 bool operator == ( MRAmrange lhs, MRAmrange rhs )
00119 {
00120 return equal( rhs, lhs );
00121 }
00122
00123 inline
00124 bool operator != ( MRAmrange lhs, MRAmrange rhs )
00125 {
00126 return !equal( rhs, lhs );
00127 }
00128
00129 bool contains( MRAmrange, MRAmrange );
00130
00131 inline
00132 bool operator < ( MRAmrange lhs, MRAmrange rhs )
00133 {
00134 return contains( rhs, lhs ) && lhs != rhs;
00135 }
00136
00137 inline
00138 bool operator > ( MRAmrange lhs, MRAmrange rhs )
00139 {
00140 return contains( lhs, rhs ) && lhs != rhs;
00141 }
00142
00143 inline
00144 bool operator <= ( MRAmrange lhs, MRAmrange rhs )
00145 {
00146 return contains( rhs, lhs );
00147 }
00148
00149 inline
00150 bool operator >= ( MRAmrange lhs, MRAmrange rhs )
00151 {
00152 return contains( lhs, rhs );
00153 }
00154
00155 bool disjoint( MRAmrange, MRAmrange );
00156
00157 bool connected( MRAmrange, MRAmrange );
00158
00159 bool interior( MRAmrange, MRAmrange );
00160
00161 MRAmrange Union( MRAmrange, MRAmrange );
00162
00163 inline
00164 MRAmrange operator + ( MRAmrange lhs, MRAmrange rhs )
00165 {
00166 return Union( lhs, rhs );
00167 }
00168
00169 MRAmrange Intersection( MRAmrange, MRAmrange );
00170
00171 inline
00172 MRAmrange operator * ( MRAmrange lhs, MRAmrange rhs )
00173 {
00174 return Intersection( lhs, rhs );
00175 }
00176
00177 MRAmrange Difference( MRAmrange, MRAmrange );
00178
00179 inline
00180 MRAmrange operator - ( MRAmrange lhs, MRAmrange rhs )
00181 {
00182 return Difference( lhs, rhs );
00183 }
00184
00185
00186
00187 inline
00188 MRAmrange::MRAmrange( const MRAmrange& mrange )
00189 {
00190 _state = mrange._state;
00191 _dim = mrange._dim;
00192 mmin = mrange.mmin;
00193 mmax = mrange.mmax;
00194 }
00195
00196 inline
00197 MRAmrange::MRAmrange()
00198 : _state(0), _dim(0)
00199 {
00200 mmin();
00201 mmax();
00202 }
00203
00204 inline
00205 MRAmrange::MRAmrange( int dim )
00206 : _state(goodbit), _dim(dim)
00207 {
00208 mmin(dim);
00209 mmax(dim);
00210 }
00211
00212 inline
00213 MRAmrange::MRAmrange( const MRAmlevel& mmin2, const MRAmlevel& mmax2 )
00214 {
00215 if ( mmin2._dim != 0 && mmin2._dim == mmax2._dim ) {
00216 _state = goodbit;
00217 _dim = mmin2._dim;
00218 mmin = mmin2;
00219 mmax = mmax2;
00220 } else {
00221 _state &= !goodbit; _state |= baddimbit;
00222 _dim = 0;
00223 mmin();
00224 mmax();
00225 }
00226 }
00227
00228 inline
00229 MRAmrange::MRAmrange( const MRAmlevel mlevel )
00230 {
00231 if ( mlevel._dim != 0 ) {
00232 _state = goodbit;
00233 _dim = mlevel._dim;
00234 mmin = mlevel;
00235 mmax = mlevel;
00236 } else {
00237 _state &= !goodbit; _state |= baddimbit;
00238 _dim = 0;
00239 mmin();
00240 mmax();
00241 }
00242 }
00243
00244 inline
00245 MRAmrange& MRAmrange::copy( const MRAmrange& mrange )
00246 {
00247 _state = mrange._state;
00248 _dim = mrange._dim;
00249 mmin = mrange.mmin;
00250 mmax = mrange.mmax;
00251 return *this;
00252 }
00253
00254 inline
00255 MRAmrange& MRAmrange::operator = ( const MRAmrange& rhs ) { return copy(rhs); }
00256
00257 inline
00258 MRAmrange& MRAmrange::operator () ( const MRAmrange& mrange )
00259 {
00260 _state = mrange._state;
00261 _dim = mrange._dim;
00262 mmin = mrange.mmin;
00263 mmax = mrange.mmax;
00264 return *this;
00265 }
00266
00267 inline
00268 MRAmrange& MRAmrange::operator () ()
00269 {
00270 _state = 0;
00271 _dim = 0;
00272 mmin();
00273 mmax();
00274 return *this;
00275 }
00276
00277 inline
00278 MRAmrange& MRAmrange::operator () ( int dim )
00279 {
00280 clear();
00281 _dim = dim;
00282 mmin(dim);
00283 mmax(dim);
00284 return *this;
00285 }
00286
00287 inline
00288 MRAmrange& MRAmrange::operator () (
00289 const MRAmlevel& mmin2, const MRAmlevel& mmax2
00290 )
00291 {
00292 if ( mmin2._dim != 0 && mmin2._dim == mmax2._dim ) {
00293 clear();
00294 _dim = mmin2._dim;
00295 mmin = mmin2;
00296 mmax = mmax2;
00297 } else {
00298 clear(); setstate(baddimbit);
00299 _dim = 0;
00300 mmin();
00301 mmax();
00302 }
00303 return *this;
00304 }
00305
00306 inline
00307 void MRAmrange::set_null()
00308 {
00309 _state = 0;
00310 _dim = 0;
00311 mmin();
00312 mmax();
00313 }
00314
00315 inline
00316 bool MRAmrange::is_null()
00317 {
00318 if ( _dim == 0 ) return true;
00319 return false;
00320 }
00321
00322 inline
00323 bool MRAmrange::operator ! ()
00324 {
00325 return is_null();
00326 }
00327
00328 inline
00329 void MRAmrange::set_empty()
00330 {
00331 if ( !is_null() ) {
00332 clear();
00333 mmin = MRAmlevel::mmax_limit;
00334 mmax = MRAmlevel::mmin_limit;
00335 } else {
00336 setstate(failbit);
00337 }
00338 }
00339
00340 inline
00341 bool MRAmrange::is_empty()
00342 {
00343 if ( good() ) {
00344 for( int d = 0; d < _dim; ++d ) if ( mmin[d] > mmax[d] ) return true;
00345 } else {
00346 setstate(failbit);
00347 }
00348 return false;
00349 }
00350
00351 inline
00352 void MRAmrange::clear() { _state = goodbit; }
00353
00354 inline
00355 void MRAmrange::setstate( int s ) { _state |= s; }
00356
00357 inline
00358 void MRAmrange::clrstate( int s ) { _state &= ~s; }
00359
00360 inline
00361 int MRAmrange::rdstate( int s ) { return (_state & s); }
00362
00363 inline
00364 bool MRAmrange::good() { return _state == goodbit; }
00365
00366 inline
00367 bool MRAmrange::fail() { return rdstate(failbit) != 0; }
00368
00369 inline
00370 bool MRAmrange::baddim() { return rdstate(baddimbit) != 0; }
00371
00372 inline
00373 bool MRAmrange::frag() { return rdstate(fragbit) != 0; }
00374
00375 inline
00376 MRAmrange& MRAmrange::operator += ( MRAmrange rhs )
00377 {
00378 return Union(rhs);
00379 }
00380
00381 inline
00382 MRAmrange& MRAmrange::operator *= ( MRAmrange rhs )
00383 {
00384 return Intersection(rhs);
00385 }
00386
00387 inline
00388 MRAmrange& MRAmrange::operator -= ( MRAmrange rhs )
00389 {
00390 return Difference(rhs);
00391 }
00392
00393 inline
00394 int MRAmrange::dim() { return _dim; }
00395
00396 inline
00397 int MRAmrange::sizeb() { return mmin.sizeb() + mmax.sizeb(); }
00398
00399 inline
00400 void MRAmrange::report( ostream& os ) {
00401 os << "MRAmrange::report(){\n";
00402 os << "state = " << _state << " = 0b0000"<<frag()<<baddim()<<fail()<<good()<< '\n';
00403 os << "dim = " << _dim;
00404 if ( _dim == 0 ) cout << " ==> is null\n";
00405 else cout << "\n";
00406 for( int d = 0; d < _dim; ++d ) {
00407 os << "mmin[] = " << mmin[d]
00408 << " mmax[] = " << mmax[d];
00409 if ( mmin[d] > mmax[d] ) cout << " ==> is_empty\n";
00410 else cout << "\n";
00411 }
00412 os << "}\n";
00413 }
00414
00415 inline
00416 void MRAmrange::write( BufferBase& buffer )
00417 {
00418 buffer >> mmin;
00419 buffer >> mmax;
00420 }
00421
00422 inline
00423 MRAmrange& MRAmrange::operator << ( BufferBase& buffer )
00424 {
00425 write(buffer);
00426 return *this;
00427 }
00428
00429 inline
00430 void MRAmrange::read( BufferBase& buffer )
00431 {
00432 buffer << mmin;
00433 buffer << mmax;
00434 }
00435
00436 inline
00437 MRAmrange& MRAmrange::operator >> ( BufferBase& buffer )
00438 {
00439 read(buffer);
00440 return *this;
00441 }
00442
00443 inline
00444 void MRAmrange::write( istream& is )
00445 {
00446 is >> mmin;
00447 is >> mmax;
00448 }
00449
00450 inline
00451 void MRAmrange::read( ostream& os )
00452 {
00453 os << mmin;
00454 os << mmax;
00455 }
00456
00457
00458
00459 inline
00460 BufferBase& operator >> ( BufferBase& buffer, MRAmrange& mrange )
00461 {
00462 mrange.write(buffer);
00463 return buffer;
00464 }
00465
00466 inline
00467 BufferBase& operator << ( BufferBase& buffer, MRAmrange& mrange )
00468 {
00469 mrange.read(buffer);
00470 return buffer;
00471 }
00472
00473 inline
00474 istream& operator >> ( istream& is, MRAmrange& mrange )
00475 {
00476 mrange.write(is);
00477 return is;
00478 }
00479
00480 inline
00481 ostream& operator << ( ostream& os, MRAmrange& mrange )
00482 {
00483 mrange.read(os);
00484 return os;
00485 }
00486
00487 #endif
00488