4.4 KiB
[linalg.scaled.scaledaccessor]
29 Numerics library [numerics]
29.9 Basic linear algebra algorithms [linalg]
29.9.8 Scaled in-place transformation [linalg.scaled]
29.9.8.2 Class template scaled_accessor [linalg.scaled.scaledaccessor]
The class template scaled_accessor is an mdspan accessor policy which upon access produces scaled elements.
It is part of the implementation of scaled ([linalg.scaled.scaled]).
namespace std::linalg {template<class ScalingFactor, class NestedAccessor>class scaled_accessor {public:using element_type = add_const_t<decltype(declval() * declvalNestedAccessor::element_type())>; using reference = remove_const_t<element_type>; using data_handle_type = NestedAccessor::data_handle_type; using offset_policy = scaled_accessor<ScalingFactor, NestedAccessor::offset_policy>; constexpr scaled_accessor() = default; templateexplicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)constexpr scaled_accessor(const scaled_accessor<ScalingFactor, OtherNestedAccessor>& other); constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a); constexpr reference access(data_handle_type p, size_t i) const; constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const; constexpr const ScalingFactor& scaling_factor() const noexcept { return scaling-factor; }constexpr const NestedAccessor& nested_accessor() const noexcept { return nested-accessor; }private: ScalingFactor scaling-factor{}; // exposition only NestedAccessor nested-accessor{}; // exposition only};}
Mandates:
element_type is valid and denotes a type,
is_copy_constructible_v is true,
is_reference_v<element_type> is false,
ScalingFactor models semiregular, and
NestedAccessor meets the accessor policy requirements ([mdspan.accessor.reqmts]).
template<class OtherNestedAccessor> explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>) constexpr scaled_accessor(const scaled_accessor<ScalingFactor, OtherNestedAccessor>& other);
Constraints: is_constructible_v<NestedAccessor, const OtherNestedAccessor&> is true.
Effects:
Direct-non-list-initializes scaling-factor with other.scaling_factor(), and
direct-non-list-initializes nested-accessor with other.nested_accessor().
constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a);
Effects:
Direct-non-list-initializes scaling-factor with s, and
direct-non-list-initializes nested-accessor with a.
constexpr reference access(data_handle_type p, size_t i) const;
Returns: scaling_factor() * NestedAccessor::element_type(nested-accessor.access(p, i))
constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const;
Returns: nested-accessor.offset(p, i)