39 #include "metaprogramming.hxx" 
   40 #include "numerictraits.hxx" 
   41 #include "tinyvector.hxx" 
   48 template<
class VALUETYPE>
 
   49 struct EndInsidePolicy
 
   51     static inline bool isEmptyRange(VALUETYPE b, VALUETYPE e)
 
   56     static inline VALUETYPE pointEnd(VALUETYPE p)
 
   63 template<
class VALUETYPE>
 
   64 struct EndOutsidePolicy
 
   66     static inline bool isEmptyRange(VALUETYPE b, VALUETYPE e)
 
   71     static inline VALUETYPE pointEnd(VALUETYPE p)
 
   87 template<
class VALUETYPE, 
unsigned int DIMENSION>
 
   97     typedef typename NumericTraits<VALUETYPE>::Promote 
VolumeType;
 
  103     enum { Dimension = DIMENSION };
 
  110     typedef typename If<typename NumericTraits<VALUETYPE>::isIntegral,
 
  111                         detail::EndOutsidePolicy<VALUETYPE>,
 
  120     : begin_(NumericTraits<
Vector>::one())
 
  129     : begin_(begin), end_(end)
 
  200         end_ += newBegin - begin_;
 
  223         for(
unsigned int i = 1; i < DIMENSION; ++i)
 
  224             result *= end_[i] - begin_[i];
 
  234         return end_ - begin_;
 
  242         end_ = begin_ + 
size;
 
  262         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  264             begin_[i] -= borderWidth;
 
  265             end_[i]   += borderWidth;
 
  276         begin_ -= borderWidth;
 
  285         return (begin_ == r.begin_) && (end_ == r.end_);
 
  291         return (begin_ != r.begin_) || (end_ != r.end_);
 
  304         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  305             if(RangePolicy::isEmptyRange(begin_[i], end_[i]))
 
  316         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  317             if((p[i] < begin_[i]) ||
 
  318                RangePolicy::isEmptyRange(p[i], end_[i]))
 
  335         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  336             if(r.end_[i] > end_[i])
 
  350         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  351             if(RangePolicy::isEmptyRange(r.begin_[i], end_[i]) ||
 
  352                RangePolicy::isEmptyRange(begin_[i], r.end_[i]))
 
  367             for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  368                 end_[i] = RangePolicy::pointEnd(p[i]);
 
  372             for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  376                 if(RangePolicy::isEmptyRange(p[i], end_[i]))
 
  377                     end_[i] = RangePolicy::pointEnd(p[i]);
 
  404             return this->
operator=(r);
 
  406         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  408             if(r.begin_[i] < begin_[i])
 
  409                 begin_[i] = r.begin_[i];
 
  410             if(end_[i] < r.end_[i])
 
  437             return this->
operator=(r);
 
  439         for(
unsigned int i = 0; i < DIMENSION; ++i)
 
  441             if(begin_[i] < r.begin_[i])
 
  442                 begin_[i] = r.begin_[i];
 
  443             if(r.end_[i] < end_[i])
 
  554 template<
class VALUETYPE, 
unsigned int DIMENSION>
 
  555 std::ostream& operator<< (std::ostream& stream, const Box<VALUETYPE, DIMENSION> & box) {
 
  556     stream<<
"["<<box.
begin()<<
", "<<box.
end()<<
" ]";
 
  564 #endif // VIGRA_BOX_HXX 
Vector size() const 
Definition: box.hxx:232
void moveBy(Vector const &offset)
Definition: box.hxx:207
bool contains(Box const &r) const 
Definition: box.hxx:329
Box(Vector const &size)
Definition: box.hxx:135
Box & operator/=(double scale)
Definition: box.hxx:489
bool contains(Vector const &p) const 
Definition: box.hxx:314
Box & operator&=(Box const &r)
Definition: box.hxx:432
Vector & end()
Definition: box.hxx:174
void setSize(Vector const &size)
Definition: box.hxx:240
Box operator+(const Vector &offset) const 
Definition: box.hxx:523
Box & operator|=(Vector const &p)
Definition: box.hxx:362
Box & operator*=(double scale)
Definition: box.hxx:466
VolumeType volume() const 
Definition: box.hxx:217
Vector const & end() const 
Definition: box.hxx:163
VALUETYPE value_type
Definition: box.hxx:93
void moveTo(Vector const &newBegin)
Definition: box.hxx:198
NumericTraits< VALUETYPE >::Promote VolumeType
Definition: box.hxx:97
Box operator&(Box const &r) const 
Definition: box.hxx:454
iterator end()
Definition: tinyvector.hxx:864
Vector & begin()
Definition: box.hxx:152
Box()
Definition: box.hxx:119
Vector const & begin() const 
Definition: box.hxx:143
Box operator*(double scale) const 
Definition: box.hxx:477
Box & operator-=(const Vector &offset)
Definition: box.hxx:535
Box operator-(const Vector &offset) const 
Definition: box.hxx:546
Box & operator+=(const Vector &offset)
Definition: box.hxx:512
void addBorder(const Vector &borderWidth)
Definition: box.hxx:274
Box operator|(Box const &r) const 
Definition: box.hxx:420
Represent an n-dimensional box as a (begin, end) pair. Depending on the value type, end() is considered to be outside the box (as in the STL, for integer types), or inside (for floating point types). size() will always be end() - begin(). 
Definition: box.hxx:88
TinyVector< VALUETYPE, DIMENSION > Vector
Definition: box.hxx:101
void setEnd(Vector const &end)
Definition: box.hxx:190
Box(Vector const &begin, Vector const &end)
Definition: box.hxx:128
bool intersects(Box const &r) const 
Definition: box.hxx:346
void addSize(Vector const &offset)
Definition: box.hxx:250
bool operator==(Box const &r) const 
equality check 
Definition: box.hxx:283
bool isEmpty() const 
Definition: box.hxx:302
If< typename NumericTraits< VALUETYPE >::isIntegral, detail::EndOutsidePolicy< VALUETYPE >, detail::EndInsidePolicy< VALUETYPE > >::type RangePolicy
Definition: box.hxx:112
void setBegin(Vector const &begin)
Definition: box.hxx:182
void addBorder(VALUETYPE borderWidth)
Definition: box.hxx:260
Box operator/(double scale) const 
Definition: box.hxx:500
Box & operator|=(Box const &r)
Definition: box.hxx:399
bool operator!=(Box const &r) const 
inequality check 
Definition: box.hxx:289
Box operator|(Vector const &p) const 
Definition: box.hxx:388