#ifndef SIOSTREAM_HPP #define SIOSTREAM_HPP #include #include #include #include #include #include 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(const circular_buffer* p, char* source, std::size_t period, std::size_t offset); const circular_buffer* parent; 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; operator const_iterator(); }; struct const_iterator{ const_iterator(const circular_buffer* p, const char* source, std::size_t period, std::size_t offset); const circular_buffer* parent; 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 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; 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{ using difference_type = ptrdiff_t; using pointer = char*; using value_type = char; using reference = char&; using iterator_category = random_access_iterator_tag; }; } #endif