CORE: added BufferView class

master
Martin Gerhardy 2022-03-28 18:58:49 +02:00
parent df0fcedd82
commit 8feab40cee
2 changed files with 138 additions and 0 deletions

View File

@ -4,6 +4,7 @@ set(SRCS
collection/Array3DView.h
collection/BitSet.h
collection/Buffer.h
collection/BufferView.h
collection/ConcurrentDynamicArray.h
collection/ConcurrentQueue.h
collection/ConcurrentPriorityQueue.h

View File

@ -0,0 +1,137 @@
/**
* @file
*/
#include "core/Assert.h"
#include <stdint.h>
#include <string.h>
namespace core {
/**
* @brief Access to a C style array for a particular type
*/
template<typename TYPE>
class BufferView {
private:
const TYPE *_buffer;
size_t _size;
public:
using value_type = TYPE;
BufferView(const TYPE *buffer, size_t elements) : _buffer(buffer), _size(elements) {
}
class iterator {
private:
const TYPE *_ptr;
public:
constexpr iterator() : _ptr(nullptr) {
}
iterator(const TYPE *ptr) : _ptr(ptr) {
}
inline const TYPE &operator*() const {
return *_ptr;
}
iterator &operator++() {
++_ptr;
return *this;
}
iterator operator++(int) {
return iterator(_ptr++);
}
iterator operator--(int) {
return iterator(_ptr--);
}
int operator-(iterator rhs) const {
return (int)(intptr_t)(_ptr - rhs._ptr);
}
iterator &operator+(size_t n) {
_ptr += n;
return *this;
}
iterator &operator+=(size_t n) {
_ptr += n;
return *this;
}
iterator &operator--() {
--_ptr;
return *this;
}
iterator &operator-(size_t n) {
_ptr -= n;
return *this;
}
iterator &operator-=(size_t n) {
_ptr -= n;
return *this;
}
inline const TYPE *operator->() const {
return _ptr;
}
inline bool operator!=(const iterator &rhs) const {
return _ptr != rhs._ptr;
}
inline bool operator==(const iterator &rhs) const {
return _ptr == rhs._ptr;
}
};
using const_iterator = iterator;
inline bool empty() const {
return _size == 0u;
}
const TYPE *data() const {
return _buffer;
}
TYPE &front() {
core_assert(_size > 0u);
return _buffer[0];
}
const TYPE &front() const {
core_assert(_size > 0u);
return _buffer[0];
}
TYPE &back() {
core_assert(_size > 0u);
return _buffer[_size - 1u];
}
inline const TYPE &operator[](size_t idx) const {
core_assert(idx < _size);
return _buffer[idx];
}
inline size_t size() const {
return _size;
}
inline iterator begin() const {
return iterator(_buffer);
}
inline iterator end() const {
return iterator(_buffer + _size);
}
};
} // namespace core