1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#ifndef FWCore_SharedMemory_ROOTDeserializer_h
#define FWCore_SharedMemory_ROOTDeserializer_h
// -*- C++ -*-
//
// Package: FWCore/SharedMemory
// Class : ROOTDeserializer
//
/**\class ROOTDeserializer ROOTDeserializer.h " FWCore/SharedMemory/interface/ROOTDeserializer.h"
Description: Use ROOT dictionaries to deserialize object from a buffer
Usage:
Used in conjunction with ROOTSerializer.
*/
//
// Original Author: Chris Jones
// Created: 22/01/2020
//
// system include files
#include "TClass.h"
#include "TBufferFile.h"
// user include files
// forward declarations
namespace edm::shared_memory {
template <typename T, typename READBUFFER>
class ROOTDeserializer {
public:
ROOTDeserializer(READBUFFER& iBuffer)
: buffer_{iBuffer}, class_{TClass::GetClass(typeid(T))}, bufferFile_(TBuffer::kRead) {}
ROOTDeserializer(const ROOTDeserializer&) = delete;
const ROOTDeserializer& operator=(const ROOTDeserializer&) = delete;
ROOTDeserializer(ROOTDeserializer&&) = delete;
const ROOTDeserializer& operator=(ROOTDeserializer&&) = delete;
// ---------- const member functions ---------------------
// ---------- member functions ---------------------------
T deserialize() {
T value;
if (previousBufferIdentifier_ != buffer_.bufferIdentifier()) {
auto buff = buffer_.buffer();
bufferFile_.SetBuffer(buff.first, buff.second, kFALSE);
previousBufferIdentifier_ = buffer_.bufferIdentifier();
}
class_->ReadBuffer(bufferFile_, &value);
bufferFile_.Reset();
return value;
}
private:
// ---------- member data --------------------------------
READBUFFER& buffer_;
TClass* const class_;
TBufferFile bufferFile_;
int previousBufferIdentifier_ = 0;
};
} // namespace edm::shared_memory
#endif
|