Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //ComponentContainer.h
- #pragma once
- #include <vector>
- #include <type_traits>
- #include <typeinfo>
- template<size_t idx, typename T>
- struct GetHelper;
- template<typename ... T>
- struct ComponentContainer {};
- template <typename T, typename... Rest>
- struct ComponentContainer<T, Rest ...> {
- ComponentContainer() = default;
- ComponentContainer(size_t p_numberOfComponents, const T& first, const Rest& ... rest) :
- numberOfComponents{ p_numberOfComponents },
- first(first),
- rest(rest...) { };
- std::vector<T> first{};
- ComponentContainer<Rest ... > rest;
- size_t numberOfComponents;
- template<size_t idx>
- auto& get()
- {
- return GetHelper<idx, ComponentContainer<T, Rest...>>::get(*this);
- }
- constexpr size_t GetTypeCount() {
- return sizeof...(Rest) + 1;
- }
- void AddElements() {
- GetHelper< sizeof...(Rest), ComponentContainer<T, Rest...>> ::AddElements(*this);
- }
- template<typename U>
- U& GetComponent(EntityId p_entityId) {
- return GetHelper<sizeof...(Rest), ComponentContainer<T, Rest...>>::template GetComponent<U>(*this, p_entityId);
- }
- };
- template<typename T, typename ... Rest>
- struct GetHelper<0, ComponentContainer<T, Rest ... >>
- {
- static std::vector<T>& get(ComponentContainer<T, Rest...>& data)
- {
- return data.first;
- }
- static void AddElements(ComponentContainer<T, Rest...>& data) {
- T obj{};
- data.first.push_back(obj);
- }
- template<typename U>
- static U& GetComponent(ComponentContainer<T, Rest...>& data, EntityId p_entityId) {
- typename std::tuple_element<0, std::tuple<T, Rest...> >::type mA;
- std::cout << typeid(mA).name() << '\n';
- std::cout << std::is_same<U, decltype(mA)>::value;
- static_assert (std::is_same<U, decltype(mA)>::value, "Component couldn't be found in GetComponent.");
- if constexpr (std::is_same<T, U>::value) {
- return data.get<0>()[p_entityId];
- }
- }
- };
- template<size_t idx, typename T, typename ... Rest>
- struct GetHelper<idx, ComponentContainer<T, Rest ... >>
- {
- static auto& get(ComponentContainer< T, Rest...>& data)
- {
- return GetHelper<idx - 1, ComponentContainer<Rest ...> >::get(data.rest);
- }
- static void AddElements(ComponentContainer<T, Rest...>& data) {
- T obj{};
- data.first.push_back(obj);
- GetHelper<idx - 1, ComponentContainer<Rest...>>::AddElements(data.rest);
- }
- template<typename U>
- static U& GetComponent(ComponentContainer<T, Rest...>& data, EntityId p_entityId) {
- typename std::tuple_element<idx, std::tuple<T, Rest...> >::type mA;
- if constexpr (std::is_same<U, decltype(mA)>::value == true) {
- return data.get<idx>()[p_entityId];
- }
- if constexpr (std::is_same<U, decltype(mA)>::value == false) {
- return GetHelper<idx - 1, ComponentContainer<T, Rest...> >::template GetComponent<U>(data, p_entityId);
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment