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