source: XIOS/dev/dev_olga/src/filter/input_pin.hpp @ 1021

Last change on this file since 1021 was 1021, checked in by oabramkina, 7 years ago

Intermeadiate version for merging with new server functionalities.

File size: 3.3 KB
Line 
1#ifndef __XIOS_CInputPin__
2#define __XIOS_CInputPin__
3
4#include <vector>
5#include <map>
6
7#include "garbage_collector.hpp"
8#include "data_packet.hpp"
9
10namespace xios
11{
12  class COutputPin;
13
14  /*!
15   * An input pin handles the data packets received by a filter.
16   */
17  class CInputPin : public InvalidableObject
18  {
19    public:
20      /*!
21       * Constructs an input pin with the specified number of slots
22       * and an associated garbage collector.
23       *
24       * \param gc the garbage collector associated with this input pin
25       * \param slotsCount the number of slots
26       */
27      CInputPin(CGarbageCollector& gc, size_t slotsCount);
28
29      /*!
30       * Sets the trigger for a specific input slot.
31       *
32       * \param inputSlot the input slot number
33       * \param trigger the corresponding trigger
34       */
35      void virtual setInputTrigger(size_t inputSlot, COutputPin* trigger);
36
37      /*!
38       * Receives a data packet from an upstream filter on
39       * the specified input slot.
40       * The receiving filter takes ownership of the packet.
41       *
42       * \param inputSlot the input slot number
43       * \param packet the data packet to be received
44       */
45      void setInput(size_t inputSlot, CDataPacketPtr packet);
46
47      /*!
48       * Triggers the input of any buffered packet for the specified timestamp.
49       *
50       * \param timestamp the timestamp for which we are triggering the input
51       */
52      void virtual trigger(Time timestamp);
53
54      /*!
55       * Tests if the pin can be triggered.
56       *
57       * \return true if the pin can be triggered
58       */
59      bool virtual canBeTriggered() const;
60
61      /*!
62       * Removes all pending packets which are older than the specified timestamp.
63       *
64       * \param timestamp the timestamp used for invalidation
65       */
66      void virtual invalidate(Time timestamp);
67
68    protected:
69      /*!
70       * Function triggered when all slots have been filled for a specific timestamp.
71       * It should be implemented by the filter class to process the data.
72       *
73       * \param data a vector of packets corresponding to each slot
74       */
75      void virtual onInputReady(std::vector<CDataPacketPtr> data) = 0;
76
77    private:
78      /*!
79       * Helper structure, groups a vector of packets corresponding to each slot
80       * with the number of slots currently filled
81       */
82      struct InputBuffer
83      {
84        size_t slotsFilled; //!< Number of slots currently filled
85        std::vector<CDataPacketPtr> packets; //< Vector of packets corresponding to each slot
86
87        /*!
88         * Initialize an empty input buffer for the specified number of slots.
89         *
90         * \param slotsCount the number of slots
91         */
92        InputBuffer(size_t slotsCount)
93          : slotsFilled(0)
94          , packets(slotsCount)
95        { /* Nothing to do */ };
96      };
97
98      CGarbageCollector& gc; //!< The garbage collector associated to the input pin
99
100      size_t slotsCount; //!< The number of slots
101
102      //! Input buffer, store the packets until all slots are full for a timestep
103      std::map<Time, InputBuffer> inputs;
104
105      //! Store the triggers corresponding to the input slots
106      std::vector<COutputPin*> triggers;
107
108      //! Whether some triggers have been set
109      bool hasTriggers;
110  }; // class CInputPin
111} // namespace xios
112
113#endif //__XIOS_CInputPin__
Note: See TracBrowser for help on using the repository browser.