00001
00002
00003
00004
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
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
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
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