6#include "TTauri/Foundation/assert.hpp"
8#include "TTauri/Foundation/strings.hpp"
18using string_tag = tt5_64;
19using string_ltag = tt5_128;
23constexpr string_tag
operator""_tag(
char const *str,
size_t)
noexcept
25 return tt5_encode<string_tag>(str);
30constexpr string_ltag
operator""_ltag(
char const *str,
size_t)
noexcept
32 return tt5_encode<string_ltag>(str);
38 ttlet split_name = split(long_name,
"::"s);
39 if (ssize(split_name) != 0) {
40 ttlet &last_name = split_name.back();
41 if (ends_with(last_name,
"_tag"s)) {
42 return last_name.substr(0, ssize(last_name) - 4);
57template<
typename Head,
typename... Tail>
60 if constexpr (
sizeof...(Tail) > 0) {
61 return index == 0 ?
std::type_index(
typeid(Head)) : tag_at_index_impl<Tail...>(index - 1);
70template<
typename... Tags>
73 if constexpr (
sizeof...(Tags) > 0) {
74 return tag_at_index_impl<Tags...>(index);
80template<
typename Head,
typename... Tail>
83 if constexpr (
sizeof...(Tail) > 0) {
84 return tag ==
std::type_index(
typeid(Head)) ? index : index_of_tag_impl<Tail...>(tag, index + 1);
93template<
typename... Tags>
96 if constexpr (
sizeof...(Tags) > 0) {
97 return index_of_tag_impl<Tags...>(tag, 0);
103template<
typename Needle,
typename Head,
typename... Tail>
104constexpr size_t index_of_tag_impl(
size_t index)
noexcept
106 if constexpr (
sizeof...(Tail) > 0) {
107 return std::is_same_v<Needle,Head> ? index : index_of_tag_impl<Needle,Tail...>(index + 1);
109 return std::is_same_v<Needle,Head> ? index : index + 1;
116template<
typename Needle,
typename... Haystack>
117constexpr size_t index_of_tag() noexcept
119 if constexpr (
sizeof...(Haystack) > 0) {
120 return index_of_tag_impl<Needle, Haystack...>(0);
126template<
typename Needle,
typename... Haystack>
127constexpr bool has_tag() noexcept {
128 return index_of_tag<Needle, Haystack...>() <
sizeof...(Haystack);
131template<
typename... Haystack>
133 return index_of_tag<Haystack...>(needle) <
sizeof...(Haystack);
TT5 A 5 bit code designed for encoding identifiers.