Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

MRAmrange.h

Go to the documentation of this file.
00001 // MRAmrange.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
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 // ##### overloaded namespace functions #####
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 // ##### class member functions #####
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 // ##### friends #####
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 

Generated on Mon May 31 21:38:50 2004 for SR2k4 Assembler by doxygen 1.3.6