MSVC's STL doesn't let iterators go before begin() (#98)

* MSVC's STL doesn't let iterators go before begin()

This is the case even of the iterator is not
dereferenced. Fix #94.

* cleanup
This commit is contained in:
Mathias Agopian
2018-08-14 22:26:39 -07:00
committed by Romain Guy
parent b739ac8e86
commit 3d3f169a63

View File

@@ -47,16 +47,16 @@ 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:
// Fixed capacity vector
template <typename TYPE, size_t CAPACITY,
typename = typename std::enable_if< std::is_pod<TYPE>::value >::type>
template<typename TYPE, size_t CAPACITY,
typename = typename std::enable_if<std::is_pod<TYPE>::value>::type>
class vector {
std::array<TYPE, RANGE_COUNT> mElements;
uint32_t mSize = 0;
@@ -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;