1
Files
lecture-operating-system-de…/c_os/user/lib/Span.h
2022-07-29 14:19:12 +02:00

66 lines
1.5 KiB
C++

#ifndef SPAN_INCLUDE_H
#define SPAN_INCLUDE_H
#include "user/lib/Iterator.h"
#include <utility>
namespace bse {
// 0 is unchecked
template<typename T, std::size_t N = 0>
class span {
public:
using iterator = ContinuousIterator<T>;
private:
T* const ptr;
const std::size_t sz = N;
public:
span() = default;
span(T* first) : ptr(first) {}
span(T* first, T* last) : ptr(first), sz(last - first) {}
iterator begin() { return iterator(ptr); }
iterator begin() const { return iterator(ptr); }
// If size is unchecked end() is equal to begin()
iterator end() { return iterator(&ptr[N]); }
iterator end() const { return iterator(&ptr[N]); }
T* operator[](std::size_t i) {
if constexpr (N != 0) {
if (i < 0 || i >= N) { return nullptr; }
}
return &ptr[i];
}
T* operator[](std::size_t i) const {
if constexpr (N != 0) {
if (i < 0 || i >= N) { return nullptr; }
}
return &ptr[i];
}
T* data() { return ptr; }
const T* data() const { return ptr; }
explicit operator T*() {
return ptr;
}
// First is inclusive, last exclusive [first, last)
span& subspan(std::size_t first, std::size_t last = N) {
return span(ptr + first, ptr + last - 1);
}
std::size_t size() const {
return sz;
}
};
} // namespace bse
#endif