VISR  0.11.7
Versatile Interactive Scene Renderer
double_buffering_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_DOUBLE_BUFFERING_PROTOCOL_HPP_INCLUDED
4 #define VISR_PML_DOUBLE_BUFFERING_PROTOCOL_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
10 
14 
15 #include <ciso646>
16 #include <memory>
17 #include <stdexcept>
18 #include <vector>
19 
20 namespace visr
21 {
22 namespace pml
23 {
24 
30 class VISR_PML_LIBRARY_SYMBOL DoubleBufferingProtocol: public CommunicationProtocolBase
31 {
32 public:
36  class InputBase;
37  template<class DataType > class Input;
38  class OutputBase;
39  template<class DataType > class Output;
40 
46  explicit DoubleBufferingProtocol( ParameterType const & parameterType,
47  ParameterConfigBase const & parameterConfig );
48 
53  virtual ~DoubleBufferingProtocol() override;
54 
58  static constexpr CommunicationProtocolType staticType() { return communicationProtocolTypeFromString(sProtocolName); };
59 
63  static constexpr char const * staticName() { return sProtocolName; }
64 
68  ParameterType parameterType( ) const override;
69 
75  virtual CommunicationProtocolType protocolType( ) const override { return staticType(); }
76 
80  ParameterBase & frontData();
81 
86  ParameterBase const & frontData() const;
87 
91  ParameterBase & backData();
92 
97  ParameterBase const & backData() const;
98 
104  void swapBuffers( bool copyValue );
105 
106  void connectInput( CommunicationProtocolBase::Input* port ) override;
107 
108  void connectOutput( CommunicationProtocolBase::Output* port ) override;
109 
110  bool disconnectInput( CommunicationProtocolBase::Input* port ) noexcept override;
111 
112  bool disconnectOutput( CommunicationProtocolBase::Output* port ) noexcept override;
113 
114 private:
115  ParameterType const mParameterType;
116 
117  std::unique_ptr<ParameterConfigBase> const mConfig;
118 
119  OutputBase* mOutput;
120  std::vector<InputBase*> mInputs;
121 
125  std::unique_ptr<ParameterBase> mBackData;
126  std::unique_ptr<ParameterBase> mFrontData;
127 
128  static constexpr const char * sProtocolName = "DoubleBuffering";
129 };
130 
131 class
133 VISR_PML_LIBRARY_SYMBOL
136 {
138 public:
139 
140  InputBase();
141 
142  virtual ~InputBase();
143 
144  ParameterBase const & data() const;
145 
146  bool changed() const;
147 
148  void resetChanged();
149 
150  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
151 
152  DoubleBufferingProtocol * getProtocol() override { return mProtocol; }
153 
154  DoubleBufferingProtocol const * getProtocol() const override { return mProtocol; }
155 
156  void setProtocolInstance( DoubleBufferingProtocol * protocol );
157 
158 private:
159  void markChanged() { mChanged = true; }
160 
161  DoubleBufferingProtocol * mProtocol;
162  bool mChanged;
163 };
164 
165 template<class MessageType>
166 class DoubleBufferingProtocol::Input: public InputBase
167 {
168  friend class InputBase;
169 public:
170  using InputBase::changed;
171 
172  using InputBase::resetChanged;
173 
174  MessageType const & data() const
175  {
176  return static_cast<MessageType const&>(InputBase::data());
177  }
178 
179 protected:
180 
181 private:
182 };
183 
185 // Output
186 
187 
188 class
190 VISR_PML_LIBRARY_SYMBOL
193 {
194  friend class DoubleBufferingProtocol;
195 public:
196  OutputBase();
197 
198  virtual ~OutputBase();
199 
200  ParameterBase & data();
201 
202  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
203 
204  DoubleBufferingProtocol * getProtocol() override { return mProtocol; }
205 
206  DoubleBufferingProtocol const * getProtocol() const override { return mProtocol; }
207 
213  void swapBuffers( bool copyValue = false );
214 
215  void setProtocolInstance( DoubleBufferingProtocol * protocol );
216 
217 private:
218  DoubleBufferingProtocol * mProtocol;
219 };
220 
221 template<class MessageType>
222 class DoubleBufferingProtocol::Output: public OutputBase
223 {
224 public:
225  using OutputBase::swapBuffers;
226 
227  MessageType & data()
228  {
229  return static_cast<MessageType&>(mProtocol->frontData());
230  }
231 };
232 
233 } // namespace pml
234 } // namespace visr
235 
237 
238 #endif // VISR_PML_DOUBLE_BUFFERING_PROTOCOL_HPP_INCLUDED
Definition: double_buffering_protocol.hpp:37
Definition: communication_protocol_base.hpp:94
static constexpr CommunicationProtocolType staticType()
Definition: double_buffering_protocol.hpp:58
Definition: double_buffering_protocol.hpp:39
uint64_t ParameterType
Definition: parameter_type.hpp:13
virtual CommunicationProtocolType protocolType() const override
Definition: double_buffering_protocol.hpp:75
friend class InputBase
Definition: double_buffering_protocol.hpp:168
std::uint64_t CommunicationProtocolType
Definition: communication_protocol_type.hpp:14
#define DEFINE_COMMUNICATION_PROTOCOL(CommunicationProtocolClassType, CommunicationProtocolId, CommunicationProtocolName)
Definition: communication_protocol_type.hpp:44
MessageType & data()
Definition: double_buffering_protocol.hpp:227
Definition: options.cpp:10
Definition: parameter_config_base.hpp:22
DoubleBufferingProtocol const * getProtocol() const override
Definition: double_buffering_protocol.hpp:154
constexpr CommunicationProtocolType communicationProtocolTypeFromString(char const *typeString)
Definition: communication_protocol_type.hpp:16
Definition: communication_protocol_base.hpp:21
DoubleBufferingProtocol * getProtocol() override
Definition: double_buffering_protocol.hpp:152
Definition: double_buffering_protocol.hpp:30
static constexpr char const * staticName()
Definition: double_buffering_protocol.hpp:63
Definition: parameter_base.hpp:18
MessageType const & data() const
Definition: double_buffering_protocol.hpp:174
Definition: communication_protocol_base.hpp:131