comparison DEPENDENCIES/generic/include/boost/iostreams/device/file_descriptor.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
2 // (C) Copyright 2003-2007 Jonathan Turkanis
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
5
6 // See http://www.boost.org/libs/iostreams for documentation.
7
8 // Inspired by fdstream.hpp, (C) Copyright Nicolai M. Josuttis 2001,
9 // available at http://www.josuttis.com/cppcode/fdstream.html.
10
11 #ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
12 #define BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
13
14 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
15 # pragma once
16 #endif
17
18 #include <string>
19 #include <boost/cstdint.hpp> // intmax_t.
20 #include <boost/iostreams/categories.hpp> // tags.
21 #include <boost/iostreams/detail/config/auto_link.hpp>
22 #include <boost/iostreams/detail/config/dyn_link.hpp>
23 #include <boost/iostreams/detail/config/windows_posix.hpp>
24 #include <boost/iostreams/detail/file_handle.hpp>
25 #include <boost/iostreams/detail/ios.hpp> // openmode, seekdir, int types.
26 #include <boost/iostreams/detail/path.hpp>
27 #include <boost/iostreams/positioning.hpp>
28 #include <boost/shared_ptr.hpp>
29
30 // Must come last.
31 #include <boost/config/abi_prefix.hpp>
32
33 namespace boost { namespace iostreams {
34
35 // Forward declarations
36 class file_descriptor_source;
37 class file_descriptor_sink;
38 namespace detail { struct file_descriptor_impl; }
39
40 enum file_descriptor_flags
41 {
42 never_close_handle = 0,
43 close_handle = 3
44 };
45
46 class BOOST_IOSTREAMS_DECL file_descriptor {
47 public:
48 friend class file_descriptor_source;
49 friend class file_descriptor_sink;
50 typedef detail::file_handle handle_type;
51 typedef char char_type;
52 struct category
53 : seekable_device_tag,
54 closable_tag
55 { };
56
57 // Default constructor
58 file_descriptor();
59
60 // Constructors taking file desciptors
61 file_descriptor(handle_type fd, file_descriptor_flags);
62 #ifdef BOOST_IOSTREAMS_WINDOWS
63 file_descriptor(int fd, file_descriptor_flags);
64 #endif
65
66 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
67 // Constructors taking file desciptors
68 explicit file_descriptor(handle_type fd, bool close_on_exit = false);
69 #ifdef BOOST_IOSTREAMS_WINDOWS
70 explicit file_descriptor(int fd, bool close_on_exit = false);
71 #endif
72 #endif
73
74 // Constructor taking a std:: string
75 explicit file_descriptor( const std::string& path,
76 BOOST_IOS::openmode mode =
77 BOOST_IOS::in | BOOST_IOS::out );
78
79 // Constructor taking a C-style string
80 explicit file_descriptor( const char* path,
81 BOOST_IOS::openmode mode =
82 BOOST_IOS::in | BOOST_IOS::out );
83
84 // Constructor taking a Boost.Filesystem path
85 template<typename Path>
86 explicit file_descriptor( const Path& path,
87 BOOST_IOS::openmode mode =
88 BOOST_IOS::in | BOOST_IOS::out )
89 {
90 init();
91 open(detail::path(path), mode);
92 }
93
94 // Copy constructor
95 file_descriptor(const file_descriptor& other);
96
97 // open overloads taking file descriptors
98 void open(handle_type fd, file_descriptor_flags);
99 #ifdef BOOST_IOSTREAMS_WINDOWS
100 void open(int fd, file_descriptor_flags);
101 #endif
102
103 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
104 // open overloads taking file descriptors
105 void open(handle_type fd, bool close_on_exit = false);
106 #ifdef BOOST_IOSTREAMS_WINDOWS
107 void open(int fd, bool close_on_exit = false);
108 #endif
109 #endif
110
111 // open overload taking a std::string
112 void open( const std::string& path,
113 BOOST_IOS::openmode mode =
114 BOOST_IOS::in | BOOST_IOS::out );
115
116 // open overload taking C-style string
117 void open( const char* path,
118 BOOST_IOS::openmode mode =
119 BOOST_IOS::in | BOOST_IOS::out );
120
121 // open overload taking a Boost.Filesystem path
122 template<typename Path>
123 void open( const Path& path,
124 BOOST_IOS::openmode mode =
125 BOOST_IOS::in | BOOST_IOS::out )
126 { open(detail::path(path), mode); }
127
128 bool is_open() const;
129 void close();
130 std::streamsize read(char_type* s, std::streamsize n);
131 std::streamsize write(const char_type* s, std::streamsize n);
132 std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
133 handle_type handle() const;
134 private:
135 void init();
136
137 // open overload taking a detail::path
138 void open( const detail::path& path,
139 BOOST_IOS::openmode,
140 BOOST_IOS::openmode = BOOST_IOS::openmode(0) );
141
142 typedef detail::file_descriptor_impl impl_type;
143 shared_ptr<impl_type> pimpl_;
144 };
145
146 class BOOST_IOSTREAMS_DECL file_descriptor_source : private file_descriptor {
147 public:
148 #ifdef BOOST_IOSTREAMS_WINDOWS
149 typedef void* handle_type; // A.k.a HANDLE
150 #else
151 typedef int handle_type;
152 #endif
153 typedef char char_type;
154 struct category
155 : input_seekable,
156 device_tag,
157 closable_tag
158 { };
159 using file_descriptor::is_open;
160 using file_descriptor::close;
161 using file_descriptor::read;
162 using file_descriptor::seek;
163 using file_descriptor::handle;
164
165 // Default constructor
166 file_descriptor_source() { }
167
168 // Constructors taking file desciptors
169 explicit file_descriptor_source(handle_type fd, file_descriptor_flags);
170 #ifdef BOOST_IOSTREAMS_WINDOWS
171 explicit file_descriptor_source(int fd, file_descriptor_flags);
172 #endif
173
174 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
175 // Constructors taking file desciptors
176 explicit file_descriptor_source(handle_type fd, bool close_on_exit = false);
177 #ifdef BOOST_IOSTREAMS_WINDOWS
178 explicit file_descriptor_source(int fd, bool close_on_exit = false);
179 #endif
180 #endif
181
182 // Constructor taking a std:: string
183 explicit file_descriptor_source( const std::string& path,
184 BOOST_IOS::openmode mode = BOOST_IOS::in );
185
186 // Constructor taking a C-style string
187 explicit file_descriptor_source( const char* path,
188 BOOST_IOS::openmode mode = BOOST_IOS::in );
189
190 // Constructor taking a Boost.Filesystem path
191 template<typename Path>
192 explicit file_descriptor_source( const Path& path,
193 BOOST_IOS::openmode mode = BOOST_IOS::in )
194 { open(detail::path(path), mode); }
195
196 // Copy constructor
197 file_descriptor_source(const file_descriptor_source& other);
198
199 // Constructors taking file desciptors
200 void open(handle_type fd, file_descriptor_flags);
201 #ifdef BOOST_IOSTREAMS_WINDOWS
202 void open(int fd, file_descriptor_flags);
203 #endif
204
205 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
206 // open overloads taking file descriptors
207 void open(handle_type fd, bool close_on_exit = false);
208 #ifdef BOOST_IOSTREAMS_WINDOWS
209 void open(int fd, bool close_on_exit = false);
210 #endif
211 #endif
212
213 // open overload taking a std::string
214 void open(const std::string& path, BOOST_IOS::openmode mode = BOOST_IOS::in);
215
216 // open overload taking C-style string
217 void open(const char* path, BOOST_IOS::openmode mode = BOOST_IOS::in);
218
219 // open overload taking a Boost.Filesystem path
220 template<typename Path>
221 void open(const Path& path, BOOST_IOS::openmode mode = BOOST_IOS::in);
222 private:
223
224 // open overload taking a detail::path
225 void open(const detail::path& path, BOOST_IOS::openmode);
226 };
227
228 class BOOST_IOSTREAMS_DECL file_descriptor_sink : private file_descriptor {
229 public:
230 #ifdef BOOST_IOSTREAMS_WINDOWS
231 typedef void* handle_type; // A.k.a HANDLE
232 #else
233 typedef int handle_type;
234 #endif
235 typedef char char_type;
236 struct category
237 : output_seekable,
238 device_tag,
239 closable_tag
240 { };
241 using file_descriptor::is_open;
242 using file_descriptor::close;
243 using file_descriptor::write;
244 using file_descriptor::seek;
245 using file_descriptor::handle;
246
247 // Default constructor
248 file_descriptor_sink() { }
249
250 // Constructors taking file desciptors
251 file_descriptor_sink(handle_type fd, file_descriptor_flags);
252 #ifdef BOOST_IOSTREAMS_WINDOWS
253 file_descriptor_sink(int fd, file_descriptor_flags);
254 #endif
255
256 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
257 // Constructors taking file desciptors
258 explicit file_descriptor_sink(handle_type fd, bool close_on_exit = false);
259 #ifdef BOOST_IOSTREAMS_WINDOWS
260 explicit file_descriptor_sink(int fd, bool close_on_exit = false);
261 #endif
262 #endif
263
264 // Constructor taking a std:: string
265 explicit file_descriptor_sink( const std::string& path,
266 BOOST_IOS::openmode mode = BOOST_IOS::out );
267
268 // Constructor taking a C-style string
269 explicit file_descriptor_sink( const char* path,
270 BOOST_IOS::openmode mode = BOOST_IOS::out );
271
272 // Constructor taking a Boost.Filesystem path
273 template<typename Path>
274 explicit file_descriptor_sink( const Path& path,
275 BOOST_IOS::openmode mode = BOOST_IOS::out )
276 { open(detail::path(path), mode); }
277
278 // Copy constructor
279 file_descriptor_sink(const file_descriptor_sink& other);
280
281 // open overloads taking file descriptors
282 void open(handle_type fd, file_descriptor_flags);
283 #ifdef BOOST_IOSTREAMS_WINDOWS
284 void open(int fd, file_descriptor_flags);
285 #endif
286
287 #if defined(BOOST_IOSTREAMS_USE_DEPRECATED)
288 // open overloads taking file descriptors
289 void open(handle_type fd, bool close_on_exit = false);
290 #ifdef BOOST_IOSTREAMS_WINDOWS
291 void open(int fd, bool close_on_exit = false);
292 #endif
293 #endif
294
295 // open overload taking a std::string
296 void open( const std::string& path,
297 BOOST_IOS::openmode mode = BOOST_IOS::out );
298
299 // open overload taking C-style string
300 void open( const char* path,
301 BOOST_IOS::openmode mode = BOOST_IOS::out );
302
303 // open overload taking a Boost.Filesystem path
304 template<typename Path>
305 void open( const Path& path,
306 BOOST_IOS::openmode mode = BOOST_IOS::out )
307 { open(detail::path(path), mode); }
308 private:
309
310 // open overload taking a detail::path
311 void open(const detail::path& path, BOOST_IOS::openmode);
312 };
313
314 } } // End namespaces iostreams, boost.
315
316 #include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
317
318 #endif // #ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED