feat: add iterable slice
This commit is contained in:
parent
bbc325c3a9
commit
537884fbb8
52
include/utils/slice.hh
Normal file
52
include/utils/slice.hh
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace ppc {
|
||||||
|
template <class T>
|
||||||
|
class slice_t {
|
||||||
|
private:
|
||||||
|
T *iterable;
|
||||||
|
std::size_t start;
|
||||||
|
std::size_t n;
|
||||||
|
public:
|
||||||
|
auto begin() const { return iterable->begin() + start; }
|
||||||
|
auto end() const { return iterable->end() + start + n; }
|
||||||
|
|
||||||
|
auto size() const { return n; }
|
||||||
|
auto &operator[](std::size_t i) { return iterable[start + i]; }
|
||||||
|
const auto &operator[](std::size_t i) const { return iterable[start + i]; }
|
||||||
|
|
||||||
|
slice_t(T &iterable, std::size_t start, std::size_t n) {
|
||||||
|
this->iterable = &iterable;
|
||||||
|
this->start = start;
|
||||||
|
this->n = n;
|
||||||
|
if (n == -1u) this->n = iterable.size() - start;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(slice_t<T> &sl) {
|
||||||
|
return slice_t<T>(sl.iterable, sl.start, sl.n);
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(slice_t<T> &sl, std::size_t start) {
|
||||||
|
return slice_t<T>(sl.iterable, sl.start + start, sl.n);
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(slice_t<T> &sl, std::size_t start, std::size_t n) {
|
||||||
|
return slice_t<T>(sl.iterable, sl.start + start, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(T &vec) {
|
||||||
|
return slice_t<T>(vec, 0, vec.size());
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(T &vec, std::size_t start) {
|
||||||
|
return slice_t<T>(vec, start, vec.size());
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline slice_t<T> slice(T &vec, std::size_t start, std::size_t n) {
|
||||||
|
return slice_t<T>(vec, start, n);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user