Project
Loading...
Searching...
No Matches
Parser.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef ALGORITHM_PARSER_H
13#define ALGORITHM_PARSER_H
14
19
20#include <functional>
21#include <vector>
22
23namespace o2
24{
25
26namespace algorithm
27{
28
31template <typename T>
32struct typesize {
33 static const size_t size = sizeof(T);
34};
35// specialization for void
36template <>
37struct typesize<void> {
38 static const size_t size = 0;
39};
40
97template <typename HeaderT,
98 typename TrailerT = void>
100{
101 public:
102 using HeaderType = HeaderT;
103 using TrailerType = TrailerT;
104 using PayloadType = unsigned char;
105
108 struct FrameInfo {
109 using PtrT = const PayloadType*;
110
111 const HeaderType* header = nullptr;
112 const TrailerType* trailer = nullptr;
113 PtrT payload = nullptr;
114 size_t length = 0;
115 };
116
122 static const size_t totalOffset = headOffset + tailOffset;
123
126 using CheckHeaderFct = std::function<bool(const HeaderType&)>;
127
131 using CheckTrailerFctArgumentT = typename std::conditional<
132 !std::is_void<TrailerType>::value, TrailerType, int>::type;
133
136 template <typename U>
137 using CheckTrailerFct = typename std::conditional<
138 !std::is_void<U>::value,
139 std::function<bool(const CheckTrailerFctArgumentT&)>,
140 std::function<bool()>>::type;
141
144 using GetFrameSizeFct = std::function<size_t(const HeaderType&)>;
145
148 using InsertFct = std::function<bool(FrameInfo&)>;
149
153 template <typename InputType>
154 int parse(const InputType* buffer, size_t bufferSize,
155 CheckHeaderFct checkHeader,
156 CheckTrailerFct<TrailerType> checkTrailer,
157 GetFrameSizeFct getFrameSize,
158 InsertFct insert)
159 {
160 static_assert(sizeof(InputType) == 1,
161 "ForwardParser currently only supports byte type buffer");
162 if (buffer == nullptr || bufferSize == 0) {
163 return 0;
164 }
165
166 size_t position = 0;
167 std::vector<FrameInfo> frames;
168 do {
170
171 // check the header
172 if (sizeof(HeaderType) + position > bufferSize) {
173 break;
174 }
175 entry.header = reinterpret_cast<const HeaderType*>(buffer + position);
176 if (!checkHeader(*entry.header)) {
177 break;
178 }
179
180 // extract frame size from header, this is expected to be the
181 // total frome size including header, payload and optional trailer
182 auto frameSize = getFrameSize(*entry.header);
183 if (frameSize + position > bufferSize) {
184 break;
185 }
186
187 // payload starts right after the header
188 entry.payload = reinterpret_cast<typename FrameInfo::PtrT>(entry.header + 1);
189 entry.length = frameSize - totalOffset;
190
191 // optionally extract and check trailer
192 if (tailOffset > 0) {
193 entry.trailer = nullptr;
194 } else {
195 auto trailerStart = buffer + position + frameSize - tailOffset;
196 entry.trailer = reinterpret_cast<const TrailerType*>(trailerStart);
197 if (!CheckTrailer(entry, checkTrailer)) {
198 break;
199 }
200 }
201
202 // store the extracted frame info and continue with remaining buffer
203 frames.emplace_back(entry);
204 position += frameSize;
205 } while (position < bufferSize);
206
207 if (position == bufferSize) {
208 // frames found and format consistent, insert entries to target
209 // Note: the complete block must be consistent
210 for (auto entry : frames) {
211 if (!insert(entry)) {
212 break;
213 }
214 }
215 return frames.size();
216 } else if (frames.size() == 0) {
217 // no frames found at all, the buffer does not contain any
218 return 0;
219 }
220
221 // format error detected
222 // TODO: decide about error policy
223 return -1;
224 }
225
230 template <typename InputType, typename U = TrailerType>
231 typename std::enable_if<std::is_void<U>::value, int>::type
232 parse(const InputType* buffer, size_t bufferSize,
233 CheckHeaderFct checkHeader,
234 GetFrameSizeFct getFrameSize,
235 InsertFct insert)
236 {
237 auto checkTrailer = []() { return true; };
238 return parse(buffer, bufferSize, checkHeader, checkTrailer, getFrameSize, insert);
239 }
240
241 private:
244 template <typename U = TrailerType>
245 typename std::enable_if<!std::is_void<U>::value, bool>::type
246 CheckTrailer(const FrameInfo& entry, CheckTrailerFct<TrailerType>& checkTrailer) const
247 {
248 return checkTrailer(*entry.trailer);
249 }
250
251 template <typename U = TrailerType>
252 typename std::enable_if<std::is_void<U>::value, bool>::type
253 CheckTrailer(const FrameInfo&, CheckTrailerFct<TrailerType>&) const
254 {
255 return true;
256 }
257};
258
295template <typename HeaderT, typename TrailerT>
297{
298 public:
299 using HeaderType = HeaderT;
300 using TrailerType = TrailerT;
301 using PayloadType = unsigned char;
302
304 struct FrameInfo {
305 using PtrT = const PayloadType*;
306
307 const HeaderType* header = nullptr;
308 const TrailerType* trailer = nullptr;
309 PtrT payload = nullptr;
310 size_t length = 0;
311 };
317 static const size_t totalOffset = headOffset + tailOffset;
318
321 using CheckHeaderFct = std::function<bool(const HeaderType&)>;
323 using CheckTrailerFct = std::function<bool(const TrailerType&)>;
326 using GetFrameSizeFct = std::function<size_t(const TrailerType&)>;
329 using InsertFct = std::function<bool(const FrameInfo&)>;
330
334 template <typename InputType>
335 int parse(const InputType* buffer, size_t bufferSize,
336 CheckHeaderFct checkHeader,
337 CheckTrailerFct checkTrailer,
338 GetFrameSizeFct getFrameSize,
339 InsertFct insert)
340 {
341 static_assert(sizeof(InputType) == 1,
342 "ReverseParser currently only supports byte type buffer");
343 if (buffer == nullptr || bufferSize == 0) {
344 return 0;
345 }
346 auto position = bufferSize;
347 std::vector<FrameInfo> frames;
348 do {
350
351 // start from end, extract and check trailer
352 if (sizeof(TrailerType) > position) {
353 break;
354 }
355 entry.trailer = reinterpret_cast<const TrailerType*>(buffer + position - sizeof(TrailerType));
356 if (!checkTrailer(*entry.trailer)) {
357 break;
358 }
359
360 // get the total frame size
361 auto frameSize = getFrameSize(*entry.trailer);
362 if (frameSize > position) {
363 break;
364 }
365
366 // extract and check header
367 auto headerStart = buffer + position - frameSize;
368 entry.header = reinterpret_cast<const HeaderType*>(headerStart);
369 if (!checkHeader(*entry.header)) {
370 break;
371 }
372
373 // payload immediately after header
374 entry.payload = reinterpret_cast<typename FrameInfo::PtrT>(entry.header + 1);
375 entry.length = frameSize - sizeof(HeaderType) - sizeof(TrailerType);
376 frames.emplace_back(entry);
377 position -= frameSize;
378 } while (position > 0);
379
380 if (position == 0) {
381 // frames found and format consistent, the complete block must be consistent
382 for (auto entry : frames) {
383 if (!insert(entry)) {
384 break;
385 }
386 }
387 return frames.size();
388 } else if (frames.size() == 0) {
389 // no frames found at all, the buffer does not contain any
390 return 0;
391 }
392
393 // format error detected
394 // TODO: decide about error policy
395 return -1;
396 }
397};
398
399} // namespace algorithm
400
401} // namespace o2
402
403#endif // ALGORITHM_PARSER_H
std::enable_if< std::is_void< U >::value, int >::type parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, GetFrameSizeFct getFrameSize, InsertFct insert)
Definition Parser.h:232
std::function< bool(FrameInfo &)> InsertFct
Definition Parser.h:148
typename std::conditional< !std::is_void< TrailerType >::value, TrailerType, int >::type CheckTrailerFctArgumentT
Definition Parser.h:132
unsigned char PayloadType
Definition Parser.h:104
typename std::conditional< !std::is_void< U >::value, std::function< bool(const CheckTrailerFctArgumentT &)>, std::function< bool()> >::type CheckTrailerFct
Definition Parser.h:140
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct< TrailerType > checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
Definition Parser.h:154
std::function< size_t(const HeaderType &)> GetFrameSizeFct
Definition Parser.h:144
std::function< bool(const HeaderType &)> CheckHeaderFct
Definition Parser.h:126
static const size_t headOffset
the length offset due to header
Definition Parser.h:118
static const size_t tailOffset
the length offset due to trailer
Definition Parser.h:120
static const size_t totalOffset
total length offset due to header and trailer
Definition Parser.h:122
std::function< size_t(const TrailerType &)> GetFrameSizeFct
Definition Parser.h:326
static const size_t tailOffset
the length offset due to trailer
Definition Parser.h:315
static const size_t totalOffset
total length offset due to header and trailer
Definition Parser.h:317
std::function< bool(const TrailerType &)> CheckTrailerFct
alias for callback checking the trailer
Definition Parser.h:323
unsigned char PayloadType
Definition Parser.h:301
std::function< bool(const HeaderType &)> CheckHeaderFct
Definition Parser.h:321
std::function< bool(const FrameInfo &)> InsertFct
Definition Parser.h:329
static const size_t headOffset
the length offset due to header
Definition Parser.h:313
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
Definition Parser.h:335
GLuint buffer
Definition glcorearb.h:655
GLuint entry
Definition glcorearb.h:5735
GLsizeiptr size
Definition glcorearb.h:659
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
of header, data, and trailer
Definition Parser.h:304