nk 1.0.0
C++ Numerical Computing Runtime
Loading...
Searching...
No Matches
span.hpp
1// include/span.hpp
2#pragma once
3
4#include <cstddef>
5#include <vector>
6
7namespace nk {
8
9template<typename T>
10class Span
11{
12public:
13 Span()
14 : data_(nullptr)
15 , size_(0)
16 {}
17 Span(T *d, size_t n)
18 : data_(d)
19 , size_(n)
20 {}
21
22 // Construct from vector (const or non-const depending on T)
23 template<typename U = T, typename std::enable_if<std::is_const<U>::value, int>::type = 0>
24 Span(const std::vector<typename std::remove_const<T>::type> &v)
25 : data_(v.data())
26 , size_(v.size())
27 {}
28
29 template<typename U = T, typename std::enable_if<!std::is_const<U>::value, int>::type = 0>
30 Span(std::vector<T> &v)
31 : data_(v.data())
32 , size_(v.size())
33 {}
34
35 T &operator[](size_t i) const { return data_[i]; }
36 size_t size() const { return size_; }
37 bool empty() const { return size_ == 0; }
38 T *data() const { return data_; }
39 T *begin() const { return data_; }
40 T *end() const { return data_ + size_; }
41
42 Span subspan(size_t offset) const { return {data_ + offset, size_ - offset}; }
43 Span subspan(size_t offset, size_t count) const { return {data_ + offset, count}; }
44
45private:
46 T *data_;
47 size_t size_;
48};
49
50} // namespace nk