BIMHome v1.0.0
BIMHome接口文档说明
fdstream.hpp
浏览该文件的文档.
1#ifndef BOOST_FDSTREAM_HPP
2#define BOOST_FDSTREAM_HPP
3
4#include <istream>
5#include <ostream>
6#include <streambuf>
7// for EOF:
8#include <cstdio>
9// for memcpy():
10#include <cstring>
11
12
13// low-level read and write functions
14#ifdef _MSC_VER
15# include <io.h>
16#else
17# include <unistd.h>
18//extern "C" {
19// int write (int fd, const char* buf, int num);
20// int read (int fd, char* buf, int num);
21//}
22#endif
23
24
25// BEGIN namespace BOOST
26namespace boost {
27
28
29/************************************************************
30 * fdostream
31 * - a stream that writes on a file descriptor
32 ************************************************************/
33
34
35class fdoutbuf : public std::streambuf {
36 protected:
37 int fd; // file descriptor
38 public:
39 // constructor
40 fdoutbuf (int _fd) : fd(_fd) {
41 }
42 protected:
43 // write one character
44 virtual int_type overflow (int_type c) {
45 if (c != EOF) {
46 char z = c;
47#ifdef _MSC_VER
48 if (_write (fd, &z, 1) != 1) {
49#else
50 if (write (fd, &z, 1) != 1) {
51#endif
52 return EOF;
53 }
54 }
55 return c;
56 }
57 // write multiple characters
58 virtual
59 std::streamsize xsputn (const char* s,
60 std::streamsize num) {
61#ifdef _MSC_VER
62 return _write(fd,s,num);
63#else
64 return write(fd,s,num);
65#endif
66 }
67};
68
69class fdostream : public std::ostream {
70 protected:
72 public:
73 fdostream (int fd) : std::ostream(0), buf(fd) {
74 rdbuf(&buf);
75 }
76};
77
78
79/************************************************************
80 * fdistream
81 * - a stream that writes on a file descriptor
82 ************************************************************/
83
84class fdinbuf : public std::streambuf {
85 protected:
86 int fd; // file descriptor
87 protected:
88 /* data buffer:
89 * - at most, pbSize characters in putback area plus
90 * - at most, bufSize characters in ordinary read buffer
91 */
92 static const int pbSize = 4; // size of putback area
93 static const int bufSize = 1024; // size of the data buffer
94 char buffer[bufSize+pbSize]; // data buffer
95
96 public:
97 /* constructor
98 * - initialize file descriptor
99 * - initialize empty data buffer
100 * - no putback area
101 * => force underflow()
102 */
103 fdinbuf (int _fd) : fd(_fd) {
104 setg (buffer+pbSize, // beginning of putback area
105 buffer+pbSize, // read position
106 buffer+pbSize); // end position
107 }
108
109 protected:
110 // insert new characters into the buffer
111 virtual int_type underflow () {
112#ifndef _MSC_VER
113using std::memcpy;
114#endif
115
116 // is read position before end of buffer?
117 if (gptr() < egptr()) {
118 return *gptr();
119 }
120
121 /* process size of putback area
122 * - use number of characters read
123 * - but at most size of putback area
124 */
125 int numPutback;
126 numPutback = gptr() - eback();
127 if (numPutback > pbSize) {
128 numPutback = pbSize;
129 }
130
131 /* copy up to pbSize characters previously read into
132 * the putback area
133 */
134 memcpy (buffer+(pbSize-numPutback), gptr()-numPutback,
135 numPutback);
136
137 // read at most bufSize new characters
138 int num;
139#ifdef _MSC_VER
140 num = _read (fd, buffer+pbSize, bufSize);
141#else
142 num = read (fd, buffer+pbSize, bufSize);
143#endif
144 if (num <= 0) {
145 // ERROR or EOF
146 return EOF;
147 }
148
149 // reset buffer pointers
150 setg (buffer+(pbSize-numPutback), // beginning of putback area
151 buffer+pbSize, // read position
152 buffer+pbSize+num); // end of buffer
153
154 // return next character
155 return *gptr();
156 }
157};
158
159class fdistream : public std::istream {
160 protected:
162 public:
163 fdistream (int fd) : std::istream(0), buf(fd) {
164 rdbuf(&buf);
165 }
166};
167
168
169} // END namespace boost
170
171#endif /*BOOST_FDSTREAM_HPP*/
int fd
Definition fdstream.hpp:86
fdinbuf(int _fd)
Definition fdstream.hpp:103
virtual int_type underflow()
Definition fdstream.hpp:111
Definition fdstream.hpp:84
fdistream(int fd)
Definition fdstream.hpp:163
fdinbuf buf
Definition fdstream.hpp:161
Definition fdstream.hpp:159
fdostream(int fd)
Definition fdstream.hpp:73
fdoutbuf buf
Definition fdstream.hpp:71
Definition fdstream.hpp:69
virtual std::streamsize xsputn(const char *s, std::streamsize num)
Definition fdstream.hpp:59
virtual int_type overflow(int_type c)
Definition fdstream.hpp:44
int fd
Definition fdstream.hpp:37
fdoutbuf(int _fd)
Definition fdstream.hpp:40
Definition fdstream.hpp:35
Definition fdstream.hpp:26