#ifndef CC_BASE_REVERSE_SPIRAL_ITERATOR_H_
#define CC_BASE_REVERSE_SPIRAL_ITERATOR_H_
#include "cc/base/base_export.h"
#include "cc/base/index_rect.h"
namespace cc {
class CC_BASE_EXPORT ReverseSpiralIterator {
public:
ReverseSpiralIterator();
ReverseSpiralIterator(const IndexRect& around_index_rect,
const IndexRect& consider_index_rect,
const IndexRect& ignore_index_rect);
~ReverseSpiralIterator() = default;
ReverseSpiralIterator& operator=(ReverseSpiralIterator&& other) = default;
operator bool() const;
ReverseSpiralIterator& 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 { kLeft, kUp, kRight, kDown };
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