cMHN 1.1
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
sequence.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_BASIC_SEQUENCE_H
4#define pRC_CORE_BASIC_SEQUENCE_H
5
23
24namespace pRC
25{
26 template<class T, T... Seq>
27 Sequence(std::integer_sequence<T, Seq...> const) -> Sequence<T, Seq...>;
28
29 template<Size... Ns>
31
32 template<class T, T... Seq>
34 {
35 public:
36 using Type = T;
37 using Dimension = Constant<Size, sizeof...(Seq)>;
38
39 static constexpr auto value(Index const index)
40 {
41 return StackArray<T, Dimension{}>(Seq...)[index];
42 }
43
44 public:
45 ~Sequence() = default;
46 constexpr Sequence(Sequence const &) = default;
47 constexpr Sequence(Sequence &&) = default;
48 constexpr Sequence &operator=(Sequence const &) & = default;
49 constexpr Sequence &operator=(Sequence &&) & = default;
50 constexpr Sequence() = default;
51 constexpr Sequence(std::integer_sequence<T, Seq...> const) {}
52 };
53
54 template<Size... Ns>
55 class Sequence<Size, Ns...>
56 {
57 private:
58 static constexpr auto linearizable()
59 {
60 if constexpr(((Ns != 0) && ...))
61 {
63 ((S /= Ns), ...);
64 return S != 0;
65 }
66 else
67 {
68 return true;
69 }
70 }
71
72 public:
73 using Type = Size;
74 using Dimension = Constant<Size, sizeof...(Ns)>;
75 using IsLinearizable = Constant<Bool, linearizable()>;
76
77 static constexpr auto value(Index const index)
78 {
79 return StackArray<Size, Dimension{}>(Ns...)[index];
80 }
81
82 static constexpr auto size(Index const index)
83 {
84 return value(index);
85 }
86
87 template<class E = IsLinearizable, If<E> = 0>
88 static constexpr auto size()
89 {
90 return (Ns * ... * Size(1));
91 }
92
93 public:
94 ~Sequence() = default;
95 constexpr Sequence(Sequence const &) = default;
96 constexpr Sequence(Sequence &&) = default;
97 constexpr Sequence &operator=(Sequence const &) & = default;
98 constexpr Sequence &operator=(Sequence &&) & = default;
99 constexpr Sequence() = default;
100 constexpr Sequence(std::integer_sequence<Size, Ns...> const) {}
101
102 explicit constexpr operator Size() const
103 {
104 return size();
105 }
106 };
107
108 template<class T, T... As, T... Bs, If<IsInvocable<Add, T, T>> = 0,
109 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
110 static inline constexpr auto operator+(Sequence<T, As...> const,
111 Sequence<T, Bs...> const)
112 {
113 return Sequence<T, (As + Bs)...>();
114 }
115
116 template<class T, T... As, T B, If<IsInvocable<Add, T, T>> = 0>
117 static inline constexpr auto operator+(Sequence<T, As...> const,
118 Constant<T, B> const)
119 {
120 return Sequence<T, (As + B)...>();
121 }
122
123 template<class T, T A, T... Bs, If<IsInvocable<Add, T, T>> = 0>
124 static inline constexpr auto operator+(Constant<T, A> const,
125 Sequence<T, Bs...> const)
126 {
127 return Sequence<T, (A + Bs)...>();
128 }
129
130 template<class T, T... As, T... Bs, If<IsInvocable<Sub, T, T>> = 0,
131 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
132 static inline constexpr auto operator-(Sequence<T, As...> const,
133 Sequence<T, Bs...> const)
134 {
135 return Sequence<T, (As - Bs)...>();
136 }
137
138 template<class T, T... As, T B, If<IsInvocable<Sub, T, T>> = 0>
139 static inline constexpr auto operator-(Sequence<T, As...> const,
140 Constant<T, B> const)
141 {
142 return Sequence<T, (As - B)...>();
143 }
144
145 template<class T, T... As, T... Bs, If<IsInvocable<Mul, T, T>> = 0,
146 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
147 static inline constexpr auto operator*(Sequence<T, As...> const,
148 Sequence<T, Bs...> const)
149 {
150 return Sequence<T, (As * Bs)...>();
151 }
152
153 template<class T, T... As, T B, If<IsInvocable<Mul, T, T>> = 0>
154 static inline constexpr auto operator*(Sequence<T, As...> const,
155 Constant<T, B> const)
156 {
157 return Sequence<T, (As * B)...>();
158 }
159
160 template<class T, T A, T... Bs, If<IsInvocable<Mul, T, T>> = 0>
161 static inline constexpr auto operator*(Constant<T, A> const,
162 Sequence<T, Bs...> const)
163 {
164 return Sequence<T, (A * Bs)...>();
165 }
166
167 template<class T, T... As, T... Bs, If<IsInvocable<Div, T, T>> = 0,
168 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
169 static inline constexpr auto operator/(Sequence<T, As...> const,
170 Sequence<T, Bs...> const)
171 {
172 return Sequence<T, (As / Bs)...>();
173 }
174
175 template<class T, T... As, T B, If<IsInvocable<Div, T, T>> = 0>
176 static inline constexpr auto operator/(Sequence<T, As...> const,
177 Constant<T, B> const)
178 {
179 return Sequence<T, (As / B)...>();
180 }
181
182 template<class T, T... As, T... Bs, If<IsInvocable<Mod, T, T>> = 0,
183 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
184 static inline constexpr auto operator%(Sequence<T, As...> const,
185 Sequence<T, Bs...> const)
186 {
187 return Sequence<T, (As % Bs)...>();
188 }
189
190 template<class T, T... As, T B, If<IsInvocable<Mod, T, T>> = 0>
191 static inline constexpr auto operator%(Sequence<T, As...> const,
192 Constant<T, B> const)
193 {
194 return Sequence<T, (As % B)...>();
195 }
196
197 template<class T, T... Is, If<IsInvocable<Minus, T>> = 0>
198 static inline constexpr auto operator-(Sequence<T, Is...> const)
199 {
200 return Sequence<T, -Is...>();
201 }
202
203 template<class T, T... As, T... Bs>
204 static inline constexpr auto operator,(Sequence<T, As...> const,
205 Sequence<T, Bs...> const)
206 {
207 return Sequence<T, As..., Bs...>();
208 }
209
210 template<class T, T... As, T... Bs,
211 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
212 static inline constexpr auto operator==(Sequence<T, As...> const,
213 Sequence<T, Bs...> const)
214 {
215 return ((As == Bs) && ...);
216 }
217
218 template<class T, T... As, T B>
219 static inline constexpr auto operator==(Sequence<T, As...> const,
220 Constant<T, B> const)
221 {
222 return ((As == B) && ...);
223 }
224
225 template<class T, T A, T... Bs>
226 static inline constexpr auto operator==(Constant<T, A> const,
227 Sequence<T, Bs...> const)
228 {
229 return ((A == Bs) && ...);
230 }
231
232 template<class T, T... As, T... Bs,
233 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
234 static inline constexpr auto operator!=(Sequence<T, As...> const,
235 Sequence<T, Bs...> const)
236 {
237 return ((As != Bs) || ...);
238 }
239
240 template<class T, T... As, T B>
241 static inline constexpr auto operator!=(Sequence<T, As...> const,
242 Constant<T, B> const)
243 {
244 return ((As != B) || ...);
245 }
246
247 template<class T, T A, T... Bs>
248 static inline constexpr auto operator!=(Constant<T, A> const,
249 Sequence<T, Bs...> const)
250 {
251 return ((A != Bs) || ...);
252 }
253
254 template<class T, T... As, T... Bs, If<IsInvocable<LessEqual, T, T>> = 0,
255 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
256 static inline constexpr auto operator<=(Sequence<T, As...> const,
257 Sequence<T, Bs...> const)
258 {
259 return ((As <= Bs) && ...);
260 }
261
262 template<class T, T... As, T B, If<IsInvocable<LessEqual, T, T>> = 0>
263 static inline constexpr auto operator<=(Sequence<T, As...> const,
264 Constant<T, B> const)
265 {
266 return ((As <= B) && ...);
267 }
268
269 template<class T, T A, T... Bs, If<IsInvocable<LessEqual, T, T>> = 0>
270 static inline constexpr auto operator<=(Constant<T, A> const,
271 Sequence<T, Bs...> const)
272 {
273 return ((A <= Bs) && ...);
274 }
275
276 template<class T, T... As, T... Bs, If<IsInvocable<GreaterEqual, T, T>> = 0,
277 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
278 static inline constexpr auto operator>=(Sequence<T, As...> const,
279 Sequence<T, Bs...> const)
280 {
281 return ((As >= Bs) && ...);
282 }
283
284 template<class T, T... As, T B, If<IsInvocable<GreaterEqual, T, T>> = 0>
285 static inline constexpr auto operator>=(Sequence<T, As...> const,
286 Constant<T, B> const)
287 {
288 return ((As >= B) && ...);
289 }
290
291 template<class T, T A, T... Bs, If<IsInvocable<GreaterEqual, T, T>> = 0>
292 static inline constexpr auto operator>=(Constant<T, A> const,
293 Sequence<T, Bs...> const)
294 {
295 return ((A >= Bs) && ...);
296 }
297
298 template<class T, T... As, T... Bs, If<IsInvocable<Equal, T, T>> = 0,
299 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
300 static inline constexpr auto operator<(Sequence<T, As...> const,
301 Sequence<T, Bs...> const)
302 {
303 return ((As < Bs) && ...);
304 }
305
306 template<class T, T... As, T B, If<IsInvocable<Equal, T, T>> = 0>
307 static inline constexpr auto operator<(Sequence<T, As...> const,
308 Constant<T, B> const)
309 {
310 return ((As < B) && ...);
311 }
312
313 template<class T, T A, T... Bs, If<IsInvocable<Equal, T, T>> = 0>
314 static inline constexpr auto operator<(Constant<T, A> const,
315 Sequence<T, Bs...> const)
316 {
317 return ((A < Bs) && ...);
318 }
319
320 template<class T, T... As, T... Bs, If<IsInvocable<Equal, T, T>> = 0,
321 If<IsSatisfied<(sizeof...(As) == sizeof...(Bs))>> = 0>
322 static inline constexpr auto operator>(Sequence<T, As...> const,
323 Sequence<T, Bs...> const)
324 {
325 return ((As > Bs) && ...);
326 }
327
328 template<class T, T... As, T B, If<IsInvocable<Equal, T, T>> = 0>
329 static inline constexpr auto operator>(Sequence<T, As...> const,
330 Constant<T, B> const)
331 {
332 return ((As > B) && ...);
333 }
334
335 template<class T, T A, T... Bs, If<IsInvocable<Equal, T, T>> = 0>
336 static inline constexpr auto operator>(Constant<T, A> const,
337 Sequence<T, Bs...> const)
338 {
339 return ((A > Bs) && ...);
340 }
341
342 template<class T, T... Seq, class F, class... Xs,
343 If<IsInvocable<F, Xs..., Constant<T, Seq>...>> = 0>
344 static inline constexpr decltype(auto) expand(Sequence<T, Seq...> const,
345 F &&f, Xs &&...args)
346 {
347 return forward<F>(f)(forward<Xs>(args)..., Constant<T, Seq>()...);
348 }
349
350 template<class T, T N>
351 static inline constexpr auto makeSeries()
352 {
353 return Sequence(std::make_integer_sequence<T, N>());
354 }
355
356 template<class T>
357 static inline constexpr auto makeSeriesFor()
358 {
359 return Sequence<T>();
360 }
361
362 template<class T, class... Ts, If<IsSatisfied<(sizeof...(Ts) > 0)>> = 0>
363 static inline constexpr auto makeSeriesFor()
364 {
365 return makeSeries<T, sizeof...(Ts)>();
366 }
367
368 template<class T, auto... Ts, If<IsSatisfied<(sizeof...(Ts) > 0)>> = 0>
369 static inline constexpr auto makeSeriesFor()
370 {
371 return makeSeries<T, sizeof...(Ts)>();
372 }
373
374 template<class T, T First, T Last, Direction D = Direction::Forwards,
375 T Step = T(1),
378 If<IsSatisfied<((Last - First) % Step == 0)>> = 0>
379 static inline constexpr auto makeRange()
380 {
381 if constexpr(First > Last)
382 {
383 return Sequence<T>();
384 }
385 else
386 {
387 if constexpr(D == Direction::Forwards)
388 {
389 return makeSeries<T, (Last - First) / Step>() *
392 }
393 if constexpr(D == Direction::Backwards)
394 {
395 return reverse(
397 }
398 }
399 }
400
401 template<class T, Size N, T V>
402 static inline constexpr auto makeConstantSequence()
403 {
404 if constexpr(N == 0)
405 {
406 return Sequence<T>();
407 }
408 else
409 {
410 return Sequence<T, V>(), makeConstantSequence<T, N - Size(1), V>();
411 }
412 }
413
414 template<class F, class T, T I1, T I2, T... Is,
416 static inline constexpr auto reduce(Sequence<T, I1, I2, Is...> const)
417 {
418 constexpr auto I = F()(I1, I2);
419
420 if constexpr(sizeof...(Is) == 0)
421 {
422 return I;
423 }
424 else
425 {
427 }
428 }
429
430 template<class F, class T, T I>
431 static inline constexpr auto reduce(Sequence<T, I> const)
432 {
433 return I;
434 }
435
436 template<Index... Ps, class T, T... Is,
437 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ps))>> = 0,
438 If<IsSatisfied<((Ps < sizeof...(Is)) && ...)>> = 0,
440 static inline constexpr auto permute(Sequence<T, Is...> const)
441 {
443 }
444
445 template<class T, T... Is>
446 static inline constexpr auto reverse(Sequence<T, Is...> const)
447 {
449 [](auto const... is)
450 {
451 return Sequence<T,
453 sizeof...(is) - Size(1) - is)...>();
454 });
455 }
456
457 template<Direction D, Size Step, class T, T First, T... Is,
460 static inline constexpr auto rotate(Sequence<T, First, Is...> const)
461 {
462 if constexpr(D == Direction::Leftwards)
463 {
464 if constexpr(Step == 0)
465 {
466 return Sequence<T, First, Is...>();
467 }
468 else
469 {
470 return rotate<D, Step - Size(1)>(Sequence<T, Is..., First>());
471 }
472 }
473 if constexpr(D == Direction::Rightwards)
474 {
477 }
478 }
479
480 template<Direction D, Size Step, class T,
483 static inline constexpr auto rotate(Sequence<T> const)
484 {
485 return Sequence<T>();
486 }
487
488 template<Index O = 0, class T, T... Is, class... Seqs,
489 If<IsSatisfied<((Sequence<T, Is...>::size() == Seqs::size()) && ...)>> =
490 0>
491 static inline constexpr auto zip(Sequence<T, Is...> const, Seqs const...)
492 {
493 using S = Sequence<T, Is...>;
494
495 if constexpr(O < S::size() - 1)
496 {
497 return (Sequence<T, S::value(O), Seqs::value(O)...>(),
498 zip<O + 1>(S(), Seqs()...));
499 }
500 else
501 {
502 return Sequence<T, S::value(O), Seqs::value(O)...>();
503 }
504 }
505
506 template<class F, class T, T... Is>
507 static inline constexpr auto filter(Sequence<T, Is...> const)
508 {
509 if constexpr(sizeof...(Is) == 0)
510 {
511 return Sequence<T>();
512 }
513 else if constexpr(sizeof...(Is) == 1)
514 {
515 if constexpr(F()(Is...))
516 {
517 return Sequence<T, Is...>();
518 }
519 else
520 {
521 return Sequence<T>();
522 }
523 }
524 else
525 {
526 return (filter<F>(Sequence<T, Is>()), ...);
527 }
528 }
529
530 template<class F, class T, T... As, T... Bs, class... Seqs,
532 If<IsSatisfied<((Sequence<T, As...>::size() == Seqs::size()) && ... &&
533 (Sequence<T, As...>::size() == Sequence<T, Bs...>::size()))>> = 0>
534 static inline constexpr auto pick(Sequence<T, As...> const,
535 Sequence<T, Bs...> const, Seqs const...)
536 {
537 if constexpr(sizeof...(Seqs) == 0)
538 {
539 return Sequence<T, F()(As, Bs)...>();
540 }
541 else
542 {
543 return pick<F>(Sequence<T, F()(As, Bs)...>(), Seqs()...);
544 }
545 }
546
547 template<Index D, Index... Ds, class T, T... Is,
548 If<IsSatisfied<(sizeof...(Ds) < sizeof...(Is))>> = 0,
549 If<IsSatisfied<(max(D, Ds...) < sizeof...(Is))>> = 0,
550 If<IsUnique<Constant<Index, D>, Constant<Index, Ds>...>> = 0>
551 static inline constexpr auto chip(Sequence<T, Is...> const)
552 {
553 if constexpr(sizeof...(Ds) != 0)
554 {
555 return chip<((Ds < D) ? Ds : Ds - 1)...>(
557 }
558 else
559 {
561 makeRange<Index, D + 1, sizeof...(Is)>()),
562 [](auto const... seq)
563 {
565 });
566 }
567 }
568
569 template<class T, T... Is>
570 static inline constexpr auto chip(Sequence<T, Is...> const)
571 {
572 return Sequence<T, Is...>();
573 }
574
575 template<Index S, Index... Ss, class T, T... Is,
576 If<IsSatisfied<(sizeof...(Ss) < sizeof...(Is))>> = 0,
577 If<IsSatisfied<(max(S, Ss...) < sizeof...(Is))>> = 0,
578 If<IsUnique<Constant<Index, S>, Constant<Index, Ss>...>> = 0>
579 static inline constexpr auto select(Sequence<T, Is...> const)
580 {
581 if constexpr(sizeof...(Ss) != 0)
582 {
585 }
586 else
587 {
589 }
590 }
591
592 template<class T, T... Is>
593 static inline constexpr auto select(Sequence<T, Is...> const)
594 {
595 return Sequence<T>();
596 }
597
598 template<Index B, Index P, class T, T... Is,
599 If<IsSatisfied<(sizeof...(Is) % B == 0)>> = 0,
600 If<IsSatisfied<(P < B)>> = 0>
601 static inline constexpr auto cut(Sequence<T, Is...> const)
602 {
603 return expand(makeSeries<Index, sizeof...(Is) / B>() +
604 Constant<Index, P * sizeof...(Is) / B>(),
605 [](auto const... is)
606 {
608 });
609 }
610
611 template<Index I, Index L, class T, T... Is,
612 If<IsSatisfied<(L <= sizeof...(Is))>> = 0, If<IsSatisfied<(I < L)>> = 0>
613 static inline constexpr auto trim(Sequence<T, Is...> const)
614 {
616 [](auto const... is)
617 {
618 return select<is...>(Sequence<T, Is...>());
619 });
620 }
621
622 template<class F = Less, class T, T I, T... Is,
624 static inline constexpr auto sort(Sequence<T, I, Is...> const)
625 {
626 if constexpr(sizeof...(Is) == 0)
627 {
628 return Sequence<T, I>();
629 }
630 else if constexpr((F()(I, Is) && ...))
631 {
633 }
634 else
635 {
637 }
638 }
639
640 template<class T, T From, T... Froms, T To, T... Tos, T P, T... Ps,
641 If<IsSatisfied<(sizeof...(Froms) == sizeof...(Tos) &&
642 sizeof...(Froms) == sizeof...(Ps))>> = 0>
643 static inline constexpr auto getPermutation(
646 {
647 {
648 if constexpr(From != To)
649 {
652 }
653 else if constexpr(sizeof...(Froms) > 0)
654 {
655 return (Sequence<T, P>(),
658 }
659 else
660 {
661 return Sequence<T, P>();
662 }
663 }
664 }
665
666 template<class T, T... Froms, T... Tos,
667 If<IsSatisfied<(sizeof...(Froms) == sizeof...(Tos))>> = 0>
668 static inline constexpr auto getPermutation(Sequence<T, Froms...> const,
670 {
673 }
674
675 template<class T, T... Froms>
676 static inline constexpr auto getPermutation(Sequence<T, Froms...> const)
677 {
680 }
681
682 template<class T, T N, T... Ps>
683 static inline constexpr auto integerFactorization(Constant<T, N> const,
685 {
686 constexpr auto P = []()
687 {
688 if(N == 0)
689 {
690 return T(0);
691 }
692
693 if(N % 2 == 0)
694 {
695 return T(2);
696 }
697
698 for(T i = 3; i <= iSqrt(N); i += 2)
699 {
700 if(N % i == 0)
701 {
702 return i;
703 }
704 }
705
706 return N;
707 }();
708
709 if constexpr(P == N)
710 {
711 return Sequence<T, Ps..., N>();
712 }
713 else
714 {
717 }
718 }
719}
720#endif // pRC_CORE_BASIC_SEQUENCE_H
pRC::Size const D
Definition CalculatePThetaTests.cpp:9
Definition type_traits.hpp:49
Definition sequence.hpp:56
constexpr Sequence()=default
static constexpr auto value(Index const index)
Definition sequence.hpp:77
constexpr Sequence & operator=(Sequence const &) &=default
Size Type
Definition sequence.hpp:73
static constexpr auto size()
Definition sequence.hpp:88
constexpr Sequence(Sequence &&)=default
Constant< Size, sizeof...(Ns)> Dimension
Definition sequence.hpp:74
constexpr Sequence & operator=(Sequence &&) &=default
static constexpr auto size(Index const index)
Definition sequence.hpp:82
constexpr Sequence(std::integer_sequence< Size, Ns... > const)
Definition sequence.hpp:100
Constant< Bool, linearizable()> IsLinearizable
Definition sequence.hpp:75
constexpr Sequence(Sequence const &)=default
Definition sequence.hpp:34
constexpr Sequence(Sequence const &)=default
static constexpr auto value(Index const index)
Definition sequence.hpp:39
Constant< Size, sizeof...(Seq)> Dimension
Definition sequence.hpp:37
~Sequence()=default
constexpr Sequence & operator=(Sequence &&) &=default
constexpr Sequence(Sequence &&)=default
constexpr Sequence()=default
constexpr Sequence(std::integer_sequence< T, Seq... > const)
Definition sequence.hpp:51
constexpr Sequence & operator=(Sequence const &) &=default
TN::Subscripts S
Definition externs_nonTT.hpp:9
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition cholesky.hpp:18
static constexpr auto select(Sequence< T, Is... > const)
Definition sequence.hpp:579
bool Bool
Definition type_traits.hpp:18
static constexpr auto reduce(Sequence< T, I1, I2, Is... > const)
Definition sequence.hpp:416
static constexpr auto rotate(Sequence< T, First, Is... > const)
Definition sequence.hpp:460
static constexpr auto integerFactorization(Constant< T, N > const, Sequence< T, Ps... > const =Sequence< T >())
Definition sequence.hpp:683
static constexpr auto operator<(X &&a, Zero<> const)
Definition less.hpp:12
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
static constexpr T iSqrt(T const a)
Definition isqrt.hpp:12
Size Index
Definition type_traits.hpp:21
std::size_t Size
Definition type_traits.hpp:20
static constexpr auto makeSeriesFor()
Definition sequence.hpp:357
static constexpr auto reverse(Direction const D)
Definition direction.hpp:24
static constexpr auto filter(Sequence< T, Is... > const)
Definition sequence.hpp:507
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
static constexpr auto zip(Sequence< T, Is... > const, Seqs const ...)
Definition sequence.hpp:491
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr auto operator-(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:132
static constexpr auto pick(Sequence< T, As... > const, Sequence< T, Bs... > const, Seqs const ...)
Definition sequence.hpp:534
static constexpr auto operator*(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:311
static constexpr auto operator%(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:184
static constexpr auto cut(Sequence< T, Is... > const)
Definition sequence.hpp:601
static constexpr auto makeRange()
Definition sequence.hpp:379
static constexpr auto operator,(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:204
static constexpr void sort(C const &compare, T &a, Size const k=T::size(), Size const d=0)
Definition sort.hpp:15
static constexpr auto makeSeries()
Definition sequence.hpp:351
static constexpr auto operator/(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:169
static constexpr auto operator!=(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:304
static constexpr auto operator>(X &&a, Zero<> const)
Definition greater.hpp:12
static constexpr auto permute(Sequence< T, Is... > const)
Definition sequence.hpp:440
std::integral_constant< T, V > Constant
Definition type_traits.hpp:34
static constexpr auto operator==(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:297
static constexpr auto trim(Sequence< T, Is... > const)
Definition sequence.hpp:613
static constexpr auto operator+(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:110
static constexpr auto operator>=(X &&a, Zero<> const)
Definition greater_equal.hpp:12
Sequence(std::integer_sequence< T, Seq... > const) -> Sequence< T, Seq... >
Direction
Definition direction.hpp:9
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:551
static constexpr auto getPermutation(Sequence< T, From, Froms... > const, Sequence< T, To, Tos... > const, Sequence< T, P, Ps... > const)
Definition sequence.hpp:643
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:344
static constexpr auto operator<=(X &&a, Zero<> const)
Definition less_equal.hpp:12
std::is_invocable< F, Args... > IsInvocable
Definition type_traits.hpp:134
static constexpr X max(X &&a)
Definition max.hpp:13
Definition limits.hpp:13