15#include <dune/functions/functionspacebases/compositebasis.hh>
16#include <dune/functions/functionspacebases/powerbasis.hh>
17#include <dune/functions/functionspacebases/subspacebasis.hh>
19namespace Ikarus::Vtk::Impl {
21template <
typename Container>
22constexpr auto sizeOfContainer = []() {
23 if constexpr (
requires { std::tuple_size<Container>::value; })
24 return std::tuple_size<Container>::value;
29template <
class PreBasis>
30struct ResultContainerPre
38 using type = ResultContainerPre<typename Basis::PreBasis>::type;
42template <
class IMS,
class... SPB>
43struct ResultContainerPre<
Dune::Functions::CompositePreBasis<IMS, SPB...>>
45 using SubPreBases = std::tuple<SPB...>;
46 using FirstBasis = std::tuple_element_t<0, SubPreBases>;
48 static constexpr size_t size =
sizeof...(SPB);
49 using type = std::array<typename ResultContainerPre<FirstBasis>::type, size>;
53template <
class PreBasis,
class PP>
54struct ResultContainerSSB
59template <
class PP,
class IMS,
class... SPB>
60struct ResultContainerSSB<
Dune::Functions::CompositePreBasis<IMS, SPB...>, PP>
62 using SubPreBases = std::tuple<SPB...>;
63 using Basis = std::tuple_element_t<PP{}.template get<0>(), SubPreBases>;
65 using type = ResultContainerPre<Basis>::type;
69template <
class RB,
class PP>
70struct ResultContainer<
Dune::Functions::SubspaceBasis<RB, PP>>
72 using RBPre = RB::PreBasis;
74 using type = ResultContainerSSB<RBPre, PP>::type;
78using ResultContainer_t =
typename ResultContainer<Basis>::type;
81template <
class IMS,
class SPB, std::
size_t size>
82struct ResultContainerPre<
Dune::Functions::PowerPreBasis<IMS, SPB, size>>
84 using type = std::array<typename ResultContainerPre<SPB>::type, size>;
Definition: utils/dirichletvalues.hh:35