8#include <unordered_map>
18 template<
typename Token,
typename Object>
29 boost::hash_combine(seed,
index++);
30 boost::hash_combine(seed, entt::type_hash<Object>::value());
31 boost::hash_combine(seed, std::hash<Token>{}(
token));
42 boost::hash_combine(seed,
index++);
43 boost::hash_combine(seed, entt::type_hash<Object>::value());
44 boost::hash_combine(seed, std::hash<Token>{}(
token));
45 lost[seed] = lostFunc;
51 if (
get.contains(
id)) {
54 if (
lost.contains(
id)) {
62 for (
const auto& [
id, callback] :
get) {
67 ownedObject = std::make_unique<Object>(std::move(obj));
69 for (
const auto& [
id, callback] :
get) {
75 for (
const auto& [
id, callback] :
lost) {
82 for (
const auto& [
id, callback] :
get) {
85 for (
const auto& [
id, callback] :
lost) {
90 template<
typename Token>
92 template<
typename Token>
95 std::unordered_map<Token, std::unordered_map<std::size_t, std::unique_ptr<IObjectDispatcher>>>
m_tokenDispatchers;
96 template<
typename Object>
98 auto typeHash = entt::type_hash<Object>::value();
101 m_tokenDispatchers[token][typeHash] = std::make_unique<ObjectDispatcher<Token, Object>>(token);
107 template<
typename Object,
typename FuncGet>
110 return dispatcher->subscribeGet([getFunc](
Object& obj) {
114 template<
typename Object,
typename FuncGet,
typename FuncLost>
115 std::pair<SubscribeId, SubscribeId>
subscribe(
const Token& token,
117 FuncLost&& lostFunc) {
119 auto getId = dispatcher->subscribeGet([getFunc = std::forward<FuncGet>(getFunc)](
Object& obj) {
122 auto lostId = dispatcher->subscribeLost([lostFunc = std::forward<FuncLost>(lostFunc)]() {
125 return {getId, lostId};
127 template<
typename Object>
130 dispatcher->push(&
object);
133 template<
typename Object>
136 dispatcher->pushOwned(std::forward<Object>(
object));
138 template<
typename Object>
143 template<
typename Object>
146 dispatcher->trigger(
object);
150 for (
auto& [typeHash, dispatcher] : tokenIt->second) {
151 dispatcher->unsubscribe(
id);
void unsubscribe(const Token &token, SubscribeId id)
std::pair< SubscribeId, SubscribeId > subscribe(const Token &token, FuncGet &&getFunc, FuncLost &&lostFunc)
PipePort< Token > getPort(const Token &token)
void provide(const Token &token, Object &object)
ObjectDispatcher< Token, Object > * getOrCreateDispatcher(const Token &token)
void trigger(const Token &token, Object *object)
void remove(const Token &token)
std::unordered_map< Token, std::unordered_map< std::size_t, std::unique_ptr< IObjectDispatcher > > > m_tokenDispatchers
void provide(const Token &token, Object &&object)
SubscribeId subscribe(const Token &token, FuncGet &&getFunc)
virtual ~IObjectDispatcher()=default
virtual void unsubscribe(SubscribeId id)=0
void trigger(Object *obj)
SubscribeId subscribeGet(std::function< void(Object &)> getFunc)
ObjectDispatcher(const Token &t)
SubscribeId subscribeLost(std::function< void()> lostFunc)
boost::unordered_flat_map< SubscribeId, std::function< void()> > lost
void unsubscribe(SubscribeId id) override
std::unique_ptr< Object > ownedObject
boost::unordered_flat_map< SubscribeId, std::function< void(Object &)> > get
void pushOwned(Object &&obj)