From 7307815e99a79dac42f2a9c06b0fe6171ea11ba0 Mon Sep 17 00:00:00 2001 From: HampusM Date: Fri, 1 Jul 2022 16:01:04 +0200 Subject: refactor: use ranges --- src/game/cell_helper_impl.hpp | 121 ++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 58 deletions(-) (limited to 'src/game/cell_helper_impl.hpp') diff --git a/src/game/cell_helper_impl.hpp b/src/game/cell_helper_impl.hpp index bd40794..c03b80c 100644 --- a/src/game/cell_helper_impl.hpp +++ b/src/game/cell_helper_impl.hpp @@ -2,18 +2,15 @@ #include "cell_helper.hpp" -#include "util/algorithm.hpp" - -template -constexpr auto has_matrix_value( - const std::shared_ptr> &matrix, - const MatrixElement &value) noexcept -{ - return [&matrix, &value](const Vector2 &pos) - { - return matrix->get(pos) == value; - }; -} +#include +#include +#include +#include +#include +#include +#include +#include +#include template CellHelper::CellHelper( @@ -26,74 +23,82 @@ template auto CellHelper::is_cell_dying(const Vector2 &cell_pos) const noexcept -> bool { - const auto neighbour_cell_positions = - container_filter(find_neighbours(cell_pos), has_matrix_value(_matrix, 'x')); - - const auto neighbour_cell_cnt = neighbour_cell_positions.size(); + int64_t neighbour_cell_cnt = ranges::count_if( + find_neighbours(cell_pos), + [this](const Vector2 &pos) + { + return _matrix->get(pos) == 'x'; + }); return neighbour_cell_cnt < 2 || neighbour_cell_cnt >= 4; } template auto CellHelper::get_birth_cell_positions( - const std::list &cell_positions) const noexcept -> std::list + const std::vector &cell_positions) const noexcept -> std::vector { - auto all_empty_neighbour_positions = std::list(); - - for (const auto &cell_pos : cell_positions) - { - const std::vector empty_neighbour_positions = - container_filter(find_neighbours(cell_pos), has_matrix_value(_matrix, ' ')); - - all_empty_neighbour_positions.insert( - all_empty_neighbour_positions.end(), - empty_neighbour_positions.begin(), - empty_neighbour_positions.end()); - } - - // Remove duplicates - all_empty_neighbour_positions.sort(); - all_empty_neighbour_positions.unique(); - - auto birth_cell_positions = container_filter( - all_empty_neighbour_positions, - [this](const Vector2 &cell_pos) - { - const auto neighbour_cell_positions = container_filter( - find_neighbours(cell_pos), - has_matrix_value(_matrix, 'x')); - - return neighbour_cell_positions.size() == 3; - }); - - return birth_cell_positions; + std::vector empty_neighbour_positions = + ranges::fold_left( + cell_positions, + std::vector(), + [this](std::vector acc, const Vector2 &pos) + { + std::vector neighbours = find_neighbours(pos); + + auto empty_neighbours = + neighbours | ranges::views::filter( + [this](const Vector2 &neighbour_pos) + { + return _matrix->get(neighbour_pos) == ' '; + }); + + ranges::actions::insert(acc, acc.end(), empty_neighbours); + + return acc; + }) | + ranges::actions::sort | ranges::actions::unique; + + auto birth_cell_positions = empty_neighbour_positions | + ranges::views::filter( + [this](const Vector2 &cell_pos) + { + auto neighbours = find_neighbours(cell_pos); + + int64_t neighbour_cell_cnt = ranges::count_if( + neighbours, + [this](const Vector2 &neighbour_pos) + { + return _matrix->get(neighbour_pos) == 'x'; + }); + + return neighbour_cell_cnt == 3; + }); + + return birth_cell_positions | ranges::to(); } template auto CellHelper::find_neighbours(const Vector2 &cell_pos) const noexcept -> std::vector { - std::vector cell_positions = {}; - const auto matrix_size = Bounds({.width = _matrix->get_column_cnt(), .height = _matrix->get_row_cnt()}); const auto neighbours = _get_position_neighbours(cell_pos); - for (const auto &neighbour_pos : neighbours) - { - if (matrix_size.validate_coords(neighbour_pos) == CoordsValidation::VALID) - { - cell_positions.push_back(neighbour_pos); - } - } - - return cell_positions; + return neighbours | + ranges::views::filter( + [&matrix_size](const Vector2 &neighbour_pos) + { + return matrix_size.validate_coords(neighbour_pos) == + CoordsValidation::VALID; + }) | + ranges::to(); } template auto CellHelper::_get_position_neighbours(const Vector2 &position) noexcept - -> std::list + -> std::vector { return { position + Vector2::up(), -- cgit v1.2.3-18-g5258