annotate DEPENDENCIES/generic/include/boost/iostreams/device/file.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
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