DUNE-ACFEM (unstable)

sequenceslice.hh
1#ifndef __DUNE_ACFEM_MPL_SEQUENCESLICE_HH__
2#define __DUNE_ACFEM_MPL_SEQUENCESLICE_HH__
3
4#include "../common/types.hh"
5#include "access.hh"
6
7namespace Dune::ACFem {
8
9 namespace MPL {
10
15 template<class Seq, std::size_t... Indices>
17
18 namespace {
19 template<class Seq, class Slice>
20 struct SliceExpander;
21
22 template<class Seq, std::size_t... Indices>
23 struct SliceExpander<Seq, IndexSequence<Indices...> >
24 {
26 };
27 }
28
31 template<class Seq, class SliceIndices>
32 using SequenceSlice = typename SliceExpander<Seq, SliceIndices>::Type;
33
37 namespace {
38
39 template<class Input, class Indices, class Output = Sequence<typename Input::value_type>, std::size_t N = 0, class SFINAE = void>
40 struct SequenceSliceComplementHelper;
41
42 // no match recursion
43 template<class T, T In0, T... In, class Output, std::size_t N, std::size_t... Indices>
44 struct SequenceSliceComplementHelper<
45 Sequence<T, In0, In...>,
46 IndexSequence<Indices...>,
47 Output, N,
48 std::enable_if_t<(... || (N == Indices))> >
49 {
50 using Type = typename SequenceSliceComplementHelper<
51 Sequence<T, In...>,
52 IndexSequence<Indices...>,
53 Output, N+1 >::Type;
54 };
55
56 // have match recursion
57 template<class T, T In0, T... In, T... Out, std::size_t N, std::size_t... Indices>
58 struct SequenceSliceComplementHelper<
59 Sequence<T, In0, In...>,
60 IndexSequence<Indices...>,
61 Sequence<T, Out...>, N,
62 std::enable_if_t<(... && (N != Indices))> >
63 {
64 using Type = typename SequenceSliceComplementHelper<
65 Sequence<T, In...>,
66 IndexSequence<Indices...>,
67 Sequence<T, Out..., In0>, N+1>::Type;
68 };
69
70 // recursion end-point
71 template<class T, class Indices, class Output, std::size_t N>
72 struct SequenceSliceComplementHelper<Sequence<T>, Indices, Output, N>
73 {
74 using Type = Output;
75 };
76
77 }
78
79 template<class Seq, class SliceIndices>
80 using SequenceSliceComplement = typename SequenceSliceComplementHelper<Seq, SliceIndices>::Type;
81
82 template<class Seq, std::size_t... Indices>
83 using SubSequenceComplement = typename SequenceSliceComplementHelper<Seq, IndexSequence<Indices...> >::Type;
84
85 namespace {
86
87 template<class Input, class Output = Sequence<typename Input::value_type> >
88 struct ReverseSequenceHelper;
89
90 template<class T, T I0, T... I, T... Out>
91 struct ReverseSequenceHelper<Sequence<T, I0, I...>, Sequence<T, Out...> >
92 : ReverseSequenceHelper<Sequence<T, I...>, Sequence<T, I0, Out...> >
93 {};
94
95 template<class T, class Output>
96 struct ReverseSequenceHelper<Sequence<T>, Output>
97 {
98 using Type = Output;
99 };
100
101 }
102
104 template<class Seq>
105 using ReverseSequence = typename ReverseSequenceHelper<Seq>::Type;
106
107 } // MPL::
108
109 using MPL::SequenceSlice;
110 using MPL::SequenceSliceComplement;
111 using MPL::SubSequence;
112 using MPL::SubSequenceComplement;
114
115} // Dune::ACFem::
116
117#endif // __DUNE_ACFEM_MPL_SEQUENCESLICE_HH__
Sequence< std::size_t, V... > IndexSequence
Sequence of std::size_t values.
Definition: types.hh:64
std::integer_sequence< T, V... > Sequence
Sequence of any type of integer values.
Definition: types.hh:56
Sequence< typename Seq::value_type, Get< Indices, Seq >::value... > SubSequence
Create a subsequence containing all values designated by the positions given by Indices.
Definition: sequenceslice.hh:16
typename SliceExpander< Seq, SliceIndices >::Type SequenceSlice
Like SubSequence, but take the indices from another sequence.
Definition: sequenceslice.hh:32
typename ReverseSequenceHelper< Seq >::Type ReverseSequence
Generate the reverse sequence.
Definition: sequenceslice.hh:105
A namespace encapsulating everything defined in our dune-acfem project.
Definition: ellipticfemscheme.hh:56
STL namespace.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Jun 19, 23:17, 2026)