ident.hpp 799 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #ifndef ENTT_IDENT_HPP
  2. #define ENTT_IDENT_HPP
  3. #include<type_traits>
  4. #include<cstddef>
  5. #include<utility>
  6. namespace entt {
  7. namespace details {
  8. template<typename Type>
  9. struct Wrapper {
  10. using type = Type;
  11. constexpr Wrapper(std::size_t index): index{index} {}
  12. const std::size_t index;
  13. };
  14. template<typename... Types>
  15. struct Identifier final: Wrapper<Types>... {
  16. template<std::size_t... Indexes>
  17. constexpr Identifier(std::index_sequence<Indexes...>): Wrapper<Types>{Indexes}... {}
  18. template<typename Type>
  19. constexpr std::size_t get() const { return Wrapper<std::decay_t<Type>>::index; }
  20. };
  21. }
  22. template<typename... Types>
  23. constexpr auto ident = details::Identifier<std::decay_t<Types>...>{std::make_index_sequence<sizeof...(Types)>{}};
  24. }
  25. #endif // ENTT_IDENT_HPP