🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.6 KiB

  1. #ifndef ENTT_ENTITY_COMPONENT_HPP
  2. #define ENTT_ENTITY_COMPONENT_HPP
  3. #include <cstddef>
  4. #include <type_traits>
  5. #include "../config/config.h"
  6. namespace entt {
  7. /**
  8. * @cond TURN_OFF_DOXYGEN
  9. * Internal details not to be documented.
  10. */
  11. namespace internal {
  12. template<typename, typename = void>
  13. struct in_place_delete: std::false_type {};
  14. template<typename Type>
  15. struct in_place_delete<Type, std::enable_if_t<Type::in_place_delete>>
  16. : std::true_type {};
  17. template<typename Type, typename = void>
  18. struct page_size: std::integral_constant<std::size_t, (ENTT_IGNORE_IF_EMPTY && std::is_empty_v<Type>) ? 0u : ENTT_PACKED_PAGE> {};
  19. template<typename Type>
  20. struct page_size<Type, std::enable_if_t<std::is_convertible_v<decltype(Type::page_size), std::size_t>>>
  21. : std::integral_constant<std::size_t, Type::page_size> {};
  22. } // namespace internal
  23. /**
  24. * Internal details not to be documented.
  25. * @endcond
  26. */
  27. /**
  28. * @brief Common way to access various properties of components.
  29. * @tparam Type Type of component.
  30. */
  31. template<typename Type, typename = void>
  32. struct component_traits {
  33. static_assert(std::is_same_v<std::decay_t<Type>, Type>, "Unsupported type");
  34. /*! @brief Pointer stability, default is `false`. */
  35. static constexpr bool in_place_delete = internal::in_place_delete<Type>::value;
  36. /*! @brief Page size, default is `ENTT_PACKED_PAGE` for non-empty types. */
  37. static constexpr std::size_t page_size = internal::page_size<Type>::value;
  38. };
  39. /**
  40. * @brief Helper variable template.
  41. * @tparam Type Type of component.
  42. */
  43. template<class Type>
  44. inline constexpr bool ignore_as_empty_v = (component_traits<Type>::page_size == 0u);
  45. } // namespace entt
  46. #endif