feat(furlang): add view
Add a basic view (span from C++20).
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
#ifndef FURLANG_VIEW_HPP
|
||||
#define FURLANG_VIEW_HPP
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <limits>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace furlang {
|
||||
|
||||
template <typename T>
|
||||
class view {
|
||||
public:
|
||||
constexpr view() noexcept = default;
|
||||
|
||||
constexpr view(const T* data, std::size_t size) noexcept
|
||||
: m_data(data), m_size(size) {}
|
||||
public:
|
||||
constexpr view subview(std::size_t offset, std::size_t count = std::numeric_limits<std::size_t>::max()) {
|
||||
if (count > 0 && offset >= m_size) throw std::runtime_error("offset too large");
|
||||
return { m_data + offset, std::min(m_size - offset, count) };
|
||||
}
|
||||
|
||||
const T& operator[](std::size_t offset) const {
|
||||
if (offset >= m_size) throw std::runtime_error("out of bounds");
|
||||
return m_data[offset];
|
||||
}
|
||||
|
||||
constexpr const T* data() const { return m_data; }
|
||||
constexpr std::size_t size() const { return m_size; }
|
||||
private:
|
||||
const T* m_data = nullptr;
|
||||
std::size_t m_size = 0;
|
||||
};
|
||||
|
||||
} // namespace furlang
|
||||
|
||||
#endif // FURLANG_VIEW_HPP
|
||||
Reference in New Issue
Block a user