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.

166 lines
4.6 KiB

  1. #include <gtest/gtest.h>
  2. #include <thread>
  3. #include <cxxabi.h>
  4. #include <ecs.h>
  5. #include <ecs/core.h>
  6. #define MAKE_COMPONENT_TAG(x) \
  7. namespace tag \
  8. { \
  9. constexpr decltype(auto) x = ::ecs::tag::component::value<component::x>; \
  10. constexpr decltype(auto) warning_supressor_##x() { (void) x; } \
  11. }
  12. #define MAKE_SYSTEM_TAG(x) \
  13. namespace tag \
  14. { \
  15. constexpr decltype(auto) x = ::ecs::tag::system::value<system::x>; \
  16. constexpr decltype(auto) warning_supressor_##x() { (void) x; } \
  17. }
  18. namespace test
  19. {
  20. namespace component
  21. {
  22. struct position
  23. {
  24. double x;
  25. double y;
  26. };
  27. struct velocity
  28. {
  29. double x;
  30. double y;
  31. };
  32. struct acceleration
  33. {
  34. double x;
  35. double y;
  36. };
  37. struct test
  38. { };
  39. MAKE_COMPONENT_TAG(position)
  40. MAKE_COMPONENT_TAG(velocity)
  41. MAKE_COMPONENT_TAG(acceleration)
  42. MAKE_COMPONENT_TAG(test)
  43. }
  44. namespace system
  45. {
  46. struct accelerate
  47. { };
  48. struct move
  49. { };
  50. struct render
  51. { };
  52. struct foo
  53. { };
  54. MAKE_SYSTEM_TAG(accelerate)
  55. MAKE_SYSTEM_TAG(move)
  56. MAKE_SYSTEM_TAG(render)
  57. MAKE_SYSTEM_TAG(foo)
  58. }
  59. }
  60. using namespace test;
  61. namespace c = component;
  62. namespace ct = c::tag;
  63. namespace cs = ecs::signature::component;
  64. namespace csl = ecs::signature_list::component;
  65. namespace s = system;
  66. namespace st = s::tag;
  67. namespace ss = ecs::signature::system;
  68. namespace ssl = ecs::signature_list::system;
  69. constexpr size_t storage_size = 1024;
  70. constexpr decltype(auto) cs_position =
  71. cs::make(ct::position)
  72. .storage(cs::storage::dynamic<storage_size>);
  73. constexpr decltype(auto) cs_velocity =
  74. cs::make(ct::velocity)
  75. .storage(cs::storage::dynamic<storage_size>);
  76. constexpr decltype(auto) cs_acceleration =
  77. cs::make(ct::acceleration)
  78. .storage(cs::storage::dynamic<storage_size>);
  79. constexpr decltype(auto) cs_test =
  80. cs::make(ct::test)
  81. .storage(cs::storage::dynamic<storage_size>);
  82. constexpr decltype(auto) cs_list = csl::make(
  83. cs_position,
  84. cs_velocity,
  85. cs_acceleration,
  86. cs_test);
  87. constexpr decltype(auto) ss_foo =
  88. ss::make(st::foo)
  89. .write(ct::test);
  90. constexpr decltype(auto) ss_accelerate =
  91. ss::make(st::accelerate)
  92. .read(ct::acceleration)
  93. .write(ct::velocity);
  94. constexpr decltype(auto) ss_move =
  95. ss::make(st::move)
  96. .read(ct::velocity)
  97. .write(ct::position);
  98. constexpr decltype(auto) ss_render =
  99. ss::make(st::render)
  100. .read(ct::velocity, ct::position, ct::acceleration, ct::test);
  101. constexpr decltype(auto) ss_list = ssl::make(
  102. ss_foo,
  103. ss_accelerate,
  104. ss_move,
  105. ss_render);
  106. constexpr decltype(auto) settings = ::ecs::settings::make()
  107. .component_signatures(cs_list)
  108. .system_signatures (ss_list);
  109. namespace sea = ::ecs::system_execution_adapter;
  110. TEST(DummyTest, fuu)
  111. {
  112. auto context = ::ecs::context::make(settings);
  113. context.step([](auto& step_proxy){
  114. step_proxy.execute_systems()(
  115. sea::tags(st::foo)
  116. .for_subtasks([](auto& s, auto& data){
  117. std::cout << "foo" << std::endl
  118. << " " << type_helper<decltype(data)>::name() << std::endl;
  119. }),
  120. sea::tags(st::accelerate)
  121. .for_subtasks([](auto& s, auto& data){
  122. std::cout << "accelerate" << std::endl
  123. << " " << type_helper<decltype(data)>::name() << std::endl;
  124. }),
  125. sea::tags(st::move)
  126. .for_subtasks([](auto& s, auto& data){
  127. std::cout << "move" << std::endl
  128. << " " << type_helper<decltype(data)>::name() << std::endl;
  129. }),
  130. sea::tags(st::render)
  131. .for_subtasks([](auto& s, auto& data){
  132. std::cout << "render" << std::endl
  133. << " " << type_helper<decltype(data)>::name() << std::endl;
  134. })
  135. );
  136. });
  137. }