Forráskód Böngészése

circular_buffer iterators now working

mawinkle 6 éve
szülő
commit
d0f6fd53e6
1 módosított fájl, 23 hozzáadás és 14 törlés
  1. 23 14
      socket_impl/siostream.cpp

+ 23 - 14
socket_impl/siostream.cpp

@@ -47,26 +47,35 @@ circular_buffer::const_iterator circular_buffer::const_iterator::operator+(size_
 }
 std::ptrdiff_t circular_buffer::iterator::operator-(const iterator& o)const{
 	using ui = std::ptrdiff_t;
-	assert(source == o.source);
-	ui so = m_begin.offset;
+	assert(parent == o.parent);
+	ui so = parent->m_begin.offset;
+	ui new_this_offset = ((ui)(this->offset) - so) % period;
+	ui new_o_offset = ((ui)(o.offset) - so) % period;
+	return new_this_offset - new_o_offset;
 }
 std::ptrdiff_t circular_buffer::iterator::operator-(const const_iterator& o)const{
-	assert(source == o.source);
-	if(parent->m_begin.offset < parent->m_end.offset)
-		return offset - o.offset;
-	return (offset - o.offset) % period;
+	using ui = std::ptrdiff_t;
+	assert(parent == o.parent);
+	ui so = parent->m_begin.offset;
+	ui new_this_offset = ((ui)(this->offset) - so) % period;
+	ui new_o_offset = ((ui)(o.offset) - so) % period;
+	return new_this_offset - new_o_offset;
 }
 std::ptrdiff_t circular_buffer::const_iterator::operator-(const iterator& o)const{
-	assert(source == o.source);
-	if(parent->m_begin.offset < parent->m_end.offset)
-		return offset - o.offset;
-	return (offset - o.offset) % period;
+	using ui = std::ptrdiff_t;
+	assert(parent == o.parent);
+	ui so = parent->m_begin.offset;
+	ui new_this_offset = ((ui)(this->offset) - so) % period;
+	ui new_o_offset = ((ui)(o.offset) - so) % period;
+	return new_this_offset - new_o_offset;
 }
 std::ptrdiff_t circular_buffer::const_iterator::operator-(const const_iterator& o)const{
-	assert(source == o.source);
-	if(parent->m_begin.offset < parent->m_end.offset)
-		return offset - o.offset;
-	return (offset - o.offset) % period;
+	using ui = std::ptrdiff_t;
+	assert(parent == o.parent);
+	ui so = parent->m_begin.offset;
+	ui new_this_offset = ((ui)(this->offset) - so) % period;
+	ui new_o_offset = ((ui)(o.offset) - so) % period;
+	return new_this_offset - new_o_offset;
 }
 
 circular_buffer::iterator& circular_buffer::iterator::operator=(const circular_buffer::iterator& o){