/*
	Copyright 2016, 2017 Michele "King_DuckZ" Santullo

	This file is part of MyCurry.

	MyCurry 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.

	MyCurry 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 MyCurry.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "vector.hpp"
#include "tileindextype.hpp"
#include <boost/iterator/iterator_facade.hpp>
#include <ciso646>

namespace curry {
	class WorldViewport;

	struct ScreenTile {
		const TileIndex* index;
		vec2i pixel_pos;
	};

	class TileIterator : public boost::iterator_facade<TileIterator, TileIndex, boost::bidirectional_traversal_tag, ScreenTile> {
		typedef boost::iterator_facade<TileIterator, TileIndex, boost::bidirectional_traversal_tag, ScreenTile> base_class;
		friend class boost::iterator_core_access;
	public:
		TileIterator (WorldViewport* parViewport, bool parEnd);

	private:
		ScreenTile dereference() const;
		void increment();
		bool equal (const TileIterator& parOther) const;

		vec2i m_pixel_pos;
		WorldViewport* m_viewport;
		vec2us m_index;
	};
} //namespace curry
