mirror of
https://github.com/matrix-construct/construct
synced 2025-01-17 01:51:53 +01:00
ircd::util: Add vector_view.
This commit is contained in:
parent
bd383562fd
commit
a8e6f4fb0a
1 changed files with 73 additions and 0 deletions
|
@ -601,6 +601,79 @@ struct string_view
|
||||||
using std::string_view::string_view;
|
using std::string_view::string_view;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
struct vector_view
|
||||||
|
{
|
||||||
|
T *_data { nullptr };
|
||||||
|
T *_stop { nullptr };
|
||||||
|
|
||||||
|
public:
|
||||||
|
T *data() const { return _data; }
|
||||||
|
size_t size() const { return std::distance(_data, _stop); }
|
||||||
|
bool empty() const { return !size(); }
|
||||||
|
|
||||||
|
const T *begin() const { return data(); }
|
||||||
|
const T *end() const { return _stop; }
|
||||||
|
const T *cbegin() { return data(); }
|
||||||
|
const T *cend() { return _stop; }
|
||||||
|
T *begin() { return data(); }
|
||||||
|
T *end() { return _stop; }
|
||||||
|
|
||||||
|
const T &operator[](const size_t &pos) const
|
||||||
|
{
|
||||||
|
return *(data() + pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
T &operator[](const size_t &pos)
|
||||||
|
{
|
||||||
|
return *(data() + pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
const T &at(const size_t &pos) const
|
||||||
|
{
|
||||||
|
if(unlikely(pos >= size()))
|
||||||
|
throw std::out_of_range();
|
||||||
|
|
||||||
|
return operator[](pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
T &at(const size_t &pos)
|
||||||
|
{
|
||||||
|
if(unlikely(pos >= size()))
|
||||||
|
throw std::out_of_range();
|
||||||
|
|
||||||
|
return operator[](pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
vector_view(T *const &start, T *const &stop)
|
||||||
|
:_data{start}
|
||||||
|
,_stop{stop}
|
||||||
|
{}
|
||||||
|
|
||||||
|
vector_view(T *const &start, const size_t &size)
|
||||||
|
:_data{start}
|
||||||
|
,_stop{start + size}
|
||||||
|
{}
|
||||||
|
|
||||||
|
template<class U,
|
||||||
|
class A>
|
||||||
|
vector_view(std::vector<U, A> &v)
|
||||||
|
:vector_view{v.data(), v.size()}
|
||||||
|
{}
|
||||||
|
|
||||||
|
template<size_t SIZE>
|
||||||
|
vector_view(T (&buffer)[SIZE])
|
||||||
|
:vector_view{std::addressof(buffer), SIZE}
|
||||||
|
{}
|
||||||
|
|
||||||
|
template<size_t SIZE>
|
||||||
|
vector_view(std::array<T, SIZE> &array)
|
||||||
|
:vector_view{array.data(), array.size()}
|
||||||
|
{}
|
||||||
|
|
||||||
|
vector_view() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Error-checking closure for POSIX system calls. Note the usage is
|
// Error-checking closure for POSIX system calls. Note the usage is
|
||||||
|
|
Loading…
Add table
Reference in a new issue