Tool Libs
UMIT-TIROL Institute of Automation and Control Engineering library collection
 
Loading...
Searching...
No Matches
buffer.h
Go to the documentation of this file.
1
5#pragma once
6#include <cstring>
7#include <cstdint>
8#include <cassert>
9#include <initializer_list>
10
17template<typename T>
18struct Buffer {
19 T *buf;
21 size_t len;
23 size_t size;
25 operator T*() { return buf; }
26 //XXX: how about a slice into a buffer?
27
29 T& at(size_t ix) {
30 assert(ix < len);
31 return buf[ix];
32 }
34 T& operator[](size_t ix) {
35 assert(ix < size);
36 return buf[ix];
37 }
39 T& operator[](size_t ix) const {
40 assert(ix < size);
41 return buf[ix];
42 }
44 Buffer& append(T b) {
45 assert(len < size);
46 buf[len++] = b;
47 return *this;
48 }
50 Buffer& append(std::initializer_list<T> list) {
51 for (auto v: list) append(v);
52 return *this;
53 }
55 T* begin() { return &buf[0]; }
56 T* begin() const { return &buf[0]; }
58 T* end() { return &buf[len]; }
59 T* end() const { return &buf[len]; }
60
61 /* Rule of Five */
64 delete[] buf; buf = nullptr; len = 0; size = 0;
65 }
67 Buffer(const T *src, size_t len, size_t sz=0) : buf{}, len(0), size(sz) {
68 if (sz == 0) size = len;
69 buf = new T[size];
70 for (size_t i = 0; i < len; ++i) append(src[i]);
71 }
73 Buffer(std::initializer_list<T> list) : buf{new T[list.size()]}, len(0), size(list.size()) {
74 append(list);
75 }
77 Buffer(size_t sz=0) : buf{new T[sz]}, len(0), size(sz) { }
79 Buffer(const Buffer &b) : buf{new T[b.size]}, len(0), size(b.size) {
80 for (auto el : b) append(el);
81 }
83 Buffer& operator=(const Buffer &b) {
84 if (this == &b) return *this; // copy to self
85 if (!size || size != b.size) { // necessary to realloc
86 delete[] buf;
87 buf = new T[b.size];
88 size = b.size;
89 }
90 assert(buf != nullptr);
91 assert(size >= b.len);
92 len = 0;
93 for (auto el: b) append(el);
94 return *this;
95 }
97 Buffer(Buffer &&b) noexcept : buf(b.buf), len(b.len), size(b.size) {
98 b.buf = nullptr;
99 b.len = 0;
100 b.size = 0;
101 }
103 Buffer& operator=(Buffer &&b) noexcept {
104 if (this == &b) return *this; // move to self
105 delete[] buf;
106 buf = b.buf;
107 len = b.len;
108 size = b.size;
109 b.len = 0;
110 b.size = 0;
111 b.buf = nullptr;
112 return *this;
113 }
114};
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
Buffer & append(T b)
simple append single item
Definition buffer.h:44
Buffer & append(std::initializer_list< T > list)
append multiple items
Definition buffer.h:50
T & at(size_t ix)
access into known length of buffer
Definition buffer.h:29
Buffer & operator=(const Buffer &b)
copy assignment operator
Definition buffer.h:83
T * end()
end method for range-based for loops
Definition buffer.h:58
Buffer(const Buffer &b)
copy constructor
Definition buffer.h:79
Buffer & operator=(Buffer &&b) noexcept
move assignment operator
Definition buffer.h:103
Buffer(const T *src, size_t len, size_t sz=0)
copy from naked array with known length
Definition buffer.h:67
T & operator[](size_t ix)
access into known size of buffer
Definition buffer.h:34
Buffer(size_t sz=0)
constructor with fixed size
Definition buffer.h:77
~Buffer()
destructor
Definition buffer.h:63
size_t size
total capacity of buffer
Definition buffer.h:23
Buffer(std::initializer_list< T > list)
initializer list constructor
Definition buffer.h:73
T & operator[](size_t ix) const
access into known size of buffer
Definition buffer.h:39
T * begin()
begin method for range-based for loops
Definition buffer.h:55
Buffer(Buffer &&b) noexcept
move constructor
Definition buffer.h:97
size_t len
number of items stored in buffer
Definition buffer.h:21