1#ifndef TATOOINE_TENSOR_OPERATIONS_BINARY_OPERATION_H
2#define TATOOINE_TENSOR_OPERATIONS_BINARY_OPERATION_H
9template <
typename F, static_tensor Lhs, static_tensor Rhs, std::size_t... Seq>
10requires(same_dimensions<Lhs, Rhs>())
12 F&& f, Lhs
const& lhs, Rhs
const& rhs,
13 std::index_sequence<Seq...> ) {
16 auto constexpr rank = tensor_rank<Lhs>;
18 if constexpr (
rank == 1) {
19 return vec<TOut, Lhs::dimension(Seq)...>{};
20 }
else if constexpr (
rank == 2) {
21 return mat<TOut, Lhs::dimension(Seq)...>{};
23 return tensor<TOut, Lhs::dimension(Seq)...>{};
27 [&](
auto const... is) { t_out(is...) = f(lhs(is...), rhs(is...)); });
31template <
typename F, static_tensor Lhs, static_tensor Rhs>
33 F&& f, Lhs
const& lhs, Rhs
const& rhs) {
35 std::make_index_sequence<Lhs::rank()>{});
Definition: algorithm.h:6
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
constexpr auto binary_operation(F &&f, Lhs const &lhs, Rhs const &rhs, std::index_sequence< Seq... >)
Definition: binary_operation.h:11
constexpr auto rank()
Definition: rank.h:10
static auto constexpr for_indices(invocable< decltype(Dims)... > auto &&f)
Definition: base_tensor.h:58