From 7aeaab2c4996e7ee58e8f7badb0f8173cbd3af8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Mon, 30 Dec 2024 22:29:14 +0100 Subject: [PATCH] Add Grid class as wrapper for two-dimensional array --- include/aoc/Grid.hpp | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 include/aoc/Grid.hpp diff --git a/include/aoc/Grid.hpp b/include/aoc/Grid.hpp new file mode 100644 index 0000000..596f142 --- /dev/null +++ b/include/aoc/Grid.hpp @@ -0,0 +1,60 @@ +// Solutions to the Advent Of Code 2024. +// Copyright (C) 2024 Stefan Müller +// +// This program 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. +// +// This program 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 +// this program. If not, see . + +#pragma once + +#include + +#include + +// Inspired by https://stackoverflow.com/a/32279494 +template +class Grid +{ +public: + Grid(size_t nRows, size_t nColumns) + : nRows_{ nRows }, nColumns_{ nColumns }, data_{ std::make_unique(nRows * nColumns) } + { + } + + size_t getNRows() const + { + return nRows_; + } + + size_t getNColumns() const + { + return nColumns_; + } + + T& cell(size_t rowNo, size_t columnNo) + { + return data_[rowNo * nColumns_ + columnNo]; + } + + T& cell(Point2 position) + { + return data_[position.y * nColumns_ + position.x]; + } + + T* operator[](size_t rowNo) + { + return rowNo * nColumns_ + data_.get(); + } +private: + size_t nRows_; + size_t nColumns_; + std::unique_ptr data_; +};