Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / chrono / io / ios_base_state.hpp
1 //  (C) Copyright 2011 Vicente J. Botet Escriba
2 //  Use, modification and distribution are subject to the Boost Software License,
3 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt).
5 //
6 // This code was adapted by Vicente from Howard Hinnant's experimental work
7 // on chrono i/o to Boost
8
9 #ifndef BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
10 #define BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
11
12 #include <boost/chrono/config.hpp>
13 #include <locale>
14 #include <boost/chrono/io/duration_style.hpp>
15 #include <boost/chrono/io/timezone.hpp>
16 #include <boost/chrono/io/utility/ios_base_state_ptr.hpp>
17
18 namespace boost
19 {
20   namespace chrono
21   {
22
23     class fmt_masks : public ios_flags<fmt_masks>
24     {
25       typedef ios_flags<fmt_masks> base_type;
26       fmt_masks& operator=(fmt_masks const& rhs) ;
27
28     public:
29       fmt_masks(std::ios_base& ios): base_type(ios) {}
30       enum type
31       {
32         uses_symbol = 1 << 0,
33         uses_local  = 1 << 1
34       };
35
36       inline duration_style get_duration_style()
37       {
38         return (flags() & uses_symbol) ? duration_style::symbol : duration_style::prefix;
39       }
40       inline void set_duration_style(duration_style style)
41       {
42         if (style == duration_style::symbol)
43           setf(uses_symbol);
44         else
45           unsetf(uses_symbol);
46       }
47
48       inline timezone get_timezone()
49       {
50         return (flags() & uses_local) ? timezone::local : timezone::utc;
51       }
52       inline void set_timezone(timezone tz)
53       {
54         if (tz == timezone::local)
55           setf(uses_local);
56         else
57           unsetf(uses_local);
58       }
59     };
60     namespace detail
61     {
62       namespace /**/ {
63         xalloc_key_initializer<fmt_masks > fmt_masks_xalloc_key_initializer;
64       } // namespace
65     } // namespace detail
66
67     inline duration_style get_duration_style(std::ios_base & ios)
68     {
69       return fmt_masks(ios).get_duration_style();
70     }
71     inline void set_duration_style(std::ios_base& ios, duration_style style)
72     {
73       fmt_masks(ios).set_duration_style(style);
74     }
75     inline std::ios_base&  symbol_format(std::ios_base& ios)
76     {
77       fmt_masks(ios).setf(fmt_masks::uses_symbol);
78       return ios;
79     }
80     inline std::ios_base&  name_format(std::ios_base& ios)
81     {
82       fmt_masks(ios).unsetf(fmt_masks::uses_symbol);
83       return ios;
84     }
85
86     inline timezone get_timezone(std::ios_base & ios)
87     {
88       return fmt_masks(ios).get_timezone();
89     }
90     inline void set_timezone(std::ios_base& ios, timezone tz)
91     {
92       fmt_masks(ios).set_timezone(tz);
93     }
94     inline std::ios_base& local_timezone(std::ios_base& ios)
95     {
96       fmt_masks(ios).setf(fmt_masks::uses_local);
97       return ios;
98     }
99
100     inline std::ios_base& utc_timezone(std::ios_base& ios)
101     {
102       fmt_masks(ios).unsetf(fmt_masks::uses_local);
103       return ios;
104     }
105
106     namespace detail
107     {
108
109       template<typename CharT>
110       struct ios_base_data_aux
111       {
112         std::basic_string<CharT> time_fmt;
113         std::basic_string<CharT> duration_fmt;
114       public:
115
116         ios_base_data_aux() :
117           time_fmt(""),
118           duration_fmt("")
119         {
120         }
121       };
122       template<typename CharT>
123       struct ios_base_data  {};
124       namespace /**/ {
125         xalloc_key_initializer<detail::ios_base_data<char>      > ios_base_data_aux_xalloc_key_initializer;
126         xalloc_key_initializer<detail::ios_base_data<wchar_t>   > wios_base_data_aux_xalloc_key_initializer;
127 #if BOOST_CHRONO_HAS_UNICODE_SUPPORT
128         xalloc_key_initializer<detail::ios_base_data<char16_t>  > u16ios_base_data_aux_xalloc_key_initializer;
129         xalloc_key_initializer<detail::ios_base_data<char32_t>  > u32ios_base_data_aux_xalloc_key_initializer;
130 #endif
131       } // namespace
132     } // namespace detail
133
134     template<typename CharT>
135     inline std::basic_string<CharT> get_time_fmt(std::ios_base & ios)
136     {
137       ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
138       return ptr->time_fmt;
139     }
140     template<typename CharT>
141     inline void set_time_fmt(std::ios_base& ios, std::basic_string<
142         CharT> const& fmt)
143     {
144       ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
145       ptr->time_fmt = fmt;
146     }
147
148   } // chrono
149 } // boost
150
151 #endif  // header