Danny Robson
9447910061
It is not currently enabled as the exact semantics aren't really known, but as we're likely to want something similar later then we shouldn't throw the code away.
87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
/*
|
|
* This file is part of libgim.
|
|
*
|
|
* libgim is free software: you can redistribute it and/or modify it under the
|
|
* terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* libgim is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with libgim. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Copyright 2010 Danny Robson <danny@nerdcruft.net>
|
|
*/
|
|
|
|
|
|
#ifndef __UTIL_REGION_HPP
|
|
#define __UTIL_REGION_HPP
|
|
|
|
#include "point.hpp"
|
|
#include "types/traits.hpp"
|
|
|
|
namespace util {
|
|
/**
|
|
* A two-dimensional rectangle, with size and position.
|
|
*/
|
|
template <typename T>
|
|
struct region {
|
|
typedef T position_type;
|
|
typedef typename always_unsigned<T>::type size_type;
|
|
|
|
T x, y;
|
|
size_type w, h;
|
|
|
|
region (T _x, T _y, size_type _w, size_type _h);
|
|
|
|
region& operator +=(const vector<2>& rhs);
|
|
|
|
size_type area (void) const;
|
|
size_type diameter (void) const;
|
|
|
|
bool empty (void) const;
|
|
|
|
point<2> base (void) const;
|
|
point<2> centre (void) const;
|
|
|
|
bool includes (const point<2>&) const; // inclusive of borders
|
|
bool contains (const point<2>&) const; // exclusive of borders
|
|
bool overlaps (const region<T>&) const; // exclusive of borders
|
|
|
|
region overlap (const region<T>&) const;
|
|
|
|
bool operator ==(const region<T>& rhs) const;
|
|
bool operator !=(const region<T>& rhs) const
|
|
{ return !(*this == rhs); }
|
|
|
|
void sanity (void) const;
|
|
|
|
#if 0
|
|
struct iterator {
|
|
T x, y;
|
|
T a;
|
|
size_type w, h;
|
|
|
|
iterator& operator++ (void);
|
|
iterator& operator* (void);
|
|
bool operator== (const iterator&) const;
|
|
bool operator!= (const iterator&) const;
|
|
};
|
|
|
|
iterator begin (void);
|
|
iterator end (void);
|
|
#endif
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
std::ostream& operator<< (std::ostream&, const util::region<T>&);
|
|
}
|
|
|
|
|
|
#endif
|