/*
* File: coordit.h
* Summary: Coordinate iterators.
*/
#include "AppHdr.h"
#include "coordit.h"
#include "coord-circle.h"
#include "player.h"
rectangle_iterator::rectangle_iterator( const coord_def& corner1,
const coord_def& corner2 )
{
topleft.x = std::min(corner1.x, corner2.x);
topleft.y = std::min(corner1.y, corner2.y); // not really necessary
bottomright.x = std::max(corner1.x, corner2.x);
bottomright.y = std::max(corner1.y, corner2.y);
current = topleft;
}
rectangle_iterator::rectangle_iterator( int x_border_dist, int y_border_dist )
{
if (y_border_dist < 0)
y_border_dist = x_border_dist;
topleft.set(x_border_dist, y_border_dist);
bottomright.set(GXM - x_border_dist - 1, GYM - y_border_dist - 1);
current = topleft;
}
rectangle_iterator::operator bool() const
{
return (current.y <= bottomright.y);
}
coord_def rectangle_iterator::operator *() const
{
return current;
}
const coord_def* rectangle_iterator::operator->() const
{
return ¤t;
}
rectangle_iterator& rectangle_iterator::operator ++()
{
if (current.x == bottomright.x)
{
current.x = topleft.x;
current.y++;
}
else
{
current.x++;
}
return *this;
}
rectangle_iterator rectangle_iterator::operator++( int dummy )
{
const rectangle_iterator copy = *this;
++(*this);
return (copy);
}
/*
* circle iterator
*/
circle_iterator::circle_iterator(const circle_def &circle_)
: circle(circle_), iter(circle_.get_bbox().iter())
{
while (iter && !circle.contains(*iter))
++iter;
}
circle_iterator::operator bool() const
{
return ((bool)iter);
}
coord_def circle_iterator::operator*() const
{
return (*iter);
}
void circle_iterator::operator++()
{
do
++iter;
while (iter && !circle.contains(*iter));
}
void circle_iterator::operator++(int)
{
++(*this);
}
radius_iterator::radius_iterator(const coord_def& center, int param,
circle_type ctype,
const los_def* _los,
bool _exclude_center)
: circle(center, param, ctype),
iter(circle.iter()),
exclude_center(_exclude_center),
los(_los)
{
advance(true);
}
radius_iterator::radius_iterator(const coord_def& _center, int _radius,
bool roguelike, bool _require_los,
bool _exclude_center,
const los_def* _los)
: circle(_center, _radius, roguelike ? C_SQUARE : C_POINTY),
iter(circle.iter()),
exclude_center(_exclude_center),
los(_require_los ? (_los ? _los : &you.get_los()) : NULL)
{
advance(true);
}
radius_iterator::radius_iterator(const los_def* los_,
bool _exclude_center)
: circle(los_->get_bounds()),
iter(circle.iter()),
exclude_center(_exclude_center),
los(los_)
{
advance(true);
}
void radius_iterator::advance(bool may_stay)
{
if (!may_stay)
++iter;
while (iter && !is_valid_square(*iter))
++iter;
current = *iter;
}
radius_iterator::operator bool() const
{
return (iter);
}
coord_def radius_iterator::operator *() const
{
return (current);
}
const coord_def* radius_iterator::operator->() const
{
return ¤t;
}
bool radius_iterator::is_valid_square(const coord_def &p) const
{
if (exclude_center && p == circle.get_center())
return (false);
if (los && !los->see_cell(p))
return (false);
return (true);
}
const radius_iterator& radius_iterator::operator++()
{
advance(false);
return (*this);
}
radius_iterator radius_iterator::operator++(int dummy)
{
const radius_iterator copy = *this;
++(*this);
return (copy);
}