mawinkle 6 роки тому
батько
коміт
b1c4bc46f2
4 змінених файлів з 165 додано та 12 видалено
  1. 69 0
      include/siostream.hpp
  2. 2 2
      socket_impl/CMakeLists.txt
  3. 91 0
      socket_impl/siostream.cpp
  4. 3 10
      test.cpp

+ 69 - 0
include/siostream.hpp

@@ -0,0 +1,69 @@
+#ifndef SIOSTREAM_HPP
+#define SIOSTREAM_HPP
+#include <iostream>
+#include <cstdint>
+#include <vector>
+#include <ios>
+#include <array>
+#include <string>
+class circular_buffer{
+public:
+	using size_t = std::size_t;
+	circular_buffer(size_t size);
+	void resize(size_t size);
+	struct iterator;
+	struct const_iterator;
+	struct iterator{
+		iterator(char* source, std::size_t period, std::size_t offset);
+		char* source;
+		size_t period;
+		size_t offset;
+		char& operator*()const;
+		iterator& operator++();
+		iterator operator+(size_t)const;
+		iterator& operator=(const iterator& o);
+		std::ptrdiff_t operator-(const iterator& o)const;
+		std::ptrdiff_t operator-(const const_iterator& o)const;
+	};
+	struct const_iterator{
+		const_iterator(const char* source, std::size_t period, std::size_t offset);
+		const char* source;
+		size_t period;
+		size_t offset;
+		const char& operator*()const;
+		const_iterator& operator++();
+		const_iterator operator+(size_t)const;
+		const_iterator& operator=(const const_iterator& o);
+		std::ptrdiff_t operator-(const iterator& o)const;
+		std::ptrdiff_t operator-(const const_iterator& o)const;
+	};
+	iterator begin();
+	const_iterator begin() const;
+	iterator end();
+	const_iterator end() const;
+private:
+	std::vector<char> m_data;
+	iterator m_begin, m_end;
+};
+class socket_ostream : public std::ostream{
+	circular_buffer buffer;
+public:
+	using char_type = char;
+	using char_traits = std::char_traits<char>;
+	socket_ostream();
+	virtual socket_ostream& put(char_type c);
+	virtual socket_ostream& operator<<(char*);
+	virtual socket_ostream& operator<<(const std::string&);
+	virtual socket_ostream& operator<<(int);
+};
+namespace std{
+	template<>
+	struct iterator_traits<circular_buffer::iterator>{
+		using difference_type = ptrdiff_t;
+		using pointer = char*;
+		using value_type = char;
+		using reference = char&;
+		using iterator_category = random_access_iterator_tag;
+	};
+}
+#endif

+ 2 - 2
socket_impl/CMakeLists.txt

@@ -1,7 +1,7 @@
 cmake_minimum_required (VERSION 3.0)
 if(WIN32)
-	add_library(sio STATIC hash.cpp socketio_win32.cpp ../msc_supp/uint128_t.cpp)
+	add_library(sio STATIC siostream.cpp hash.cpp socketio_win32.cpp ../msc_supp/uint128_t.cpp)
 endif()
 if(UNIX)
-        add_library(sio STATIC hash.cpp udpsocket_posix.cpp socketio_posix.cpp)
+        add_library(sio STATIC siostream.cpp hash.cpp udpsocket_posix.cpp socketio_posix.cpp)
 endif()

+ 91 - 0
socket_impl/siostream.cpp

@@ -0,0 +1,91 @@
+#include <siostream.hpp>
+#include <algorithm>
+using std::size_t;
+socket_ostream::socket_ostream() : std::ostream(), buffer(1024){}
+circular_buffer::circular_buffer(size_t size) : m_data(size), m_begin(m_data.data(), size, 0), m_end(m_data.data(), size, 0){
+	
+}
+circular_buffer::iterator::iterator(char* _source, size_t _period, size_t _offset):source(_source),period(_period), offset(_offset){
+	
+}
+circular_buffer::const_iterator::const_iterator(const char* _source, size_t _period, size_t _offset):source(_source),period(_period), offset(_offset){
+	
+}
+void circular_buffer::resize(size_t size){
+	std::vector<char> newdata(size);
+	size_t os = m_end - m_begin;
+	if(size >= (m_begin - m_end))
+		std::copy(m_begin, m_begin, newdata.begin());
+	else
+		std::copy(m_begin, m_begin + size, newdata.begin());
+	std::swap(m_data, newdata);
+	m_begin = iterator(m_data.data(),size,0);
+	m_end = iterator(m_data.data(),size,os);
+}
+char& circular_buffer::iterator::operator*()const{
+	return *(source + offset);
+}
+const char& circular_buffer::const_iterator::operator*()const {
+	return *(source + offset);
+}
+circular_buffer::iterator& circular_buffer::iterator::operator++(){
+	++offset;
+	if(offset == size)offset = 0;
+	return *this;
+}
+circular_buffer::const_iterator& circular_buffer::const_iterator::operator++(){
+	
+}
+circular_buffer::iterator circular_buffer::iterator::operator+(size_t leap)const{
+	
+}
+
+std::ptrdiff_t circular_buffer::iterator::operator-(const iterator& o)const{
+	
+}
+std::ptrdiff_t circular_buffer::iterator::operator-(const const_iterator& o)const{
+	
+}
+std::ptrdiff_t circular_buffer::const_iterator::operator-(const iterator& o)const{
+	
+}
+std::ptrdiff_t circular_buffer::const_iterator::operator-(const const_iterator& o)const{
+	
+}
+circular_buffer::const_iterator circular_buffer::const_iterator::operator+(size_t leap)const{
+	
+}
+circular_buffer::iterator& circular_buffer::iterator::operator=(const circular_buffer::iterator& o){
+	source = o.source;
+	period = o.period;
+	offset = o.offset;
+}
+circular_buffer::const_iterator& circular_buffer::const_iterator::operator=(const circular_buffer::const_iterator& o){
+	source = o.source;
+	period = o.period;
+	offset = o.offset;
+}
+circular_buffer::iterator circular_buffer::begin(){
+	
+}
+circular_buffer::const_iterator circular_buffer::begin() const{
+	
+}
+circular_buffer::iterator circular_buffer::end(){
+	
+}
+circular_buffer::const_iterator circular_buffer::end()const{
+	
+}
+socket_ostream& socket_ostream::put(char_type c){
+	
+}
+socket_ostream& socket_ostream::operator<<(char*){
+	
+}
+socket_ostream& socket_ostream::operator<<(const std::string&){
+	
+}
+socket_ostream& socket_ostream::operator<<(int){
+	
+}

+ 3 - 10
test.cpp

@@ -2,16 +2,9 @@
 #include <hash.hpp>
 #include <random>
 #include <iostream>
+#include <siostream.hpp>
 #include <util.hpp>
 int main(){
-    const int runs = 1000;
-    std::mt19937_64 gen(54);
-    std::vector<BigInt> vec(runs, BigInt(gen, 65536));
-    std::vector<BigInt> hashes(runs);
-    auto a = std::nanoTime();
-    for(int i = 0;i < runs;i++){
-        hashes[i] = sha512(vec[i]);
-    }
-    auto b = std::nanoTime();
-    std::cout << (b - a) / 1000 / 1000.0 << " ms" << std::endl;
+	socket_ostream os;
+	os.put('h');
 }