CORE: added BufferView class
parent
df0fcedd82
commit
8feab40cee
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue