8 #include "Utilities/TypeTraits/IsA.hpp"
17 template <
typename TagsList>
27 template <
template <
typename...>
class Wrapper,
typename TagList,
30 tmpl::transform<TagList, tmpl::bind<Wrapper, tmpl::_1, tmpl::pin<Args>...>>;
33 template <
template <
typename...>
class Prefix,
typename Tag,
typename... Args>
34 struct add_tag_prefix_impl {
35 using type = Prefix<Tag, Args...>;
38 template <
template <
typename...>
class Prefix,
typename TagList,
40 struct add_tag_prefix_impl<Prefix, Tags::Variables<TagList>, Args...> {
49 template <
template <
typename...>
class Prefix,
typename Tag,
typename... Args>
51 typename detail::add_tag_prefix_impl<Prefix, Tag, Args...>::type;
55 struct remove_tag_prefix_impl;
57 template <
typename WrappedTag,
template <
typename...>
class Prefix,
59 struct remove_tag_prefix_impl<Prefix<WrappedTag, Args...>> {
60 using type = WrappedTag;
63 template <
typename TagList>
64 struct remove_tag_prefix_impl<Tags::Variables<TagList>> {
66 tmpl::transform<TagList, remove_tag_prefix_impl<tmpl::_1>>>;
73 template <
typename Tag>
78 template <
typename Tag,
typename = std::
nullptr_t>
79 struct remove_all_prefixes_impl {
83 template <
typename Tag>
84 struct remove_all_prefixes_impl<
85 Tag,
Requires<std::is_base_of_v<db::PrefixTag, Tag>>> {
86 using type =
typename remove_all_prefixes_impl<typename Tag::tag>::type;
89 template <
typename TagList>
90 struct remove_all_prefixes_impl<Tags::Variables<TagList>> {
92 tmpl::transform<TagList, remove_all_prefixes_impl<tmpl::_1>>>;
99 template <
typename Tag>
101 typename detail::remove_all_prefixes_impl<Tag>::type;