]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/chrono/io/ios_base_state.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / 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 //:
118 // time_fmt(""),
119 // duration_fmt("")
120 {
121 }
122 };
123 template<typename CharT>
124 struct ios_base_data {};
125 namespace /**/ {
126 xalloc_key_initializer<detail::ios_base_data<char> > ios_base_data_aux_xalloc_key_initializer;
127 xalloc_key_initializer<detail::ios_base_data<wchar_t> > wios_base_data_aux_xalloc_key_initializer;
128 #if BOOST_CHRONO_HAS_UNICODE_SUPPORT
129 xalloc_key_initializer<detail::ios_base_data<char16_t> > u16ios_base_data_aux_xalloc_key_initializer;
130 xalloc_key_initializer<detail::ios_base_data<char32_t> > u32ios_base_data_aux_xalloc_key_initializer;
131 #endif
132 } // namespace
133 } // namespace detail
134
135 template<typename CharT>
136 inline std::basic_string<CharT> get_time_fmt(std::ios_base & ios)
137 {
138 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
139 return ptr->time_fmt;
140 }
141 template<typename CharT>
142 inline void set_time_fmt(std::ios_base& ios, std::basic_string<
143 CharT> const& fmt)
144 {
145 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
146 ptr->time_fmt = fmt;
147 }
148
149 } // chrono
150 } // boost
151
152 #endif // header