Chris@16: // (C) Copyright 2011 Vicente J. Botet Escriba Chris@16: // Use, modification and distribution are subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt). Chris@16: // Chris@16: // This code was adapted by Vicente from Howard Hinnant's experimental work Chris@16: // on chrono i/o to Boost Chris@16: Chris@16: #ifndef BOOST_CHRONO_IO_IOS_BASE_STATE_HPP Chris@16: #define BOOST_CHRONO_IO_IOS_BASE_STATE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace chrono Chris@16: { Chris@16: Chris@16: class fmt_masks : public ios_flags Chris@16: { Chris@16: typedef ios_flags base_type; Chris@16: fmt_masks& operator=(fmt_masks const& rhs) ; Chris@16: Chris@16: public: Chris@16: fmt_masks(std::ios_base& ios): base_type(ios) {} Chris@16: enum type Chris@16: { Chris@16: uses_symbol = 1 << 0, Chris@16: uses_local = 1 << 1 Chris@16: }; Chris@16: Chris@16: inline duration_style get_duration_style() Chris@16: { Chris@16: return (flags() & uses_symbol) ? duration_style::symbol : duration_style::prefix; Chris@16: } Chris@16: inline void set_duration_style(duration_style style) Chris@16: { Chris@16: if (style == duration_style::symbol) Chris@16: setf(uses_symbol); Chris@16: else Chris@16: unsetf(uses_symbol); Chris@16: } Chris@16: Chris@16: inline timezone get_timezone() Chris@16: { Chris@16: return (flags() & uses_local) ? timezone::local : timezone::utc; Chris@16: } Chris@16: inline void set_timezone(timezone tz) Chris@16: { Chris@16: if (tz == timezone::local) Chris@16: setf(uses_local); Chris@16: else Chris@16: unsetf(uses_local); Chris@16: } Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: namespace /**/ { Chris@16: xalloc_key_initializer fmt_masks_xalloc_key_initializer; Chris@16: } // namespace Chris@16: } // namespace detail Chris@16: Chris@16: inline duration_style get_duration_style(std::ios_base & ios) Chris@16: { Chris@16: return fmt_masks(ios).get_duration_style(); Chris@16: } Chris@16: inline void set_duration_style(std::ios_base& ios, duration_style style) Chris@16: { Chris@16: fmt_masks(ios).set_duration_style(style); Chris@16: } Chris@16: inline std::ios_base& symbol_format(std::ios_base& ios) Chris@16: { Chris@16: fmt_masks(ios).setf(fmt_masks::uses_symbol); Chris@16: return ios; Chris@16: } Chris@16: inline std::ios_base& name_format(std::ios_base& ios) Chris@16: { Chris@16: fmt_masks(ios).unsetf(fmt_masks::uses_symbol); Chris@16: return ios; Chris@16: } Chris@16: Chris@16: inline timezone get_timezone(std::ios_base & ios) Chris@16: { Chris@16: return fmt_masks(ios).get_timezone(); Chris@16: } Chris@16: inline void set_timezone(std::ios_base& ios, timezone tz) Chris@16: { Chris@16: fmt_masks(ios).set_timezone(tz); Chris@16: } Chris@16: inline std::ios_base& local_timezone(std::ios_base& ios) Chris@16: { Chris@16: fmt_masks(ios).setf(fmt_masks::uses_local); Chris@16: return ios; Chris@16: } Chris@16: Chris@16: inline std::ios_base& utc_timezone(std::ios_base& ios) Chris@16: { Chris@16: fmt_masks(ios).unsetf(fmt_masks::uses_local); Chris@16: return ios; Chris@16: } Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: template Chris@16: struct ios_base_data_aux Chris@16: { Chris@16: std::basic_string time_fmt; Chris@16: std::basic_string duration_fmt; Chris@16: public: Chris@16: Chris@16: ios_base_data_aux() : Chris@16: time_fmt(""), Chris@16: duration_fmt("") Chris@16: { Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct ios_base_data {}; Chris@16: namespace /**/ { Chris@16: xalloc_key_initializer > ios_base_data_aux_xalloc_key_initializer; Chris@16: xalloc_key_initializer > wios_base_data_aux_xalloc_key_initializer; Chris@16: #if BOOST_CHRONO_HAS_UNICODE_SUPPORT Chris@16: xalloc_key_initializer > u16ios_base_data_aux_xalloc_key_initializer; Chris@16: xalloc_key_initializer > u32ios_base_data_aux_xalloc_key_initializer; Chris@16: #endif Chris@16: } // namespace Chris@16: } // namespace detail Chris@16: Chris@16: template Chris@16: inline std::basic_string get_time_fmt(std::ios_base & ios) Chris@16: { Chris@16: ios_state_not_null_ptr, detail::ios_base_data_aux > ptr(ios); Chris@16: return ptr->time_fmt; Chris@16: } Chris@16: template Chris@16: inline void set_time_fmt(std::ios_base& ios, std::basic_string< Chris@16: CharT> const& fmt) Chris@16: { Chris@16: ios_state_not_null_ptr, detail::ios_base_data_aux > ptr(ios); Chris@16: ptr->time_fmt = fmt; Chris@16: } Chris@16: Chris@16: } // chrono Chris@16: } // boost Chris@16: Chris@16: #endif // header