// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #pragma once #ifndef NDK_BASESYSTEM_HPP #define NDK_BASESYSTEM_HPP #include #include #include namespace Ndk { class World; class NDK_API BaseSystem { friend class Sdk; friend Entity; friend World; public: BaseSystem(SystemIndex systemId); BaseSystem(const BaseSystem&); BaseSystem(BaseSystem&&) noexcept = default; ~BaseSystem(); virtual BaseSystem* Clone() const = 0; bool Filters(const Entity* entity) const; const std::vector& GetEntities() const; SystemIndex GetIndex() const; World& GetWorld() const; bool HasEntity(const Entity* entity) const; BaseSystem& operator=(const BaseSystem&) = delete; BaseSystem& operator=(BaseSystem&&) noexcept = default; protected: template void Excludes(); template void Excludes(); void ExcludesComponent(ComponentIndex index); static SystemIndex GetNextIndex(); template void Requires(); template void Requires(); void RequiresComponent(ComponentIndex index); template void RequiresAny(); template void RequiresAny(); void RequiresAnyComponent(ComponentIndex index); private: void AddEntity(Entity* entity); virtual void OnEntityAdded(Entity* entity); virtual void OnEntityRemoved(Entity* entity); void RemoveEntity(Entity* entity); void SetWorld(World& world); static bool Initialize(); static void Uninitialize(); std::vector m_entities; NzBitset m_entityBits; NzBitset<> m_excludedComponents; mutable NzBitset<> m_filterResult; NzBitset<> m_requiredAnyComponents; NzBitset<> m_requiredComponents; SystemIndex m_systemIndex; World* m_world; static SystemIndex s_nextIndex; }; } #include #endif // NDK_BASESYSTEM_HPP