aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/bboxset.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/CarpetLib/src/bboxset.cc')
-rw-r--r--Carpet/CarpetLib/src/bboxset.cc140
1 files changed, 132 insertions, 8 deletions
diff --git a/Carpet/CarpetLib/src/bboxset.cc b/Carpet/CarpetLib/src/bboxset.cc
index 489856298..f18385c1b 100644
--- a/Carpet/CarpetLib/src/bboxset.cc
+++ b/Carpet/CarpetLib/src/bboxset.cc
@@ -5,7 +5,7 @@
copyright : (C) 2000 by Erik Schnetter
email : schnetter@astro.psu.edu
- $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/bboxset.cc,v 1.4 2001/03/19 21:30:19 eschnett Exp $
+ $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetLib/src/bboxset.cc,v 1.5 2001/03/22 18:42:05 eschnett Exp $
***************************************************************************/
@@ -18,7 +18,8 @@
* *
***************************************************************************/
-#include <cassert>
+#include <assert.h>
+
#include <iostream>
#include <set>
@@ -28,6 +29,8 @@
# include "bboxset.hh"
#endif
+using namespace std;
+
// Constructors
@@ -210,6 +213,8 @@ bboxset<T,D>& bboxset<T,D>::operator&= (const bboxset& s) {
// Difference
+#ifndef SGI
+// This doesn't work on SGIs. Is this legal C++?
template<class T, int D>
bboxset<T,D> operator- (const bbox<T,D>& b1, const bbox<T,D>& b2) {
assert (b1.is_aligned_with(b2));
@@ -243,6 +248,104 @@ bboxset<T,D> operator- (const bbox<T,D>& b1, const bbox<T,D>& b2) {
assert (r.invariant());
return r;
}
+#else
+bboxset<int,1> operator- (const bbox<int,1>& b1, const bbox<int,1>& b2) {
+ assert (b1.is_aligned_with(b2));
+ if (b1.empty()) return bboxset<int,1>();
+ if (b2.empty()) return bboxset<int,1>(b1);
+ const vect<int,1> str = b1.stride();
+ bboxset<int,1> r;
+ for (int d=0; d<1; ++d) {
+ // make resulting bboxes as large as possible in x-direction (for
+ // better consumption by Fortranly ordered arrays)
+ vect<int,1> lb, ub;
+ bbox<int,1> b;
+ for (int dd=0; dd<1; ++dd) {
+ if (dd<d) {
+ lb[dd] = b2.lower()[dd];
+ ub[dd] = b2.upper()[dd];
+ } else if (dd>d) {
+ lb[dd] = b1.lower()[dd];
+ ub[dd] = b1.upper()[dd];
+ }
+ }
+ lb[d] = b1.lower()[d];
+ ub[d] = b2.lower()[d] - str[d];
+ b = bbox<int,1>(lb,ub,str) & b1;
+ r += b;
+ lb[d] = b2.upper()[d] + str[d];
+ ub[d] = b1.upper()[d];
+ b = bbox<int,1>(lb,ub,str) & b1;
+ r += b;
+ }
+ assert (r.invariant());
+ return r;
+}
+bboxset<int,2> operator- (const bbox<int,2>& b1, const bbox<int,2>& b2) {
+ assert (b1.is_aligned_with(b2));
+ if (b1.empty()) return bboxset<int,2>();
+ if (b2.empty()) return bboxset<int,2>(b1);
+ const vect<int,2> str = b1.stride();
+ bboxset<int,2> r;
+ for (int d=0; d<2; ++d) {
+ // make resulting bboxes as large as possible in x-direction (for
+ // better consumption by Fortranly ordered arrays)
+ vect<int,2> lb, ub;
+ bbox<int,2> b;
+ for (int dd=0; dd<2; ++dd) {
+ if (dd<d) {
+ lb[dd] = b2.lower()[dd];
+ ub[dd] = b2.upper()[dd];
+ } else if (dd>d) {
+ lb[dd] = b1.lower()[dd];
+ ub[dd] = b1.upper()[dd];
+ }
+ }
+ lb[d] = b1.lower()[d];
+ ub[d] = b2.lower()[d] - str[d];
+ b = bbox<int,2>(lb,ub,str) & b1;
+ r += b;
+ lb[d] = b2.upper()[d] + str[d];
+ ub[d] = b1.upper()[d];
+ b = bbox<int,2>(lb,ub,str) & b1;
+ r += b;
+ }
+ assert (r.invariant());
+ return r;
+}
+bboxset<int,3> operator- (const bbox<int,3>& b1, const bbox<int,3>& b2) {
+ assert (b1.is_aligned_with(b2));
+ if (b1.empty()) return bboxset<int,3>();
+ if (b2.empty()) return bboxset<int,3>(b1);
+ const vect<int,3> str = b1.stride();
+ bboxset<int,3> r;
+ for (int d=0; d<3; ++d) {
+ // make resulting bboxes as large as possible in x-direction (for
+ // better consumption by Fortranly ordered arrays)
+ vect<int,3> lb, ub;
+ bbox<int,3> b;
+ for (int dd=0; dd<3; ++dd) {
+ if (dd<d) {
+ lb[dd] = b2.lower()[dd];
+ ub[dd] = b2.upper()[dd];
+ } else if (dd>d) {
+ lb[dd] = b1.lower()[dd];
+ ub[dd] = b1.upper()[dd];
+ }
+ }
+ lb[d] = b1.lower()[d];
+ ub[d] = b2.lower()[d] - str[d];
+ b = bbox<int,3>(lb,ub,str) & b1;
+ r += b;
+ lb[d] = b2.upper()[d] + str[d];
+ ub[d] = b1.upper()[d];
+ b = bbox<int,3>(lb,ub,str) & b1;
+ r += b;
+ }
+ assert (r.invariant());
+ return r;
+}
+#endif
template<class T, int D>
bboxset<T,D> bboxset<T,D>::operator- (const box& b) const {
@@ -281,21 +384,38 @@ bboxset<T,D> bboxset<T,D>::operator- (const bboxset& s) const {
return r;
}
+#ifndef SGI
+// This doesn't work on SGIs. Is this legal C++?
template<class T, int D>
bboxset<T,D> operator- (const bbox<T,D>& b, const bboxset<T,D>& s) {
bboxset<T,D> r = bboxset<T,D>(b) - s;
assert (r.invariant());
return r;
}
+#else
+bboxset<int,1> operator- (const bbox<int,1>& b, const bboxset<int,1>& s) {
+ bboxset<int,1> r = bboxset<int,1>(b) - s;
+ assert (r.invariant());
+ return r;
+}
+bboxset<int,2> operator- (const bbox<int,2>& b, const bboxset<int,2>& s) {
+ bboxset<int,2> r = bboxset<int,2>(b) - s;
+ assert (r.invariant());
+ return r;
+}
+bboxset<int,3> operator- (const bbox<int,3>& b, const bboxset<int,3>& s) {
+ bboxset<int,3> r = bboxset<int,3>(b) - s;
+ assert (r.invariant());
+ return r;
+}
+#endif
// Output
template<class T,int D>
ostream& operator<< (ostream& os, const bboxset<T,D>& s) {
-// os << "bboxset<" STR(T) "," << D << ">:size=" << s.size() << ","
-// << "set=" << s.bs;
- os << s.bs;
+ os << "bboxset<T," << D << ">:size=" << s.size() << "," << "set=" << s.bs;
return os;
}
@@ -303,7 +423,11 @@ ostream& operator<< (ostream& os, const bboxset<T,D>& s) {
#if defined(TMPL_EXPLICIT)
template class bboxset<int,3>;
-template bboxset<int,3> operator- (const bbox<int,3>& b1, const bbox<int,3>& b3);
-template bboxset<int,3> operator- (const bbox<int,3>& b, const bboxset<int,3>& s);
-template ostream& operator<< (ostream& os, const bboxset<int,3>& b);
+
+template
+bboxset<int,3> operator- (const bbox<int,3>& b1, const bbox<int,3>& b3);
+template
+bboxset<int,3> operator- (const bbox<int,3>& b, const bboxset<int,3>& s);
+template
+ostream& operator<< (ostream& os, const bboxset<int,3>& b);
#endif