message: MSVC's STL doesn't let iterators go before begin()
  * MSVC's STL doesn't let iterators go before begin()
  This is the case even of the iterator is not
  dereferenced. Fix
  * cleanup
diff: @@ -47,10 +47,10 @@ public:
  Slice<const BufferRange> getRanges() const { return { mStorage.cbegin(), mStorage.cend() }; }
  - BufferRange const* begin() const noexcept { return &*mStorage.begin(); }
  - BufferRange const* end() const noexcept { return &*mStorage.end(); }
  - BufferRange const* cbegin() const noexcept { return &*mStorage.cbegin(); }
  - BufferRange const* cend() const noexcept { return &*mStorage.cend(); }
  + BufferRange const* begin() const noexcept { return mStorage.data(); }
  + BufferRange const* end() const noexcept { return mStorage.data() + mStorage.size(); }
  + BufferRange const* cbegin() const noexcept { return mStorage.data(); }
  + BufferRange const* cend() const noexcept { return mStorage.data() + mStorage.size(); }
  BufferRange const& operator[](size_t i) const noexcept { return mStorage[i]; }
  private:
  @@ -68,6 +68,8 @@ private:
  bool empty() const noexcept { return size() == 0; }
  size_t size() const noexcept { return mSize; }
  size_t capacity() const noexcept { return CAPACITY; }
  + value_type *data() { return mElements.data(); }
  + value_type const *data() const { return mElements.data(); }
  iterator begin() { return mElements.begin(); }
  iterator end() { return begin() + mSize; }
  const_iterator begin() const { return mElements.begin(); }
  @@ -86,7 +88,8 @@ private:
  assert(mSize < CAPACITY);
  // equivalent to std::move_backward(pos, end(), end() + 1) but we don't want a call to memmove
  iterator e = end();
  - while (pos != e--) {
  + while (pos != e) {
  + --e;
  e[1] = e[0];
  }
  *pos = value;
  