/*============================================================================= Copyright (c) 2011-2017 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include #include #include #include #include #include #include // // next_cell // template inline SPROUT_CONSTEXPR Value next_cell(Value const& val, Size n) { return val ? n == 2 || n == 3 : n == 3; } template inline SPROUT_CONSTEXPR typename sprout::container_traits::value_type>::value_type next_cell(Container const& cont, Difference1 i, Difference2 j) { return i == 0 // +---- // | o x // | x x ? j == 0 ? ::next_cell( cont[i][j], 0 + cont[i][j + 1] + cont[i + 1][j] + cont[i + 1][j + 1] ) // ----+ // x o | // x x | : j == static_cast(sprout::size(cont[i]) - 1) ? ::next_cell( cont[i][j], 0 + cont[i][j - 1] + cont[i + 1][j - 1] + cont[i + 1][j] ) // ----- // x o x // x x x : ::next_cell( cont[i][j], 0 + cont[i][j - 1] + cont[i][j + 1] + cont[i + 1][j - 1] + cont[i + 1][j] + cont[i + 1][j + 1] ) : i == static_cast(sprout::size(cont) - 1) // | x x // | o x // +---- ? j == 0 ? ::next_cell( cont[i][j], 0 + cont[i - 1][j] + cont[i - 1][j + 1] + cont[i][j + 1] ) // x x | // x o | // ----+ : j == static_cast(sprout::size(cont[i]) - 1) ? ::next_cell( cont[i][j], 0 + cont[i - 1][j - 1] + cont[i - 1][j] + cont[i][j - 1] ) // x x x // x o x // ----- : ::next_cell( cont[i][j], 0 + cont[i - 1][j - 1] + cont[i - 1][j] + cont[i - 1][j + 1] + cont[i][j - 1] + cont[i][j + 1] ) // | x x // | o x // | x x : j == 0 ? ::next_cell( cont[i][j], 0 + cont[i - 1][j] + cont[i - 1][j + 1] + cont[i][j + 1] + cont[i + 1][j] + cont[i + 1][j + 1]) // x x | // x o | // x x | : j == static_cast(sprout::size(cont[i]) - 1) ? ::next_cell( cont[i][j], 0 + cont[i - 1][j - 1] + cont[i - 1][j] + cont[i][j - 1] + cont[i + 1][j - 1] + cont[i + 1][j] ) // x x x // x o x // x x x : ::next_cell( cont[i][j], 0 + cont[i - 1][j - 1] + cont[i - 1][j] + cont[i - 1][j + 1] + cont[i][j - 1] + cont[i][j + 1] + cont[i + 1][j - 1] + cont[i + 1][j] + cont[i + 1][j + 1] ) ; } namespace detail { template inline SPROUT_CONSTEXPR typename sprout::container_traits::value_type next_cells_2(Container const& cont, sprout::index_t i, sprout::index_tuple) { return sprout::remake::value_type>( cont[i], sprout::size(cont[i]), ::next_cell(cont, i, Js)... ); } template inline SPROUT_CONSTEXPR Container next_cells_1(Container const& cont, sprout::index_tuple) { return sprout::remake( cont, sprout::size(cont), detail::next_cells_2(cont, Is, sprout::container_indexes::value_type>::make())... ); } } // namespace detail // // next_cells // template inline SPROUT_CONSTEXPR Container next_cells(Container const& cont) { return detail::next_cells_1(cont, sprout::container_indexes::make()); } namespace detail { struct gen_next_cells { public: template SPROUT_CONSTEXPR sprout::pair operator()(Container const& cont) const { return sprout::pair(cont, ::next_cells(cont)); } }; } // namespace detail // // next_cells // template inline SPROUT_CONSTEXPR sprout::array next_cells(Container const& cont) { return sprout::fixed::unfold >(detail::gen_next_cells(), cont); } #include #include #define BOARD_WIDTH 16 #define BOARD_HEIGHT 16 #define BOARD_COUNT 16 template void SPROUT_NON_CONSTEXPR print_board(Container const& board) { testspr::print_hl(); for (auto&& line : board) { for (auto&& cell : line) { testspr::print(cell ? "" : "", ' '); } testspr::print_ln(); } } int main() { typedef sprout::array, BOARD_HEIGHT> board_type; // cell initial placement #define _ 0 #define X 1 SPROUT_STATIC_CONSTEXPR board_type board0 {{ {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, X, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, X, _, _, _, _, _, _, _, _}}, {{_, _, _, _, X, X, _, _, X, X, X, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}}, {{_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _}} }}; #undef _ #undef X // execute life game SPROUT_STATIC_CONSTEXPR auto boards = ::next_cells(board0); // print for (auto&& board : boards) { ::print_board(board); } }