It is quite common to want to combine 2 existing DiscreteDomain types into an extended DiscreteDomain. E.g. from DiscreteDomain<GridBatch1, GridBatch2> and DiscreteDomain<OperatorDim1, OperatorDim2> I would like to obtain a DiscreteDomain<GridBatch1, GridBatch2, OperatorDim1, OperatorDim2>. Currently to achieve this we need to transit via TypeSeq objects:
using BatchedDomain = ddc::detail::convert_type_seq_to_discrete_domain_t<type_seq_cat_t<ddc::to_type_seq_t<BatchDomain>, ddc::to_type_seq_t<OperatorDomain>>>;
It would be nice to have an operator which can do this. This could be implemented as above or more generally
Example implementation
template <class... Containers>
struct Combine;
template <class Container>
struct Combine<Container>
{
using type = Container;
};
template <
template <typename...>
class Container,
class... Tags,
class... OTags,
class... TailContainers>
struct Combine<Container<Tags...>, Container<OTags...>, TailContainers...>
{
using type = Combine<Container<Tags..., OTags...>, TailContainers...>::type;
};
/**
* @brief A helper structure to determine the type when combining tags across containers.
*
* E.g. combine_t<Idx<Tag1>, Idx<Tag2>> == Idx<Tag1, Tag2>
*
* @tparam Containers The containers that should be combined. They should differ only in the tags.
*/
template <class... Containers>
using combine_t = typename detail::Combine<Containers...>::type;
The advantage of the general method is that it can also be used for DiscreteElement and DiscreteVector. It is rare to need to combine these without also needing to combine a DiscreteDomain (from which the element and vector can be extracted) but this does happen.
It is quite common to want to combine 2 existing
DiscreteDomaintypes into an extendedDiscreteDomain. E.g. fromDiscreteDomain<GridBatch1, GridBatch2>andDiscreteDomain<OperatorDim1, OperatorDim2>I would like to obtain aDiscreteDomain<GridBatch1, GridBatch2, OperatorDim1, OperatorDim2>. Currently to achieve this we need to transit viaTypeSeqobjects:It would be nice to have an operator which can do this. This could be implemented as above or more generally
Example implementation
The advantage of the general method is that it can also be used for
DiscreteElementandDiscreteVector. It is rare to need to combine these without also needing to combine aDiscreteDomain(from which the element and vector can be extracted) but this does happen.