From 537884fbb8ce7c429b3031261bc1e6809e71160a Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Tue, 27 Sep 2022 13:56:05 +0300 Subject: [PATCH] feat: add iterable slice --- include/utils/slice.hh | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 include/utils/slice.hh diff --git a/include/utils/slice.hh b/include/utils/slice.hh new file mode 100644 index 0000000..ee080e6 --- /dev/null +++ b/include/utils/slice.hh @@ -0,0 +1,52 @@ +#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); + } +} \ No newline at end of file