-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuffer.h
128 lines (112 loc) · 2.94 KB
/
buffer.h
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
127
128
// CEZEO software Ltd. https://www.cezeo.com
#pragma once
#include <stdint.h>
#include <stdexcept>
#include <iterator>
template < typename T >
class ptr_iterator : public std::iterator< std::forward_iterator_tag, T >
{
typedef ptr_iterator< T > iterator;
pointer pos_;
public:
ptr_iterator() : pos_(nullptr)
{}
ptr_iterator(T* v) : pos_(v)
{}
~ptr_iterator() = default;
iterator operator++(int) // postfix
{
return pos_++;
}
iterator& operator++() // prefix
{
++pos_;
return *this;
}
reference operator*() const
{
return *pos_;
}
pointer operator->() const
{
return pos_;
}
iterator operator+(difference_type v) const
{
return pos_ + v;
}
bool operator==(const iterator& rhs) const
{
return pos_ == rhs.pos_;
}
bool operator!=(const iterator& rhs) const
{
return pos_ != rhs.pos_;
}
};
template < typename T >
ptr_iterator< T > begin(T* val)
{
return ptr_iterator< T >(val);
}
template < typename T, typename Tsize >
ptr_iterator< T > end(T* val, Tsize size)
{
return ptr_iterator< T >(val) + size;
}
class buffer final
{
public:
enum TYPE
{
KEEPER, // does not manage memory that holding
HOLDER, // manage memory by this class, owning transfered here
};
buffer() noexcept = default;
// new empty buffer
buffer(const size_t size);
// KEEPER - memory viewer (does not own nor manage memeory)
// HOLDER - allocate new memory for data and copy it to this memory
buffer(const uint8_t* ptr, const size_t size, const TYPE type = HOLDER);
buffer(const buffer& src);
buffer(buffer&& src) noexcept;
~buffer() noexcept;
// assignment
buffer& operator=(const buffer& src);
// KEEPER - memory viewer (does not own nor manage memeory)
// HOLDER - allocate new memory for data and copy it to this memory
void set(const uint8_t* ptr, const size_t size, TYPE type = HOLDER);
// subsript access
uint8_t& operator[](std::size_t idx);
const uint8_t& operator[](std::size_t idx) const;
// get data pointer
uint8_t* data() const noexcept;
// get size of data
size_t size() const noexcept;
// set new size for data (reallocate with copy or without)
void resize(const size_t new_size, bool copy = true);
// clear data
void clear() noexcept;
// if buffer is empty
bool empty() const noexcept;
// swap objects
friend void swap(buffer& a, buffer& b) noexcept
{
// enable ADL
using std::swap;
swap(a.buffer_ptr, b.buffer_ptr);
swap(a.buffer_size, b.buffer_size);
swap(a.buffer_type, b.buffer_type);
}
// current buffer type
buffer::TYPE type() const noexcept;
ptr_iterator< uint8_t > begin() const;
ptr_iterator< uint8_t > end() const;
private:
// allocate memory and optionally copy from copy_from_ptr to allocated buffer
void allocate_copy(const size_t size, const uint8_t* copy_from_ptr = nullptr);
void destroy() noexcept;
uint8_t* buffer_ptr{nullptr};
size_t buffer_size{0};
TYPE buffer_type{KEEPER};
};