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
 |