Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

107 рядки
4.0 KiB

  1. #pragma once
  2. #include <ecs/config.h>
  3. #include <ecs/core/mp/list.h>
  4. #include <ecs/core/mp/option_map.h>
  5. #include "./system_storage.h"
  6. #include "./entity_storage.h"
  7. #include "./refresh_parallelism.h"
  8. #include "./scheduler.h"
  9. beg_namespace_ecs_settings
  10. {
  11. namespace keys
  12. {
  13. constexpr decltype(auto) component_signatures = hana::size_c<0>;
  14. constexpr decltype(auto) system_signatures = hana::size_c<1>;
  15. constexpr decltype(auto) system_storage = hana::size_c<2>;
  16. constexpr decltype(auto) entity_storage = hana::size_c<3>;
  17. constexpr decltype(auto) refresh_parallelism = hana::size_c<4>;
  18. constexpr decltype(auto) scheduler = hana::size_c<5>;
  19. }
  20. namespace __impl
  21. {
  22. template<typename T_options>
  23. struct settings_t
  24. {
  25. private:
  26. template<typename T_key, typename T_value>
  27. constexpr decltype(auto) change(const T_key& key, T_value&& value) const noexcept
  28. {
  29. auto new_options = T_options { }.set(key, std::forward<T_value>(value));
  30. return settings_t<core::mp::decay_t<decltype(new_options)>> { };
  31. }
  32. template<typename T_key>
  33. constexpr decltype(auto) get(const T_key& key) const noexcept
  34. { return T_options { }.at(key); }
  35. public: /* getter */
  36. constexpr decltype(auto) component_signatures() const noexcept
  37. { return get(keys::component_signatures); }
  38. constexpr decltype(auto) system_signatures() const noexcept
  39. { return get(keys::system_signatures); }
  40. constexpr decltype(auto) system_storage() const noexcept
  41. { return get(keys::system_storage); }
  42. constexpr decltype(auto) entity_storage() const noexcept
  43. { return get(keys::entity_storage); }
  44. constexpr decltype(auto) refresh_parallelism() const noexcept
  45. { return get(keys::refresh_parallelism); }
  46. constexpr decltype(auto) scheduler() const noexcept
  47. { return get(keys::scheduler); }
  48. public: /* setter */
  49. template<typename T>
  50. constexpr decltype(auto) component_signatures(T t) const noexcept
  51. { return change(keys::component_signatures, t); }
  52. template<typename T>
  53. constexpr decltype(auto) system_signatures(T t) const noexcept
  54. { return change(keys::system_signatures, t); }
  55. template<typename T>
  56. constexpr decltype(auto) system_storage(T t) const noexcept
  57. { return change(keys::system_storage, t); }
  58. template<typename T>
  59. constexpr decltype(auto) entity_storage(T t) const noexcept
  60. { return change(keys::entity_storage, t); }
  61. template<typename T>
  62. constexpr decltype(auto) refresh_parallelism(T t) const noexcept
  63. { return change(keys::refresh_parallelism, t); }
  64. template<typename T>
  65. constexpr decltype(auto) scheduler(T t) const noexcept
  66. { return change(keys::scheduler, t); }
  67. };
  68. struct make_t
  69. {
  70. constexpr decltype(auto) operator()() const noexcept
  71. {
  72. using namespace ::ecs::core::mp;
  73. auto options = option_map::make()
  74. .add(keys::component_signatures, list::empty)
  75. .add(keys::system_signatures, list::empty)
  76. .add(keys::system_storage, system_storage::tuple)
  77. .add(keys::entity_storage, entity_storage::dynamic<1024>)
  78. .add(keys::refresh_parallelism, refresh_parallelism::enable)
  79. .add(keys::scheduler, scheduler::atomic_counter);
  80. return settings_t<decay_t<decltype(options)>> { };
  81. }
  82. };
  83. }
  84. constexpr decltype(auto) make = __impl::make_t { };
  85. }
  86. end_namespace_ecs_settings