153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  (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 |