File indexing completed on 2025-01-18 09:29:47
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
0010 #define BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
0011
0012 #include <boost/chrono/config.hpp>
0013 #include <locale>
0014 #include <boost/chrono/io/duration_style.hpp>
0015 #include <boost/chrono/io/timezone.hpp>
0016 #include <boost/chrono/io/utility/ios_base_state_ptr.hpp>
0017
0018 namespace boost
0019 {
0020 namespace chrono
0021 {
0022
0023 class fmt_masks : public ios_flags<fmt_masks>
0024 {
0025 typedef ios_flags<fmt_masks> base_type;
0026 fmt_masks& operator=(fmt_masks const& rhs) ;
0027
0028 public:
0029 fmt_masks(std::ios_base& ios): base_type(ios) {}
0030 enum type
0031 {
0032 uses_symbol = 1 << 0,
0033 uses_local = 1 << 1
0034 };
0035
0036 inline duration_style get_duration_style()
0037 {
0038 return (flags() & uses_symbol) ? duration_style::symbol : duration_style::prefix;
0039 }
0040 inline void set_duration_style(duration_style style)
0041 {
0042 if (style == duration_style::symbol)
0043 setf(uses_symbol);
0044 else
0045 unsetf(uses_symbol);
0046 }
0047
0048 inline timezone get_timezone()
0049 {
0050 return (flags() & uses_local) ? timezone::local : timezone::utc;
0051 }
0052 inline void set_timezone(timezone tz)
0053 {
0054 if (tz == timezone::local)
0055 setf(uses_local);
0056 else
0057 unsetf(uses_local);
0058 }
0059 };
0060 namespace detail
0061 {
0062 namespace {
0063 xalloc_key_initializer<fmt_masks > fmt_masks_xalloc_key_initializer;
0064 }
0065 }
0066
0067 inline duration_style get_duration_style(std::ios_base & ios)
0068 {
0069 return fmt_masks(ios).get_duration_style();
0070 }
0071 inline void set_duration_style(std::ios_base& ios, duration_style style)
0072 {
0073 fmt_masks(ios).set_duration_style(style);
0074 }
0075 inline std::ios_base& symbol_format(std::ios_base& ios)
0076 {
0077 fmt_masks(ios).setf(fmt_masks::uses_symbol);
0078 return ios;
0079 }
0080 inline std::ios_base& name_format(std::ios_base& ios)
0081 {
0082 fmt_masks(ios).unsetf(fmt_masks::uses_symbol);
0083 return ios;
0084 }
0085
0086 inline timezone get_timezone(std::ios_base & ios)
0087 {
0088 return fmt_masks(ios).get_timezone();
0089 }
0090 inline void set_timezone(std::ios_base& ios, timezone tz)
0091 {
0092 fmt_masks(ios).set_timezone(tz);
0093 }
0094 inline std::ios_base& local_timezone(std::ios_base& ios)
0095 {
0096 fmt_masks(ios).setf(fmt_masks::uses_local);
0097 return ios;
0098 }
0099
0100 inline std::ios_base& utc_timezone(std::ios_base& ios)
0101 {
0102 fmt_masks(ios).unsetf(fmt_masks::uses_local);
0103 return ios;
0104 }
0105
0106 namespace detail
0107 {
0108
0109 template<typename CharT>
0110 struct ios_base_data_aux
0111 {
0112 std::basic_string<CharT> time_fmt;
0113 std::basic_string<CharT> duration_fmt;
0114 public:
0115
0116 ios_base_data_aux()
0117
0118
0119
0120 {
0121 }
0122 };
0123 template<typename CharT>
0124 struct ios_base_data {};
0125 namespace {
0126 xalloc_key_initializer<detail::ios_base_data<char> > ios_base_data_aux_xalloc_key_initializer;
0127 xalloc_key_initializer<detail::ios_base_data<wchar_t> > wios_base_data_aux_xalloc_key_initializer;
0128 #if BOOST_CHRONO_HAS_UNICODE_SUPPORT
0129 xalloc_key_initializer<detail::ios_base_data<char16_t> > u16ios_base_data_aux_xalloc_key_initializer;
0130 xalloc_key_initializer<detail::ios_base_data<char32_t> > u32ios_base_data_aux_xalloc_key_initializer;
0131 #endif
0132 }
0133 }
0134
0135 template<typename CharT>
0136 inline std::basic_string<CharT> get_time_fmt(std::ios_base & ios)
0137 {
0138 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
0139 return ptr->time_fmt;
0140 }
0141 template<typename CharT>
0142 inline void set_time_fmt(std::ios_base& ios, std::basic_string<
0143 CharT> const& fmt)
0144 {
0145 ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
0146 ptr->time_fmt = fmt;
0147 }
0148
0149 }
0150 }
0151
0152 #endif