Arduino PulseWire Transceiver Library
Loading...
Searching...
No Matches
Vector.h
1#pragma once
2#include <stddef.h>
3#include <stdint.h>
4#include "TransceiverConfig.h"
5#if defined(HAS_STL)
6# include <vector>
7#endif
8namespace pulsewire {
9
10#if defined(HAS_STL)
11
12// Use global std::vector, not pulsewire::std
13template <typename T>
14using Vector = ::std::vector<T>;
15
16#else
17
28template <typename T>
29class Vector {
30 public:
32 using value_type = T;
34 using iterator = T*;
36 using const_iterator = const T*;
37
39 Vector() : _data(nullptr), _size(0), _capacity(0) {}
40
42 explicit Vector(size_t n) : _data(nullptr), _size(0), _capacity(0) {
43 resize(n);
44 }
45
47 Vector(const Vector& other) : _data(nullptr), _size(0), _capacity(0) {
48 if (other._size) {
49 reserve(other._size);
50 for (size_t i = 0; i < other._size; ++i) _data[i] = other._data[i];
51 _size = other._size;
52 }
53 }
54
57 : _data(other._data), _size(other._size), _capacity(other._capacity) {
58 other._data = nullptr;
59 other._size = 0;
60 other._capacity = 0;
61 }
62
65 if (this != &other) {
66 clear();
67 reserve(other._size);
68 for (size_t i = 0; i < other._size; ++i) _data[i] = other._data[i];
69 _size = other._size;
70 }
71 return *this;
72 }
73
76 if (this != &other) {
77 delete[] _data;
78 _data = other._data;
79 _size = other._size;
80 _capacity = other._capacity;
81 other._data = nullptr;
82 other._size = 0;
83 other._capacity = 0;
84 }
85 return *this;
86 }
87
89 ~Vector() { delete[] _data; }
90
92 void push_back(const T& value) {
93 if (_size >= _capacity) reserve(_capacity ? _capacity * 2 : 4);
94 _data[_size++] = value;
95 }
97 iterator begin() { return _data; }
99 iterator end() { return _data + _size; }
101 const_iterator begin() const { return _data; }
103 const_iterator end() const { return _data + _size; }
104
106 T* data() { return _data; }
108 const T* data() const { return _data; }
109
111 T& operator[](size_t idx) { return _data[idx]; }
113 const T& operator[](size_t idx) const { return _data[idx]; }
114
116 size_t size() const { return _size; }
118 bool empty() const { return _size == 0; }
120 void clear() { _size = 0; }
121
123 T& back() { return _data[_size - 1]; }
125 const T& back() const { return _data[_size - 1]; }
126
129 size_t idx = pos - _data;
130 if (idx >= _size) return end();
131 for (size_t i = idx; i + 1 < _size; ++i) _data[i] = _data[i + 1];
132 --_size;
133 return _data + idx;
134 }
135
138 if (first >= last) return first;
139 size_t idx = first - _data;
140 size_t idx2 = last - _data;
141 if (idx >= _size) return end();
142 if (idx2 > _size) idx2 = _size;
143 size_t count = idx2 - idx;
144 for (size_t i = idx; i + count < _size; ++i) _data[i] = _data[i + count];
145 _size -= count;
146 return _data + idx;
147 }
148
150 void resize(size_t n) {
151 if (n > _capacity) reserve(n);
152 for (size_t i = _size; i < n; ++i) _data[i] = T();
153 _size = n;
154 }
155
157 void reserve(size_t cap) {
158 if (cap <= _capacity) return;
159 T* new_data = new T[cap];
160 for (size_t i = 0; i < _size; ++i) new_data[i] = _data[i];
161 delete[] _data;
162 _data = new_data;
163 _capacity = cap;
164 }
165
167 size_t capacity() const { return _capacity; }
168
169 private:
170 T* _data;
171 size_t _size;
172 size_t _capacity;
173};
174
175#endif
176} // namespace pulsewire
Small, header-only vector replacement for non-STL environments.
Definition Vector.h:29
iterator begin()
Iterator to first element.
Definition Vector.h:97
iterator end()
Iterator to one past last element.
Definition Vector.h:99
size_t capacity() const
Current allocated capacity.
Definition Vector.h:167
const_iterator end() const
Const iterator to one past last element.
Definition Vector.h:103
void resize(size_t n)
Resize vector to n elements.
Definition Vector.h:150
Vector(size_t n)
Construct vector with n default-initialized elements.
Definition Vector.h:42
void clear()
Remove all elements.
Definition Vector.h:120
iterator erase(iterator first, iterator last)
Erase range [first, last), return iterator to next element.
Definition Vector.h:137
T & operator[](size_t idx)
Access element by index.
Definition Vector.h:111
const_iterator begin() const
Const iterator to first element.
Definition Vector.h:101
Vector & operator=(Vector &&other) noexcept
Move assignment.
Definition Vector.h:75
Vector(Vector &&other) noexcept
Move constructor.
Definition Vector.h:56
Vector(const Vector &other)
Copy constructor.
Definition Vector.h:47
void push_back(const T &value)
Add element to end of vector.
Definition Vector.h:92
void reserve(size_t cap)
Reserve space for at least cap elements.
Definition Vector.h:157
T * data()
Pointer to underlying data.
Definition Vector.h:106
Vector()
Default constructor: creates empty vector.
Definition Vector.h:39
bool empty() const
True if vector is empty.
Definition Vector.h:118
const T * data() const
Const pointer to underlying data.
Definition Vector.h:108
~Vector()
Destructor: frees memory.
Definition Vector.h:89
iterator erase(iterator pos)
Erase single element at iterator pos, return iterator to next element.
Definition Vector.h:128
T & back()
Access last element.
Definition Vector.h:123
const T & operator[](size_t idx) const
Access element by index (const)
Definition Vector.h:113
Vector & operator=(const Vector &other)
Copy assignment.
Definition Vector.h:64
const T & back() const
Access last element (const)
Definition Vector.h:125
size_t size() const
Number of elements in vector.
Definition Vector.h:116