#pragma once template struct OwnerView { using TView = entt::basic_view, entt::exclude_t<>>; struct iterator { iterator(Player* apPlayer, typename TView::iterator aItor, typename TView::iterator aEnd, const TView& aView) : m_pPlayer{apPlayer} , m_itor{aItor} , m_end{aEnd} , m_view{aView} { } iterator& operator++() { do { m_itor++; } while (m_itor != m_end && m_view.template get(*m_itor).GetOwner() != m_pPlayer); return *this; } bool operator!=(const iterator& acRhs) const { return m_itor != acRhs.m_itor; } bool operator==(const iterator& acRhs) const { return m_itor == acRhs.m_itor; } decltype(auto) operator*() { return m_itor.operator*(); } [[nodiscard]] decltype(auto) operator->() const { return m_itor.operator->(); } [[nodiscard]] decltype(auto) operator*() const { return m_itor.operator*(); } private: Player* m_pPlayer; typename TView::iterator m_itor; typename TView::iterator m_end; const TView& m_view; }; decltype(auto) find(entt::entity aEntity) const; decltype(auto) begin() const; decltype(auto) end() const; template decltype(auto) get(entt::entity aEntity); template decltype(auto) get(entt::entity aEntity) const; OwnerView(entt::registry& aRegistry, Player* apPlayer); private: TView m_view; Player* m_pPlayer; }; template OwnerView::OwnerView(entt::registry& aRegistry, Player* apPlayer) : m_view(aRegistry.view()) , m_pPlayer(apPlayer) { } template decltype(auto) OwnerView::find(entt::entity aEntity) const { auto it = m_view.find(aEntity); if (it == m_view.end()) return end(); if (m_view.template get(*it).GetOwner() == m_pPlayer) return iterator(m_pPlayer, it, std::end(m_view), m_view); return end(); } template decltype(auto) OwnerView::begin() const { return iterator(m_pPlayer, std::begin(m_view), std::end(m_view), m_view); } template decltype(auto) OwnerView::end() const { return iterator(m_pPlayer, std::end(m_view), std::end(m_view), m_view); } template template decltype(auto) OwnerView::get(entt::entity aEntity) { return m_view.template get(aEntity); } template template decltype(auto) OwnerView::get(entt::entity aEntity) const { return m_view.template get(aEntity); }