siostream.hpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef SIOSTREAM_HPP
  2. #define SIOSTREAM_HPP
  3. #include <iostream>
  4. #include <cstdint>
  5. #include <vector>
  6. #include <ios>
  7. #include <array>
  8. #include <string>
  9. class circular_buffer{
  10. public:
  11. using size_t = std::size_t;
  12. circular_buffer(size_t size);
  13. void resize(size_t size);
  14. struct iterator;
  15. struct const_iterator;
  16. void push_front(char c);
  17. void push_back(char c);
  18. void pop_front(char c);
  19. void pop_back(char c);
  20. struct iterator{
  21. iterator(const circular_buffer* p, char* source, std::size_t period, std::size_t offset);
  22. const circular_buffer* parent;
  23. char* source;
  24. size_t period;
  25. size_t offset;
  26. char& operator*()const;
  27. iterator& operator++();
  28. iterator operator+(size_t)const;
  29. iterator& operator=(const iterator& o);
  30. bool operator==(const iterator& o);
  31. bool operator==(const const_iterator& o);
  32. bool operator!=(const iterator& o);
  33. bool operator!=(const const_iterator& o);
  34. iterator& operator--();
  35. std::ptrdiff_t operator-(const iterator& o)const;
  36. std::ptrdiff_t operator-(const const_iterator& o)const;
  37. operator const_iterator();
  38. };
  39. struct const_iterator{
  40. const_iterator(const circular_buffer* p, const char* source, std::size_t period, std::size_t offset);
  41. const circular_buffer* parent;
  42. const char* source;
  43. size_t period;
  44. size_t offset;
  45. const char& operator*()const;
  46. const_iterator& operator++();
  47. const_iterator operator+(size_t)const;
  48. const_iterator& operator=(const const_iterator& o);
  49. bool operator==(const iterator& o);
  50. bool operator==(const const_iterator& o);
  51. bool operator!=(const iterator& o);
  52. bool operator!=(const const_iterator& o);
  53. const_iterator& operator--();
  54. std::ptrdiff_t operator-(const iterator& o)const;
  55. std::ptrdiff_t operator-(const const_iterator& o)const;
  56. };
  57. iterator begin();
  58. const_iterator begin() const;
  59. iterator end();
  60. const_iterator end() const;
  61. private:
  62. std::vector<char> m_data;
  63. iterator m_begin, m_end;
  64. };
  65. class socket_ostream : public std::ostream{
  66. circular_buffer buffer;
  67. public:
  68. using char_type = char;
  69. using char_traits = std::char_traits<char>;
  70. socket_ostream();
  71. virtual socket_ostream& put(char_type c);
  72. virtual socket_ostream& operator<<(char*);
  73. virtual socket_ostream& operator<<(const std::string&);
  74. virtual socket_ostream& operator<<(int);
  75. };
  76. namespace std{
  77. template<>
  78. struct iterator_traits<circular_buffer::iterator>{
  79. using difference_type = ptrdiff_t;
  80. using pointer = char*;
  81. using value_type = char;
  82. using reference = char&;
  83. using iterator_category = random_access_iterator_tag;
  84. };
  85. }
  86. #endif