VCTR
Loading...
Searching...
No Matches
ContainerAndExpressionConcepts.h
1/*
2 ==============================================================================
3 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
5 Copyright 2022- by sonible GmbH.
6
7 This file is part of VCTR - Versatile Container Templates Reconceptualized.
8
9 VCTR is free software: you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License version 3
11 only, as published by the Free Software Foundation.
12
13 VCTR is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU Lesser General Public License version 3 for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 version 3 along with VCTR. If not, see <https://www.gnu.org/licenses/>.
20 ==============================================================================
21*/
22
23namespace vctr::detail
24{
25
26// clang-format off
27template <class T>
28struct AnyVctr : std::false_type {};
29
30template <class T, template <class> class A>
31struct AnyVctr<Vector<T, A>> : std::true_type {};
32
33template <class T>
34struct AnyVctr<OwnedVector<T>> : std::true_type {};
35
36template <class T, size_t e, size_t s>
37struct AnyVctr<Array<T, e, s>> : std::true_type {};
38
39template <class T, size_t e>
40struct AnyVctr<OwnedArray<T, e>> : std::true_type {};
41
42template <class T, size_t n, class S>
43struct AnyVctr<Span<T, n, S>> : std::true_type {};
44
45template <class E, class S, size_t e, class I>
46struct AnyVctr<VctrBase<E, S, e, I>> : std::true_type {};
47
48template <class T>
49struct IsSpan : std::false_type {};
50
51template <class T, size_t n, class S>
52struct IsSpan<Span<T, n, S>> : std::true_type {};
53
54template <class T>
55struct IsStdArray : std::false_type {};
56
57template <class T, size_t e>
58struct IsStdArray<std::array<T, e>> : std::true_type {};
59
60template <class T>
61struct IsStdSpan : std::false_type {};
62
63template <class T, size_t e>
64struct IsStdSpan<std::span<T, e>> : std::true_type {};
65
66template <class T>
67struct IsExpressionChainBuilder : std::false_type {};
68
69template <template <size_t, class...> class ExpressionType, class RuntimeArgs, class... AdditionalParameters>
70struct IsExpressionChainBuilder<ExpressionChainBuilderWithRuntimeArgs<ExpressionType, RuntimeArgs, AdditionalParameters...>> : std::true_type {};
71// clang-format on
72
73} // namespace vctr::detail
74
75namespace vctr::has
76{
77
79template <class T>
80concept prepareNeonEvaluation = requires (const T& t) { t.prepareNeonEvaluation(); };
81
83template <class T>
84concept getNeon = requires (const T& t, size_t i) { t.getNeon (i); };
85
87template <class T>
88concept prepareAVXEvaluation = requires (const T& t) { t.prepareAVXEvaluation(); };
89
91template <class T>
92concept getAVX = requires (const T& t, size_t i) { t.getAVX (i); };
93
95template <class T>
96concept prepareSSEEvaluation = requires (const T& t) { t.prepareSSEEvaluation(); };
97
99template <class T>
100concept getSSE = requires (const T& t, size_t i) { t.getSSE (i); };
101
103template <class T>
104concept indexOperator = requires (T& t) { t[size_t()]; };
105
107template <class T>
108concept constIndexOperator = requires (const T& t) { t[size_t()]; };
109
111template <class T, class DstType>
112concept evalNextVectorOpInExpressionChain = requires (const T& t, DstType* d) { t.evalNextVectorOpInExpressionChain (d); } && std::same_as<DstType, typename std::remove_cvref_t<T>::value_type>;
113
115template <class T, class ValueType>
116concept reduceElementWise = requires (const T&t, ValueType& v) { t.reduceElementWise (v, size_t()); };
117
119template <class T, class DstType>
120concept reduceVectorOp = requires (const T& t) { { t.reduceVectorOp() } -> std::same_as<DstType>; };
121
123template <class T, class SrcDstType>
124concept reduceNeonRegisterWise = requires (const T& t, NeonRegister<SrcDstType>& sd, size_t s) { t.reduceNeonRegisterWise (sd, s); };
125
127template <class T, class SrcDstType>
128concept reduceAVXRegisterWise = requires (const T& t, AVXRegister<SrcDstType>& sd, size_t s) { t.reduceAVXRegisterWise (sd, s); };
129
131template <class T, class SrcDstType>
132concept reduceSSERegisterWise = requires (const T& t, SSERegister<SrcDstType>& sd, size_t s) { t.reduceSSERegisterWise (sd, s); };
133
135template <class T>
136concept data = requires (const T& t) { t.data(); };
137
139template <class T, class ElementType>
140concept dataWithElementType = requires (const T& t) { { t.data() } -> std::convertible_to<const ElementType*>; };
141
143template <class T>
144concept size = requires (const T& t, size_t i) { i = t.size(); };
145
147template <class T>
149
151template <class T, class ElementType>
153
155template <class T>
156concept begin = requires (T& t) { *t.begin(); } || requires (const T& t) { *t.begin(); };
157
159template <class T>
160concept end = requires (T& t) { *t.end(); } || requires (const T& t) { *t.begin(); };
161
163template <class T>
164concept resize = requires (T& t, size_t n) { t.resize (n); };
165
167template <class T>
168concept getStorageInfo = requires (const T& t) { t.getStorageInfo(); };
169
171template <class T>
172concept isNotAliased = requires (const T& t, bool r, const void* o) { r = t.isNotAliased (o); };
173
175template <class T, size_t i, class RuntimeArgs>
176concept iterateOverRuntimeArgChain = requires (T& t, const RuntimeArgs& r) { t.template iterateOverRuntimeArgChain<i, RuntimeArgs> (r); };
177
179template <class T, class... Args>
180concept applyRuntimeArgs = requires (T& t, const Args&... args) { t.applyRuntimeArgs (args...); };
181
182} // namespace vctr::has
183
184namespace vctr::detail
185{
192enum PlatformVectorOpPreference
193{
194 dontPreferIfIppAndAccelerateAreAvailable,
195 preferIfIppAndAccelerateAreAvailable
196};
197
198template <PlatformVectorOpPreference pref>
199concept isPreferredVectorOp = (Config::hasIPP && Config::platformApple && (pref == preferIfIppAndAccelerateAreAvailable)) ||
200 ((! (Config::hasIPP && Config::platformApple)) && (pref == dontPreferIfIppAndAccelerateAreAvailable));
201} // namespace vctr::detail
202
203namespace vctr::is
204{
205
206// clang-format off
207
209template <class T>
210concept anyVctr = detail::AnyVctr<std::remove_cvref_t<T>>::value;
211
213template <class T, class V>
214concept anyVctrWithValueType = anyVctr<T> && std::same_as<typename std::remove_cvref_t<T>::value_type, V>;
215
217template <class T>
219
221template <class T, class V>
222concept expressionWithValueType = expression<T> && std::same_as<typename std::remove_cvref_t<T>::value_type, V>;
223
225template <class T>
226concept expressionChainBuilder = detail::IsExpressionChainBuilder<std::remove_cvref_t<T>>::value;
227
229template <class T>
231
233template <class T>
234concept stdArray = detail::IsStdArray<T>::value;
235
237template <class T>
238concept stdSpan = detail::IsStdSpan<T>::value;
239
241template <class T>
242concept view = detail::IsSpan<T>::value || detail::IsStdSpan<T>::value;
243
244//==============================================================================
246template <class T, class DstType>
248
249//==============================================================================
251template <class DstType, class... Sources>
252concept suitableForAccelerateSSEOp = Config::platformApple && Config::archX64 && std::same_as<float, DstType> && (has::getSSE<Sources> && ...);
253
255template <class DstType, class... Sources>
256concept suitableForAccelerateNeonOp = Config::platformApple && Config::archARM && std::same_as<float, DstType> && (has::getNeon<Sources> && ...);
257
259template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
261
263template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
265
267template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
269
271template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
273
275template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
277
279template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
280concept suitableForAccelerateRealFloatVectorReductionOp = detail::isPreferredVectorOp<pref> && Config::platformApple && has::data<Src> && realFloatNumber<DstType>;
281//==============================================================================
283template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
285
287template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
288concept suitableForIppRealSingedInt32VectorOp = detail::isPreferredVectorOp<pref> && Config::hasIPP && has::evalNextVectorOpInExpressionChain<Src, DstType> && std::same_as<int32_t, DstType>;
289
291template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
293
295template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
297
299template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
301
303template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
304concept suitableForIppRealFloatVectorReductionOp = detail::isPreferredVectorOp<pref> && Config::hasIPP && has::data<Src> && realFloatNumber<DstType>;
305
307template <class Src, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
309
310//==============================================================================
312template <class SrcA, class SrcB, class DstType>
313concept suitableForBinaryVectorOp = ((expressionWithEvalVectorOp < SrcA, DstType > && anyVctr < SrcB >) ||
314 (anyVctr<SrcA> && expressionWithEvalVectorOp < SrcB, DstType >) ||
316 std::same_as<typename std::remove_cvref_t<SrcA>::value_type, typename std::remove_cvref_t<SrcB>::value_type>;
317
318//==============================================================================
320template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
322
324template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
326
328template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
330
331//==============================================================================
333template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
335
337template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
339
341template <class SrcA, class SrcB, class DstType, detail::PlatformVectorOpPreference pref = detail::preferIfIppAndAccelerateAreAvailable>
343
344//==============================================================================
346template <class T>
348
350template <class T>
352
356template <class T, class ElementType>
357concept suitableInitializerForElementType = std::constructible_from<ElementType, std::remove_cvref_t<T>> && ! expression<T>;
358
362template <class T>
363concept suitableInitializerFunction = std::invocable<T, size_t> && ! std::same_as<void, std::invoke_result_t<T, size_t>>;
364
368template <class T, class ElementType>
369concept suitableInitializerFunctionForElementType = suitableInitializerFunction<T> && std::constructible_from<ElementType, std::invoke_result_t<T, size_t>>;
370
372template <class T, class ElementType>
373concept inputIteratorToConstructValuesOfType = std::input_iterator<T> && std::constructible_from<ElementType, std::iter_value_t<T>>;
374
376template <class T, class ElementType>
377concept contiguousIteratorWithValueTypeSameAs = std::contiguous_iterator<T> && std::same_as<ElementType, std::iter_value_t<T>>;
378
383template <class T>
384concept storageInfo = requires (const T& info, size_t a, bool b) { a = T::memberAlignment; b = info.dataIsSIMDAligned; b = info.hasSIMDExtendedStorage; };
385
386template <class T>
387concept reductionExpression = requires (const T& t, typename T::value_type v, size_t i) { v = T::reductionResultInitValue; t.reduceElementWise (v, i); };
388
389// clang-format on
390
391} // namespace vctr::is
392
393namespace vctr::are
394{
395
397template <class... T>
399
400} // namespace vctr::are
Constrains a pack of types to be no expression templates.
Definition: ContainerAndExpressionConcepts.h:398
Constrains a type to have a function applyRuntimeArgs (const Args&...)
Definition: ContainerAndExpressionConcepts.h:180
Constrains a type to have a member function begin() or begin() const.
Definition: ContainerAndExpressionConcepts.h:156
Constrains a type to have a const operator[] overload taking a size_t argument.
Definition: ContainerAndExpressionConcepts.h:108
Constrains a type to have a member function data() const returning a pointer convertible to const Ele...
Definition: ContainerAndExpressionConcepts.h:140
Constrains a type to have a member function data() const.
Definition: ContainerAndExpressionConcepts.h:136
Constrains a type to have a member function end() or end() const.
Definition: ContainerAndExpressionConcepts.h:160
Constrains a type to have a member function evalNextVectorOpInExpressionChain (value_type*) const.
Definition: ContainerAndExpressionConcepts.h:112
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:92
Constrains a type to have a member function getNeon (size_t) const.
Definition: ContainerAndExpressionConcepts.h:84
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:100
Constrains a type to have a function getStorageInfo() const.
Definition: ContainerAndExpressionConcepts.h:168
Constrains a type to have a non const operator[] overload taking a size_t argument.
Definition: ContainerAndExpressionConcepts.h:104
Constrains a type to have a function isNotAliased (const void*) const.
Definition: ContainerAndExpressionConcepts.h:172
Constrains a type to have a function iterateOverRuntimeArgChain<size_t> (RuntimeArgs)
Definition: ContainerAndExpressionConcepts.h:176
Constrains a type to have a member function prepareAVXEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:88
Constrains a type to have a member function prepareNeonEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:80
Constrains a type to have a member function prepareSSEEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:96
Constrains a type to have a member function reduceAVXRegisterWise (AVXRegister<SrcDstType>&,...
Definition: ContainerAndExpressionConcepts.h:128
Constrains a type to have a member function reduceElementWise() const that takes a ValueType& and siz...
Definition: ContainerAndExpressionConcepts.h:116
Constrains a type to have a member function reduceNeonRegisterWise (NeonRegister<SrcDstType>&,...
Definition: ContainerAndExpressionConcepts.h:124
Constrains a type to have a member function reduceSSERegisterWise (SSERegister<SrcDstType>&,...
Definition: ContainerAndExpressionConcepts.h:132
Constrains a type to have a member function reduceVectorOp() const that returns a DstType value.
Definition: ContainerAndExpressionConcepts.h:120
Constrains a type to have a function resize (size_t).
Definition: ContainerAndExpressionConcepts.h:164
Constrains a type to both, a member function size() const and data() const returning a pointer conver...
Definition: ContainerAndExpressionConcepts.h:152
Constrains a type to both, a member function size() const and data() const.
Definition: ContainerAndExpressionConcepts.h:148
Constrains a type to have a member function size() const.
Definition: ContainerAndExpressionConcepts.h:144
Constrains a type to either be an expression template or any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:230
Constrains a type to be any derived instance of VctrBase with a certain value_type.
Definition: ContainerAndExpressionConcepts.h:214
Constrains a type to be any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:210
Constrains a type to represent a complex valued floating point number (e.g.
Definition: NumericTypeConcepts.h:87
Constrains the type to be a contiguous iterator with a value type same as ElementType.
Definition: ContainerAndExpressionConcepts.h:377
Constrains a type to be an expression chain builder.
Definition: ContainerAndExpressionConcepts.h:226
Constrains a type to be an expression template that defines evalNextVectorOpInExpressionChain for Dst...
Definition: ContainerAndExpressionConcepts.h:247
Constrains a type to be an expression template with a certain value_type.
Definition: ContainerAndExpressionConcepts.h:222
Constrains a type to be an expression template.
Definition: ContainerAndExpressionConcepts.h:218
Constrains the type to be an input iterator with a value type suitable to construct an ElementType.
Definition: ContainerAndExpressionConcepts.h:373
Constrains a type to represent a real valued integer number.
Definition: NumericTypeConcepts.h:53
Constrains a type to supply begin and end functions and to not satisfy triviallyCopyableWithDataAndSi...
Definition: ContainerAndExpressionConcepts.h:351
Constrains a type to represent a real valued floating point number.
Definition: NumericTypeConcepts.h:83
Definition: ContainerAndExpressionConcepts.h:387
Constrains a type to be any instance of std::array.
Definition: ContainerAndExpressionConcepts.h:234
Constrains a type to be any instance of std::span.
Definition: ContainerAndExpressionConcepts.h:238
Constrains the type to be a suitable storage info type.
Definition: ContainerAndExpressionConcepts.h:384
A combined concept to check if Apple Accelerate is a suitable option for a complex valued floating po...
Definition: ContainerAndExpressionConcepts.h:325
A combined concept to check if Apple Accelerate is a suitable option for a complex valued floating po...
Definition: ContainerAndExpressionConcepts.h:264
A combined concept to check if Apple Accelerate is a suitable option for a floating point vector oper...
Definition: ContainerAndExpressionConcepts.h:272
A combined concept to check if Apple Accelerate vpf functions are suitable to work on Neon registers.
Definition: ContainerAndExpressionConcepts.h:256
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:321
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:260
A combined concept to check if Apple Accelerate is a suitable option for a floating point vector redu...
Definition: ContainerAndExpressionConcepts.h:280
A combined concept to check if Apple Accelerate is a suitable option for a vector operation that tran...
Definition: ContainerAndExpressionConcepts.h:276
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:329
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:268
A combined concept to check if Apple Accelerate vpf functions are suitable to work on SSE registers.
Definition: ContainerAndExpressionConcepts.h:252
Constrains two source types to be suitable for a an aliasing-free binary vector operation using platf...
Definition: ContainerAndExpressionConcepts.h:313
A combined concept to check if Intel IPP is a suitable option for a complex valued floating point bin...
Definition: ContainerAndExpressionConcepts.h:338
A combined concept to check if Intel IPP is a suitable option for a complex valued floating point vec...
Definition: ContainerAndExpressionConcepts.h:292
A combined concept to check if Intel IPP is a suitable option for a floating point vector operation t...
Definition: ContainerAndExpressionConcepts.h:300
A combined concept to check if Intel IPP is a suitable option for a real valued floating point binary...
Definition: ContainerAndExpressionConcepts.h:334
A combined concept to check if Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:284
A combined concept to check if Intel IPP is a suitable option for a floating point vector reduction o...
Definition: ContainerAndExpressionConcepts.h:304
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:342
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:296
A combined concept to check if Intel IPP is a suitable option for a real or complex floating point ve...
Definition: ContainerAndExpressionConcepts.h:308
A combined concept to check if Intel IPP is a suitable option for a real valued singed int32 vector o...
Definition: ContainerAndExpressionConcepts.h:288
Constrains the type to be suitable for initializing a single element Vctr with a given ElementType,...
Definition: ContainerAndExpressionConcepts.h:357
Constrains the type to be a function suitable for initializing the nth element of a Vctr with a given...
Definition: ContainerAndExpressionConcepts.h:369
Constrains the type to be a function suitable for initializing the nth element of a Vctr,...
Definition: ContainerAndExpressionConcepts.h:363
Constrains a type to supply a data and size function, an index operator and define a trivially copyab...
Definition: ContainerAndExpressionConcepts.h:347
Constrains a type to be trivially copyable.
Definition: GenericConcepts.h:84
Constrains a type to be a view rather than an owning container.
Definition: ContainerAndExpressionConcepts.h:242
typename detail::ValueType< std::remove_cvref_t< T > >::Type ValueType
If T is an expression template, it equals its return type, if it's a type that defines value_type as ...
Definition: Traits.h:201