Skip to content

Commit 14ae43e

Browse files
mkrzewicmatthiasrichter
authored andcommitted
Ask for pointer to get a pointer in header::get<T>
1 parent 29cd59c commit 14ae43e

30 files changed

Lines changed: 75 additions & 69 deletions

Algorithm/include/Algorithm/HeaderStack.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void dispatchHeaderStackCallback(PtrType ptr,
6767
HeaderType /*dummy*/,
6868
HeaderCallbackType onHeader)
6969
{
70-
const HeaderType* h = o2::header::get<HeaderType>(ptr, size);
70+
const HeaderType* h = o2::header::get<HeaderType*>(ptr, size);
7171
if (h) {
7272
onHeader(*h);
7373
}
@@ -134,7 +134,7 @@ void parseHeaderStack(PtrType ptr,
134134
SizeType size,
135135
HeaderType & header)
136136
{
137-
const HeaderType* h = o2::header::get<HeaderType>(ptr, size);
137+
const HeaderType* h = o2::header::get<HeaderType*>(ptr, size);
138138
if (h) {
139139
header = *h;
140140
}

Algorithm/include/Algorithm/O2FormatParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ int parseO2Format(const InputListT& list,
6969
for (auto & part : list) {
7070
if (!dh) {
7171
// new header - payload pair, read DataHeader
72-
dh = o2::header::get<o2::header::DataHeader>(getPointer(part), getSize(part));
72+
dh = o2::header::get<o2::header::DataHeader*>(getPointer(part), getSize(part));
7373
if (!dh) {
7474
return -ENOMSG;
7575
}

DataFormats/Headers/include/Headers/DataHeader.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -406,22 +406,28 @@ struct BaseHeader
406406

407407
/// find a header of type HeaderType in a buffer
408408
/// use like this:
409-
/// HeaderType* h = get<HeaderType>(buffer)
410-
template<typename HeaderType>
411-
const HeaderType* get(const byte* buffer, size_t /*len*/=0) {
409+
/// HeaderType* h = get<HeaderType*>(buffer)
410+
template <typename HeaderType, typename std::enable_if_t<std::is_pointer<HeaderType>::value, int> = 0>
411+
auto get(const byte* buffer, size_t /*len*/ = 0)
412+
{
413+
using HeaderConstPtrType = const typename std::remove_pointer<HeaderType>::type*;
414+
using HeaderValueType = typename std::remove_pointer<HeaderType>::type;
415+
412416
const BaseHeader* current = BaseHeader::get(buffer);
413-
if (!current) return nullptr;
414-
if (current->description==HeaderType::sHeaderType)
415-
return reinterpret_cast<const HeaderType*>(current);
417+
if (!current)
418+
return HeaderConstPtrType{ nullptr };
419+
if (current->description == HeaderValueType::sHeaderType)
420+
return reinterpret_cast<HeaderConstPtrType>(current);
416421
while ((current = current->next())) {
417-
if (current->description==HeaderType::sHeaderType)
418-
return reinterpret_cast<const HeaderType*>(current);
422+
if (current->description == HeaderValueType::sHeaderType)
423+
return reinterpret_cast<HeaderConstPtrType>(current);
419424
}
420-
return nullptr;
425+
return HeaderConstPtrType{ nullptr };
421426
}
422427

423-
template<typename HeaderType>
424-
const HeaderType* get(const void* buffer, size_t len=0) {
428+
template <typename HeaderType, typename std::enable_if_t<std::is_pointer<HeaderType>::value, int> = 0>
429+
auto get(const void* buffer, size_t len = 0)
430+
{
425431
return get<HeaderType>(reinterpret_cast<const byte *>(buffer), len);
426432
}
427433

DataFormats/Headers/test/testDataHeader.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,10 @@ namespace o2 {
166166
Stack s1{ DataHeader{ gDataDescriptionInvalid, gDataOriginInvalid, DataHeader::SubSpecificationType{ 0 }, 0 },
167167
NameHeader<9>{ "somename" } };
168168

169-
const DataHeader* h1 = get<DataHeader>(s1.buffer.get());
169+
const DataHeader* h1 = get<DataHeader*>(s1.buffer.get());
170170
BOOST_CHECK(h1 != nullptr);
171171
BOOST_CHECK(*h1 == dh1);
172-
const NameHeader<0>* h2 = get<NameHeader<0>>(s1.buffer.get());
172+
const NameHeader<0>* h2 = get<NameHeader<0>*>(s1.buffer.get());
173173
BOOST_CHECK(h2 != nullptr);
174174
BOOST_CHECK(0 == std::strcmp(h2->getName(), "somename"));
175175
BOOST_CHECK(h2->description == NameHeader<0>::sHeaderType);

Framework/Core/include/Framework/DataRefUtils.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct DataRefUtils {
3434
as(DataRef const& ref)
3535
{
3636
using DataHeader = o2::header::DataHeader;
37-
auto header = o2::header::get<const DataHeader>(ref.header);
37+
auto header = o2::header::get<const DataHeader*>(ref.header);
3838
if (header->payloadSerializationMethod != o2::header::gSerializationMethodNone) {
3939
throw std::runtime_error("Attempt to extract a POD from a wrong message kind");
4040
}
@@ -59,7 +59,7 @@ struct DataRefUtils {
5959
as(DataRef const& ref)
6060
{
6161
using DataHeader = o2::header::DataHeader;
62-
auto header = o2::header::get<const DataHeader>(ref.header);
62+
auto header = o2::header::get<const DataHeader*>(ref.header);
6363
if (header->payloadSerializationMethod != o2::header::gSerializationMethodROOT) {
6464
throw std::runtime_error("Attempt to extract a TMessage from non-ROOT serialised message");
6565
}
@@ -126,7 +126,7 @@ struct DataRefUtils {
126126
{
127127
using T = typename W::wrapped_type;
128128
using DataHeader = o2::header::DataHeader;
129-
auto header = o2::header::get<const DataHeader>(ref.header);
129+
auto header = o2::header::get<const DataHeader*>(ref.header);
130130
if (header->payloadSerializationMethod != o2::header::gSerializationMethodROOT) {
131131
throw std::runtime_error("Attempt to extract a TMessage from non-ROOT serialised message");
132132
}
@@ -153,7 +153,7 @@ struct DataRefUtils {
153153
static unsigned getPayloadSize(const DataRef& ref)
154154
{
155155
using DataHeader = o2::header::DataHeader;
156-
auto header = o2::header::get<const DataHeader>(ref.header);
156+
auto header = o2::header::get<const DataHeader*>(ref.header);
157157
if (!header) {
158158
return 0;
159159
}

Framework/Core/include/Framework/InputRecord.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class InputRecord {
202202
using DataHeader = o2::header::DataHeader;
203203

204204
auto ref = this->get(binding);
205-
auto header = o2::header::get<const DataHeader>(ref.header);
205+
auto header = o2::header::get<const DataHeader*>(ref.header);
206206
auto method = header->payloadSerializationMethod;
207207
if (method == o2::header::gSerializationMethodNone) {
208208
auto const* ptr = reinterpret_cast<T const*>(ref.payload);
@@ -234,7 +234,7 @@ class InputRecord {
234234
using DataHeader = o2::header::DataHeader;
235235

236236
auto ref = this->get(binding);
237-
auto header = o2::header::get<const DataHeader>(ref.header);
237+
auto header = o2::header::get<const DataHeader*>(ref.header);
238238
auto method = header->payloadSerializationMethod;
239239
if (method == o2::header::gSerializationMethodNone) {
240240
throw std::runtime_error(

Framework/Core/src/DataAllocator.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ DataAllocator::addPartToContext(FairMQMessagePtr&& payloadMessage,
155155

156156
// FIXME: this is kind of ugly, we know that we can change the content of the
157157
// header message because we have just created it, but the API declares it const
158-
const DataHeader *cdh = o2::header::get<DataHeader>(headerMessage->GetData());
158+
const DataHeader* cdh = o2::header::get<DataHeader*>(headerMessage->GetData());
159159
DataHeader *dh = const_cast<DataHeader *>(cdh);
160160
dh->payloadSize = payloadMessage->GetSize();
161161
parts.AddPart(std::move(headerMessage));

Framework/Core/src/DataProcessingDevice.cxx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ DataProcessingDevice::HandleData(FairMQParts &iParts, int /*index*/) {
127127
}
128128
for (size_t hi = 0; hi < parts.Size()/2; ++hi) {
129129
auto pi = hi*2;
130-
auto dh = o2::header::get<DataHeader>(parts.At(pi)->GetData());
130+
auto dh = o2::header::get<DataHeader*>(parts.At(pi)->GetData());
131131
if (!dh) {
132132
LOG(ERROR) << "Header is not a DataHeader?";
133133
return false;
@@ -136,7 +136,7 @@ DataProcessingDevice::HandleData(FairMQParts &iParts, int /*index*/) {
136136
LOG(ERROR) << "DataHeader payloadSize mismatch";
137137
return false;
138138
}
139-
auto dph = o2::header::get<DataProcessingHeader>(parts.At(pi)->GetData());
139+
auto dph = o2::header::get<DataProcessingHeader*>(parts.At(pi)->GetData());
140140
if (!dph) {
141141
LOG(ERROR) << "Header stack does not contain DataProcessingHeader";
142142
return false;
@@ -270,12 +270,12 @@ DataProcessingDevice::HandleData(FairMQParts &iParts, int /*index*/) {
270270
for (size_t ii = 0, ie = record.size(); ii != ie; ++ii) {
271271
DataRef input = record.getByPos(ii);
272272
assert(input.header);
273-
auto dh = o2::header::get<DataHeader>(input.header);
273+
auto dh = o2::header::get<DataHeader*>(input.header);
274274
if (!dh) {
275275
reportError("Header is not a DataHeader?");
276276
continue;
277277
}
278-
auto dph = o2::header::get<DataProcessingHeader>(input.header);
278+
auto dph = o2::header::get<DataProcessingHeader*>(input.header);
279279
if (!dph) {
280280
reportError("Header stack does not contain DataProcessingHeader");
281281
continue;
@@ -297,12 +297,12 @@ DataProcessingDevice::HandleData(FairMQParts &iParts, int /*index*/) {
297297
LOG(ERROR) << "Missing header!";
298298
continue;
299299
}
300-
auto fdph = o2::header::get<DataProcessingHeader>(header.get()->GetData());
300+
auto fdph = o2::header::get<DataProcessingHeader*>(header.get()->GetData());
301301
if (fdph == nullptr) {
302302
LOG(ERROR) << "Forwarded data does not have a DataProcessingHeader";
303303
continue;
304304
}
305-
auto fdh = o2::header::get<DataHeader>(header.get()->GetData());
305+
auto fdh = o2::header::get<DataHeader*>(header.get()->GetData());
306306
if (fdh == nullptr) {
307307
LOG(ERROR) << "Forwarded data does not have a DataHeader";
308308
continue;
@@ -314,8 +314,8 @@ DataProcessingDevice::HandleData(FairMQParts &iParts, int /*index*/) {
314314
forwardedParts.AddPart(std::move(header));
315315
forwardedParts.AddPart(std::move(payload));
316316
assert(forwardedParts.Size() == 2);
317-
assert(o2::header::get<DataProcessingHeader>(forwardedParts.At(0)->GetData()));
318-
LOG(DEBUG) << o2::header::get<DataProcessingHeader>(forwardedParts.At(0)->GetData())->startTime;
317+
assert(o2::header::get<DataProcessingHeader*>(forwardedParts.At(0)->GetData()));
318+
LOG(DEBUG) << o2::header::get<DataProcessingHeader*>(forwardedParts.At(0)->GetData())->startTime;
319319
LOG(DEBUG) << forwardedParts.At(0)->GetSize();
320320
// FIXME: this should use a correct subchannel
321321
device.Send(forwardedParts, forward.channel, 0);

Framework/Core/src/DataProcessor.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void DataProcessor::doSend(FairMQDevice &device, RootObjectContext &context) {
4040
FairMQMessagePtr payload(device.NewMessage());
4141
auto a = messageRef.payload.get();
4242
device.Serialize<TMessageSerializer>(*payload, a);
43-
const DataHeader *cdh = o2::header::get<DataHeader>(messageRef.header->GetData());
43+
const DataHeader* cdh = o2::header::get<DataHeader*>(messageRef.header->GetData());
4444
// sigh... See if we can avoid having it const by not
4545
// exposing it to the user in the first place.
4646
DataHeader *dh = const_cast<DataHeader *>(cdh);

Framework/Core/src/DataRelayer.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ size_t
4646
assignInputSpecId(void *data, std::vector<InputRoute> const &routes) {
4747
for (size_t ri = 0, re = routes.size(); ri < re; ++ri) {
4848
auto &route = routes[ri];
49-
const DataHeader *h = o2::header::get<DataHeader>(data);
49+
const DataHeader* h = o2::header::get<DataHeader*>(data);
5050
if (h == nullptr) {
5151
return re;
5252
}
@@ -101,8 +101,8 @@ DataRelayer::relay(std::unique_ptr<FairMQMessage> &&header,
101101
// header stack. This is an extension to the DataHeader, because apparently
102102
// we do have data which comes without a timestamp, although I am personally
103103
// not sure what that would be.
104-
auto getTimeslice = [&header,&timeslices]() -> int64_t {
105-
const DataProcessingHeader *dph = o2::header::get<DataProcessingHeader>(header->GetData());
104+
auto getTimeslice = [&header, &timeslices]() -> int64_t {
105+
const DataProcessingHeader* dph = o2::header::get<DataProcessingHeader*>(header->GetData());
106106
if (dph == nullptr) {
107107
return -1;
108108
}

0 commit comments

Comments
 (0)