#include namespace ppc { template 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 inline slice_t slice(slice_t &sl) { return slice_t(sl.iterable, sl.start, sl.n); } template inline slice_t slice(slice_t &sl, std::size_t start) { return slice_t(sl.iterable, sl.start + start, sl.n); } template inline slice_t slice(slice_t &sl, std::size_t start, std::size_t n) { return slice_t(sl.iterable, sl.start + start, n); } template inline slice_t slice(T &vec) { return slice_t(vec, 0, vec.size()); } template inline slice_t slice(T &vec, std::size_t start) { return slice_t(vec, start, vec.size()); } template inline slice_t slice(T &vec, std::size_t start, std::size_t n) { return slice_t(vec, start, n); } }