10 #ifndef hifi_BufferParser_h
11 #define hifi_BufferParser_h
18 #include "GLMHelpers.h"
19 #include "ByteCountCoding.h"
20 #include "PropertyFlags.h"
21 #include <glm/gtc/type_ptr.hpp>
25 BufferParser(
const uint8_t* data,
size_t size,
size_t offset = 0) :
26 _offset(offset), _data(data), _size(size) {
30 inline void readValue(T& result) {
31 Q_ASSERT(remaining() >=
sizeof(T));
32 memcpy(&result, _data + _offset,
sizeof(T));
36 inline void readUuid(QUuid& result) {
37 readValue(result.data1);
38 readValue(result.data2);
39 readValue(result.data3);
40 readValue(result.data4);
41 result.data1 = qFromBigEndian<quint32>(result.data1);
42 result.data2 = qFromBigEndian<quint16>(result.data2);
43 result.data3 = qFromBigEndian<quint16>(result.data3);
47 inline void readFlags(PropertyFlags<T>& result) {
48 _offset += result.decode(_data + _offset, remaining());
52 inline void readCompressedCount(T& result) {
54 ByteCountCoded<T> codec;
55 _offset += codec.decode(
reinterpret_cast<const char*
>(_data + _offset), (
int)remaining());
59 inline size_t remaining()
const {
60 return _size - _offset;
63 inline size_t offset()
const {
67 inline const uint8_t* data()
const {
74 const uint8_t*
const _data;
80 inline void BufferParser::readValue<quat>(quat& result) {
81 size_t advance = unpackOrientationQuatFromBytes(_data + _offset, result);
86 inline void BufferParser::readValue(QString& result) {
87 uint16_t length; readValue(length);
88 result = QString((
const char*)_data + _offset);
92 inline void BufferParser::readValue(QUuid& result) {
93 uint16_t length; readValue(length);
94 Q_ASSERT(16 == length);
99 inline void BufferParser::readValue(QVector<glm::vec3>& result) {
100 uint16_t length; readValue(length);
101 result.resize(length);
102 for (
int i=0; i<length; i++) {
103 memcpy(glm::value_ptr(result[i]), _data + _offset + (
sizeof(glm::vec3)*i),
sizeof(glm::vec3) * length);
106 _offset +=
sizeof(glm::vec3) * length;
110 inline void BufferParser::readValue(QByteArray& result) {
111 uint16_t length; readValue(length);
112 result = QByteArray((
char*)_data + _offset, (
int)length);