Selaa lähdekoodia

Buffer iterator operator- still not working correctly

mawinkle 6 vuotta sitten
vanhempi
commit
e2ef719252
3 muutettua tiedostoa jossa 75 lisäystä ja 19 poistoa
  1. 14 0
      include/siostream.hpp
  2. 51 16
      socket_impl/siostream.cpp
  3. 10 3
      test.cpp

+ 14 - 0
include/siostream.hpp

@@ -13,6 +13,10 @@ public:
 	void resize(size_t size);
 	struct iterator;
 	struct const_iterator;
+	void push_front(char c);
+	void push_back(char c);
+	void pop_front(char c);
+	void pop_back(char c);
 	struct iterator{
 		iterator(const circular_buffer* p, char* source, std::size_t period, std::size_t offset);
 		const circular_buffer* parent;
@@ -23,6 +27,11 @@ public:
 		iterator& operator++();
 		iterator operator+(size_t)const;
 		iterator& operator=(const iterator& o);
+		bool operator==(const iterator& o);
+		bool operator==(const const_iterator& o);
+		bool operator!=(const iterator& o);
+		bool operator!=(const const_iterator& o);
+		iterator& operator--();
 		std::ptrdiff_t operator-(const iterator& o)const;
 		std::ptrdiff_t operator-(const const_iterator& o)const;
 		operator const_iterator();
@@ -37,6 +46,11 @@ public:
 		const_iterator& operator++();
 		const_iterator operator+(size_t)const;
 		const_iterator& operator=(const const_iterator& o);
+		bool operator==(const iterator& o);
+		bool operator==(const const_iterator& o);
+		bool operator!=(const iterator& o);
+		bool operator!=(const const_iterator& o);
+		const_iterator& operator--();
 		std::ptrdiff_t operator-(const iterator& o)const;
 		std::ptrdiff_t operator-(const const_iterator& o)const;
 	};

+ 51 - 16
socket_impl/siostream.cpp

@@ -30,7 +30,6 @@ const char& circular_buffer::const_iterator::operator*()const {
 	return *(source + offset);
 }
 circular_buffer::iterator& circular_buffer::iterator::operator++(){
-	std::cout << period << std::endl;
 	++offset;
 	if(offset == period)offset = 0;
 	return *this;
@@ -47,37 +46,24 @@ circular_buffer::const_iterator circular_buffer::const_iterator::operator+(size_
 	return circular_buffer::const_iterator(parent, source, period, (offset + leap) % period);
 }
 std::ptrdiff_t circular_buffer::iterator::operator-(const iterator& o)const{
+	using ui = std::ptrdiff_t;
 	assert(source == o.source);
-	if(o.offset > offset)
-		return -(o - *this);
-	if(o.offset == offset)return 0;
-	if(parent->m_begin.offset < parent->m_end.offset)
-		return offset - o.offset;
-	return (offset - o.offset) % period;
+	ui so = m_begin.offset;
 }
 std::ptrdiff_t circular_buffer::iterator::operator-(const const_iterator& o)const{
 	assert(source == o.source);
-	if(o.offset > offset)
-		return -(o - *this);
-	if(o.offset == offset)return 0;
 	if(parent->m_begin.offset < parent->m_end.offset)
 		return offset - o.offset;
 	return (offset - o.offset) % period;
 }
 std::ptrdiff_t circular_buffer::const_iterator::operator-(const iterator& o)const{
 	assert(source == o.source);
-	if(o.offset > offset)
-		return -(o - *this);
-	if(o.offset == offset)return 0;
 	if(parent->m_begin.offset < parent->m_end.offset)
 		return offset - o.offset;
 	return (offset - o.offset) % period;
 }
 std::ptrdiff_t circular_buffer::const_iterator::operator-(const const_iterator& o)const{
 	assert(source == o.source);
-	if(o.offset > offset)
-		return -(o - *this);
-	if(o.offset == offset)return 0;
 	if(parent->m_begin.offset < parent->m_end.offset)
 		return offset - o.offset;
 	return (offset - o.offset) % period;
@@ -93,6 +79,40 @@ circular_buffer::const_iterator& circular_buffer::const_iterator::operator=(cons
 	period = o.period;
 	offset = o.offset;
 }
+bool circular_buffer::iterator::operator!=(const iterator& o){
+	return source != o.source || parent != o.parent || period != o.period || offset != o.offset;
+}
+bool circular_buffer::iterator::operator!=(const const_iterator& o){
+	return source != o.source || parent != o.parent || period != o.period || offset != o.offset;
+}
+bool circular_buffer::const_iterator::operator!=(const iterator& o){
+	return source != o.source || parent != o.parent || period != o.period || offset != o.offset;
+}
+bool circular_buffer::const_iterator::operator!=(const const_iterator& o){
+	return source != o.source || parent != o.parent || period != o.period || offset != o.offset;
+}
+bool circular_buffer::iterator::operator==(const iterator& o){
+	return source == o.source && parent == o.parent && period == o.period && offset == o.offset;
+}
+bool circular_buffer::iterator::operator==(const const_iterator& o){
+	return source == o.source && parent == o.parent && period == o.period && offset == o.offset;
+}
+bool circular_buffer::const_iterator::operator==(const iterator& o){
+	return source == o.source && parent == o.parent && period == o.period && offset == o.offset;
+}
+bool circular_buffer::const_iterator::operator==(const const_iterator& o){
+	return source == o.source && parent == o.parent && period == o.period && offset == o.offset;
+}
+circular_buffer::iterator& circular_buffer::iterator::operator--(){
+	if(offset == 0)
+		offset = period;
+	--offset;
+}
+circular_buffer::const_iterator& circular_buffer::const_iterator::operator--(){
+	if(offset == 0)
+		offset = period;
+	--offset;
+}
 circular_buffer::iterator::operator const_iterator(){
 	return const_iterator(parent, source, period, offset);
 }
@@ -108,6 +128,21 @@ circular_buffer::iterator circular_buffer::end(){
 circular_buffer::const_iterator circular_buffer::end()const{
 	return circular_buffer::const_iterator(m_end.parent, m_end.source, m_end.period, m_end.offset);
 }
+void circular_buffer::push_front(char c){
+	--m_begin;
+	*m_begin = c;
+}
+void circular_buffer::push_back(char c){
+	*m_end = c;
+	++m_end;
+}
+void circular_buffer::pop_front(char c){
+	++m_begin;
+}
+void circular_buffer::pop_back(char c){
+	--m_end;
+}
+
 socket_ostream& socket_ostream::put(char_type c){
 	
 }

+ 10 - 3
test.cpp

@@ -1,12 +1,19 @@
 #include <crypt/BigInt64.hpp>
 #include <hash.hpp>
+#include <algorithm>
 #include <random>
 #include <iostream>
 #include <siostream.hpp>
 #include <util.hpp>
 int main(){
 	circular_buffer a(1024);
-	circular_buffer::iterator it = a.begin();
-	++it;
-	std::cout << it - a.begin() << std::endl;
+	a.push_back('a');
+	a.push_back('t');
+	a.push_back('u');
+	a.push_back('o');
+	a.push_front('o');
+	a.push_front('o');
+	
+	std::for_each(a.begin(), a.end(), [](const char& c){std::cout << c;});
+	std::cout << "\n" << (a.begin() - a.end()) << "\n";
 }