// Copyright Louis Dionne 2013-2016 // 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 #include #include #include #include #include namespace boost { namespace hana { template struct mult_impl, cppcon::Matrix> { template static constexpr decltype(auto) apply(M1&& m1, M2&& m2) { static_assert(C1 == R2, "wrong dimensions for matrix multiplication"); auto cols = cppcon::columns(std::forward(m2)); return unpack( transform(cppcon::rows(std::forward(m1)), [&](auto&& row) -> decltype(auto) { return zip_with(cppcon::detail::tuple_scalar_product, replicate(std::forward(row), uint_c), 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_c<1>, int_c<0>)...); }; return cppcon::matrix(row(n)...); }); }); } }; }} #endif // !BOOST_HANA_EXAMPLE_CPPCON_2014_MATRIX_RING_HPP