diff options
Diffstat (limited to 'entityx/deps/Dependencies.h')
-rw-r--r-- | entityx/deps/Dependencies.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/entityx/deps/Dependencies.h b/entityx/deps/Dependencies.h new file mode 100644 index 0000000..88c9f79 --- /dev/null +++ b/entityx/deps/Dependencies.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 Alec Thomas <alec@swapoff.org> + * All rights reserved. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. + * + * Author: Alec Thomas <alec@swapoff.org> + */ +#pragma once + +#include "entityx/System.h" +#include "entityx/Event.h" +#include "entityx/Entity.h" + +namespace entityx { +namespace deps { + +/** + * An entityx::System for declaring component dependencies. + * + * eg. To declare that a `Physics` component must always be paired with `Position` + * and `Direction` components: + * + * system_manager->add<Dependency<Physics, Position, Direction>>(); + */ +template <typename C, typename ... Deps> +class Dependency : public System<Dependency<C, Deps...>>, public Receiver<Dependency<C, Deps...>> { +public: + void receive(const ComponentAddedEvent<C> &event) { + assign<Deps...>(event.entity); + } + + void configure(EventManager &events) override { + events.subscribe<ComponentAddedEvent<C>>(*this); + } + + void update(EntityManager &entities, EventManager &events, TimeDelta dt) override {} + +private: + template <typename D> + void assign(Entity entity) { + if (!entity.component<D>()) entity.assign<D>(); + } + + template <typename D, typename D1, typename ... Ds> + void assign(Entity entity) { + assign<D>(entity); + assign<D1, Ds...>(entity); + } +}; + +} // namespace deps +} // namespace entityx |