-
Notifications
You must be signed in to change notification settings - Fork 0
/
buffer.cpp
126 lines (111 loc) · 4.95 KB
/
buffer.cpp
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//Copyright © 2023 Charles Kerr. All rights reserved.
#include "buffer.hpp"
#include <iostream>
#include <stdexcept>
using namespace std::string_literals ;
//=========================================================================================
namespace util {
//=================================================================================
// Constructors
//==============================================================================
//=================================================================================
buffer_t::buffer_t(): write_data(nullptr),read_data(nullptr),current_position(0),length(0),owning(false),is_expandable(true){
}
//=================================================================================
buffer_t::buffer_t(const void *ptr, std::size_t size, bool consume):buffer_t(){
if ((ptr==nullptr) || (size==0)){
throw std::runtime_error("buffer_t initialization with null data");
}
if (consume){
owning=true ;
data = std::vector<std::uint8_t>(size,0) ;
std::copy(static_cast<const std::uint8_t*>(ptr),static_cast<const std::uint8_t*>(ptr)+size,data.begin());
ptr = static_cast<const void*>(data.data()) ;
write_data = static_cast<void*>(data.data());
size = data.size();
}
read_data = ptr;
length = size ;
}
//=================================================================================
buffer_t::buffer_t(void *ptr, std::size_t size, bool consume):buffer_t(){
if ((ptr==nullptr) || (size==0)){
throw std::runtime_error("buffer_t initialization with null data");
}
if (consume){
owning=true ;
data = std::vector<std::uint8_t>(size,0) ;
std::copy(static_cast<std::uint8_t*>(ptr),static_cast<std::uint8_t*>(ptr)+size,data.begin());
ptr = static_cast<void*>(data.data()) ;
size = data.size();
}
write_data = ptr ;
read_data = const_cast<const void *>(ptr);
length = size ;
}
//=================================================================================
buffer_t::buffer_t( std::size_t size):buffer_t(){
data = std::vector<std::uint8_t>(size,0) ;
write_data = static_cast<void*>(data.data()) ;
read_data = static_cast<const void*>(data.data());
length = data.size();
owning = true ;
}
//=================================================================================
// Size/position related
//=================================================================================
//=================================================================================
auto buffer_t::size() const ->std::size_t {
return length;
}
//=================================================================================
auto buffer_t::remaining() const ->std::size_t {
return length-current_position ;
}
//=================================================================================
auto buffer_t::at() const ->std::size_t{
return current_position;
}
//=================================================================================
auto buffer_t::at(std::size_t position) -> buffer_t&{
if (position > length){
throw std::out_of_range("Index position exceeds buffer length");
}
current_position = position ;
return *this ;
}
//=================================================================================
auto buffer_t::resize(std::size_t size) ->buffer_t& {
if (!owning) {
throw std::runtime_error("Unable to resize buffer, not the data owner");
}
data.resize(size,0);
if (current_position > data.size()){
current_position = data.size();
}
write_data = static_cast<void*>(data.data());
read_data = static_cast<const void*>(data.data());
length = data.size() ;
return *this ;
}
//=================================================================================
auto buffer_t::expandable(bool value) ->buffer_t{
is_expandable = value ;
return *this ;
}
//=================================================================================
auto buffer_t::expandable() const ->bool{
return is_expandable;
}
//=================================================================================
// Access related
//=================================================================================
//=================================================================================
auto buffer_t::raw() ->void* {
return write_data;
}
//=================================================================================
auto buffer_t::raw() const ->const void* {
return read_data ;
}
}