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