16template<
typename Item>
struct MutableVectorSpan;
19template<
typename Item>
struct Span {
31#if !defined(_MSC_VER) || _MSC_VER-0 >= 1926
33 template<
typename T=Item>
35 typename std::enable_if<std::is_const<T>::value>::type* = 0)
40 : begin_(
o.begin_), size_(
o.size_) {}
49 Item&
front() {
return *begin_; }
50 const Item&
front()
const {
return *begin_; }
51 Item&
back() {
return *(begin_ + size_ - 1); }
52 const Item&
back()
const {
return *(begin_ + size_ - 1); }
54 const Item&
operator[](std::size_t
i)
const {
return *(begin_ +
i); }
57 Item&
at(std::size_t
i) {
59 throw std::out_of_range(
"item index ouf of range: #" + std::to_string(
i));
62 const Item&
at(std::size_t
i)
const {
63 return const_cast<Span*
>(
this)->
at(
i);
66 std::size_t
size()
const {
return size_; }
67 bool empty()
const {
return size_ == 0; }
68 explicit operator bool()
const {
return size_ != 0; }
90 std::size_t size_ = 0;
95 using vector_type = std::vector<typename Span<Item>::value_type>;
100 :
Span<Item>(
p), vector_(v) {}
116 auto offset = this->begin_ - this->vector_->data();
117 auto iter = vector_->begin() + (pos - this->vector_->data());
118 auto ret = vector_->insert(
iter, std::move(item));
119 this->begin_ = vector_->data() +
offset;
125 vector_->erase(vector_->begin() + (pos - vector_->data()));
130 bool is_ending()
const {
return this->
end() == vector_->data() + vector_->size(); }
MutableVectorSpan(Span< Item > &&p, vector_type *v)
typename Span< Item >::iterator iterator
MutableVectorSpan()=default
std::vector< typename Span< Item >::value_type > vector_type
MutableVectorSpan< Item > sub(Iter first, Iter last)
iterator insert(iterator pos, Item &&item)
bool is_beginning() const
MutableVectorSpan< const Item > subspan(F &&func) const
MutableVectorSpan(vector_type &v, iterator begin, std::size_t n)
MutableVectorSpan< Item > subspan(F &&func)
const Item & back() const
const Item & operator[](std::size_t i) const
Span< V > subspan(F &&func)
const_iterator begin() const
void set_size(std::size_t n)
const Span & children() const
void set_begin(iterator begin)
Span(const Span< value_type > &o, typename std::enable_if< std::is_const< T >::value >::type *=0)
Span< Item > sub(Iter first, Iter last)
Span< const value_type > subspan(F &&func) const
Span(iterator begin, std::size_t n)
const_iterator end() const
const Item & front() const
typename std::remove_cv< Item >::type value_type
Item & operator[](std::size_t i)
const Item & at(std::size_t i) const