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

MRAmrange.cpp

Go to the documentation of this file.
00001 // MRAmrange.cpp
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifdef USE_STD
00008 #include <iostream>
00009 using namespace std;
00010 #else
00011 #include <iostream.h>
00012 #endif
00013 
00014 #include "BufferBase.h"
00015 #include "MRAmlevel.h"
00016 
00017 #include "MRAmrange.h"
00018 
00019 // ##### overloaded namespace functions #####
00020 
00021 bool equal( MRAmrange lhs, MRAmrange rhs ) 
00022 {
00023    if ( lhs._state != rhs._state ) return false;
00024    if ( lhs._dim != rhs._dim ) return false;
00025    if ( lhs.mmin != rhs.mmin ) return false;
00026    if ( lhs.mmax != rhs.mmax ) return false;
00027    return true;
00028 }
00029 
00030 bool contains( MRAmrange lhs, MRAmrange rhs )
00031 {
00032    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) return false;
00033    if ( lhs._dim != rhs._dim ) return false;
00034    if ( rhs.is_empty() ) return true;
00035    if ( lhs.is_empty() ) return false;
00036    for( int d = 0; d < lhs._dim; ++d ) {
00037       if ( rhs.mmin[d] < lhs.mmin[d] || rhs.mmax[d] > lhs.mmax[d] )
00038           return false;
00039    }
00040    return true;
00041 }
00042 
00043 bool disjoint( MRAmrange lhs, MRAmrange rhs )
00044 {
00045    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) return false;
00046    if ( lhs._dim != rhs._dim ) return false;
00047    if ( lhs.is_empty() || rhs.is_empty() ) return false;
00048    if ( lhs <= rhs || lhs >= rhs ) return false;
00049    for( int d = 0; d < lhs._dim; ++d ) {
00050       if ( lhs.mmin[d] < rhs.mmin[d] && lhs.mmax[d] < rhs.mmin[d] )
00051           return true;
00052       if ( lhs.mmin[d] > rhs.mmax[d] && lhs.mmax[d] > rhs.mmax[d] )
00053           return true;
00054    }
00055    return false;
00056 }
00057 
00058 bool connected( MRAmrange lhs, MRAmrange rhs )
00059 {
00060    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) return false;
00061    if ( lhs._dim != rhs._dim ) return false;
00062 //   if ( lhs.is_empty() || rhs.is_empty() ) return false;
00063    if ( lhs.is_empty() || rhs.is_empty() ) return true;
00064    if ( lhs <= rhs || lhs >= rhs ) return true;
00065    for( int d = 0; d < lhs._dim; ++d ) {
00066       if ( lhs.mmin[d] <= rhs.mmin[d] && lhs.mmax[d] >= rhs.mmin[d] - 1 )
00067           return true;
00068       if ( lhs.mmax[d] >= rhs.mmax[d] && lhs.mmin[d] <= rhs.mmax[d] + 1 )
00069           return true;
00070    }
00071    return false;
00072 }
00073 
00074 bool interior( MRAmrange lhs, MRAmrange rhs )
00075 {
00076    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) return false;
00077    if ( lhs._dim != rhs._dim ) return false;
00078    if ( lhs.is_empty() || rhs.is_empty() ) return false;
00079    if ( lhs >= rhs || disjoint( lhs, rhs ) ) return false;
00080    for( int d = 0; d < lhs._dim; ++d ) {
00081       if ( lhs.mmin[d] <= rhs.mmin[d] || lhs.mmax[d] >= rhs.mmax[d] )
00082           return false;
00083    }
00084    return true;
00085 }
00086 
00087 MRAmrange Union( MRAmrange lhs, MRAmrange rhs )
00088 {
00089    MRAmrange mrange;
00090    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) {
00091       mrange.clrstate(MRAmrange::goodbit);
00092       mrange.setstate(MRAmrange::failbit);
00093    } else if ( lhs._dim != rhs._dim ) {
00094       mrange.clrstate(MRAmrange::goodbit);
00095       mrange.setstate(MRAmrange::failbit);
00096       mrange.setstate(MRAmrange::baddimbit);
00097    } else if ( rhs.is_empty() ) {
00098       mrange = lhs;
00099    } else if ( lhs.is_empty() ) {
00100       mrange = rhs;
00101    } if ( !connected( lhs, rhs ) ) {
00102       mrange.clrstate(MRAmrange::goodbit);
00103       mrange.setstate(MRAmrange::failbit);
00104       mrange.setstate(MRAmrange::fragbit);
00105    } else {
00106       mrange = lhs;
00107       for( int d = 0; d < lhs._dim; ++d ) {
00108          if ( rhs.mmin[d] < mrange.mmin[d] ) mrange.mmin[d] = rhs.mmin[d];
00109          if ( rhs.mmax[d] > mrange.mmin[d] ) mrange.mmax[d] = rhs.mmax[d];
00110       }
00111    } 
00112    return mrange;
00113 }
00114 
00115 MRAmrange Intersection( MRAmrange lhs, MRAmrange rhs )
00116 {
00117    MRAmrange mrange;
00118    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) {
00119       mrange.clrstate(MRAmrange::goodbit);
00120       mrange.setstate(MRAmrange::failbit);
00121    } else if ( lhs._dim != rhs._dim ) {
00122       mrange.clrstate(MRAmrange::goodbit);
00123       mrange.setstate(MRAmrange::failbit);
00124       mrange.setstate(MRAmrange::baddimbit);
00125    } else if ( lhs.is_empty() ) {
00126       mrange = lhs;
00127    } else if ( rhs.is_empty() ) {
00128       mrange = rhs;
00129    } if ( disjoint( lhs, rhs ) ) {
00130       mrange(lhs._dim);
00131       mrange.set_empty();
00132    } else {
00133       mrange = lhs;
00134       for( int d = 0; d < lhs._dim; ++d ) {
00135          if ( rhs.mmin[d] > mrange.mmin[d] ) mrange.mmin[d] = rhs.mmin[d];
00136          if ( rhs.mmax[d] < mrange.mmax[d] ) mrange.mmax[d] = rhs.mmax[d];
00137       }
00138    } 
00139    return mrange;
00140 }
00141 
00142 MRAmrange Difference( MRAmrange lhs, MRAmrange rhs )
00143 {
00144    MRAmrange mrange;
00145    if ( !lhs.good() || !rhs.good() || !lhs || !rhs ) {
00146       mrange.clrstate(MRAmrange::goodbit);
00147       mrange.setstate(MRAmrange::failbit);
00148    } else if ( lhs._dim != rhs._dim ) {
00149       mrange.clrstate(MRAmrange::goodbit);
00150       mrange.setstate(MRAmrange::failbit);
00151       mrange.setstate(MRAmrange::baddimbit);
00152    } else if ( lhs.is_empty() ) {
00153       mrange = lhs;
00154    } else if ( rhs.is_empty() ) {
00155       mrange = rhs;
00156    } if ( disjoint( lhs, rhs ) ) {
00157       mrange = lhs;
00158    } if ( lhs == rhs ) {
00159       mrange(lhs._dim);
00160       mrange.set_empty();
00161    } if ( lhs < rhs ) {
00162       mrange(lhs._dim);
00163       mrange.set_empty();
00164    } if ( interior( lhs, rhs) ) {
00165       mrange.clrstate(MRAmrange::goodbit);
00166       mrange.setstate(MRAmrange::failbit);
00167       mrange.setstate(MRAmrange::fragbit);
00168    } else {
00169       if ( interior( rhs, lhs ) ) {
00170          mrange = lhs;
00171          mrange.clrstate(MRAmrange::goodbit);
00172          mrange.setstate(MRAmrange::failbit);
00173          mrange.setstate(MRAmrange::fragbit);
00174       } else {
00175          mrange = lhs; 
00176          for( int d = 0; d < lhs._dim; ++d ) {
00177             if ( rhs.mmin[d] > lhs.mmin[d] ) mrange.mmax[d] = rhs.mmin[d] - 1;
00178             if ( rhs.mmax[d] < lhs.mmax[d] ) mrange.mmin[d] = rhs.mmax[d] + 1;
00179          }
00180       }
00181    } 
00182    return mrange;
00183 }
00184 
00185 // ##### class member functions #####
00186 
00187 MRAmrange& MRAmrange::Union( MRAmrange rhs )
00188 {
00189    if ( !good() || !rhs.good() || is_null() || !rhs ) {
00190       clrstate(MRAmrange::goodbit);
00191       setstate(MRAmrange::failbit);
00192    } else if ( _dim != rhs._dim ) {
00193       clrstate(MRAmrange::goodbit);
00194       setstate(MRAmrange::failbit);
00195       setstate(MRAmrange::baddimbit);
00196    } else if ( rhs.is_empty() ) {
00197       return *this;
00198    } else if ( is_empty() ) {
00199       *this = rhs;
00200    } if ( !connected( *this, rhs ) ) {
00201       clrstate(MRAmrange::goodbit);
00202       setstate(MRAmrange::failbit);
00203       setstate(MRAmrange::fragbit);
00204    } else {
00205       for( int d = 0; d < _dim; ++d ) {
00206          if ( rhs.mmin[d] < mmin[d] ) mmin[d] = rhs.mmin[d];
00207          if ( rhs.mmax[d] > mmin[d] ) mmax[d] = rhs.mmax[d];
00208       }
00209    } 
00210    return *this;
00211 }
00212 
00213 MRAmrange& MRAmrange::Intersection( MRAmrange rhs )
00214 {
00215    if ( !good() || !rhs.good() || is_null() || !rhs ) {
00216       clrstate(MRAmrange::goodbit);
00217       setstate(MRAmrange::failbit);
00218    } else if ( _dim != rhs._dim ) {
00219       clrstate(MRAmrange::goodbit);
00220       setstate(MRAmrange::failbit);
00221       setstate(MRAmrange::baddimbit);
00222    } else if ( is_empty() ) {
00223       return *this;
00224    } else if ( rhs.is_empty() ) {
00225       *this = rhs;
00226    } if ( disjoint( *this, rhs ) ) {
00227       set_empty();
00228    } else {
00229       for( int d = 0; d < _dim; ++d ) {
00230          if ( rhs.mmin[d] > mmin[d] ) mmin[d] = rhs.mmin[d];
00231          if ( rhs.mmax[d] < mmax[d] ) mmax[d] = rhs.mmax[d];
00232       }
00233    } 
00234    return *this;
00235 }
00236 
00237 MRAmrange& MRAmrange::Difference( MRAmrange rhs )
00238 {
00239    if ( !good() || !rhs.good() || is_null() || !rhs ) {
00240       clrstate(MRAmrange::goodbit);
00241       setstate(MRAmrange::failbit);
00242    } else if ( _dim != rhs._dim ) {
00243       clrstate(MRAmrange::goodbit);
00244       setstate(MRAmrange::failbit);
00245       setstate(MRAmrange::baddimbit);
00246    } else if ( is_empty() ) {
00247       return *this;
00248    } else if ( rhs.is_empty() ) {
00249       *this = rhs;
00250    } if ( disjoint( *this, rhs ) ) {
00251       return *this;;
00252    } if ( *this == rhs ) {
00253       set_empty();
00254    } if ( *this < rhs ) {
00255       set_empty();
00256    } if ( interior( *this, rhs) ) {
00257       clrstate(MRAmrange::goodbit);
00258       setstate(MRAmrange::failbit);
00259       setstate(MRAmrange::fragbit);
00260    } else {
00261       if ( interior( rhs, *this ) ) {
00262          clrstate(MRAmrange::goodbit);
00263          setstate(MRAmrange::failbit);
00264          setstate(MRAmrange::fragbit);
00265       } else {
00266          for( int d = 0; d < _dim; ++d ) {
00267             if ( rhs.mmin[d] > mmin[d] ) mmax[d] = rhs.mmin[d] - 1;
00268             if ( rhs.mmax[d] < mmax[d] ) mmin[d] = rhs.mmax[d] + 1;
00269          }
00270       }
00271    }
00272    return *this;
00273 }
00274 

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