diff options
| -rw-r--r-- | src/grid.h | 137 | 
1 files changed, 137 insertions, 0 deletions
| diff --git a/src/grid.h b/src/grid.h new file mode 100644 index 0000000..6d3933b --- /dev/null +++ b/src/grid.h @@ -0,0 +1,137 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + *            grid.h + * + *  Sat Jun 16 11:52:08 CEST 2018 + *  Copyright 2018 André Nusser + *  andre.nusser@googlemail.com + ****************************************************************************/ + +/* + *  This file is part of DrumGizmo. + * + *  DrumGizmo is free software; you can redistribute it and/or modify + *  it under the terms of the GNU Lesser General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  DrumGizmo 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 Lesser General Public License for more details. + * + *  You should have received a copy of the GNU Lesser General Public License + *  along with DrumGizmo; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#pragma once + +#include <vector> + +template <typename T> +class Grid +{ +public: +	using Index = std::size_t; +	struct Pos +	{ +		T x, y; + +		Pos(T x, T y) : x(x), y(y) {} +	}; + +	Grid() = default; +	Grid(Index width, Index height); +	Grid(Index width, Index height, T value); + +	bool is_valid(Index x, Index y) const; +	bool is_valid(Pos pos) const; + +	Index width() const; +	Index height() const; +	T operator()(Pos pos) const; +	T operator()(Index x, Index y) const; +	T& operator()(Pos pos); +	T& operator()(Index x, Index y); + +	void resize(Index width, Index height); +	void assign(Index width, Index height, T value); + +private: +	Index _width; +	Index _height; +	std::vector<T> _entries; + +}; + +template <typename T> +Grid<T>::Grid(Index width, Index height) +	: _width(width), _height(height), _entries(_width*_height) {} + +template <typename T> +Grid<T>::Grid(Index width, Index height, T value) +	: _width(width), _height(height), _entries(_width*_height, value) {} + +template <typename T> +bool Grid<T>::is_valid(Index x, Index y) const +{ +	return x >= 0 && x < _width && y >= 0 && y < _height; +} + +template <typename T> +bool Grid<T>::is_valid(Pos pos) const +{ +	return is_valid(pos.x, pos.y); +} + +template <typename T> +auto Grid<T>::width() const -> Index +{ +	return _width; +} +	 +template <typename T> +auto Grid<T>::height() const -> Index +{ +	return _height; +} + +template <typename T> +T Grid<T>::operator()(Pos pos) const +{ +	return _entries.at(pos.x + _width*pos.y); +} + +template <typename T> +T Grid<T>::operator()(Index x, Index y) const +{ +	return _entries.at(x + _width*y); +} + +template <typename T> +T& Grid<T>::operator()(Pos pos) +{ +	return _entries.at(pos.x + _width*pos.y); +} + +template <typename T> +T& Grid<T>::operator()(Index x, Index y) +{ +	return _entries.at(x + _width*y); +} + +template <typename T> +void Grid<T>::resize(Index width, Index height) +{ +	_width = width; +	_height = height; +	_entries.resize(_width*_height); +} + +template <typename T> +void Grid<T>::assign(Index width, Index height, T value) +{ +	_width = width; +	_height = height; +	_entries.assign(_width*_height, value); +} | 
