VISR  0.11.1
Versatile Interactive Scene Renderer
message_queue_protocol.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_PML_MESSAGE_QUEUE_PROTOCOL_HPP_INCLUDED
4 #define VISR_PML_MESSAGE_QUEUE_PROTOCOL_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
10 
14 
15 #include <ciso646>
16 #include <deque>
17 #include <memory>
18 #include <stdexcept>
19 
20 namespace visr
21 {
22 namespace pml
23 {
24 
31 class VISR_PML_LIBRARY_SYMBOL MessageQueueProtocol: public CommunicationProtocolBase
32 {
33 public:
37  class InputBase;
38  template<class DataType > class Input;
39  class OutputBase;
40  template<class DataType > class Output;
41 
42  static constexpr CommunicationProtocolType staticType() { return communicationProtocolTypeFromString( sProtocolName ); }
43 
44  static constexpr const char * staticName() { return sProtocolName; }
45 
46  explicit MessageQueueProtocol( ParameterType const & parameterType,
47  ParameterConfigBase const & config );
48 
49  virtual ~MessageQueueProtocol() override;
50 
51  ParameterType parameterType() const override;
52 
53  virtual CommunicationProtocolType protocolType() const override;
54 
58  void clear();
59 
63  bool empty() const;
64 
68  std::size_t numberOfElements() const;
69 
70  void enqueue( std::unique_ptr<ParameterBase>& val );
71 
72  /*
73  * Return the next element in the FIFO queue.
74  * @return A reference to the next element.
75  * @throw logic_error If the queue is empty
76  */
77  ParameterBase const& nextElement() const
78 ;
83  void popNextElement();
84 
85  void connectInput( CommunicationProtocolBase::Input* port ) override;
86 
87  void connectOutput( CommunicationProtocolBase::Output* port ) override;
88 
89  bool disconnectInput( CommunicationProtocolBase::Input* port ) noexcept override;
90 
91  bool disconnectOutput( CommunicationProtocolBase::Output* port ) noexcept override;
92 
93 private:
94  using QueueType = std::deque<std::unique_ptr<ParameterBase> >;
98  QueueType mQueue;
99 
100  ParameterType const mParameterType;
101 
102  std::unique_ptr<ParameterConfigBase> const mParameterConfig;
103 
104  InputBase * mInput;
105  OutputBase* mOutput;
106 
107  static constexpr const char * sProtocolName = "MessageQueue";
108 };
109 
111 // Input
112 
114 {
115 public:
120  : mProtocol( nullptr )
121  {
122  }
123 
124  virtual ~InputBase();
125 
126  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
127 
128  MessageQueueProtocol * getProtocol() override { return mProtocol; }
129 
130  MessageQueueProtocol const * getProtocol() const override { return mProtocol; }
131 
132  bool empty() const
133  {
134  return mProtocol->empty();
135  }
136 
137  std::size_t size() const
138  {
139  return mProtocol->numberOfElements();
140  }
141 
142  ParameterBase const & front() const
143  {
144  return mProtocol->nextElement();
145  }
146 
147  void pop()
148  {
149  mProtocol->popNextElement();
150  }
151 
152  void clear()
153  {
154  mProtocol->clear();
155  }
156 
158  {
159  mProtocol = protocol;
160  }
161 
162 #if 0
163  bool isConnected() const override
164  {
165  return mProtocol != nullptr;
166  }
167 #endif
168 private:
169  MessageQueueProtocol * mProtocol;
170 };
171 
172 template<typename MessageType>
174 {
175 public:
176  MessageType const & front() const
177  {
178  return static_cast<MessageType const &>( InputBase::front() );
179  }
180 };
181 
183 // Output
184 
186 {
187 public:
192  : mProtocol( nullptr )
193  {
194  }
195 
196  virtual ~OutputBase();
197 
198  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
199 
200  MessageQueueProtocol * getProtocol() override { return mProtocol; }
201 
202  MessageQueueProtocol const * getProtocol() const override { return mProtocol; }
203 
204  bool empty() const
205  {
206  return mProtocol->empty();
207  }
208 
209  std::size_t size() const
210  {
211  return mProtocol->numberOfElements();
212  }
213 
214  void enqueue( std::unique_ptr<ParameterBase> && val )
215  {
216  // Move to impl object
217  mProtocol->enqueue( val );
218  }
219 
221  {
222  mProtocol = protocol;
223  }
224 #if 0
225  bool isConnected() const override
226  {
227  return mProtocol != nullptr;
228  }
229 #endif
230 private:
231  MessageQueueProtocol * mProtocol;
232 };
233 
234 template<class MessageType>
236 {
237 public:
238  void enqueue( MessageType const & val )
239  {
240  OutputBase::enqueue( std::unique_ptr<ParameterBase>( new MessageType( val ) ) );
241  }
242 
243  void enqueue( MessageType && val )
244  {
245  OutputBase::enqueue( std::unique_ptr<MessageType>(new MessageType( val )) );
246  }
247 };
248 
249 } // namespace pml
250 } // namespace visr
251 
253 
254 #endif // VISR_PML_MESSAGE_QUEUE_PROTOCOL_HPP_INCLUDED
void clear()
Definition: message_queue_protocol.hpp:152
static constexpr const char * staticName()
Definition: message_queue_protocol.hpp:44
std::size_t size() const
Definition: message_queue_protocol.hpp:209
MessageType const & front() const
Definition: message_queue_protocol.hpp:176
Definition: communication_protocol_base.hpp:94
uint64_t ParameterType
Definition: parameter_type.hpp:13
void enqueue(MessageType &&val)
Definition: message_queue_protocol.hpp:243
static constexpr CommunicationProtocolType staticType()
Definition: message_queue_protocol.hpp:42
void pop()
Definition: message_queue_protocol.hpp:147
Definition: message_queue_protocol.hpp:40
MessageQueueProtocol const * getProtocol() const override
Definition: message_queue_protocol.hpp:130
MessageQueueProtocol const * getProtocol() const override
Definition: message_queue_protocol.hpp:202
Definition: message_queue_protocol.hpp:185
void setProtocolInstance(MessageQueueProtocol *protocol)
Definition: message_queue_protocol.hpp:220
std::uint64_t CommunicationProtocolType
Definition: communication_protocol_type.hpp:14
InputBase()
Definition: message_queue_protocol.hpp:119
void enqueue(MessageType const &val)
Definition: message_queue_protocol.hpp:238
#define DEFINE_COMMUNICATION_PROTOCOL(CommunicationProtocolClassType, CommunicationProtocolId, CommunicationProtocolName)
Definition: communication_protocol_type.hpp:44
bool empty() const
Definition: message_queue_protocol.hpp:204
ParameterBase const & front() const
Definition: message_queue_protocol.hpp:142
Definition: options.cpp:10
bool empty() const
Definition: message_queue_protocol.hpp:132
OutputBase()
Definition: message_queue_protocol.hpp:191
Definition: parameter_config_base.hpp:22
MessageQueueProtocol * getProtocol() override
Definition: message_queue_protocol.hpp:200
constexpr CommunicationProtocolType communicationProtocolTypeFromString(char const *typeString)
Definition: communication_protocol_type.hpp:16
Definition: communication_protocol_base.hpp:21
Definition: message_queue_protocol.hpp:38
std::size_t size() const
Definition: message_queue_protocol.hpp:137
void setProtocolInstance(MessageQueueProtocol *protocol)
Definition: message_queue_protocol.hpp:157
void enqueue(std::unique_ptr< ParameterBase > &&val)
Definition: message_queue_protocol.hpp:214
MessageQueueProtocol * getProtocol() override
Definition: message_queue_protocol.hpp:128
Definition: parameter_base.hpp:18
Definition: message_queue_protocol.hpp:31
Definition: message_queue_protocol.hpp:113
Definition: communication_protocol_base.hpp:131