acl  3.5.3.0
pipe_stream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <list>
4 #include "noncopyable.hpp"
5 #include "string.hpp"
6 
7 namespace acl {
8 
9 /**
10  * 双向输入输出缓冲管道流, 该流不仅可接收输入数据,同时还可输出所
11  * 输入的数据,纯虚基类,子类需要实现三个接口函数
12  */
14 {
15 public:
17  virtual ~pipe_stream() {}
18 
19  /**
20  * 数据输入输出接口
21  * @param in {const char*} 输入数据的地址
22  * @param len {size_t} 输入数据长度
23  * @param out {string*} 存储输出结果缓冲区,不能为空
24  * @param max {size_t} 希望接收到输出结果的长度限制,如果为0则
25  * 表示没有限制,输出结果都存储在 out 缓冲区中
26  * @return {int} 输出数据的长度,如果 < 0 则表示出错
27  */
28  virtual int push_pop(const char* in, size_t len,
29  string* out, size_t max = 0) = 0;
30 
31  /**
32  * 最后处理的输出数据接口
33  * @param out {string*} 存储输出结果缓冲区,不能为空
34  * @param max {size_t} 希望接收到输出结果的长度限制,如果为0则
35  * 表示没有限制,输出结果都存储在 out 缓冲区中
36  * @return {int} 输出数据的长度,如果 < 0 则表示出错
37  */
38  virtual int pop_end(string* out, size_t max = 0) = 0;
39 
40  /**
41  * 清空内部缓冲区
42  */
43  virtual void clear() {}
44 };
45 
46 /**
47  * 字符串处理双向管理流
48  */
50 {
51 public:
52  pipe_string();
53  pipe_string(string& s);
54  virtual ~pipe_string();
55 
56  // pipe_stream 基类中的四个虚函数
57  virtual int push_pop(const char* in, size_t len,
58  string* out, size_t max = 0);
59  virtual int pop_end(string* out, size_t max = 0);
60  virtual void clear()
61  {
62  m_pBuf->clear();
63  m_pos = 0;
64  }
65 
66  string& get_buf() const
67  {
68  return (*m_pBuf);
69  }
70 
71  char* c_str() const
72  {
73  return (m_pBuf->c_str());
74  }
75 
76  size_t length() const
77  {
78  return (m_pBuf->length());
79  }
80 
81  bool empty() const
82  {
83  return (m_pBuf->empty());
84  }
85 
86 private:
87  string* m_pBuf;
88  string* m_pSavedBufPtr;
89  size_t m_pos;
90 };
91 
92 /**
93  * 管道流管理器,该类管理所有的管理流,将数据依次传递给所有管理流的
94  * 输入接口,同时从所有管道流的输出接口中获得数据然后再将数据传递给
95  * 下一个管道流的输入接口,以此类推,直到最后一个管道流
96  */
98 {
99 public:
100  pipe_manager();
101  ~pipe_manager();
102 
103  /**
104  * 以尾部添加的方式注册新的管道流处理器
105  * @param stream {pipe_stream*} 管道流处理器对象
106  * @return {bool} 如果该管道流处理器对象已经存在则返回 false
107  */
108  bool push_back(pipe_stream* stream);
109 
110  /**
111  * 以头部添加的方式注册新的管道流处理器
112  * @param stream {pipe_stream*} 管道流处理器对象
113  * @return {bool} 如果该管道流处理器对象已经存在则返回 false
114  */
115  bool push_front(pipe_stream* stream);
116 
117  /**
118  * 应用向管道流管理器添加新数据,由该管理器依次传递给所有已注册管道流
119  * 处理器,同时从已注册管道流处理器接收处理结果,依次传递给下一个
120  * @param src {const char*} 待处理的数据地址
121  * @param len {size_t} src 数据长度
122  * @param out {pipe_stream*} 如果非空,则该管道处理器将是最后一个只接收
123  * 输入而不进行输出的管道处理器
124  * @return {bool} 是否有错误发生
125  */
126  bool update(const char* src, size_t len, pipe_stream* out = NULL);
127 
128  /**
129  * 最后必须调用一次该函数,以使有些管道的缓冲区里的数据可以一次性地
130  * 刷新至最后的管道中
131  * @param out {pipe_stream*} 如果非空,则该管道处理器将是最后一个只接收
132  * 输入而不进行输出的管道处理器
133  * @return {bool} 是否有错误发生
134  */
135  bool update_end(pipe_stream* out = NULL);
136 
137  pipe_manager& operator<<(const string&);
138  pipe_manager& operator<<(const string*);
139  pipe_manager& operator<<(const char*);
140 #if defined(_WIN32) || defined(_WIN64)
141  pipe_manager& operator<<(__int64);
142  pipe_manager& operator<<(unsigned __int64);
143 #else
144  pipe_manager& operator<<(long long int);
145  pipe_manager& operator<<(unsigned long long int);
146 #endif
147  pipe_manager& operator<<(long);
148  pipe_manager& operator<<(unsigned long);
149  pipe_manager& operator<<(int);
150  pipe_manager& operator<<(unsigned int);
151  pipe_manager& operator<<(short);
152  pipe_manager& operator<<(unsigned short);
153  pipe_manager& operator<<(char);
154  pipe_manager& operator<<(unsigned char);
155 
156  char* c_str() const;
157  size_t length() const;
158  void clear();
159 
160 private:
161  std::list<pipe_stream*> m_streams;
162  string* m_pBuf1, *m_pBuf2;
163  pipe_string* m_pPipeStream;
164 };
165 
166 } // namespace acl
virtual ~pipe_stream()
Definition: pipe_stream.hpp:17
char * c_str() const
Definition: pipe_stream.hpp:71
virtual void clear()
Definition: pipe_stream.hpp:43
string & get_buf() const
Definition: pipe_stream.hpp:66
size_t length() const
Definition: pipe_stream.hpp:76
#define ACL_CPP_API
bool empty() const
Definition: pipe_stream.hpp:81
virtual void clear()
Definition: pipe_stream.hpp:60