Advertisement
in_chainz

Untitled

Mar 19th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class Writer {
  5. public:
  6.     virtual void Write(const char *data, size_t len) {
  7.         std::cout << "(flush) ";
  8.         for (size_t i = 0; i < len; ++i)
  9.             std::cout << data[i];
  10.         std::cout << std::endl;
  11.     }
  12. };
  13.  
  14. class BufferedWriter : public Writer {
  15. public:
  16.     explicit BufferedWriter(size_t size) : bufsize_(size) {
  17.         buffer_.resize(bufsize_);
  18.     }
  19.  
  20.     void Write(const char *data, size_t len) override {
  21.         if (!bufsize_) {
  22.             printer_.Write(data, len);
  23.             return;
  24.         }
  25.  
  26.         for (int i = 0; i < len; ++i) {
  27.             flush();
  28.             buffer_[cursize_++] = data[i];
  29.         }
  30.     }
  31.  
  32.     ~BufferedWriter() {
  33.         if (cursize_) {
  34.             char *last_data = new char[cursize_];
  35.             for (size_t i = 0; i < cursize_; ++i)
  36.                 last_data[i] = buffer_[i];
  37.             printer_.Write(last_data, cursize_);
  38.             delete[] last_data;
  39.         }
  40.     }
  41.  
  42. private:
  43.     void flush() {
  44.         if (cursize_ < bufsize_)
  45.             return;
  46.         char *data = new char[bufsize_];
  47.  
  48.         for (size_t i = 0; i < bufsize_; ++i)
  49.             data[i] = buffer_[i];
  50.  
  51.         printer_.Write(data, bufsize_);
  52.         cursize_ = 0;
  53.         delete[] data;
  54.     }
  55.  
  56.     size_t bufsize_;
  57.     std::vector<char> buffer_;
  58.     size_t cursize_ = 0;
  59.     Writer printer_;
  60. };
  61.  
  62. int main() {
  63.     char data[100] = "a";
  64.     char data1[14] = "helloworl";
  65.     BufferedWriter wrt(2);
  66.     wrt.Write(data, 1);
  67.     wrt.Write(data1, 9);
  68.     wrt.Write("fuck", 4);
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement