From 20bdae6c72192c87bf95c6ac86c8cc049aa1ab5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Sat, 16 Jun 2018 12:52:22 +0200 Subject: Add new Grid class. (which is header only due to template) --- src/grid.h | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/grid.h 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 + +template +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 _entries; + +}; + +template +Grid::Grid(Index width, Index height) + : _width(width), _height(height), _entries(_width*_height) {} + +template +Grid::Grid(Index width, Index height, T value) + : _width(width), _height(height), _entries(_width*_height, value) {} + +template +bool Grid::is_valid(Index x, Index y) const +{ + return x >= 0 && x < _width && y >= 0 && y < _height; +} + +template +bool Grid::is_valid(Pos pos) const +{ + return is_valid(pos.x, pos.y); +} + +template +auto Grid::width() const -> Index +{ + return _width; +} + +template +auto Grid::height() const -> Index +{ + return _height; +} + +template +T Grid::operator()(Pos pos) const +{ + return _entries.at(pos.x + _width*pos.y); +} + +template +T Grid::operator()(Index x, Index y) const +{ + return _entries.at(x + _width*y); +} + +template +T& Grid::operator()(Pos pos) +{ + return _entries.at(pos.x + _width*pos.y); +} + +template +T& Grid::operator()(Index x, Index y) +{ + return _entries.at(x + _width*y); +} + +template +void Grid::resize(Index width, Index height) +{ + _width = width; + _height = height; + _entries.resize(_width*_height); +} + +template +void Grid::assign(Index width, Index height, T value) +{ + _width = width; + _height = height; + _entries.assign(_width*_height, value); +} -- cgit v1.2.3