Chris@16
|
1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
|
Chris@16
|
2 // (C) Copyright 2003-2007 Jonathan Turkanis
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/iostreams for documentation.
|
Chris@16
|
7
|
Chris@16
|
8 #ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
|
Chris@16
|
9 #define BOOST_IOSTREAMS_FILE_HPP_INCLUDED
|
Chris@16
|
10
|
Chris@16
|
11 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
Chris@16
|
12 # pragma once
|
Chris@16
|
13 #endif
|
Chris@16
|
14
|
Chris@16
|
15 #include <boost/iostreams/detail/config/wide_streams.hpp>
|
Chris@16
|
16 #ifndef BOOST_IOSTREAMS_NO_LOCALE
|
Chris@16
|
17 # include <locale>
|
Chris@16
|
18 #endif
|
Chris@16
|
19 #include <string> // pathnames, char_traits.
|
Chris@16
|
20 #include <boost/iostreams/categories.hpp>
|
Chris@16
|
21 #include <boost/iostreams/detail/ios.hpp> // openmode, seekdir, int types.
|
Chris@16
|
22 #include <boost/iostreams/detail/fstream.hpp>
|
Chris@16
|
23 #include <boost/iostreams/operations.hpp> // seek.
|
Chris@16
|
24 #include <boost/shared_ptr.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 // Must come last.
|
Chris@16
|
27 #include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
|
Chris@16
|
28
|
Chris@16
|
29 namespace boost { namespace iostreams {
|
Chris@16
|
30
|
Chris@16
|
31 template<typename Ch>
|
Chris@16
|
32 class basic_file {
|
Chris@16
|
33 public:
|
Chris@16
|
34 typedef Ch char_type;
|
Chris@16
|
35 struct category
|
Chris@16
|
36 : public seekable_device_tag,
|
Chris@16
|
37 public closable_tag,
|
Chris@16
|
38 public localizable_tag,
|
Chris@16
|
39 public flushable_tag
|
Chris@16
|
40 { };
|
Chris@16
|
41 basic_file( const std::string& path,
|
Chris@16
|
42 BOOST_IOS::openmode mode =
|
Chris@16
|
43 BOOST_IOS::in | BOOST_IOS::out,
|
Chris@16
|
44 BOOST_IOS::openmode base_mode =
|
Chris@16
|
45 BOOST_IOS::in | BOOST_IOS::out );
|
Chris@16
|
46 std::streamsize read(char_type* s, std::streamsize n);
|
Chris@16
|
47 bool putback(char_type c);
|
Chris@16
|
48 std::streamsize write(const char_type* s, std::streamsize n);
|
Chris@16
|
49 std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
|
Chris@16
|
50 BOOST_IOS::openmode which =
|
Chris@16
|
51 BOOST_IOS::in | BOOST_IOS::out );
|
Chris@16
|
52 void open( const std::string& path,
|
Chris@16
|
53 BOOST_IOS::openmode mode =
|
Chris@16
|
54 BOOST_IOS::in | BOOST_IOS::out,
|
Chris@16
|
55 BOOST_IOS::openmode base_mode =
|
Chris@16
|
56 BOOST_IOS::in | BOOST_IOS::out );
|
Chris@16
|
57 bool is_open() const;
|
Chris@16
|
58 void close();
|
Chris@16
|
59 bool flush();
|
Chris@16
|
60 #ifndef BOOST_IOSTREAMS_NO_LOCALE
|
Chris@16
|
61 void imbue(const std::locale& loc) { pimpl_->file_.pubimbue(loc); }
|
Chris@16
|
62 #endif
|
Chris@16
|
63 private:
|
Chris@16
|
64 struct impl {
|
Chris@16
|
65 impl(const std::string& path, BOOST_IOS::openmode mode)
|
Chris@16
|
66 { file_.open(path.c_str(), mode); }
|
Chris@16
|
67 ~impl() { if (file_.is_open()) file_.close(); }
|
Chris@16
|
68 BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) file_;
|
Chris@16
|
69 };
|
Chris@16
|
70 shared_ptr<impl> pimpl_;
|
Chris@16
|
71 };
|
Chris@16
|
72
|
Chris@16
|
73 typedef basic_file<char> file;
|
Chris@16
|
74 typedef basic_file<wchar_t> wfile;
|
Chris@16
|
75
|
Chris@16
|
76 template<typename Ch>
|
Chris@16
|
77 struct basic_file_source : private basic_file<Ch> {
|
Chris@16
|
78 typedef Ch char_type;
|
Chris@16
|
79 struct category
|
Chris@16
|
80 : input_seekable,
|
Chris@16
|
81 device_tag,
|
Chris@16
|
82 closable_tag
|
Chris@16
|
83 { };
|
Chris@16
|
84 using basic_file<Ch>::read;
|
Chris@16
|
85 using basic_file<Ch>::putback;
|
Chris@16
|
86 using basic_file<Ch>::seek;
|
Chris@16
|
87 using basic_file<Ch>::is_open;
|
Chris@16
|
88 using basic_file<Ch>::close;
|
Chris@16
|
89 basic_file_source( const std::string& path,
|
Chris@16
|
90 BOOST_IOS::openmode mode =
|
Chris@16
|
91 BOOST_IOS::in )
|
Chris@16
|
92 : basic_file<Ch>(path, mode & ~BOOST_IOS::out, BOOST_IOS::in)
|
Chris@16
|
93 { }
|
Chris@16
|
94 void open( const std::string& path,
|
Chris@16
|
95 BOOST_IOS::openmode mode = BOOST_IOS::in )
|
Chris@16
|
96 {
|
Chris@16
|
97 basic_file<Ch>::open(path, mode & ~BOOST_IOS::out, BOOST_IOS::in);
|
Chris@16
|
98 }
|
Chris@16
|
99 };
|
Chris@16
|
100
|
Chris@16
|
101 typedef basic_file_source<char> file_source;
|
Chris@16
|
102 typedef basic_file_source<wchar_t> wfile_source;
|
Chris@16
|
103
|
Chris@16
|
104 template<typename Ch>
|
Chris@16
|
105 struct basic_file_sink : private basic_file<Ch> {
|
Chris@16
|
106 typedef Ch char_type;
|
Chris@16
|
107 struct category
|
Chris@16
|
108 : output_seekable,
|
Chris@16
|
109 device_tag,
|
Chris@16
|
110 closable_tag,
|
Chris@16
|
111 flushable_tag
|
Chris@16
|
112 { };
|
Chris@16
|
113 using basic_file<Ch>::write;
|
Chris@16
|
114 using basic_file<Ch>::seek;
|
Chris@16
|
115 using basic_file<Ch>::is_open;
|
Chris@16
|
116 using basic_file<Ch>::close;
|
Chris@16
|
117 using basic_file<Ch>::flush;
|
Chris@16
|
118 basic_file_sink( const std::string& path,
|
Chris@16
|
119 BOOST_IOS::openmode mode = BOOST_IOS::out )
|
Chris@16
|
120 : basic_file<Ch>(path, mode & ~BOOST_IOS::in, BOOST_IOS::out)
|
Chris@16
|
121 { }
|
Chris@16
|
122 void open( const std::string& path,
|
Chris@16
|
123 BOOST_IOS::openmode mode = BOOST_IOS::out )
|
Chris@16
|
124 {
|
Chris@16
|
125 basic_file<Ch>::open(path, mode & ~BOOST_IOS::in, BOOST_IOS::out);
|
Chris@16
|
126 }
|
Chris@16
|
127 };
|
Chris@16
|
128
|
Chris@16
|
129 typedef basic_file_sink<char> file_sink;
|
Chris@16
|
130 typedef basic_file_sink<wchar_t> wfile_sink;
|
Chris@16
|
131
|
Chris@16
|
132 //------------------Implementation of basic_file------------------------------//
|
Chris@16
|
133
|
Chris@16
|
134 template<typename Ch>
|
Chris@16
|
135 basic_file<Ch>::basic_file
|
Chris@16
|
136 ( const std::string& path, BOOST_IOS::openmode mode,
|
Chris@16
|
137 BOOST_IOS::openmode base_mode )
|
Chris@16
|
138 {
|
Chris@16
|
139 open(path, mode, base_mode);
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@16
|
142 template<typename Ch>
|
Chris@16
|
143 inline std::streamsize basic_file<Ch>::read
|
Chris@16
|
144 (char_type* s, std::streamsize n)
|
Chris@16
|
145 {
|
Chris@16
|
146 std::streamsize result = pimpl_->file_.sgetn(s, n);
|
Chris@16
|
147 return result != 0 ? result : -1;
|
Chris@16
|
148 }
|
Chris@16
|
149
|
Chris@16
|
150 template<typename Ch>
|
Chris@16
|
151 inline bool basic_file<Ch>::putback(char_type c)
|
Chris@16
|
152 {
|
Chris@16
|
153 return !!pimpl_->file_.sputbackc(c);
|
Chris@16
|
154 }
|
Chris@16
|
155
|
Chris@16
|
156 template<typename Ch>
|
Chris@16
|
157 inline std::streamsize basic_file<Ch>::write
|
Chris@16
|
158 (const char_type* s, std::streamsize n)
|
Chris@16
|
159 { return pimpl_->file_.sputn(s, n); }
|
Chris@16
|
160
|
Chris@16
|
161 template<typename Ch>
|
Chris@16
|
162 std::streampos basic_file<Ch>::seek
|
Chris@16
|
163 ( stream_offset off, BOOST_IOS::seekdir way,
|
Chris@16
|
164 BOOST_IOS::openmode )
|
Chris@16
|
165 { return iostreams::seek(pimpl_->file_, off, way); }
|
Chris@16
|
166
|
Chris@16
|
167 template<typename Ch>
|
Chris@16
|
168 void basic_file<Ch>::open
|
Chris@16
|
169 ( const std::string& path, BOOST_IOS::openmode mode,
|
Chris@16
|
170 BOOST_IOS::openmode base_mode )
|
Chris@16
|
171 {
|
Chris@16
|
172 pimpl_.reset(new impl(path, mode | base_mode));
|
Chris@16
|
173 }
|
Chris@16
|
174
|
Chris@16
|
175 template<typename Ch>
|
Chris@16
|
176 bool basic_file<Ch>::is_open() const { return pimpl_->file_.is_open(); }
|
Chris@16
|
177
|
Chris@16
|
178 template<typename Ch>
|
Chris@16
|
179 void basic_file<Ch>::close() { pimpl_->file_.close(); }
|
Chris@16
|
180
|
Chris@16
|
181 template<typename Ch>
|
Chris@16
|
182 bool basic_file<Ch>::flush()
|
Chris@16
|
183 { return pimpl_->file_.BOOST_IOSTREAMS_PUBSYNC() == 0; }
|
Chris@16
|
184
|
Chris@16
|
185 //----------------------------------------------------------------------------//
|
Chris@16
|
186
|
Chris@16
|
187 } } // End namespaces iostreams, boost.
|
Chris@16
|
188
|
Chris@16
|
189 #include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC
|
Chris@16
|
190
|
Chris@16
|
191 #endif // #ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
|