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:
committed by
Romain Guy
parent
b739ac8e86
commit
3d3f169a63
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user