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