|
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_IMBUE_HPP_INCLUDED |
|
8 #define BOOST_IOSTREAMS_IMBUE_HPP_INCLUDED |
|
9 |
|
10 #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
11 # pragma once |
|
12 #endif |
|
13 |
|
14 #include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC. |
|
15 #include <boost/detail/workaround.hpp> |
|
16 #include <boost/iostreams/detail/dispatch.hpp> |
|
17 #include <boost/iostreams/detail/streambuf.hpp> |
|
18 #include <boost/iostreams/detail/wrap_unwrap.hpp> |
|
19 #include <boost/iostreams/operations_fwd.hpp> |
|
20 #include <boost/mpl/if.hpp> |
|
21 |
|
22 // Must come last. |
|
23 #include <boost/iostreams/detail/config/disable_warnings.hpp> |
|
24 |
|
25 namespace boost { namespace iostreams { |
|
26 |
|
27 namespace detail { |
|
28 |
|
29 // Implementation templates for simulated tag dispatch. |
|
30 template<typename T> |
|
31 struct imbue_impl; |
|
32 |
|
33 } // End namespace detail. |
|
34 |
|
35 template<typename T, typename Locale> |
|
36 void imbue(T& t, const Locale& loc) |
|
37 { detail::imbue_impl<T>::imbue(detail::unwrap(t), loc); } |
|
38 |
|
39 namespace detail { |
|
40 |
|
41 //------------------Definition of imbue_impl----------------------------------// |
|
42 |
|
43 template<typename T> |
|
44 struct imbue_impl |
|
45 : mpl::if_< |
|
46 is_custom<T>, |
|
47 operations<T>, |
|
48 imbue_impl< |
|
49 BOOST_DEDUCED_TYPENAME |
|
50 dispatch< |
|
51 T, streambuf_tag, localizable_tag, any_tag |
|
52 >::type |
|
53 > |
|
54 >::type |
|
55 { }; |
|
56 |
|
57 template<> |
|
58 struct imbue_impl<any_tag> { |
|
59 template<typename T, typename Locale> |
|
60 static void imbue(T&, const Locale&) { } |
|
61 }; |
|
62 |
|
63 template<> |
|
64 struct imbue_impl<streambuf_tag> { |
|
65 template<typename T, typename Locale> |
|
66 static void imbue(T& t, const Locale& loc) { t.pubimbue(loc); } |
|
67 }; |
|
68 |
|
69 template<> |
|
70 struct imbue_impl<localizable_tag> { |
|
71 template<typename T, typename Locale> |
|
72 static void imbue(T& t, const Locale& loc) { t.imbue(loc); } |
|
73 }; |
|
74 |
|
75 } // End namespace detail. |
|
76 |
|
77 } } // End namespaces iostreams, boost. |
|
78 |
|
79 #include <boost/iostreams/detail/config/enable_warnings.hpp> |
|
80 |
|
81 #endif // #ifndef BOOST_IOSTREAMS_IMBUE_HPP_INCLUDED |