component.hpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. #include "fwd.hpp"
  7. namespace entt {
  8. /**
  9. * @cond TURN_OFF_DOXYGEN
  10. * Internal details not to be documented.
  11. */
  12. namespace internal {
  13. template<typename Type, typename = void>
  14. //struct in_place_delete : std::bool_constant<!(std::is_move_constructible_v<Type> &&std::is_move_assignable_v<Type>)> {};
  15. struct in_place_delete: std::true_type {}; // Modified so in_place_delete defaults to true
  16. template<>
  17. struct in_place_delete<void>: std::false_type {};
  18. template<typename Type>
  19. struct in_place_delete<Type, std::enable_if_t<Type::in_place_delete>>
  20. : std::true_type {};
  21. template<typename Type, typename = void>
  22. struct page_size: std::integral_constant<std::size_t, !std::is_empty_v<ENTT_ETO_TYPE(Type)> * ENTT_PACKED_PAGE> {};
  23. template<>
  24. struct page_size<void>: std::integral_constant<std::size_t, 0u> {};
  25. template<typename Type>
  26. struct page_size<Type, std::void_t<decltype(Type::page_size)>>
  27. : std::integral_constant<std::size_t, Type::page_size> {};
  28. } // namespace internal
  29. /**
  30. * Internal details not to be documented.
  31. * @endcond
  32. */
  33. /**
  34. * @brief Common way to access various properties of components.
  35. * @tparam Type Type of component.
  36. */
  37. template<typename Type, typename = void>
  38. struct component_traits {
  39. static_assert(std::is_same_v<std::decay_t<Type>, Type>, "Unsupported type");
  40. /*! @brief Component type. */
  41. using type = Type;
  42. /*! @brief Pointer stability, default is `false`. */
  43. static constexpr bool in_place_delete = internal::in_place_delete<Type>::value;
  44. /*! @brief Page size, default is `ENTT_PACKED_PAGE` for non-empty types. */
  45. static constexpr std::size_t page_size = internal::page_size<Type>::value;
  46. };
  47. } // namespace entt
  48. #endif