23struct conjugate_function
25 template <uni20::Complex C>
31 template <
class Value>
46template <
class Accessor>
51template <
class Mdspan>
53 accessor_applies_conjugation_v<typename std::remove_cvref_t<Mdspan>::accessor_type>;
60template <AccessorPolicy Accessor>
65 using value_type = std::remove_cv_t<typename Accessor::element_type>;
67 using reference = std::invoke_result_t<detail::conjugate_function, typename Accessor::reference>;
73 requires std::default_initializable<Accessor>
79 : accessor_(static_cast<Accessor&&>(accessor))
85 return detail::conjugate_function{}(accessor_.access(ptr,
offset));
91 return accessor_.offset(ptr,
offset);
100 return static_cast<Accessor&&
>(accessor_);
104 [[no_unique_address]] Accessor accessor_{};
111template <AccessorPolicy Accessor,
class Domain>
112inline constexpr bool enable_accessor_in_domain<conjugated_accessor<Accessor>,
Domain> =
113 enable_accessor_in_domain<Accessor, Domain>;
116template <MdspanLike Span>
118 !accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
122 using accessor_type =
decltype(accessor);
123 using extents_type =
typename Span::extents_type;
124 using layout_type =
typename Span::layout_type;
125 using element_type =
typename accessor_type::element_type;
127 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{
span.data_handle(),
span.mapping(),
128 std::move(accessor)};
132template <MdspecLike Span>
134 !accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
138 using accessor_type =
decltype(accessor);
139 using extents_type =
typename Span::extents_type;
140 using layout_type =
typename Span::layout_type;
141 using element_type =
typename accessor_type::element_type;
142 using descriptor_type =
typename Span::data_descriptor_type;
149template <MdspanLike Span>
151 accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
154 auto accessor =
span.accessor().wrapped_accessor();
155 using accessor_type =
decltype(accessor);
156 using extents_type =
typename Span::extents_type;
157 using layout_type =
typename Span::layout_type;
158 using element_type =
typename accessor_type::element_type;
160 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{
span.data_handle(),
span.mapping(),
161 std::move(accessor)};
165template <MdspecLike Span>
167 accessor_applies_conjugation_v<typename std::remove_cvref_t<Span>::accessor_type>)
170 auto accessor =
span.accessor().wrapped_accessor();
171 using accessor_type =
decltype(accessor);
172 using extents_type =
typename Span::extents_type;
173 using layout_type =
typename Span::layout_type;
174 using element_type =
typename accessor_type::element_type;
175 using descriptor_type =
typename Span::data_descriptor_type;
182template <MdspanLike Span>
187 using accessor_type =
decltype(accessor);
188 using extents_type =
typename Span::extents_type;
189 using layout_type =
typename Span::layout_type;
190 using element_type =
typename accessor_type::element_type;
192 return stdex::mdspan<element_type, extents_type, layout_type, accessor_type>{
span.data_handle(),
span.mapping(),
193 std::move(accessor)};
197template <MdspecLike Span>
202 using accessor_type =
decltype(accessor);
203 using extents_type =
typename Span::extents_type;
204 using layout_type =
typename Span::layout_type;
205 using element_type =
typename accessor_type::element_type;
206 using descriptor_type =
typename Span::data_descriptor_type;
Ordered domain spaces of a tensor morphism.
Definition morphism_boundary.hpp:24
Read-only accessor that returns uni20::conj of the wrapped accessor value.
Definition conjugate_accessor.hpp:62
UNI20_HOST_DEVICE constexpr data_handle_type offset(data_handle_type ptr, offset_type offset) const
Delegate handle offsetting to the wrapped accessor.
Definition conjugate_accessor.hpp:89
UNI20_HOST_DEVICE constexpr conjugated_accessor(Accessor accessor)
Construct from the accessor whose values should be conjugated on read.
Definition conjugate_accessor.hpp:78
UNI20_HOST_DEVICE constexpr auto wrapped_accessor() const &-> Accessor const &
Return the wrapped accessor.
Definition conjugate_accessor.hpp:95
UNI20_HOST_DEVICE constexpr reference access(data_handle_type ptr, offset_type offset) const
Return the conjugated value at a handle-relative offset.
Definition conjugate_accessor.hpp:83
std::remove_cv_t< typename Accessor::element_type > value_type
Definition conjugate_accessor.hpp:65
UNI20_HOST_DEVICE constexpr auto wrapped_accessor() &&-> Accessor
Move out the wrapped accessor.
Definition conjugate_accessor.hpp:98
UNI20_HOST_DEVICE constexpr conjugated_accessor()
Definition conjugate_accessor.hpp:72
typename Accessor::data_handle_type data_handle_type
Definition conjugate_accessor.hpp:68
value_type const element_type
Definition conjugate_accessor.hpp:66
std::invoke_result_t< detail::conjugate_function, typename Accessor::reference > reference
Definition conjugate_accessor.hpp:67
span_offset_t< Accessor > offset_type
Definition conjugate_accessor.hpp:70
Accessor wrapped_accessor_type
Definition conjugate_accessor.hpp:64
Store a data descriptor with the mapping and accessor for an eventual mdspan.
Definition mdspec.hpp:31
constexpr auto data_descriptor() noexcept -> data_descriptor_type &
Return the descriptor used to acquire writable data access.
Definition mdspec.hpp:77
Project compiler annotations shared by host and device code.
#define UNI20_HOST_DEVICE
Definition compiler_attributes.hpp:12
Concept for complex scalar types.
Definition scalar_concepts.hpp:75
locale_t value
Definition data_table.cpp:49
uni20::complex< T > conj(detail::standard_complex< T > x)
Returns the complex conjugate for complex-valued scalars.
Definition math.hpp:70
typename span_offset_type< AP >::type span_offset_t
Convenience alias for accessor_offset_type<AP>::type.
Definition mdspan/concepts.hpp:48
constexpr stdex::default_accessor< T const > const_accessor(stdex::default_accessor< T > const &accessor_policy)
Wrap a default_accessor<T> into a const_default_accessor<T>.
Definition mdspan/concepts.hpp:160
Scalar math helper utilities.
Mdspan concept and accessor extensions for Uni20.
Mdspan-shaped metadata for storage whose data handle requires acquisition.
Definition async/async.hpp:26
constexpr bool accessor_applies_conjugation_v
True when an accessor presents conjugated values.
Definition conjugate_accessor.hpp:47
constexpr bool mdspan_needs_conjugation_v
True when an mdspan-like type's accessor presents conjugated values.
Definition conjugate_accessor.hpp:52
std::size_t span
Definition presentation.cpp:2017
Trait used by mdspan accessors that present conjugated values on read.
Definition conjugate_accessor.hpp:43