diff --git a/include/seqan3/contrib/sdsl-lite.hpp b/include/seqan3/contrib/sdsl-lite.hpp index a82da4ac29..b6c7cf061f 100644 --- a/include/seqan3/contrib/sdsl-lite.hpp +++ b/include/seqan3/contrib/sdsl-lite.hpp @@ -1600,6 +1600,10 @@ class ram_filebuf : public std::streambuf { private: ram_fs::content_type * m_ram_file = nullptr; + std::ptrdiff_t get_pos() const + { + return (eback() != nullptr && gptr() != nullptr) ? (gptr() - eback()) : 0; + } void pbump64(std::ptrdiff_t x) { while (x > std::numeric_limits::max()) @@ -1751,11 +1755,12 @@ class ram_filebuf : public std::streambuf { if (epptr() - pbase() == (std::ptrdiff_t)m_ram_file->size() and epptr() == pptr()) { + std::ptrdiff_t const read_pos = get_pos(); m_ram_file->insert(m_ram_file->end(), s, s + n); setp(m_ram_file->data(), m_ram_file->data() + m_ram_file->size()); std::ptrdiff_t add = epptr() - pbase(); pbump64(add); - setg(m_ram_file->data(), gptr(), m_ram_file->data() + m_ram_file->size()); + setg(m_ram_file->data(), m_ram_file->data() + read_pos, m_ram_file->data() + m_ram_file->size()); return n; } else @@ -1779,11 +1784,12 @@ class ram_filebuf : public std::streambuf { if (m_ram_file) { + std::ptrdiff_t const read_pos = get_pos(); m_ram_file->push_back(c); setp(m_ram_file->data(), m_ram_file->data() + m_ram_file->size()); std::ptrdiff_t add = epptr() - pbase(); pbump64(add); - setg(m_ram_file->data(), gptr(), m_ram_file->data() + m_ram_file->size()); + setg(m_ram_file->data(), m_ram_file->data() + read_pos, m_ram_file->data() + m_ram_file->size()); } return traits_type::to_int_type(c); }