/* @copyright Louis Dionne 2014 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_HANA_EXAMPLE_CPPCON_2014_MATRIX_RING_HPP #define BOOST_HANA_EXAMPLE_CPPCON_2014_MATRIX_RING_HPP #include "matrix.hpp" #include #include #include #include #include #include #include namespace boost { namespace hana { template struct mult_impl, cppcon::Matrix> { template static constexpr decltype(auto) apply(A&& a, B&& b) { auto cols = cppcon::columns(std::forward(b)); return unpack( transform(cppcon::rows(std::forward(a)), [&](auto&& row) -> decltype(auto) { return zip_with(cppcon::detail::tuple_scalar_product, repeat(uint, std::forward(row)), cols ); } ), cppcon::matrix ); } }; template struct one_impl> { static constexpr decltype(auto) apply() { return unpack(range_c, [](auto ...n) { return unpack(range_c, [=](auto ...m) { auto row = [=](auto n) { return cppcon::row(if_(n == m, int_<1>, int_<0>)...); }; return cppcon::matrix(row(n)...); }); }); } }; }} #endif // !BOOST_HANA_EXAMPLE_CPPCON_2014_MATRIX_RING_HPP