Project
Loading...
Searching...
No Matches
Cursor.h
Go to the documentation of this file.
1// Copyright 2019-2026 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 O2_FRAMEWORK_AODNATIVE_CURSOR_H_
13#define O2_FRAMEWORK_AODNATIVE_CURSOR_H_
14
15#include "AODNative/Errors.h"
16#include "Endian.h"
17#include <bit>
18#include <cstdint>
19#include <cstring>
20#include <span>
21#include <string>
22
23namespace o2::aod::native
24{
25
31class Cursor
32{
33 public:
34 Cursor(std::span<const uint8_t> buf, std::string const& file, uint64_t fileOffset = 0, int64_t origin = 0)
35 : mBuf(buf), mFile(file), mFileOffset(fileOffset), mOrigin(origin)
36 {
37 }
38
39 size_t pos() const { return mPos; }
40 int64_t displacement() const { return (int64_t)mPos + mOrigin; }
41 size_t remaining() const { return mBuf.size() - mPos; }
42 std::span<const uint8_t> buffer() const { return mBuf; }
43
44 void seek(size_t p)
45 {
46 if (p > mBuf.size()) {
47 fail("seek past the end of the buffer");
48 }
49 mPos = p;
50 }
51 void skip(size_t n) { seek(need(n) + n); }
52 void back(size_t n)
53 {
54 if (n > mPos) {
55 fail("seek before the start of the buffer");
56 }
57 mPos -= n;
58 }
59
60 std::span<const uint8_t> bytes(size_t n)
61 {
62 auto p = need(n);
63 mPos += n;
64 return mBuf.subspan(p, n);
65 }
66
67 uint8_t u8() { return bytes(1)[0]; }
68 uint16_t u16() { return load<uint16_t>(); }
69 uint32_t u32() { return load<uint32_t>(); }
70 uint64_t u64() { return load<uint64_t>(); }
71 int16_t i16() { return (int16_t)u16(); }
72 int32_t i32() { return (int32_t)u32(); }
73 int64_t i64() { return (int64_t)u64(); }
74 double f64() { return std::bit_cast<double>(u64()); }
75
77 std::string string()
78 {
79 uint32_t n = u8();
80 if (n == 255) {
81 n = u32();
82 }
83 auto b = bytes(n);
84 return {(char const*)b.data(), b.size()};
85 }
86
88 std::string cstring()
89 {
90 auto start = mPos;
91 while (u8() != 0) {
92 }
93 return {(char const*)mBuf.data() + start, mPos - start - 1};
94 }
95
96 [[noreturn]] void fail(std::string const& what) const
97 {
98 throw CorruptData(mFile, mFileOffset + mPos, what);
99 }
100
101 std::string const& file() const { return mFile; }
102
103 private:
104 size_t need(size_t n) const
105 {
106 if (n > mBuf.size() - mPos) {
107 fail("read of " + std::to_string(n) + " bytes past the end of a " + std::to_string(mBuf.size()) + " byte buffer");
108 }
109 return mPos;
110 }
111
112 template <typename T>
113 T load()
114 {
115 T v;
116 std::memcpy(&v, bytes(sizeof(T)).data(), sizeof(T));
117 if constexpr (std::endian::native == std::endian::little) {
118 v = bswap(v);
119 }
120 return v;
121 }
122
123 std::span<const uint8_t> mBuf;
124 std::string const& mFile;
125 uint64_t mFileOffset;
126 int64_t mOrigin;
127 size_t mPos = 0;
128};
129
130} // namespace o2::aod::native
131
132#endif // O2_FRAMEWORK_AODNATIVE_CURSOR_H_
size_t bytes
std::span< const uint8_t > buffer() const
Definition Cursor.h:42
void back(size_t n)
Definition Cursor.h:52
std::span< const uint8_t > bytes(size_t n)
Definition Cursor.h:60
std::string const & file() const
Definition Cursor.h:101
size_t remaining() const
Definition Cursor.h:41
size_t pos() const
Definition Cursor.h:39
int64_t displacement() const
Definition Cursor.h:40
std::string string()
TString: 1-byte length, or 0xFF followed by a 4-byte length.
Definition Cursor.h:77
void fail(std::string const &what) const
Definition Cursor.h:96
Cursor(std::span< const uint8_t > buf, std::string const &file, uint64_t fileOffset=0, int64_t origin=0)
Definition Cursor.h:34
std::string cstring()
NUL-terminated string, as used for class names after kNewClassTag.
Definition Cursor.h:88
void seek(size_t p)
Definition Cursor.h:44
void skip(size_t n)
Definition Cursor.h:51
GLdouble n
Definition glcorearb.h:1982
const GLdouble * v
Definition glcorearb.h:832
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLboolean * data
Definition glcorearb.h:298
GLuint start
Definition glcorearb.h:469
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glcorearb.h:2514
constexpr T bswap(T v)
Definition Endian.h:22
consteval header::DataOrigin origin()
Definition ASoA.h:376
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52