DUNE-ACFEM (unstable)

insertat.hh
1#ifndef __DUNE_ACFEM_MPL_INSERTAT_HH__
2#define __DUNE_ACFEM_MPL_INSERTAT_HH__
3
4#include "sort.hh"
5#include "permutation.hh"
6
7namespace Dune {
8
9 namespace ACFem {
10
31 namespace {
32
33 // Helper for sequence insertAt() alike
34 template<class Out, class Input, class Inject, class Pos, bool AssumeSorted = true, class SFINAE = void>
35 struct InsertAtHelper;
36
37 // Inject data at current position
38 template<class T, class Input, class Inject, class Pos>
39 struct InsertAtHelper<Sequence<T>, Input, Inject, Pos, false>
40 {
41 using Sort = SortSequence<Pos>;
42 using SortedInject = PermuteSequence<Inject, typename Sort::Permutation>;
43 using SortedPos = typename Sort::Result;
44 using Type = typename InsertAtHelper<Sequence<T>, Input, SortedInject, SortedPos>::Type;
45 };
46
47 // Inject data at current position
48 template<class T, T... Out,
49 class Input,
50 T FrontInject, T... RestInject,
51 std::size_t FrontPos, std::size_t... RestPos>
52 struct InsertAtHelper<Sequence<T, Out...>, Input, Sequence<T, FrontInject, RestInject...>, IndexSequence<FrontPos, RestPos...>,
53 true,
54 std::enable_if_t<sizeof...(Out) == FrontPos> >
55 {
56 using Type = typename InsertAtHelper<Sequence<T, Out..., FrontInject>, Input, Sequence<T, RestInject...>, IndexSequence<RestPos...> >::Type;
57 };
58
59 // Still data to inject, but not at this position
60 template<class T, T... Out,
61 T FrontInput, T... RestInput,
62 class Inject,
63 std::size_t FrontPos, std::size_t... RestPos>
64 struct InsertAtHelper<Sequence<T, Out...>,
65 Sequence<T, FrontInput, RestInput...>,
66 Inject,
67 IndexSequence<FrontPos, RestPos...>,
68 true,
69 std::enable_if_t<(sizeof...(Out) < FrontPos)> >
70 {
71 using Type = typename InsertAtHelper<Sequence<T, Out..., FrontInput>, Sequence<T, RestInput...>, Inject, IndexSequence<FrontPos, RestPos...> >::Type;
72 };
73
74 // Recursion end-point: nothing more to inject, just copy over old data.
75 template<class Out, class Input, class Pos>
76 struct InsertAtHelper<Out, Input, Sequence<typename Input::value_type>, Pos>
77 {
78 using Type = SequenceCat<Out, Input>;
79 };
80 }
81
86 template<class Input, class Inject, class Pos, bool AssumeSorted = true>
87 using InsertAt = typename InsertAtHelper<Sequence<typename Input::value_type>, Input, Inject, Pos, AssumeSorted>::Type;
88
90
92
94
95 } // ACFem::
96
97} // Dune::
98
99#endif // __DUNE_ACFEM_MPL_INSERTAT_HH__
typename InsertAtHelper< Sequence< typename Input::value_type >, Input, Inject, Pos, AssumeSorted >::Type InsertAt
Insert Inject into the sequence Input at the position specified by Pos.
Definition: insertat.hh:87
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
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)