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).
6 // This code was adapted by Vicente from Howard Hinnant's experimental work
7 // on chrono i/o to Boost
9 #ifndef BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
10 #define BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
12 #include <boost/chrono/config.hpp>
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>
23 class fmt_masks : public ios_flags<fmt_masks>
25 typedef ios_flags<fmt_masks> base_type;
26 fmt_masks& operator=(fmt_masks const& rhs) ;
29 fmt_masks(std::ios_base& ios): base_type(ios) {}
36 inline duration_style get_duration_style()
38 return (flags() & uses_symbol) ? duration_style::symbol : duration_style::prefix;
40 inline void set_duration_style(duration_style style)
42 if (style == duration_style::symbol)
48 inline timezone get_timezone()
50 return (flags() & uses_local) ? timezone::local : timezone::utc;
52 inline void set_timezone(timezone tz)
54 if (tz == timezone::local)
63 xalloc_key_initializer<fmt_masks > fmt_masks_xalloc_key_initializer;
67 inline duration_style get_duration_style(std::ios_base & ios)
69 return fmt_masks(ios).get_duration_style();
71 inline void set_duration_style(std::ios_base& ios, duration_style style)
73 fmt_masks(ios).set_duration_style(style);
75 inline std::ios_base& symbol_format(std::ios_base& ios)
77 fmt_masks(ios).setf(fmt_masks::uses_symbol);
80 inline std::ios_base& name_format(std::ios_base& ios)
82 fmt_masks(ios).unsetf(fmt_masks::uses_symbol);
86 inline timezone get_timezone(std::ios_base & ios)
88 return fmt_masks(ios).get_timezone();
90 inline void set_timezone(std::ios_base& ios, timezone tz)
92 fmt_masks(ios).set_timezone(tz);
94 inline std::ios_base& local_timezone(std::ios_base& ios)
96 fmt_masks(ios).setf(fmt_masks::uses_local);
100 inline std::ios_base& utc_timezone(std::ios_base& ios)
102 fmt_masks(ios).unsetf(fmt_masks::uses_local);
109 template<typename CharT>
110 struct ios_base_data_aux
112 std::basic_string<CharT> time_fmt;
113 std::basic_string<CharT> duration_fmt;
116 ios_base_data_aux() :
122 template<typename CharT>
123 struct ios_base_data {};
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;
132 } // namespace detail
134 template<typename CharT>
135 inline std::basic_string<CharT> get_time_fmt(std::ios_base & ios)
137 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
138 return ptr->time_fmt;
140 template<typename CharT>
141 inline void set_time_fmt(std::ios_base& ios, std::basic_string<
144 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);