Guest User

ComponentContainer.h

a guest
Feb 22nd, 2020
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. //ComponentContainer.h
  2. #pragma once
  3.  
  4. #include <vector>
  5.  
  6. #include <type_traits>
  7. #include <typeinfo>
  8.  
  9. template<size_t idx, typename T>
  10. struct GetHelper;
  11.  
  12. template<typename ... T>
  13. struct ComponentContainer {};
  14.  
  15. template <typename T, typename... Rest>
  16. struct ComponentContainer<T, Rest ...> {
  17.  
  18. ComponentContainer() = default;
  19.  
  20. ComponentContainer(size_t p_numberOfComponents, const T& first, const Rest& ... rest) :
  21. numberOfComponents{ p_numberOfComponents },
  22. first(first),
  23. rest(rest...) { };
  24.  
  25. std::vector<T> first{};
  26. ComponentContainer<Rest ... > rest;
  27. size_t numberOfComponents;
  28.  
  29.  
  30. template<size_t idx>
  31. auto& get()
  32. {
  33. return GetHelper<idx, ComponentContainer<T, Rest...>>::get(*this);
  34. }
  35.  
  36. constexpr size_t GetTypeCount() {
  37. return sizeof...(Rest) + 1;
  38. }
  39.  
  40. void AddElements() {
  41. GetHelper< sizeof...(Rest), ComponentContainer<T, Rest...>> ::AddElements(*this);
  42. }
  43.  
  44. template<typename U>
  45. U& GetComponent(EntityId p_entityId) {
  46. return GetHelper<sizeof...(Rest), ComponentContainer<T, Rest...>>::template GetComponent<U>(*this, p_entityId);
  47. }
  48.  
  49. };
  50.  
  51. template<typename T, typename ... Rest>
  52. struct GetHelper<0, ComponentContainer<T, Rest ... >>
  53. {
  54. static std::vector<T>& get(ComponentContainer<T, Rest...>& data)
  55. {
  56. return data.first;
  57. }
  58.  
  59. static void AddElements(ComponentContainer<T, Rest...>& data) {
  60. T obj{};
  61. data.first.push_back(obj);
  62. }
  63.  
  64. template<typename U>
  65. static U& GetComponent(ComponentContainer<T, Rest...>& data, EntityId p_entityId) {
  66. typename std::tuple_element<0, std::tuple<T, Rest...> >::type mA;
  67. std::cout << typeid(mA).name() << '\n';
  68. std::cout << std::is_same<U, decltype(mA)>::value;
  69.  
  70. static_assert (std::is_same<U, decltype(mA)>::value, "Component couldn't be found in GetComponent.");
  71.  
  72. if constexpr (std::is_same<T, U>::value) {
  73. return data.get<0>()[p_entityId];
  74. }
  75.  
  76. }
  77.  
  78. };
  79.  
  80. template<size_t idx, typename T, typename ... Rest>
  81. struct GetHelper<idx, ComponentContainer<T, Rest ... >>
  82. {
  83. static auto& get(ComponentContainer< T, Rest...>& data)
  84. {
  85. return GetHelper<idx - 1, ComponentContainer<Rest ...> >::get(data.rest);
  86. }
  87.  
  88. static void AddElements(ComponentContainer<T, Rest...>& data) {
  89. T obj{};
  90. data.first.push_back(obj);
  91. GetHelper<idx - 1, ComponentContainer<Rest...>>::AddElements(data.rest);
  92. }
  93.  
  94. template<typename U>
  95. static U& GetComponent(ComponentContainer<T, Rest...>& data, EntityId p_entityId) {
  96.  
  97. typename std::tuple_element<idx, std::tuple<T, Rest...> >::type mA;
  98.  
  99. if constexpr (std::is_same<U, decltype(mA)>::value == true) {
  100. return data.get<idx>()[p_entityId];
  101. }
  102. if constexpr (std::is_same<U, decltype(mA)>::value == false) {
  103. return GetHelper<idx - 1, ComponentContainer<T, Rest...> >::template GetComponent<U>(data, p_entityId);
  104. }
  105. }
  106.  
  107. };
Advertisement
Add Comment
Please, Sign In to add comment