3030
3131#include < FairMQDevice.h>
3232#include < options/FairMQProgOptions.h>
33- #include " Headers/DataHeader .h"
33+ #include " O2Device/Utilities .h"
3434#include " Monitoring/MonitoringFactory.h"
3535#include < stdexcept>
36- #include < gsl/gsl>
37- #include " O2Device/Utilities.h"
3836
3937namespace o2
4038{
@@ -47,6 +45,7 @@ class O2Device : public FairMQDevice
4745{
4846 public:
4947 using FairMQDevice::FairMQDevice;
48+
5049 ~O2Device () override = default ;
5150
5251 // / Monitoring instance
@@ -66,82 +65,7 @@ class O2Device : public FairMQDevice
6665 }
6766 }
6867
69- // / Here is how to add an annotated data part (with header);
70- // / @param[in,out] parts is a reference to the message;
71- // / @param[] inputHeaderStack header block must be MOVED in (rvalue ref)
72- // / @param[] inputDataMessage the data message must be MOVED in (unique_ptr by value)
73- bool AddMessage (O2Message& parts, o2::header::Stack&& inputHeaderStack, FairMQMessagePtr inputDataMessage)
74- {
75-
76- // we have to move the incoming data
77- using std::move;
78- o2::header::Stack headerStack{ move (inputHeaderStack) };
79- FairMQMessagePtr dataMessage{ move (inputDataMessage) };
80-
81- FairMQMessagePtr headerMessage =
82- o2::memoryResources::getMessage (move (inputHeaderStack));
83-
84- parts.AddPart (move (headerMessage));
85- parts.AddPart (move (dataMessage));
86- return true ;
87- }
88-
89- // this executes user code (e.g. a lambda) on each data block (header-payload pair)
90- template <typename F>
91- bool ForEach (O2Message& parts, F function)
92- {
93- if ((parts.Size () % 2 ) != 0 ) {
94- throw std::invalid_argument (
95- " number of parts in message not even (n%2 != 0), cannot be considered an O2 compliant message" );
96- }
97-
98- return ForEach (parts.begin (), parts.end (), function);
99- }
100-
101- // this executes user code (a member function) on a data block (header-payload pair)
102- // at some point should de DEPRECATED in favor of the lambda version
103- template <typename T, typename std::enable_if<std::is_base_of<O2Device, T>::value, int >::type = 0 >
104- bool ForEach (O2Message& parts, bool (T::*memberFunction)(const byte* headerBuffer, size_t headerBufferSize,
105- const byte* dataBuffer, size_t dataBufferSize))
106- {
107- if ((parts.Size () % 2 ) != 0 ) {
108- throw std::invalid_argument (
109- " number of parts in message not even (n%2 != 0), cannot be considered an O2 compliant message" );
110- }
111-
112- return ForEach (parts.fParts .begin (), parts.fParts .end (),
113- [&](gsl::span<const byte> headerBuffer, gsl::span<const byte> dataBuffer) {
114- (static_cast <T*>(this )->*memberFunction)(headerBuffer.data (), headerBuffer.size (),
115- dataBuffer.data (), dataBuffer.size ());
116- });
117- }
118-
11968 private:
120- template <typename I, typename F>
121- bool ForEach (I begin, I end, F function)
122- {
123- using span = gsl::span<const byte>;
124- using gsl::narrow_cast;
125- for (auto it = begin; it != end; ++it) {
126- byte* headerBuffer{ nullptr };
127- span::index_type headerBufferSize{ 0 };
128- if (*it != nullptr ) {
129- headerBuffer = reinterpret_cast <byte*>((*it)->GetData ());
130- headerBufferSize = narrow_cast<span::index_type>((*it)->GetSize ());
131- }
132- ++it;
133- byte* dataBuffer{ nullptr };
134- span::index_type dataBufferSize{ 0 };
135- if (*it != nullptr ) {
136- dataBuffer = reinterpret_cast <byte*>((*it)->GetData ());
137- dataBufferSize = narrow_cast<span::index_type>((*it)->GetSize ());
138- }
139-
140- // call the user provided function
141- function (span{ headerBuffer, headerBufferSize }, span{ dataBuffer, dataBufferSize });
142- }
143- return true ;
144- }
14569};
14670}
14771}
0 commit comments