diff --git a/memory/buffer/circular.cpp b/memory/buffer/circular.cpp index 822c4afb..3642f619 100644 --- a/memory/buffer/circular.cpp +++ b/memory/buffer/circular.cpp @@ -152,6 +152,35 @@ circular::size (void) const } +//----------------------------------------------------------------------------- +template +typename circular::iterator +circular::constrain (iterator cursor) +{ + CHECK_LIMIT (cursor, m_begin, m_begin + 2 * size ()); + + return m_begin + (cursor - m_begin) % size (); +} + + +//----------------------------------------------------------------------------- +template +util::view::iterator> +circular::constrain (util::view window) +{ + CHECK_LIMIT (window.begin (), m_begin, m_begin + 2 * size ()); + CHECK_LIMIT (window.end (), m_begin, m_begin + 2 * size ()); + + auto first = window.begin (); + auto last = first + window.size (); + util::view res { first, last }; + + CHECK_EQ (res.size (), window.size ()); + CHECK_LE (res.begin (), res.end ()); + return res; +} + + /////////////////////////////////////////////////////////////////////////////// template class util::memory::buffer::circular; template class util::memory::buffer::circular; diff --git a/memory/buffer/circular.hpp b/memory/buffer/circular.hpp index 36dcf6af..f37785ab 100644 --- a/memory/buffer/circular.hpp +++ b/memory/buffer/circular.hpp @@ -17,6 +17,8 @@ #ifndef __UTIL_MEMORY_BUFFER_CIRCULAR_HPP #define __UTIL_MEMORY_BUFFER_CIRCULAR_HPP +#include "../../view.hpp" + #include namespace util::memory::buffer { @@ -49,6 +51,13 @@ namespace util::memory::buffer { size_t size (void) const; + /// rebases the pointer so that it points to within the first + /// repetition of the data buffer. + iterator constrain (iterator); + /// rebases a pair of pointers so they fall within a contiguous span of + /// the data buffer. + util::view constrain (util::view); + private: value_type *m_begin, *m_end;