1
+ #pragma once
2
+
3
+ #include < vector>
4
+ #include < string>
5
+ #include < algorithm>
6
+ #include < stddef.h>
7
+
8
+ // 网络库底层的缓冲区类型定义
9
+ class Buffer
10
+ {
11
+ public:
12
+ static const size_t kCheapPrepend = 8 ;
13
+ static const size_t kInitialSize = 1024 ;
14
+
15
+ explicit Buffer (size_t initalSize = kInitialSize )
16
+ : buffer_(kCheapPrepend + initalSize)
17
+ , readerIndex_(kCheapPrepend )
18
+ , writerIndex_(kCheapPrepend )
19
+ {
20
+ }
21
+
22
+ size_t readableBytes () const { return writerIndex_ - readerIndex_; }
23
+ size_t writableBytes () const { return buffer_.size () - writerIndex_; }
24
+ size_t prependableBytes () const { return readerIndex_; }
25
+
26
+ // 返回缓冲区中可读数据的起始地址
27
+ const char *peek () const { return begin () + readerIndex_; }
28
+ void retrieve (size_t len)
29
+ {
30
+ if (len < readableBytes ())
31
+ {
32
+ readerIndex_ += len; // 说明应用只读取了可读缓冲区数据的一部分,就是len长度 还剩下readerIndex+=len到writerIndex_的数据未读
33
+ }
34
+ else // len == readableBytes()
35
+ {
36
+ retrieveAll ();
37
+ }
38
+ }
39
+ void retrieveAll ()
40
+ {
41
+ readerIndex_ = kCheapPrepend ;
42
+ writerIndex_ = kCheapPrepend ;
43
+ }
44
+
45
+ // 把onMessage函数上报的Buffer数据 转成string类型的数据返回
46
+ std::string retrieveAllAsString () { return retrieveAsString (readableBytes ()); }
47
+ std::string retrieveAsString (size_t len)
48
+ {
49
+ std::string result (peek (), len);
50
+ retrieve (len); // 上面一句把缓冲区中可读的数据已经读取出来 这里肯定要对缓冲区进行复位操作
51
+ return result;
52
+ }
53
+
54
+ // buffer_.size - writerIndex_
55
+ void ensureWritableBytes (size_t len)
56
+ {
57
+ if (writableBytes () < len)
58
+ {
59
+ makeSpace (len); // 扩容
60
+ }
61
+ }
62
+
63
+ // 把[data, data+len]内存上的数据添加到writable缓冲区当中
64
+ void append (const char *data, size_t len)
65
+ {
66
+ ensureWritableBytes (len);
67
+ std::copy (data, data+len, beginWrite ());
68
+ writerIndex_ += len;
69
+ }
70
+ char *beginWrite () { return begin () + writerIndex_; }
71
+ const char *beginWrite () const { return begin () + writerIndex_; }
72
+
73
+ // 从fd上读取数据
74
+ ssize_t readFd (int fd, int *saveErrno);
75
+ // 通过fd发送数据
76
+ ssize_t writeFd (int fd, int *saveErrno);
77
+
78
+ private:
79
+ // vector底层数组首元素的地址 也就是数组的起始地址
80
+ char *begin () { return &*buffer_.begin (); }
81
+ const char *begin () const { return &*buffer_.begin (); }
82
+
83
+ void makeSpace (size_t len)
84
+ {
85
+ /* *
86
+ * | kCheapPrepend |xxx|reader | writer | // xxx标示reader中已读的部分
87
+ * | kCheapPrepend | len |
88
+ **/
89
+ if (writableBytes () + prependableBytes () < len + kCheapPrepend ) // 也就是说 len > xxx + writer的部分
90
+ {
91
+ buffer_.resize (writerIndex_ + len);
92
+ }
93
+ else // 这里说明 len <= xxx + writer 把reader搬到从xxx开始 使得xxx后面是一段连续空间
94
+ {
95
+ size_t readable = readableBytes (); // readable = reader的长度
96
+ std::copy (begin ()+readerIndex_, begin ()+writerIndex_, // 把这一部分数据拷贝到begin+kCheapPrepend起始处
97
+ begin ()+kCheapPrepend );
98
+ readerIndex_ = kCheapPrepend ;
99
+ writerIndex_ = readerIndex_+readable;
100
+ }
101
+ }
102
+
103
+ std::vector<char > buffer_;
104
+ size_t readerIndex_;
105
+ size_t writerIndex_;
106
+ };
0 commit comments