VISR  0.11.1
Versatile Interactive Scene Renderer
shared_data_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_SHARED_DATA_PROTOCOL_HPP_INCLUDED
4 #define VISR_PML_SHARED_DATA_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 
25 class VISR_PML_LIBRARY_SYMBOL SharedDataProtocol: public CommunicationProtocolBase
26 {
27 public:
31  class InputBase;
32  template<class DataType > class Input;
33  class OutputBase;
34  template<class DataType > class Output;
35 
36  explicit SharedDataProtocol( ParameterType const & config,
37  ParameterConfigBase const & parameterConfig );
38 
39  virtual ~SharedDataProtocol() override;
40 
41  ParameterType parameterType( ) const override;
42 
43  virtual CommunicationProtocolType protocolType( ) const override;
44 
45  static constexpr CommunicationProtocolType staticType() { return communicationProtocolTypeFromString( sProtocolName ); };
46 
47  static constexpr const char * staticName() { return sProtocolName; }
48 
50  {
51  return *mData;
52  }
53 
54  ParameterBase const & data( ) const
55  {
56  return *mData;
57  }
58 
59  void connectInput( CommunicationProtocolBase::Input* port ) override;
60 
61  void connectOutput( CommunicationProtocolBase::Output* port ) override;
62 
63  bool disconnectInput( CommunicationProtocolBase::Input* port ) noexcept override;
64 
65  bool disconnectOutput( CommunicationProtocolBase::Output* port ) noexcept override;
66 
67 private:
68  ParameterType mParameterType;
69 
70  std::unique_ptr<ParameterConfigBase> const mParameterConfig;
71 
75  std::unique_ptr<ParameterBase> mData;
76 
77  OutputBase* mOutput;
78  std::vector<InputBase*> mInputs;
79 
80  static constexpr const char * sProtocolName = "SharedData";
81 };
82 
83 class VISR_PML_LIBRARY_SYMBOL SharedDataProtocol::InputBase: public CommunicationProtocolBase::Input
84 {
85 public:
90  : mProtocol( nullptr )
91  {
92  }
93 
94  virtual ~InputBase();
95 
96  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
97 
98  SharedDataProtocol * getProtocol() override { return mProtocol; }
99 
100  SharedDataProtocol const * getProtocol() const override { return mProtocol; }
101 
102  ParameterBase const & data() const
103  {
104  return mProtocol->data();
105  }
106 
108  {
109  mProtocol = protocol;
110  }
111 private:
112  SharedDataProtocol * mProtocol;
113 }; // class InputBase
114 
115 template<class MessageType>
117 {
118  friend class InputBase;
119 public:
120  MessageType const & data() const
121  {
122  return static_cast<MessageType const&>(InputBase::data());
123  }
124 };
125 
127 // Output
128 
130 {
131 public:
136  : mProtocol( nullptr )
137  {
138  }
139 
140  virtual ~OutputBase();
141 
142  void setProtocolInstance( CommunicationProtocolBase * protocol ) override;
143 
144  SharedDataProtocol * getProtocol() override { return mProtocol; }
145 
146  SharedDataProtocol const * getProtocol() const override { return mProtocol; }
147 
149  {
150  return mProtocol->data();
151  }
152 
154  {
155  mProtocol = protocol;
156  }
157 
158 #if 0
159  bool isConnected() const override
160  {
161  return mProtocol != nullptr;
162  }
163 #endif
164 private:
165  SharedDataProtocol * mProtocol;
166 }; // class OutputBase
167 
168 template<class MessageType>
170 {
171 public:
172  MessageType & data()
173  {
174  return static_cast<MessageType&>(OutputBase::data());
175  }
176 };
177 
178 } // namespace pml
179 } // namespace visr
180 
182 
183 #endif // VISR_PML_SHARED_DATA_PROTOCOL_HPP_INCLUDED
static constexpr const char * staticName()
Definition: shared_data_protocol.hpp:47
MessageType const & data() const
Definition: shared_data_protocol.hpp:120
Definition: shared_data_protocol.hpp:34
Definition: communication_protocol_base.hpp:94
OutputBase()
Definition: shared_data_protocol.hpp:135
Definition: shared_data_protocol.hpp:32
uint64_t ParameterType
Definition: parameter_type.hpp:13
static constexpr CommunicationProtocolType staticType()
Definition: shared_data_protocol.hpp:45
ParameterBase & data()
Definition: shared_data_protocol.hpp:148
Definition: shared_data_protocol.hpp:25
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: shared_data_protocol.hpp:172
Definition: options.cpp:10
Definition: parameter_config_base.hpp:22
void setProtocolInstance(SharedDataProtocol *protocol)
Definition: shared_data_protocol.hpp:107
ParameterBase const & data() const
Definition: shared_data_protocol.hpp:102
Definition: shared_data_protocol.hpp:129
ParameterBase & data()
Definition: shared_data_protocol.hpp:49
SharedDataProtocol * getProtocol() override
Definition: shared_data_protocol.hpp:98
constexpr CommunicationProtocolType communicationProtocolTypeFromString(char const *typeString)
Definition: communication_protocol_type.hpp:16
SharedDataProtocol * getProtocol() override
Definition: shared_data_protocol.hpp:144
Definition: communication_protocol_base.hpp:21
Definition: shared_data_protocol.hpp:83
InputBase()
Definition: shared_data_protocol.hpp:89
ParameterBase const & data() const
Definition: shared_data_protocol.hpp:54
Definition: parameter_base.hpp:18
void setProtocolInstance(SharedDataProtocol *protocol)
Definition: shared_data_protocol.hpp:153
Definition: communication_protocol_base.hpp:131
SharedDataProtocol const * getProtocol() const override
Definition: shared_data_protocol.hpp:100
SharedDataProtocol const * getProtocol() const override
Definition: shared_data_protocol.hpp:146