ossrv_pub/boost_apis/boost/iostreams/stream.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 // (C) Copyright Jonathan Turkanis 2003.
       
     2 // Distributed under the Boost Software License, Version 1.0. (See accompanying
       
     3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
       
     4 
       
     5 // See http://www.boost.org/libs/iostreams for documentation.
       
     6 
       
     7 #ifndef BOOST_IOSTREAMS_STREAM_HPP_INCLUDED
       
     8 #define BOOST_IOSTREAMS_STREAM_HPP_INCLUDED
       
     9 
       
    10 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
       
    11 # pragma once
       
    12 #endif
       
    13 
       
    14 #include <boost/iostreams/constants.hpp>
       
    15 #include <boost/iostreams/detail/char_traits.hpp>
       
    16 #include <boost/iostreams/detail/config/overload_resolution.hpp>
       
    17 #include <boost/iostreams/detail/forward.hpp>
       
    18 #include <boost/iostreams/detail/iostream.hpp>  // standard streams.
       
    19 #include <boost/iostreams/detail/select.hpp>
       
    20 #include <boost/iostreams/stream_buffer.hpp>
       
    21 #include <boost/mpl/and.hpp>
       
    22 #include <boost/type_traits/is_convertible.hpp>
       
    23 
       
    24 namespace boost { namespace iostreams { namespace detail {
       
    25 
       
    26 template<typename Device, typename Tr>
       
    27 struct stream_traits {
       
    28     typedef typename char_type_of<Device>::type                char_type;
       
    29     typedef Tr                                                 traits_type;
       
    30     typedef typename category_of<Device>::type                 mode;
       
    31     typedef typename
       
    32             iostreams::select< // Dismbiguation required for Tru64.
       
    33                 mpl::and_<
       
    34                     is_convertible<mode, input>,
       
    35                     is_convertible<mode, output>
       
    36                 >,
       
    37                 BOOST_IOSTREAMS_BASIC_IOSTREAM(char_type, traits_type),
       
    38                 is_convertible<mode, input>,
       
    39                 BOOST_IOSTREAMS_BASIC_ISTREAM(char_type, traits_type),
       
    40                 else_,
       
    41                 BOOST_IOSTREAMS_BASIC_OSTREAM(char_type, traits_type)
       
    42             >::type type;
       
    43 };
       
    44 
       
    45 // By encapsulating initialization in a base, we can define the macro
       
    46 // BOOST_IOSTREAMS_DEFINE_FORWARDING_FUNCTIONS to generate constuctors
       
    47 // without base member initializer lists.
       
    48 template< typename Device,
       
    49           typename Tr =
       
    50               BOOST_IOSTREAMS_CHAR_TRAITS(
       
    51                   BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
       
    52               ),
       
    53           typename Alloc =
       
    54               std::allocator<
       
    55                   BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
       
    56               >,
       
    57           typename Base = // VC6 Workaround.
       
    58               BOOST_DEDUCED_TYPENAME
       
    59               detail::stream_traits<Device, Tr>::type >
       
    60 class stream_base
       
    61     : protected base_from_member< stream_buffer<Device, Tr, Alloc> >,
       
    62       public Base
       
    63 {
       
    64 private:
       
    65     typedef base_from_member< stream_buffer<Device, Tr, Alloc> > pbase_type;
       
    66     typedef typename stream_traits<Device, Tr>::type         stream_type;
       
    67 protected:
       
    68     using pbase_type::member; // Avoid warning about 'this' in initializer list.
       
    69 public:
       
    70     stream_base() : pbase_type(), stream_type(&member) { }
       
    71 };
       
    72 
       
    73 } } } // End namespaces detail, iostreams, boost.
       
    74 
       
    75 #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
       
    76 # include <boost/iostreams/detail/broken_overload_resolution/stream.hpp>
       
    77 #else
       
    78 
       
    79 namespace boost { namespace iostreams {
       
    80 
       
    81 //
       
    82 // Template name: stream.
       
    83 // Description: A iostream which reads from and writes to an instance of a
       
    84 //      designated device type.
       
    85 // Template paramters:
       
    86 //      Device - A device type.
       
    87 //      Alloc - The allocator type.
       
    88 //
       
    89 template< typename Device,
       
    90           typename Tr =
       
    91               BOOST_IOSTREAMS_CHAR_TRAITS(
       
    92                   BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
       
    93               ),
       
    94           typename Alloc =
       
    95               std::allocator<
       
    96                   BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
       
    97               > >
       
    98 struct stream : detail::stream_base<Device, Tr, Alloc> {
       
    99 public:
       
   100     typedef typename char_type_of<Device>::type  char_type;
       
   101     BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
       
   102 private:
       
   103     typedef typename
       
   104             detail::stream_traits<
       
   105                 Device, Tr
       
   106             >::type                              stream_type;
       
   107     typedef Device                               policy_type;
       
   108 public:
       
   109     stream() { }
       
   110     BOOST_IOSTREAMS_FORWARD( stream, open_impl, Device,
       
   111                              BOOST_IOSTREAMS_PUSH_PARAMS,
       
   112                              BOOST_IOSTREAMS_PUSH_ARGS )
       
   113     bool is_open() const { return this->member.is_open(); }
       
   114     void close() { this->member.close(); }
       
   115     bool auto_close() const { return this->member.auto_close(); }
       
   116     void set_auto_close(bool close) { this->member.set_auto_close(close); }
       
   117     bool strict_sync() { return this->member.strict_sync(); }
       
   118     Device& operator*() { return *this->member; }
       
   119     Device* operator->() { return &*this->member; }
       
   120     Device* component() { return this->member.component(); }
       
   121 private:
       
   122     void open_impl(const Device& dev BOOST_IOSTREAMS_PUSH_PARAMS()) // For forwarding.
       
   123     { 
       
   124         this->clear(); 
       
   125         this->member.open(dev BOOST_IOSTREAMS_PUSH_ARGS()); 
       
   126     }
       
   127 };
       
   128 
       
   129 } } // End namespaces iostreams, boost.
       
   130 
       
   131 #endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
       
   132 
       
   133 #endif // #ifndef BOOST_IOSTREAMS_stream_HPP_INCLUDED