stromx  0.8.0
Operator.h
1 /*
2 * Copyright 2011 Matthias Fuchs
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 #ifndef STROMX_RUNTIME_OPERATOR_H
18 #define STROMX_RUNTIME_OPERATOR_H
19 
20 #include <map>
21 #include <set>
22 #include <string>
23 #include "stromx/runtime/ConnectorObserver.h"
24 #include "stromx/runtime/DataContainer.h"
25 #include "stromx/runtime/DataRef.h"
26 #include "stromx/runtime/Exception.h"
27 #include "stromx/runtime/OperatorInfo.h"
28 #include "stromx/runtime/Position.h"
29 
30 namespace stromx
31 {
32  namespace runtime
33  {
34  class AbstractFactory;
35  class Id2DataMapper;
36  class OperatorInfo;
37  class OperatorKernel;
38 
39  namespace impl
40  {
41  class InputNode;
42  class Network;
43  class MutexHandle;
44  class OutputNode;
45  class SynchronizedOperatorKernel;
46  }
47 
60  class STROMX_RUNTIME_API Operator
61  {
62  friend class FactoryTest;
63  friend class OperatorTest;
64  friend class InputNodeTest;
65  friend class NetworkTest;
66  friend class OperatorTester;
67  friend class OutputNodeTest;
68  friend class ThreadImplTest;
69  friend class SendReceiveTest;
70  friend class Stream;
71  friend class Thread;
72  friend class impl::Network;
73 
74  public:
76  enum Status
77  {
85  EXECUTING
86  };
87 
93  explicit Operator(OperatorKernel* const kernel);
94 
95  virtual ~Operator();
96 
98  const std::string & name() const { return m_name; }
99 
105  void setName(const std::string & name) { m_name = name; }
106 
108  const Position & position() const { return m_position; }
109 
115  void setPosition(const Position & position) { m_position = position; }
116 
121  const OperatorInfo& info() const;
122 
124  Status status() const;
125 
136  void setParameter(const unsigned int id, const Data& value);
137 
154  void setParameter(const unsigned int id, const Data& value, const unsigned int timeout);
155 
167  DataRef getParameter(const unsigned int id) const;
168 
183  DataRef getParameter(const unsigned int id, const unsigned int timeout) const;
184 
196  const DataContainer getOutputData(const unsigned int id) const;
197 
205  void setInputData(const unsigned int id, const DataContainer & data);
206 
212  void clearOutputData(const unsigned int id);
213 
221  void addObserver(const ConnectorObserver* const observer);
222 
229  void removeObserver(const ConnectorObserver* const observer);
230 
237  const AbstractFactory* factory() const;
238 
248  void setFactory(const AbstractFactory* const factory);
249 
250  private:
251  class InternalObserver;
252 
253  Operator(const Operator& op);
254 
255  void initialize();
256  void deinitialize();
257  void setConnectorType(const unsigned int id, const Description::Type type,
258  const Parameter::UpdateBehavior behavior);
259  impl::InputNode* getInputNode(const unsigned int id) const;
260  impl::OutputNode* getOutputNode(const unsigned int id) const;
261  void activate();
262  void deactivate();
263  void interrupt();
264  void observeInput(const unsigned int id, const DataContainer & oldData,
265  const DataContainer & newData) const;
266  void observeOutput(const unsigned int id, const DataContainer & oldData,
267  const DataContainer & newData) const;
268 
269  std::string m_name;
270  InternalObserver* m_inputObserver;
271  InternalObserver* m_outputObserver;
272  impl::SynchronizedOperatorKernel* m_kernel;
273  std::map<unsigned int, impl::OutputNode*> m_outputs;
274  std::map<unsigned int, impl::InputNode*> m_inputs;
275  std::set<const ConnectorObserver*> m_observers;
276  Position m_position;
277  impl::MutexHandle* m_observerMutex;
278  };
279  }
280 }
281 
282 #endif // STROMX_RUNTIME_OPERATOR_H
Abstract data object.
Definition: Data.h:53
Reference to a data object.
Definition: DataRef.h:48
Container which manages the life-cycle of data objects.
Definition: DataContainer.h:43
Operator with utility functions for unit testing.
Definition: OperatorTester.h:27
void setName(const std::string &name)
Definition: Operator.h:105
const std::string & name() const
Definition: Operator.h:98
Definition: Operator.h:83
const Position & position() const
Definition: Operator.h:108
Type
Definition: Description.h:73
Factory of operator and data objects.
Definition: AbstractFactory.h:32
UpdateBehavior
Definition: Description.h:86
The stromx class library.
Definition: AdjustRgbChannels.cpp:29
Definition: Operator.h:79
The core data processing pipeline of stromx.
Definition: Stream.h:45
2D position.
Definition: Position.h:26
Meta-information about an operator.
Definition: OperatorInfo.h:51
Abstract operator.
Definition: Operator.h:60
A thread which visits input nodes.
Definition: Thread.h:53
Abstract operator kernel.
Definition: OperatorKernel.h:46
Status
Definition: Operator.h:76
void setPosition(const Position &position)
Definition: Operator.h:115
Abstract base class of observers of operator connectors.
Definition: ConnectorObserver.h:30