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
 | 
