Chris@16: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) Chris@16: // (C) Copyright 2003-2007 Jonathan Turkanis Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // See http://www.boost.org/libs/iostreams for documentation. Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED Chris@16: #define BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include // allocator. Chris@16: #include // BOOST_DEDUCED_TYPENAME. Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // failure, streamsize. Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Must come last. Chris@16: #include // MSVC. Chris@16: Chris@16: namespace boost { namespace iostreams { namespace detail { Chris@16: Chris@16: template Chris@16: struct stream_buffer_traits { Chris@16: typedef typename Chris@16: mpl::if_< Chris@16: is_convertible< Chris@16: BOOST_DEDUCED_TYPENAME category_of::type, Chris@16: direct_tag Chris@16: >, Chris@16: direct_streambuf, Chris@16: indirect_streambuf Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: } } } // End namespaces detail, iostreams, boost Chris@16: Chris@16: #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION Chris@16: # include Chris@16: #else Chris@16: Chris@16: namespace boost { namespace iostreams { Chris@16: Chris@16: template< typename T, Chris@16: typename Tr = Chris@16: BOOST_IOSTREAMS_CHAR_TRAITS( Chris@16: BOOST_DEDUCED_TYPENAME char_type_of::type Chris@16: ), Chris@16: typename Alloc = Chris@16: std::allocator< Chris@16: BOOST_DEDUCED_TYPENAME char_type_of::type Chris@16: >, Chris@16: typename Mode = BOOST_DEDUCED_TYPENAME mode_of::type > Chris@16: class stream_buffer Chris@16: : public detail::stream_buffer_traits::type Chris@16: { Chris@16: private: Chris@16: BOOST_STATIC_ASSERT(( Chris@16: is_convertible< Chris@16: BOOST_DEDUCED_TYPENAME iostreams::category_of::type, Mode Chris@16: >::value Chris@16: )); Chris@16: typedef typename Chris@16: detail::stream_buffer_traits< Chris@16: T, Tr, Alloc, Mode Chris@16: >::type base_type; Chris@16: public: Chris@16: typedef typename char_type_of::type char_type; Chris@16: struct category Chris@16: : Mode, Chris@16: closable_tag, Chris@16: streambuf_tag Chris@16: { }; Chris@16: BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr) Chris@16: public: Chris@16: stream_buffer() { } Chris@16: ~stream_buffer() Chris@16: { Chris@16: try { Chris@16: if (this->is_open() && this->auto_close()) Chris@16: this->close(); Chris@16: } catch (...) { } Chris@16: } Chris@16: BOOST_IOSTREAMS_FORWARD( stream_buffer, open_impl, T, Chris@16: BOOST_IOSTREAMS_PUSH_PARAMS, Chris@16: BOOST_IOSTREAMS_PUSH_ARGS ) Chris@16: T& operator*() { return *this->component(); } Chris@16: T* operator->() { return this->component(); } Chris@16: private: Chris@16: void open_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS()) Chris@16: { // Used for forwarding. Chris@16: if (this->is_open()) Chris@16: boost::throw_exception( Chris@16: BOOST_IOSTREAMS_FAILURE("already open") Chris@16: ); Chris@16: base_type::open(t BOOST_IOSTREAMS_PUSH_ARGS()); Chris@16: } Chris@16: }; Chris@16: Chris@16: } } // End namespaces iostreams, boost. Chris@16: Chris@16: #endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION Chris@16: Chris@16: #include // MSVC. Chris@16: Chris@16: #endif // #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED