You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
151 lines
5.5 KiB
151 lines
5.5 KiB
// (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_STREAM_HPP_INCLUDED |
|
#define BOOST_IOSTREAMS_STREAM_HPP_INCLUDED |
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
#include <boost/iostreams/constants.hpp> |
|
#include <boost/iostreams/detail/char_traits.hpp> |
|
#include <boost/iostreams/detail/config/overload_resolution.hpp> |
|
#include <boost/iostreams/detail/forward.hpp> |
|
#include <boost/iostreams/detail/iostream.hpp> // standard streams. |
|
#include <boost/iostreams/detail/select.hpp> |
|
#include <boost/iostreams/stream_buffer.hpp> |
|
#include <boost/mpl/and.hpp> |
|
#include <boost/type_traits/is_convertible.hpp> |
|
#include <boost/utility/base_from_member.hpp> |
|
|
|
namespace boost { namespace iostreams { namespace detail { |
|
|
|
template<typename Device, typename Tr> |
|
struct stream_traits { |
|
typedef typename char_type_of<Device>::type char_type; |
|
typedef Tr traits_type; |
|
typedef typename category_of<Device>::type mode; |
|
typedef typename |
|
iostreams::select< // Dismbiguation required for Tru64. |
|
mpl::and_< |
|
is_convertible<mode, input>, |
|
is_convertible<mode, output> |
|
>, |
|
BOOST_IOSTREAMS_BASIC_IOSTREAM(char_type, traits_type), |
|
is_convertible<mode, input>, |
|
BOOST_IOSTREAMS_BASIC_ISTREAM(char_type, traits_type), |
|
else_, |
|
BOOST_IOSTREAMS_BASIC_OSTREAM(char_type, traits_type) |
|
>::type stream_type; |
|
typedef typename |
|
iostreams::select< // Dismbiguation required for Tru64. |
|
mpl::and_< |
|
is_convertible<mode, input>, |
|
is_convertible<mode, output> |
|
>, |
|
iostream_tag, |
|
is_convertible<mode, input>, |
|
istream_tag, |
|
else_, |
|
ostream_tag |
|
>::type stream_tag; |
|
}; |
|
|
|
// By encapsulating initialization in a base, we can define the macro |
|
// BOOST_IOSTREAMS_DEFINE_FORWARDING_FUNCTIONS to generate constuctors |
|
// without base member initializer lists. |
|
template< typename Device, |
|
typename Tr = |
|
BOOST_IOSTREAMS_CHAR_TRAITS( |
|
BOOST_DEDUCED_TYPENAME char_type_of<Device>::type |
|
), |
|
typename Alloc = |
|
std::allocator< |
|
BOOST_DEDUCED_TYPENAME char_type_of<Device>::type |
|
>, |
|
typename Base = // VC6 Workaround. |
|
BOOST_DEDUCED_TYPENAME |
|
detail::stream_traits<Device, Tr>::stream_type > |
|
class stream_base |
|
: protected base_from_member< stream_buffer<Device, Tr, Alloc> >, |
|
public Base |
|
{ |
|
private: |
|
typedef base_from_member< stream_buffer<Device, Tr, Alloc> > pbase_type; |
|
typedef typename stream_traits<Device, Tr>::stream_type stream_type; |
|
protected: |
|
using pbase_type::member; // Avoid warning about 'this' in initializer list. |
|
public: |
|
stream_base() : pbase_type(), stream_type(&member) { } |
|
}; |
|
|
|
} } } // End namespaces detail, iostreams, boost. |
|
|
|
#ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION |
|
# include <boost/iostreams/detail/broken_overload_resolution/stream.hpp> |
|
#else |
|
|
|
namespace boost { namespace iostreams { |
|
|
|
// |
|
// Template name: stream. |
|
// Description: A iostream which reads from and writes to an instance of a |
|
// designated device type. |
|
// Template paramters: |
|
// Device - A device type. |
|
// Alloc - The allocator type. |
|
// |
|
template< typename Device, |
|
typename Tr = |
|
BOOST_IOSTREAMS_CHAR_TRAITS( |
|
BOOST_DEDUCED_TYPENAME char_type_of<Device>::type |
|
), |
|
typename Alloc = |
|
std::allocator< |
|
BOOST_DEDUCED_TYPENAME char_type_of<Device>::type |
|
> > |
|
struct stream : detail::stream_base<Device, Tr, Alloc> { |
|
public: |
|
typedef typename char_type_of<Device>::type char_type; |
|
struct category |
|
: mode_of<Device>::type, |
|
closable_tag, |
|
detail::stream_traits<Device, Tr>::stream_tag |
|
{ }; |
|
BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr) |
|
private: |
|
typedef typename |
|
detail::stream_traits< |
|
Device, Tr |
|
>::stream_type stream_type; |
|
public: |
|
stream() { } |
|
BOOST_IOSTREAMS_FORWARD( stream, open_impl, Device, |
|
BOOST_IOSTREAMS_PUSH_PARAMS, |
|
BOOST_IOSTREAMS_PUSH_ARGS ) |
|
bool is_open() const { return this->member.is_open(); } |
|
void close() { this->member.close(); } |
|
bool auto_close() const { return this->member.auto_close(); } |
|
void set_auto_close(bool close) { this->member.set_auto_close(close); } |
|
bool strict_sync() { return this->member.strict_sync(); } |
|
Device& operator*() { return *this->member; } |
|
Device* operator->() { return &*this->member; } |
|
Device* component() { return this->member.component(); } |
|
private: |
|
void open_impl(const Device& dev BOOST_IOSTREAMS_PUSH_PARAMS()) // For forwarding. |
|
{ |
|
this->clear(); |
|
this->member.open(dev BOOST_IOSTREAMS_PUSH_ARGS()); |
|
} |
|
}; |
|
|
|
} } // End namespaces iostreams, boost. |
|
|
|
#endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION |
|
|
|
#endif // #ifndef BOOST_IOSTREAMS_stream_HPP_INCLUDED
|
|
|