-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbufferreader.cpp
More file actions
90 lines (76 loc) · 1.64 KB
/
bufferreader.cpp
File metadata and controls
90 lines (76 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
** Copyright (C) 2012 Aldebaran Robotics
** See COPYING for the license
*/
#include <cstring>
#include <stdexcept>
#include <qi/buffer.hpp>
#include "buffer_p.hpp"
namespace qi {
BufferReader::BufferReader(const Buffer& buffer)
: _buffer(&buffer)
, _cursor(0)
, _subCursor(0)
{
}
BufferReader::~BufferReader()
{
}
bool BufferReader::seek(size_t offset)
{
if (_cursor + offset <= _buffer->size())
{
_cursor += offset;
return true;
}
else
{
return false;
}
}
void *BufferReader::peek(size_t offset) const
{
if (_cursor + offset <= _buffer->size())
return _cursor + (unsigned char*)_buffer->data();
else
return nullptr;
}
void *BufferReader::read(size_t offset)
{
void *p = nullptr;
if ((p = peek(offset)))
seek(offset);
else
return nullptr;
return p;
}
size_t BufferReader::read(void *data, size_t size)
{
if (_buffer->size() - _cursor < size)
{
size = _buffer->size() - _cursor;
}
memcpy(data, (unsigned char*)(_buffer->data()) + _cursor, size);
_cursor += size;
return size;
}
bool BufferReader::hasSubBuffer() const
{
if (_buffer->subBuffers().size() <= _subCursor)
return false;
if (_buffer->subBuffers()[_subCursor].first == _cursor)
return true;
return false;
}
const Buffer& BufferReader::subBuffer()
{
if (!hasSubBuffer())
throw std::runtime_error("No sub-buffer at actual offset.");
_cursor += sizeof(uint32_t);
return _buffer->subBuffers()[_subCursor++].second;
}
size_t BufferReader::position() const
{
return _cursor;
}
}