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