From 39bd667fd0a149c3bb428ccf35fa8c17fcafeccf Mon Sep 17 00:00:00 2001 From: mmoscicki2 <50666212+mmoscicki2@users.noreply.github.com> Date: Thu, 16 May 2019 20:49:01 +0200 Subject: [PATCH] Fix reverse_iterator in Vector and tests (#5344) Before this commit tests for iterators passed, even if the code inside the loop has not been executed. --- include/flatbuffers/flatbuffers.h | 22 ++++++++++++---------- tests/test.cpp | 20 ++++++++++++++------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index a1a95f0..83dd09d 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -201,14 +201,16 @@ template struct VectorIterator { template struct VectorReverseIterator : public std::reverse_iterator { - explicit VectorReverseIterator(Iterator iter) : iter_(iter) {} + explicit VectorReverseIterator(Iterator iter) : + std::reverse_iterator(iter) {} - typename Iterator::value_type operator*() const { return *(iter_ - 1); } - - typename Iterator::value_type operator->() const { return *(iter_ - 1); } + typename Iterator::value_type operator*() const { + return *(std::reverse_iterator::current); + } - private: - Iterator iter_; + typename Iterator::value_type operator->() const { + return *(std::reverse_iterator::current); + } }; struct String; @@ -269,11 +271,11 @@ template class Vector { iterator end() { return iterator(Data(), size()); } const_iterator end() const { return const_iterator(Data(), size()); } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + reverse_iterator rbegin() { return reverse_iterator(end() - 1); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(end() - 1); } - reverse_iterator rend() { return reverse_iterator(end()); } - const_reverse_iterator rend() const { return const_reverse_iterator(end()); } + reverse_iterator rend() { return reverse_iterator(begin() - 1); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin() - 1); } const_iterator cbegin() const { return begin(); } diff --git a/tests/test.cpp b/tests/test.cpp index 911d1aa..86eb164 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -253,29 +253,37 @@ void AccessFlatBufferTest(const uint8_t *flatbuf, size_t length, unsigned char inv_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // Check compatibilty of iterators with STL. std::vector inv_vec(inventory->begin(), inventory->end()); - for (auto it = inventory->begin(); it != inventory->end(); ++it) { + int n = 0; + for (auto it = inventory->begin(); it != inventory->end(); ++it, ++n) { auto indx = it - inventory->begin(); TEST_EQ(*it, inv_vec.at(indx)); // Use bounds-check. TEST_EQ(*it, inv_data[indx]); } + TEST_EQ(n, inv_vec.size()); - for (auto it = inventory->cbegin(); it != inventory->cend(); ++it) { + n = 0; + for (auto it = inventory->cbegin(); it != inventory->cend(); ++it, ++n) { auto indx = it - inventory->cbegin(); TEST_EQ(*it, inv_vec.at(indx)); // Use bounds-check. TEST_EQ(*it, inv_data[indx]); } + TEST_EQ(n, inv_vec.size()); - for (auto it = inventory->rbegin(); it != inventory->rend(); ++it) { - auto indx = inventory->rend() - it; + n = 0; + for (auto it = inventory->rbegin(); it != inventory->rend(); ++it, ++n) { + auto indx = inventory->rend() - it - 1; TEST_EQ(*it, inv_vec.at(indx)); // Use bounds-check. TEST_EQ(*it, inv_data[indx]); } + TEST_EQ(n, inv_vec.size()); - for (auto it = inventory->crbegin(); it != inventory->crend(); ++it) { - auto indx = inventory->crend() - it; + n = 0; + for (auto it = inventory->crbegin(); it != inventory->crend(); ++it, ++n) { + auto indx = inventory->crend() - it - 1; TEST_EQ(*it, inv_vec.at(indx)); // Use bounds-check. TEST_EQ(*it, inv_data[indx]); } + TEST_EQ(n, inv_vec.size()); TEST_EQ(monster->color(), Color_Blue); -- 2.7.4