tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
scaled_scalar.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_LINALG_SCALED_SCALAR_HPP
4#define TETL_LINALG_SCALED_SCALAR_HPP
5
8
9namespace etl::linalg::detail {
10
11template <typename ScalingFactor, typename ReferenceValue>
12concept scalable = requires { declval<ScalingFactor>() * declval<ReferenceValue>(); };
13
14template <typename ScalingFactor, typename Reference, typename ReferenceValue>
15 requires(scalable<ScalingFactor, ReferenceValue>)
16struct scaled_scalar
17 : proxy_reference<Reference, ReferenceValue, scaled_scalar<ScalingFactor, Reference, ReferenceValue>> {
18 using value_type = decltype(declval<ScalingFactor>() * ReferenceValue(declval<Reference>()));
19
20 constexpr explicit scaled_scalar(ScalingFactor const& scalingFactor, Reference const& reference)
21 : proxy_reference<Reference, ReferenceValue, scaled_scalar<ScalingFactor, Reference, ReferenceValue>>{reference}
22 , _scalingFactor{scalingFactor}
23 {
24 }
25
26 [[nodiscard]] constexpr auto to_value(Reference reference) const -> value_type
27 {
28 return _scalingFactor * ReferenceValue(reference);
29 }
30
31private:
32 ScalingFactor _scalingFactor;
33};
34
35} // namespace etl::linalg::detail
36
37#endif // TETL_LINALG_SCALED_SCALAR_HPP
auto declval() noexcept -> add_rvalue_reference_t< T >