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// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_LINALG_SCALED_SCALAR_HPP
5#define TETL_LINALG_SCALED_SCALAR_HPP
6
7#include <etl/_linalg/proxy_reference.hpp>
8#include <etl/_type_traits/declval.hpp>
9
10namespace etl::linalg::detail {
11
12template <typename ScalingFactor, typename ReferenceValue>
13concept scalable = requires { declval<ScalingFactor>() * declval<ReferenceValue>(); };
14
15template <typename ScalingFactor, typename Reference, typename ReferenceValue>
16 requires(scalable<ScalingFactor, ReferenceValue>)
17struct scaled_scalar
18 : proxy_reference<Reference, ReferenceValue, scaled_scalar<ScalingFactor, Reference, ReferenceValue>> {
19 using value_type = decltype(declval<ScalingFactor>() * ReferenceValue(declval<Reference>()));
20
21 constexpr explicit scaled_scalar(ScalingFactor const& scalingFactor, Reference const& reference)
22 : proxy_reference<Reference, ReferenceValue, scaled_scalar<ScalingFactor, Reference, ReferenceValue>>{reference}
23 , _scalingFactor{scalingFactor}
24 {
25 }
26
27 [[nodiscard]] constexpr auto to_value(Reference reference) const -> value_type
28 {
29 return _scalingFactor * ReferenceValue(reference);
30 }
31
32private:
33 ScalingFactor _scalingFactor;
34};
35
36} // namespace etl::linalg::detail
37
38#endif // TETL_LINALG_SCALED_SCALAR_HPP
Definition accessor_conjugate.hpp:13
Definition adjacent_find.hpp:9