siostream.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. struct iterator{
  17. iterator(char* source, std::size_t period, std::size_t offset);
  18. char* source;
  19. size_t period;
  20. size_t offset;
  21. char& operator*()const;
  22. iterator& operator++();
  23. iterator operator+(size_t)const;
  24. iterator& operator=(const iterator& o);
  25. std::ptrdiff_t operator-(const iterator& o)const;
  26. std::ptrdiff_t operator-(const const_iterator& o)const;
  27. };
  28. struct const_iterator{
  29. const_iterator(const char* source, std::size_t period, std::size_t offset);
  30. const char* source;
  31. size_t period;
  32. size_t offset;
  33. const char& operator*()const;
  34. const_iterator& operator++();
  35. const_iterator operator+(size_t)const;
  36. const_iterator& operator=(const const_iterator& o);
  37. std::ptrdiff_t operator-(const iterator& o)const;
  38. std::ptrdiff_t operator-(const const_iterator& o)const;
  39. };
  40. iterator begin();
  41. const_iterator begin() const;
  42. iterator end();
  43. const_iterator end() const;
  44. private:
  45. std::vector<char> m_data;
  46. iterator m_begin, m_end;
  47. };
  48. class socket_ostream : public std::ostream{
  49. circular_buffer buffer;
  50. public:
  51. using char_type = char;
  52. using char_traits = std::char_traits<char>;
  53. socket_ostream();
  54. virtual socket_ostream& put(char_type c);
  55. virtual socket_ostream& operator<<(char*);
  56. virtual socket_ostream& operator<<(const std::string&);
  57. virtual socket_ostream& operator<<(int);
  58. };
  59. namespace std{
  60. template<>
  61. struct iterator_traits<circular_buffer::iterator>{
  62. using difference_type = ptrdiff_t;
  63. using pointer = char*;
  64. using value_type = char;
  65. using reference = char&;
  66. using iterator_category = random_access_iterator_tag;
  67. };
  68. }
  69. #endif