sandbox
Loading...
Searching...
No Matches
component.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_ECS_COMPONENT_HPP_
3#define LIBSBX_ECS_COMPONENT_HPP_
4
5#include <type_traits>
6
7namespace sbx::ecs {
8
9namespace detail {
10
11template<typename Type, typename = void>
12struct in_place_delete: std::bool_constant<!(std::is_move_constructible_v<Type> && std::is_move_assignable_v<Type>)> { };
13
14template<>
15struct in_place_delete<void>: std::false_type { };
16
17template<typename Type>
18struct in_place_delete<Type, std::enable_if_t<Type::in_place_delete>> : std::true_type { };
19
20template<typename Type, typename = void>
21struct page_size: std::integral_constant<std::size_t, !std::is_empty_v<Type> * 1024u> { };
22
23template<>
24struct page_size<void>: std::integral_constant<std::size_t, 0u> { };
25
26template<typename Type>
27struct page_size<Type, std::void_t<decltype(Type::page_size)>> : std::integral_constant<std::size_t, Type::page_size> { };
28
29} // namespace detail
30
31template<typename Type, typename Entity>
32requires (std::is_same_v<std::decay_t<Type>, Type>)
34
35 using element_type = Type;
36 using entity_type = Entity;
37
38 static constexpr bool in_place_delete = detail::in_place_delete<Type>::value;
39 static constexpr std::size_t page_size = detail::page_size<Type>::value;
40
41}; // struct component_traits
42
43} // namespace sbx::ecs
44
45#endif // LIBSBX_ECS_COMPONENT_HPP_
Definition: component.hpp:33
Definition: component.hpp:12
Definition: component.hpp:21