1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #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;
- 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;
- char* source;
- size_t period;
- size_t offset;
- char& operator*()const;
- 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();
- };
- 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);
- 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;
- };
- 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
|