Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

96 řádky
3.4 KiB

  1. #pragma once
  2. #include <ecs/config.h>
  3. #include <ecs/tag/system.h>
  4. #include <ecs/signature/system.h>
  5. beg_namespace_ecs_signature_list_system
  6. {
  7. namespace __impl
  8. {
  9. template<typename... T_system_signatures>
  10. struct signature_list_t
  11. {
  12. public:
  13. core::mp::list::type<T_system_signatures...> items;
  14. public: /* misc */
  15. constexpr decltype(auto) size() const noexcept
  16. { return hana::size(items); }
  17. public: /* get */
  18. template<typename T_system_tag>
  19. constexpr decltype(auto) get_by_tag(T_system_tag st) const noexcept
  20. {
  21. static_assert(decltype(tag::system::is_valid(st)) { });
  22. using namespace ::ecs::core::mp;
  23. return *hana::find_if(items, [](auto ssig){
  24. using is_same_type = std::is_same<
  25. decay_t<decltype(unwrapped(ssig).tag())>,
  26. decay_t<decltype(st)>>;
  27. return is_same_type { };
  28. });
  29. }
  30. template<typename T_system>
  31. constexpr decltype(auto) get_by_type(T_system) const noexcept
  32. {
  33. using system_type = typename core::mp::decay_t<T_system>::type;
  34. return get_by_tag(tag::system::value<system_type>);
  35. }
  36. template<typename T_system>
  37. constexpr decltype(auto) get_by_type() const noexcept
  38. { return get_by_tag(tag::system::value<T_system>); }
  39. template<typename T_index>
  40. constexpr decltype(auto) get_by_index(T_index index) const noexcept
  41. { return hana::at(items, index); }
  42. public: /* id */
  43. template<typename T_system_signature>
  44. constexpr decltype(auto) id_by_signature(T_system_signature ssig) const noexcept
  45. { return core::mp::list::index_of(items, ssig); }
  46. template<typename T_system>
  47. constexpr decltype(auto) id_by_type() const noexcept
  48. { return id_by_signature(get_by_type<T_system>()); }
  49. template<typename T_system_tag>
  50. constexpr decltype(auto) id_by_tag(T_system_tag st) const noexcept
  51. { return id_by_signature(signature_by_tag(st)); }
  52. };
  53. struct make_t
  54. {
  55. template<typename... T_system_signatures>
  56. constexpr decltype(auto) operator()(T_system_signatures... sss) const noexcept
  57. {
  58. using namespace ::ecs::core::mp;
  59. static_assert(
  60. decltype(signature::system::is_valid(sss...)) { },
  61. "system::signature_list::make() needs a list of system signatures");
  62. return signature_list_t<hana::type<core::mp::decay_t<T_system_signatures>>...> { };
  63. }
  64. };
  65. struct is_valid_t
  66. {
  67. template<typename T_system_signature_list>
  68. constexpr decltype(auto) operator()(T_system_signature_list&& ssl) const noexcept
  69. {
  70. return hana::all_of(
  71. hana::transform(
  72. std::forward<T_system_signature_list>(ssl).items, core::mp::unwrap),
  73. signature::system::is_valid);
  74. }
  75. };
  76. }
  77. constexpr decltype(auto) make = __impl::make_t { };
  78. constexpr decltype(auto) is_valid = __impl::is_valid_t { };
  79. }
  80. end_namespace_ecs_signature_list_system