12#ifndef ALGORITHM_PARSER_H
13#define ALGORITHM_PARSER_H
33 static const size_t size =
sizeof(T);
38 static const size_t size = 0;
97template <
typename HeaderT,
98 typename TrailerT =
void>
136 template <
typename U>
138 !std::is_void<U>::value,
140 std::function<bool()>>
::type;
153 template <
typename InputType>
161 "ForwardParser currently only supports byte type buffer");
162 if (
buffer ==
nullptr || bufferSize == 0) {
167 std::vector<FrameInfo> frames;
172 if (
sizeof(
HeaderType) + position > bufferSize) {
176 if (!checkHeader(*
entry.header)) {
182 auto frameSize = getFrameSize(*
entry.header);
183 if (frameSize + position > bufferSize) {
193 entry.trailer =
nullptr;
197 if (!CheckTrailer(
entry, checkTrailer)) {
203 frames.emplace_back(
entry);
204 position += frameSize;
205 }
while (position < bufferSize);
207 if (position == bufferSize) {
210 for (
auto entry : frames) {
211 if (!insert(
entry)) {
215 return frames.size();
216 }
else if (frames.size() == 0) {
230 template <
typename InputType,
typename U = TrailerType>
231 typename std::enable_if<std::is_void<U>::value,
int>
::type
237 auto checkTrailer = []() {
return true; };
238 return parse(
buffer, bufferSize, checkHeader, checkTrailer, getFrameSize, insert);
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
248 return checkTrailer(*
entry.trailer);
251 template <
typename U = TrailerType>
252 typename std::enable_if<std::is_void<U>::value,
bool>
::type
253 CheckTrailer(
const FrameInfo&, CheckTrailerFct<TrailerType>&)
const
295template <
typename HeaderT,
typename TrailerT>
334 template <
typename InputType>
342 "ReverseParser currently only supports byte type buffer");
343 if (
buffer ==
nullptr || bufferSize == 0) {
346 auto position = bufferSize;
347 std::vector<FrameInfo> frames;
356 if (!checkTrailer(*
entry.trailer)) {
361 auto frameSize = getFrameSize(*
entry.trailer);
362 if (frameSize > position) {
367 auto headerStart =
buffer + position - frameSize;
369 if (!checkHeader(*
entry.header)) {
376 frames.emplace_back(
entry);
377 position -= frameSize;
378 }
while (position > 0);
382 for (
auto entry : frames) {
383 if (!insert(
entry)) {
387 return frames.size();
388 }
else if (frames.size() == 0) {
std::enable_if< std::is_void< U >::value, int >::type parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, GetFrameSizeFct getFrameSize, InsertFct insert)
std::function< bool(FrameInfo &)> InsertFct
typename std::conditional< !std::is_void< TrailerType >::value, TrailerType, int >::type CheckTrailerFctArgumentT
unsigned char PayloadType
typename std::conditional< !std::is_void< U >::value, std::function< bool(const CheckTrailerFctArgumentT &)>, std::function< bool()> >::type CheckTrailerFct
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct< TrailerType > checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
std::function< size_t(const HeaderType &)> GetFrameSizeFct
std::function< bool(const HeaderType &)> CheckHeaderFct
static const size_t headOffset
the length offset due to header
static const size_t tailOffset
the length offset due to trailer
static const size_t totalOffset
total length offset due to header and trailer
std::function< size_t(const TrailerType &)> GetFrameSizeFct
static const size_t tailOffset
the length offset due to trailer
static const size_t totalOffset
total length offset due to header and trailer
std::function< bool(const TrailerType &)> CheckTrailerFct
alias for callback checking the trailer
unsigned char PayloadType
std::function< bool(const HeaderType &)> CheckHeaderFct
std::function< bool(const FrameInfo &)> InsertFct
static const size_t headOffset
the length offset due to header
int parse(const InputType *buffer, size_t bufferSize, CheckHeaderFct checkHeader, CheckTrailerFct checkTrailer, GetFrameSizeFct getFrameSize, InsertFct insert)
GLint GLint GLsizei GLint GLenum GLenum type
GLuint GLsizei GLsizei * length
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
const HeaderType * header
const TrailerType * trailer
of header, data, and trailer
const HeaderType * header
const TrailerType * trailer