| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)// (C) Copyright 2003-2007 Jonathan Turkanis// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)// See http://www.boost.org/libs/iostreams for documentation.#ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED#define BOOST_IOSTREAMS_FILE_HPP_INCLUDED#if defined(_MSC_VER)# pragma once#endif#include <boost/iostreams/detail/config/wide_streams.hpp>#ifndef BOOST_IOSTREAMS_NO_LOCALE# include <locale>#endif#include <string>                               // pathnames, char_traits.#include <boost/iostreams/categories.hpp>#include <boost/iostreams/detail/ios.hpp>       // openmode, seekdir, int types.#include <boost/iostreams/detail/fstream.hpp>#include <boost/iostreams/operations.hpp>       // seek.#include <boost/shared_ptr.hpp>      // Must come last.#include <boost/iostreams/detail/config/disable_warnings.hpp>  // MSVC.namespace boost { namespace iostreams {template<typename Ch>class basic_file {public:    typedef Ch char_type;    struct category        : public seekable_device_tag,          public closable_tag,          public localizable_tag,          public flushable_tag        { };    basic_file( const std::string& path,                BOOST_IOS::openmode mode =                    BOOST_IOS::in | BOOST_IOS::out,                BOOST_IOS::openmode base_mode =                    BOOST_IOS::in | BOOST_IOS::out );    std::streamsize read(char_type* s, std::streamsize n);    bool putback(char_type c);    std::streamsize write(const char_type* s, std::streamsize n);    std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,                          BOOST_IOS::openmode which =                              BOOST_IOS::in | BOOST_IOS::out );    void open( const std::string& path,               BOOST_IOS::openmode mode =                   BOOST_IOS::in | BOOST_IOS::out,               BOOST_IOS::openmode base_mode =                   BOOST_IOS::in | BOOST_IOS::out );    bool is_open() const;    void close();    bool flush();#ifndef BOOST_IOSTREAMS_NO_LOCALE    void imbue(const std::locale& loc) { pimpl_->file_.pubimbue(loc);  }#endifprivate:    struct impl {        impl(const std::string& path, BOOST_IOS::openmode mode)            { file_.open(path.c_str(), mode); }        ~impl() { if (file_.is_open()) file_.close(); }        BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) file_;    };    shared_ptr<impl> pimpl_;};typedef basic_file<char>     file;typedef basic_file<wchar_t>  wfile;template<typename Ch>struct basic_file_source : private basic_file<Ch> {    typedef Ch char_type;    struct category        : input_seekable,          device_tag,          closable_tag        { };    using basic_file<Ch>::read;    using basic_file<Ch>::putback;    using basic_file<Ch>::seek;    using basic_file<Ch>::is_open;    using basic_file<Ch>::close;    basic_file_source( const std::string& path,                       BOOST_IOS::openmode mode =                            BOOST_IOS::in )        : basic_file<Ch>(path, mode & ~BOOST_IOS::out, BOOST_IOS::in)        { }    void open( const std::string& path,               BOOST_IOS::openmode mode = BOOST_IOS::in )    {        basic_file<Ch>::open(path, mode & ~BOOST_IOS::out, BOOST_IOS::in);    }};typedef basic_file_source<char>     file_source;typedef basic_file_source<wchar_t>  wfile_source;template<typename Ch>struct basic_file_sink : private basic_file<Ch> {    typedef Ch char_type;    struct category        : output_seekable,          device_tag,          closable_tag,          flushable_tag        { };    using basic_file<Ch>::write;    using basic_file<Ch>::seek;    using basic_file<Ch>::is_open;    using basic_file<Ch>::close;    using basic_file<Ch>::flush;    basic_file_sink( const std::string& path,                     BOOST_IOS::openmode mode = BOOST_IOS::out )        : basic_file<Ch>(path, mode & ~BOOST_IOS::in, BOOST_IOS::out)        { }    void open( const std::string& path,               BOOST_IOS::openmode mode = BOOST_IOS::out )    {        basic_file<Ch>::open(path, mode & ~BOOST_IOS::in, BOOST_IOS::out);    }};typedef basic_file_sink<char>     file_sink;typedef basic_file_sink<wchar_t>  wfile_sink;                                 //------------------Implementation of basic_file------------------------------//template<typename Ch>basic_file<Ch>::basic_file    ( const std::string& path, BOOST_IOS::openmode mode,       BOOST_IOS::openmode base_mode ){     open(path, mode, base_mode);}template<typename Ch>inline std::streamsize basic_file<Ch>::read    (char_type* s, std::streamsize n){     std::streamsize result = pimpl_->file_.sgetn(s, n);     return result != 0 ? result : -1;}template<typename Ch>inline bool basic_file<Ch>::putback(char_type c){     return !!pimpl_->file_.sputbackc(c); }template<typename Ch>inline std::streamsize basic_file<Ch>::write    (const char_type* s, std::streamsize n){ return pimpl_->file_.sputn(s, n); }template<typename Ch>std::streampos basic_file<Ch>::seek    ( stream_offset off, BOOST_IOS::seekdir way,       BOOST_IOS::openmode ){ return iostreams::seek(pimpl_->file_, off, way); }template<typename Ch>void basic_file<Ch>::open    ( const std::string& path, BOOST_IOS::openmode mode,       BOOST_IOS::openmode base_mode ){     pimpl_.reset(new impl(path, mode | base_mode));}template<typename Ch>bool basic_file<Ch>::is_open() const { return pimpl_->file_.is_open(); }template<typename Ch>void basic_file<Ch>::close() { pimpl_->file_.close(); }template<typename Ch>bool basic_file<Ch>::flush(){ return pimpl_->file_.BOOST_IOSTREAMS_PUBSYNC() == 0; }//----------------------------------------------------------------------------//} } // End namespaces iostreams, boost.#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC#endif // #ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
 |