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