Blame view

3rdparty/boost_1_81_0/boost/iostreams/stream_buffer.hpp 3.81 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  // (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_BUFFER_HPP_INCLUDED
  #define BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
  
  #if defined(_MSC_VER)
  # pragma once
  #endif
  
  #include <memory>            // allocator.
  #include <boost/config.hpp>  // BOOST_DEDUCED_TYPENAME.
  #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/ios.hpp>  // failure, streamsize.
  #include <boost/iostreams/detail/streambuf/direct_streambuf.hpp>
  #include <boost/iostreams/detail/streambuf/indirect_streambuf.hpp>
  #include <boost/iostreams/traits.hpp>
  #include <boost/static_assert.hpp>
  #include <boost/throw_exception.hpp>
  #include <boost/type_traits/is_convertible.hpp>
  
  // Must come last.
  #include <boost/iostreams/detail/config/disable_warnings.hpp>  // MSVC.
  
  namespace boost { namespace iostreams { namespace detail {
  
  template<typename T, typename Tr, typename Alloc, typename Mode>
  struct stream_buffer_traits {
      typedef typename
              mpl::if_<
                  is_convertible<
                      BOOST_DEDUCED_TYPENAME category_of<T>::type,
                      direct_tag
                  >,
                  direct_streambuf<T, Tr>,
                  indirect_streambuf<T, Tr, Alloc, Mode>
              >::type type;
  };
  
  } } } // End namespaces detail, iostreams, boost
  
  #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
  # include <boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp>
  #else
  
  namespace boost { namespace iostreams {
  
  template< typename T,
            typename Tr =
                BOOST_IOSTREAMS_CHAR_TRAITS(
                    BOOST_DEDUCED_TYPENAME char_type_of<T>::type
                ),
            typename Alloc =
                std::allocator<
                    BOOST_DEDUCED_TYPENAME char_type_of<T>::type
                >,
            typename Mode = BOOST_DEDUCED_TYPENAME mode_of<T>::type >
  class stream_buffer
      : public detail::stream_buffer_traits<T, Tr, Alloc, Mode>::type
  {
  private:
      BOOST_STATIC_ASSERT((
          is_convertible<
              BOOST_DEDUCED_TYPENAME iostreams::category_of<T>::type, Mode
          >::value
      ));
      typedef typename
              detail::stream_buffer_traits<
                  T, Tr, Alloc, Mode
              >::type                           base_type;
  public:
      typedef typename char_type_of<T>::type    char_type;
      struct category 
          : Mode,
            closable_tag,
            streambuf_tag
          { };
      BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
  public:
      stream_buffer() { }
      ~stream_buffer()
      { 
          try { 
              if (this->is_open() && this->auto_close()) 
                  this->close(); 
          } catch (...) { } 
      }
      BOOST_IOSTREAMS_FORWARD( stream_buffer, open_impl, T,
                               BOOST_IOSTREAMS_PUSH_PARAMS,
                               BOOST_IOSTREAMS_PUSH_ARGS )
      T& operator*() { return *this->component(); }
      T* operator->() { return this->component(); }
  private:
      void open_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS())
          {   // Used for forwarding.
              if (this->is_open())
                  boost::throw_exception(
                      BOOST_IOSTREAMS_FAILURE("already open")
                  );
              base_type::open(t BOOST_IOSTREAMS_PUSH_ARGS());
          }
  };
  
  } } // End namespaces iostreams, boost.
  
  #endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
  
  #include <boost/iostreams/detail/config/enable_warnings.hpp>  // MSVC.
  
  #endif // #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED