All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
MPMCMessageBus.h
1 // Copyright (c) 2014 eeGeo. All rights reserved.
2 
3 #pragma once
4 
5 #include "CatalogBinding.h"
6 #include "MessageQueue.h"
7 
8 namespace Eegeo
9 {
10  namespace Messaging
11  {
12  template <typename TMessageCatalog>
14  {
15  private:
16  TMessageCatalog m_catalog;
17 
18  class MessageInfo
19  {
20  public:
21  virtual ~MessageInfo() {};
22  virtual void Dispatch() = 0;
23  };
24 
25  template <typename TMessage>
26  class TypedMessageInfo : public MessageInfo
27  {
28  private:
29  TMessage m_message;
30  TMessageCatalog& m_catalog;
31  public:
32  TypedMessageInfo(const TMessage& message,
33  TMessageCatalog& catalog)
34  : m_message(message)
35  , m_catalog(catalog)
36  {
37  }
38 
39  void Dispatch()
40  {
41  CatalogBinding<TMessage>& binding(m_catalog);
42  binding.Dispatch(m_message);
43  }
44  };
45 
46  MessageQueue<MessageInfo*> m_messages;
47 
48  public:
49  template <typename TMessage>
50  void Publish(const TMessage& message)
51  {
52  m_messages.Enqueue(new TypedMessageInfo<TMessage>(message, m_catalog));
53  }
54 
55  template <typename TMessage>
56  void Subscribe(Eegeo::Helpers::ICallback1<const TMessage&>& handler)
57  {
58  CatalogBinding<TMessage>& binding(m_catalog);
59  binding.Subscribe(handler);
60  }
61 
62  template <typename TMessage>
63  void Unsubscribe(Eegeo::Helpers::ICallback1<const TMessage&>& handler)
64  {
65  CatalogBinding<TMessage>& binding(m_catalog);
66  binding.Unsubscribe(handler);
67  }
68 
69  void Flush()
70  {
71  MessageInfo* info;
72  while (m_messages.TryDequeue(info))
73  {
74  info->Dispatch();
75  delete info;
76  }
77  }
78  };
79  }
80 }