ppc-lang/include/utils/slice.hh

54 lines
1.6 KiB
C++
Raw Normal View History

2022-09-27 10:56:05 +00:00
#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) const { return (iterable*)[start + i]; }
2022-09-27 10:56:05 +00:00
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;
}
};
2022-09-27 10:57:48 +00:00
template <class T>
using vec_slice_t = slice_t<std::vector<T>>;
2022-09-27 10:56:05 +00:00
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);
}
}