libcruft-util/region.hpp
Danny Robson 71c0f02873 Make region dimensions the same type as positions
There are just far too many warnings issued for signedness differences
for it to be practical to cast every time.
Unsignedness was hiding the issue of dimensions being larger than
positions could express anyway.
2012-06-14 18:30:08 +10:00

91 lines
2.4 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;
#if 0
typedef typename always_unsigned<T>::type size_type;
#else
typedef T size_type;
#endif
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