siostream.hpp 2.0 KB

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