ATLAS Offline Software
Loading...
Searching...
No Matches
PackedContainerStreamer.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
10
11
15#include "TClassStreamer.h"
16#include "TMemberStreamer.h"
17#include "TError.h"
18#include "TROOT.h"
19#include <cassert>
20
21
22namespace SG {
23
24
30inline
31void writePackedParameters( TBuffer& b, const SG::PackedParameters& parms ) {
32 b << parms.nbits();
33 b << parms.flags();
34 if (parms.isFloat()) {
35 b << parms.nmantissa();
36 if (parms.hasScale())
37 b << parms.scale();
38 }
39}
40
41
46inline
48 uint8_t nbits;
49 b >> nbits;
50
51 uint8_t flags;
52 b >> flags;
53
54 SG::PackedParameters parms (nbits, flags);
55 if (parms.isFloat()) {
56 uint8_t nmantissa;
57 b >> nmantissa;
58 parms.setNmantissa (nmantissa);
59 if (parms.hasScale()) {
60 float scale;
61 b >> scale;
62 parms.setScale (scale);
63 }
64 }
65 return parms;
66}
67
68
72template <class T, class ALLOC>
74 : public TClassStreamer
75{
76public:
81
82
88 virtual void operator()(TBuffer &b, void *objp) override;
89
90
94 virtual TClassStreamer* Generate() const override;
95
96
97private:
99 std::string m_className;
100};
101
102
106template <class T, class ALLOC>
111
112
118template <class T, class ALLOC>
121 reinterpret_cast<SG::PackedContainer<T, ALLOC>*> (objp);
122
123 if (b.IsReading()) {
124 UInt_t R__s, R__c;
125 Version_t R__v = b.ReadVersion(&R__s, &R__c);
126 if (R__v != 1) {
127 Error ("PackedContainerStreamer",
128 "Bad version %d for object of type %s (expected 1)",
129 R__v, m_className.c_str());
130 }
131
132 cont->setParms (readPackedParameters (b));
133
134 uint32_t nelt;
135 b >> nelt;
136
137 SG::PackedConverter cnv (cont->parms());
138 cnv.read (nelt, *cont, b);
139
140 b.CheckByteCount(R__s, R__c, m_className.c_str());
141 }
142 else {
143 UInt_t R__c = b.Length();
144 b.SetBufferOffset (R__c + sizeof(UInt_t));
145 b << Version_t(1);
146 writePackedParameters (b, cont->parms());
147
148 uint32_t nelt = cont->size();
149 b << nelt;
150
151 SG::PackedConverter cnv (cont->parms());
152 cnv.write (cont->size(), *cont, b);
153
154 b.SetByteCount(R__c, kTRUE);
155 }
156}
157
158
162template <class T, class ALLOC>
164{
165 return new PackedContainerStreamer<T, ALLOC> (*this);
166}
167
168
169template <class T, class ALLOC>
171
172
173} // namespace SG
174
175
176#define STREAMER1(TYPE, ALLOC) \
177 namespace ROOT { TGenericClassInfo* GenerateInitInstance(const SG::PackedContainer<TYPE, ALLOC>*);} \
178 namespace SG { \
179 template <> struct InstallPackedContainerStreamer<TYPE, ALLOC> { \
180 InstallPackedContainerStreamer() { \
181 ROOT::GenerateInitInstance((SG::PackedContainer<TYPE, ALLOC>*)nullptr)->AdoptStreamer (new PackedContainerStreamer<TYPE, ALLOC>) ; \
182 } }; \
183 InstallPackedContainerStreamer<TYPE, ALLOC> _R__UNIQUE_(streamerInstance); \
184 } class swallowSemicolon
185
186#define STREAMER(TYPE) STREAMER1(TYPE, std::allocator<TYPE>)
187
188
190STREAMER(unsigned char);
191STREAMER(short);
192STREAMER(unsigned short);
194STREAMER(unsigned int);
195STREAMER(float);
196STREAMER(double);
197
198STREAMER(std::vector<char>);
199STREAMER(std::vector<unsigned char>);
200STREAMER(std::vector<short>);
201STREAMER(std::vector<unsigned short>);
202STREAMER(std::vector<int>);
203STREAMER(std::vector<unsigned int>);
204STREAMER(std::vector<float>);
205STREAMER(std::vector<double>);
206
207STREAMER(std::vector<std::vector<char> >);
208STREAMER(std::vector<std::vector<unsigned char> >);
209STREAMER(std::vector<std::vector<short> >);
210STREAMER(std::vector<std::vector<unsigned short> >);
211STREAMER(std::vector<std::vector<int> >);
212STREAMER(std::vector<std::vector<unsigned int> >);
213STREAMER(std::vector<std::vector<float> >);
214STREAMER(std::vector<std::vector<double> >);
215
216#undef STREAMER
#define STREAMER(TYPE)
Container to hold aux data to be stored in a packed form.
Helper for packing/unpacking a PackedContainer to/from a stream.
An interface for getting the name of a class as a string.
std::string m_className
Name of the class we read/write (for error messages).
virtual void operator()(TBuffer &b, void *objp) override
Run the streamer.
virtual TClassStreamer * Generate() const override
Clone operation, required for MT.
Container to hold aux data to be stored in a packed form.
void setParms(const PackedParameters &parms)
Set the packing parameters.
const PackedParameters & parms() const
Return the packing parameters for this container.
Helper for packing/unpacking a PackedContainer to/from a stream.
void write(size_t nelt, const std::vector< U, ALLOC > &vec, STREAM &stream)
Pack a vector to the stream.
void read(size_t nelt, std::vector< U, ALLOC > &vec, STREAM &stream)
Unpack a vector from the stream.
Describe how the contents of a PackedContainer are to be saved.
bool hasScale() const
Should floats be rescaled before writing?
bool isFloat() const
Are elements being written as floating-point numbers?
bool setNmantissa(uint8_t nmantissa)
Set the number of mantissa bits used in the packed representation.
uint8_t nbits() const
The number of bits used to store each element.
bool setScale(float scale)
Set the scale to use when packing floating-point data.
uint8_t nmantissa() const
The number of bits used for the mantissa portion of a float-point representation, excluding a sign bi...
float scale() const
Return the scale for floating-point numbers.
uint8_t flags() const
Additional flags describing the packing.
Forward declaration.
void writePackedParameters(TBuffer &b, const SG::PackedParameters &parms)
Write a set of packed parameters to a buffer.
SG::PackedParameters readPackedParameters(TBuffer &b)
Read a set of packed parameters from a buffer.