pRC
multi-purpose Tensor Train library for C++
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
352 template<class T, T... Seq, class F, class... Xs,
353 If<IsInvocable<F, Xs..., Constant<T, Seq>...>> = 0>
354 static inline constexpr decltype(auto) expand(Sequence<T, Seq...> const,
355 F &&f, Xs &&...args)
356 {
357 return forward<F>(f)(forward<Xs>(args)..., Constant<T, Seq>()...);
358 }
359
360 template<class T, T N>
361 static inline constexpr auto makeSeries()
362 {
363 return Sequence(std::make_integer_sequence<T, N>());
364 }
365
366 template<class T>
367 static inline constexpr auto makeSeriesFor()
368 {
369 return Sequence<T>();
370 }
371
372 template<class T, class... Ts, If<IsSatisfied<(sizeof...(Ts) > 0)>> = 0>
373 static inline constexpr auto makeSeriesFor()
374 {
375 return makeSeries<T, sizeof...(Ts)>();
376 }
377
378 template<class T, auto... Ts, If<IsSatisfied<(sizeof...(Ts) > 0)>> = 0>
379 static inline constexpr auto makeSeriesFor()
380 {
381 return makeSeries<T, sizeof...(Ts)>();
382 }
383
384 template<class T, T First, T Last, Direction D = Direction::Forwards,
385 T Step = T(1),
388 If<IsSatisfied<((Last - First) % Step == 0)>> = 0>
389 static inline constexpr auto makeRange()
390 {
391 if constexpr(First > Last)
392 {
393 return Sequence<T>();
394 }
395 else
396 {
397 if constexpr(D == Direction::Forwards)
398 {
399 return makeSeries<T, (Last - First) / Step>() *
402 }
403 if constexpr(D == Direction::Backwards)
404 {
405 return reverse(
407 }
408 }
409 }
410
411 template<class T, Size N, T V>
412 static inline constexpr auto makeConstantSequence()
413 {
414 if constexpr(N == 0)
415 {
416 return Sequence<T>();
417 }
418 else
419 {
420 return Sequence<T, V>(), makeConstantSequence<T, N - Size(1), V>();
421 }
422 }
423
424 template<class F, class T, T I1, T I2, T... Is,
426 static inline constexpr auto reduce(Sequence<T, I1, I2, Is...> const)
427 {
428 constexpr auto I = F()(I1, I2);
429
430 if constexpr(sizeof...(Is) == 0)
431 {
432 return I;
433 }
434 else
435 {
437 }
438 }
439
440 template<class F, class T, T I>
441 static inline constexpr auto reduce(Sequence<T, I> const)
442 {
443 return I;
444 }
445
446 template<Index... Ps, class T, T... Is,
447 If<IsSatisfied<(sizeof...(Is) == sizeof...(Ps))>> = 0,
448 If<IsSatisfied<((Ps < sizeof...(Is)) && ...)>> = 0,
450 static inline constexpr auto permute(Sequence<T, Is...> const)
451 {
453 }
454
455 template<class T, T... Is>
456 static inline constexpr auto reverse(Sequence<T, Is...> const)
457 {
459 [](auto const... is)
460 {
461 return Sequence<T,
463 sizeof...(is) - Size(1) - is)...>();
464 });
465 }
466
467 template<Direction D, Size Step, class T, T First, T... Is,
470 static inline constexpr auto rotate(Sequence<T, First, Is...> const)
471 {
472 if constexpr(D == Direction::Leftwards)
473 {
474 if constexpr(Step == 0)
475 {
476 return Sequence<T, First, Is...>();
477 }
478 else
479 {
480 return rotate<D, Step - Size(1)>(Sequence<T, Is..., First>());
481 }
482 }
483 if constexpr(D == Direction::Rightwards)
484 {
487 }
488 }
489
490 template<Direction D, Size Step, class T,
493 static inline constexpr auto rotate(Sequence<T> const)
494 {
495 return Sequence<T>();
496 }
497
498 template<Index O = 0, class T, T... Is, class... Seqs,
499 If<IsSatisfied<((Sequence<T, Is...>::size() == Seqs::size()) && ...)>> =
500 0>
501 static inline constexpr auto zip(Sequence<T, Is...> const, Seqs const...)
502 {
503 using S = Sequence<T, Is...>;
504
505 if constexpr(O < S::size() - 1)
506 {
507 return (Sequence<T, S::value(O), Seqs::value(O)...>(),
508 zip<O + 1>(S(), Seqs()...));
509 }
510 else
511 {
512 return Sequence<T, S::value(O), Seqs::value(O)...>();
513 }
514 }
515
516 template<class F, class T, T... Is>
517 static inline constexpr auto filter(Sequence<T, Is...> const)
518 {
519 if constexpr(sizeof...(Is) == 0)
520 {
521 return Sequence<T>();
522 }
523 else if constexpr(sizeof...(Is) == 1)
524 {
525 if constexpr(F()(Is...))
526 {
527 return Sequence<T, Is...>();
528 }
529 else
530 {
531 return Sequence<T>();
532 }
533 }
534 else
535 {
536 return (filter<F>(Sequence<T, Is>()), ...);
537 }
538 }
539
540 template<class F, class T, T... As, T... Bs, class... Seqs,
542 If<IsSatisfied<((Sequence<T, As...>::size() == Seqs::size()) && ... &&
543 (Sequence<T, As...>::size() == Sequence<T, Bs...>::size()))>> = 0>
544 static inline constexpr auto pick(Sequence<T, As...> const,
545 Sequence<T, Bs...> const, Seqs const...)
546 {
547 if constexpr(sizeof...(Seqs) == 0)
548 {
549 return Sequence<T, F()(As, Bs)...>();
550 }
551 else
552 {
553 return pick<F>(Sequence<T, F()(As, Bs)...>(), Seqs()...);
554 }
555 }
556
557 template<Index D, Index... Ds, class T, T... Is,
558 If<IsSatisfied<(sizeof...(Ds) < sizeof...(Is))>> = 0,
559 If<IsSatisfied<(max(D, Ds...) < sizeof...(Is))>> = 0,
561 static inline constexpr auto chip(Sequence<T, Is...> const)
562 {
563 if constexpr(sizeof...(Ds) != 0)
564 {
565 return chip<((Ds < D) ? Ds : Ds - 1)...>(
567 }
568 else
569 {
571 makeRange<Index, D + 1, sizeof...(Is)>()),
572 [](auto const... seq)
573 {
575 });
576 }
577 }
578
579 template<class T, T... Is>
580 static inline constexpr auto chip(Sequence<T, Is...> const)
581 {
582 return Sequence<T, Is...>();
583 }
584
585 template<Index S, Index... Ss, class T, T... Is,
586 If<IsSatisfied<(sizeof...(Ss) < sizeof...(Is))>> = 0,
587 If<IsSatisfied<(max(S, Ss...) < sizeof...(Is))>> = 0,
589 static inline constexpr auto select(Sequence<T, Is...> const)
590 {
591 if constexpr(sizeof...(Ss) != 0)
592 {
595 }
596 else
597 {
599 }
600 }
601
602 template<class T, T... Is>
603 static inline constexpr auto select(Sequence<T, Is...> const)
604 {
605 return Sequence<T>();
606 }
607
608 template<Index B, Index P, class T, T... Is,
609 If<IsSatisfied<(sizeof...(Is) % B == 0)>> = 0,
610 If<IsSatisfied<(P < B)>> = 0>
611 static inline constexpr auto cut(Sequence<T, Is...> const)
612 {
613 return expand(makeSeries<Index, sizeof...(Is) / B>() +
614 Constant<Index, P * sizeof...(Is) / B>(),
615 [](auto const... is)
616 {
618 });
619 }
620
621 template<Index I, Index L, class T, T... Is,
622 If<IsSatisfied<(L <= sizeof...(Is))>> = 0, If<IsSatisfied<(I < L)>> = 0>
623 static inline constexpr auto trim(Sequence<T, Is...> const)
624 {
626 [](auto const... is)
627 {
628 return select<is...>(Sequence<T, Is...>());
629 });
630 }
631
632 template<class F = Less, class T, T I, T... Is,
634 static inline constexpr auto sort(Sequence<T, I, Is...> const)
635 {
636 if constexpr(sizeof...(Is) == 0)
637 {
638 return Sequence<T, I>();
639 }
640 else if constexpr((F()(I, Is) && ...))
641 {
643 }
644 else
645 {
647 }
648 }
649
650 template<class T, T From, T... Froms, T To, T... Tos, T P, T... Ps,
651 If<IsSatisfied<(sizeof...(Froms) == sizeof...(Tos) &&
652 sizeof...(Froms) == sizeof...(Ps))>> = 0>
653 static inline constexpr auto getPermutation(
656 {
657 {
658 if constexpr(From != To)
659 {
662 }
663 else if constexpr(sizeof...(Froms) > 0)
664 {
665 return (Sequence<T, P>(),
668 }
669 else
670 {
671 return Sequence<T, P>();
672 }
673 }
674 }
675
676 template<class T, T... Froms, T... Tos,
677 If<IsSatisfied<(sizeof...(Froms) == sizeof...(Tos))>> = 0>
678 static inline constexpr auto getPermutation(Sequence<T, Froms...> const,
680 {
683 }
684
685 template<class T, T... Froms>
686 static inline constexpr auto getPermutation(Sequence<T, Froms...> const)
687 {
690 }
691
692 template<class T, T N, T... Ps>
693 static inline constexpr auto integerFactorization(Constant<T, N> const,
695 {
696 constexpr auto P = []()
697 {
698 if(N == 0)
699 {
700 return T(0);
701 }
702
703 if(N % 2 == 0)
704 {
705 return T(2);
706 }
707
708 for(T i = 3; i <= iSqrt(N); i += 2)
709 {
710 if(N % i == 0)
711 {
712 return i;
713 }
714 }
715
716 return N;
717 }();
718
719 if constexpr(P == N)
720 {
721 return Sequence<T, Ps..., N>();
722 }
723 else
724 {
727 }
728 }
729}
730#endif // pRC_CORE_BASIC_SEQUENCE_H
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
T Type
Definition sequence.hpp:36
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
Definition cholesky.hpp:18
static constexpr auto select(Sequence< T, Is... > const)
Definition sequence.hpp:589
static constexpr auto reduce(Sequence< T, I1, I2, Is... > const)
Definition sequence.hpp:426
static constexpr auto rotate(Sequence< T, First, Is... > const)
Definition sequence.hpp:470
static constexpr auto integerFactorization(Constant< T, N > const, Sequence< T, Ps... > const =Sequence< T >())
Definition sequence.hpp:693
static constexpr auto operator<(X &&a, Zero<> const)
Definition less.hpp:12
bool Bool
Definition type_traits.hpp:18
static constexpr auto makeConstantSequence()
Definition sequence.hpp:412
static constexpr T iSqrt(T const a)
Definition isqrt.hpp:12
static constexpr auto makeSeriesFor()
Definition sequence.hpp:367
static constexpr auto reverse(Direction const D)
Definition direction.hpp:24
static constexpr auto filter(Sequence< T, Is... > const)
Definition sequence.hpp:517
static constexpr auto zip(Sequence< T, Is... > const, Seqs const ...)
Definition sequence.hpp:501
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
std::size_t Size
Definition type_traits.hpp:20
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:544
static constexpr auto operator*(JacobiRotation< TA > const &a, JacobiRotation< TB > const &b)
Definition jacobi_rotation.hpp:311
std::is_invocable< F, Args... > IsInvocable
Definition type_traits.hpp:134
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:611
static constexpr auto makeRange()
Definition sequence.hpp:389
std::integral_constant< T, V > Constant
Definition type_traits.hpp:34
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:361
static constexpr auto operator/(Sequence< T, As... > const, Sequence< T, Bs... > const)
Definition sequence.hpp:169
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
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:450
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:623
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
Direction
Definition direction.hpp:9
static constexpr auto chip(Sequence< T, Is... > const)
Definition sequence.hpp:561
static constexpr auto getPermutation(Sequence< T, From, Froms... > const, Sequence< T, To, Tos... > const, Sequence< T, P, Ps... > const)
Definition sequence.hpp:653
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
forwards the values in a pRC::Sequence to a function as parameters
Definition sequence.hpp:354
static constexpr auto operator<=(X &&a, Zero<> const)
Definition less_equal.hpp:12
Size Index
Definition type_traits.hpp:21
static constexpr X max(X &&a)
Definition max.hpp:13
Definition limits.hpp:13