00001 #ifndef COORDIT_H
00002 #define COORDIT_H
00003
00004 #include "coord-circle.h"
00005
00006 class rectangle_iterator :
00007 public std::iterator<std::forward_iterator_tag, coord_def>
00008 {
00009 public:
00010 rectangle_iterator(const coord_def& corner1, const coord_def& corner2);
00011 explicit rectangle_iterator(int x_border_dist, int y_border_dist = -1);
00012 operator bool() const;
00013 coord_def operator *() const;
00014 const coord_def* operator->() const;
00015
00016 rectangle_iterator& operator ++ ();
00017 rectangle_iterator operator ++ (int);
00018 private:
00019 coord_def current, topleft, bottomright;
00020 };
00021
00022 class circle_iterator
00023 {
00024 const circle_def &circle;
00025 rectangle_iterator iter;
00026
00027 public:
00028 circle_iterator(const circle_def &circle_);
00029
00030 operator bool() const;
00031 coord_def operator*() const;
00032
00033 void operator++();
00034 void operator++(int);
00035 };
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 class los_base;
00046 class radius_iterator : public std::iterator<std::forward_iterator_tag,
00047 coord_def>
00048 {
00049 public:
00050
00051 radius_iterator(const coord_def& center, int param,
00052 circle_type ctype,
00053 const los_base* los = NULL,
00054 bool exclude_center = false);
00055
00056 radius_iterator(const coord_def& center, int radius,
00057 bool roguelike_metric = true,
00058 bool require_los = true,
00059 bool exclude_center = false,
00060 const los_base* los = NULL);
00061
00062 radius_iterator(const los_base* los,
00063 bool exclude_center = false);
00064
00065 operator bool() const;
00066 coord_def operator *() const;
00067 const coord_def* operator->() const;
00068
00069 const radius_iterator& operator ++ ();
00070 radius_iterator operator ++ (int);
00071
00072 private:
00073 void advance(bool may_stay);
00074 bool is_valid_square(const coord_def& p) const;
00075
00076 circle_def circle;
00077 circle_iterator iter;
00078 bool exclude_center;
00079 const los_base* los;
00080 coord_def current;
00081 };
00082
00083 class adjacent_iterator : public radius_iterator
00084 {
00085 public:
00086 explicit adjacent_iterator(const coord_def& pos,
00087 bool _exclude_center = true) :
00088 radius_iterator(pos, 1, C_SQUARE, NULL, _exclude_center) {}
00089 };
00090
00091 class orth_adjacent_iterator : public radius_iterator
00092 {
00093 public:
00094 explicit orth_adjacent_iterator(const coord_def& pos,
00095 bool _exclude_center = true) :
00096 radius_iterator(pos, 1, C_POINTY, NULL, _exclude_center) {}
00097 };
00098
00099
00100
00101
00102
00103 class distance_iterator :
00104 public std::iterator<std::forward_iterator_tag, coord_def>
00105 {
00106 public:
00107 distance_iterator(const coord_def& _center,
00108 bool _fair = true,
00109 bool exclude_center = true,
00110 int _max_radius = 107);
00111 operator bool() const;
00112 coord_def operator *() const;
00113 const coord_def* operator->() const;
00114
00115 const distance_iterator& operator ++();
00116 void operator ++(int);
00117 int radius() const;
00118 private:
00119 coord_def center, current;
00120 std::vector<coord_def> lists[3], *vcur, *vnear, *vfar;
00121 int r, max_radius;
00122 int threshold;
00123 unsigned int icur, iend;
00124 bool fair;
00125 bool advance();
00126 void push_neigh(coord_def from, int dx, int dy);
00127 };
00128
00129 #endif