#ifndef CC_BASE_SPIRAL_ITERATOR_H_
#define CC_BASE_SPIRAL_ITERATOR_H_
#include "cc/base/base_export.h"
#include "cc/base/index_rect.h"
namespace cc {
class CC_BASE_EXPORT SpiralIterator {
public:
SpiralIterator();
SpiralIterator(const IndexRect& around_index_rect,
const IndexRect& consider_index_rect,
const IndexRect& ignore_index_rect);
~SpiralIterator() = default;
operator bool() const;
SpiralIterator& operator++();
int index_x() const { return index_x_; }
int index_y() const { return index_y_; }
private:
int current_step_count() const {
return (direction_ == Direction::kUp || direction_ == Direction::kDown)
? vertical_step_count_
: horizontal_step_count_;
}
bool needs_direction_switch() const;
void switch_direction();
enum class Direction { kUp, kLeft, kDown, kRight };
IndexRect around_index_rect_;
IndexRect consider_index_rect_;
IndexRect ignore_index_rect_;
int index_x_;
int index_y_;
Direction direction_;
int delta_x_;
int delta_y_;
int current_step_;
int horizontal_step_count_;
int vertical_step_count_;
};
}
#endif