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.

82 lines
3.2 KiB

  1. #pragma once
  2. #include <ecs/config.h>
  3. beg_namespace_ecs_core_system_scheduler
  4. {
  5. namespace __impl
  6. {
  7. template<typename T_system_tag, typename T_dependencies>
  8. struct dependencie_item_t
  9. {
  10. using system_tag_type = T_system_tag;
  11. using dependencies_type = T_dependencies;
  12. system_tag_type tag;
  13. dependencies_type dependencies;
  14. };
  15. template<typename T_system_signature_list, typename T_system_tag_list>
  16. constexpr decltype(auto) build_dependencie_list(T_system_signature_list ssl, T_system_tag_list stl)
  17. {
  18. auto filtered = hana::filter(ssl, [stl](auto& ssig){
  19. return hana::contains(stl, mp::unwrap(ssig).tag());
  20. });
  21. return hana::transform(filtered, [](auto& ssig){
  22. auto tag = mp::unwrap(ssig).tag();
  23. auto deps = hana::filter(mp::unwrap(ssig).dependencies(), [](auto& tag){
  24. return hana::contains(T_system_tag_list { }, tag);
  25. });
  26. using tag_type = mp::decay_t<decltype(tag)>;
  27. using dep_type = mp::decay_t<decltype(deps)>;
  28. using item_type = dependencie_item_t<tag_type, dep_type>;
  29. return item_type { };
  30. });
  31. }
  32. template<typename T_dependency_list>
  33. constexpr decltype(auto) get_independent_items(T_dependency_list deps) noexcept
  34. {
  35. return hana::filter(deps, [](auto& item){
  36. return hana::size(item.dependencies) == hana::size_c<0>;
  37. });
  38. }
  39. }
  40. template<typename T_settings>
  41. struct atomic_counter
  42. {
  43. public:
  44. using settings_type = T_settings;
  45. public:
  46. template<typename T_system_tag_list, typename T_func>
  47. inline void execute(T_system_tag_list stl, T_func&& func)
  48. {
  49. static_assert(tag::system::is_list(stl));
  50. auto dependencie_list = __impl::build_dependencie_list((settings_type { }).system_signatures().items, stl);
  51. auto independent_items = __impl::get_independent_items(dependencie_list);
  52. std::cout << "dependencie_list" << std::endl;
  53. hana::for_each(dependencie_list, [](auto& item){
  54. using system_type = mp::unwrap_t<mp::decay_t<decltype(item.tag)>>;
  55. std::cout << " " << type_helper<system_type>::name() << std::endl;
  56. hana::for_each(item.dependencies, [](auto& tag){
  57. std::cout << " " << type_helper<mp::unwrap_t<mp::decay_t<decltype(tag)>>>::name() << std::endl;
  58. });
  59. });
  60. std::cout << "independent_items" << std::endl;
  61. hana::for_each(independent_items, [](auto& item){
  62. using system_type = mp::unwrap_t<mp::decay_t<decltype(item.tag)>>;
  63. std::cout << " " << type_helper<system_type>::name() << std::endl;
  64. hana::for_each(item.dependencies, [](auto& tag){
  65. std::cout << " " << type_helper<mp::unwrap_t<mp::decay_t<decltype(tag)>>>::name() << std::endl;
  66. });
  67. });
  68. }
  69. };
  70. }
  71. end_namespace_ecs_core_system_scheduler