diff --git a/include/LIEF/iterators.hpp b/include/LIEF/iterators.hpp index 8634d73..107deff 100644 --- a/include/LIEF/iterators.hpp +++ b/include/LIEF/iterators.hpp @@ -132,9 +132,19 @@ class ref_iterator : public std::iterator< if (n >= this->size()) { throw integrity_error(std::to_string(n) + " is out of bound"); } - auto it = this->begin(); - std::advance(it, n); - return const_cast>(*it); + + ref_iterator* no_const_this = const_cast(this); + + typename ref_iterator::difference_type saved_dist = std::distance(std::begin(no_const_this->container_), no_const_this->it_); + no_const_this->it_ = std::begin(no_const_this->container_); + std::advance(no_const_this->it_, n); + + auto&& v = const_cast>(no_const_this->operator*()); + + no_const_this->it_ = std::begin(no_const_this->container_); + std::advance(no_const_this->it_, saved_dist); + + return v; } ref_iterator operator+(typename ref_iterator::difference_type n) const { diff --git a/tests/test_iterators.cpp b/tests/test_iterators.cpp index 58bac45..b1c6eb2 100644 --- a/tests/test_iterators.cpp +++ b/tests/test_iterators.cpp @@ -497,7 +497,11 @@ TEST_CASE("Test const filter ref iterators", "[lief][iterators][filter][const_re it_filter_const_ref bar_filtred = foo.get_bar_filter(); it_filter_const_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter(); + CHECK(bar_filtred[1] == "6"); CHECK(bar_filtred[0] == "1"); + + CHECK(bar_ptr_filtred[1] == "6"); + CHECK(bar_ptr_filtred[0] == "6"); }