#ifndef BBOXSET_HH #define BBOXSET_HH #include #include #include #include #include #include "bbox.hh" #include "defs.hh" #include "vect.hh" using namespace std; // Forward declaration template class bboxset; // template // bboxset operator+ (const bbox& b1, const bbox& b2); // template // bboxset operator+ (const bbox& b, const bboxset& s); // template // bboxset operator- (const bbox& b1, const bbox& b2); // template // bboxset operator- (const bbox& b, const bboxset& s); // Output template ostream& operator<< (ostream& os, const bboxset& s); // Bounding box class template class bboxset { // Types typedef bbox box; //S typedef set bset; typedef list bset; // Fields bset bs; // Invariant: // All bboxes have the same stride. // No bbox is empty. // The bboxes don't overlap. public: // Constructors bboxset (); bboxset (const box& b); bboxset (const bboxset& s); bboxset (const list& lb); bboxset (const vector >& vlb); // Invariant bool invariant () const; // Normalisation void normalize (); // Accessors bool empty () const { return bs.empty(); } // T size () const; typedef typename box::size_type size_type; size_type size () const; int setsize () const { return bs.size(); } // Find out whether this bboxset intersects the bbox b bool intersects (const box& b) const; // Add (bboxes that don't overlap) bboxset& operator+= (const box& b) { if (b.empty()) return *this; // This is very slow when there are many bboxes #if 0 && ! defined(CARPET_OPTIMISE) // check for overlap for (const_iterator bi=begin(); bi!=end(); ++bi) { assert (not (*bi).intersects(b)); } #endif //S bs.insert(b); bs.push_back(b); assert (invariant()); return *this; } bboxset& operator+= (const bboxset& s); bboxset& add_transfer (bboxset& s); bboxset operator+ (const box& b) const; bboxset operator+ (const bboxset& s) const; // Union bboxset& operator|= (const box& b); bboxset& operator|= (const bboxset& s); bboxset operator| (const box& b) const; bboxset operator| (const bboxset& s) const; // Intersection bboxset operator& (const box& b) const; bboxset operator& (const bboxset& s) const; bboxset& operator&= (const box& b); bboxset& operator&= (const bboxset& s); // Difference // friend bboxset operator- (const box& b1, const box& b2); static bboxset minus (const box& b1, const box& b2); bboxset operator- (const box& b) const; bboxset& operator-= (const box& b) { *this = *this - b; assert (invariant()); return *this; } bboxset& operator-= (const bboxset& s); bboxset operator- (const bboxset& s) const; // friend bboxset operator- (const box& b, const bboxset& s); static bboxset minus (const box& b, const bboxset& s); // Equality bool operator== (const bboxset& s) const; bool operator!= (const bboxset& s) const; bool operator< (const bboxset& s) const; bool operator<= (const bboxset& s) const; bool operator> (const bboxset& s) const; bool operator>= (const bboxset& s) const; // Iterators typedef typename bset::const_iterator const_iterator; typedef typename bset::iterator iterator; const_iterator begin () const { return bs.begin(); } const_iterator end () const { return bs.end(); } // iterator begin () const { return bs.begin(); } // iterator end () const { return bs.end(); } // Memory usage size_t memory () const { return memoryof (bs); } // Output void output (ostream& os) const; }; template inline bboxset operator+ (const bbox& b1, const bbox& b2) { return bboxset(b1) + bboxset(b2); } template inline bboxset operator+ (const bbox& b, const bboxset& s) { return bboxset(b) + s; } template inline bboxset operator- (const bbox& b1, const bbox& b2) { return bboxset::minus(b1,b2); } template inline bboxset operator- (const bbox& b, const bboxset& s) { return bboxset::minus(b,s); } template inline bboxset operator| (const bbox& b, const bboxset& s) { return s | b; } template inline bboxset operator& (const bbox& b, const bboxset& s) { return s & b; } template inline bool operator== (const bbox& b, const bboxset& s) { return bboxset(b) == s; } template inline bool operator!= (const bbox& b, const bboxset& s) { return bboxset(b) != s; } template inline bool operator< (const bbox& b, const bboxset& s) { return bboxset(b) < s; } template inline bool operator<= (const bbox& b, const bboxset& s) { return bboxset(b) <= s; } template inline bool operator> (const bbox& b, const bboxset& s) { return bboxset(b) > s; } template inline bool operator>= (const bbox& b, const bboxset& s) { return bboxset(b) >= s; } template inline bool operator== (const bboxset& s, const bbox& b) { return s == bboxset(b); } template inline bool operator!= (const bboxset& s, const bbox& b) { return s != bboxset(b); } template inline bool operator< (const bboxset& s, const bbox& b) { return s < bboxset(b); } template inline bool operator<= (const bboxset& s, const bbox& b) { return s <= bboxset(b); } template inline bool operator> (const bboxset& s, const bbox& b) { return s > bboxset(b); } template inline bool operator>= (const bboxset& s, const bbox& b) { return s >= bboxset(b); } // Memory usage template inline size_t memoryof (bboxset const & s) { return s.memory(); } // Output template inline ostream& operator<< (ostream& os, const bboxset& s) { s.output(os); return os; } #endif // BBOXSET_HH