1 | // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) |
---|---|
2 | // (C) Copyright 2003-2007 Jonathan Turkanis |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
4 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) |
5 | |
6 | // See http://www.boost.org/libs/iostreams for documentation. |
7 | |
8 | #ifndef BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED |
9 | #define BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED |
10 | |
11 | #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
12 | # pragma once |
13 | #endif |
14 | |
15 | #include <utility> // pair. |
16 | #include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC. |
17 | #include <boost/detail/workaround.hpp> |
18 | #include <boost/iostreams/detail/wrap_unwrap.hpp> |
19 | #include <boost/iostreams/operations_fwd.hpp> // is_custom |
20 | #include <boost/iostreams/traits.hpp> |
21 | #include <boost/mpl/if.hpp> |
22 | |
23 | // Must come last. |
24 | #include <boost/iostreams/detail/config/disable_warnings.hpp> |
25 | |
26 | namespace boost { namespace iostreams { |
27 | |
28 | namespace detail { |
29 | |
30 | template<typename T> |
31 | struct output_sequence_impl; |
32 | |
33 | } // End namespace detail. |
34 | |
35 | template<typename T> |
36 | inline std::pair< |
37 | BOOST_DEDUCED_TYPENAME char_type_of<T>::type*, |
38 | BOOST_DEDUCED_TYPENAME char_type_of<T>::type* |
39 | > |
40 | output_sequence(T& t) |
41 | { return detail::output_sequence_impl<T>::output_sequence(t); } |
42 | |
43 | namespace detail { |
44 | |
45 | //------------------Definition of output_sequence_impl------------------------// |
46 | |
47 | template<typename T> |
48 | struct output_sequence_impl |
49 | : mpl::if_< |
50 | detail::is_custom<T>, |
51 | operations<T>, |
52 | output_sequence_impl<direct_tag> |
53 | >::type |
54 | { }; |
55 | |
56 | template<> |
57 | struct output_sequence_impl<direct_tag> { |
58 | template<typename U> |
59 | static std::pair< |
60 | BOOST_DEDUCED_TYPENAME char_type_of<U>::type*, |
61 | BOOST_DEDUCED_TYPENAME char_type_of<U>::type* |
62 | > |
63 | output_sequence(U& u) { return u.output_sequence(); } |
64 | }; |
65 | |
66 | } // End namespace detail. |
67 | |
68 | } } // End namespaces iostreams, boost. |
69 | |
70 | #include <boost/iostreams/detail/config/enable_warnings.hpp> |
71 | |
72 | #endif // #ifndef BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED |
73 |