Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:29:47

0001 //  (C) Copyright 2011 Vicente J. Botet Escriba
0002 //  Use, modification and distribution are subject to the Boost Software License,
0003 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0004 //  http://www.boost.org/LICENSE_1_0.txt).
0005 //
0006 // This code was adapted by Vicente from Howard Hinnant's experimental work
0007 // on chrono i/o to Boost
0008 
0009 #ifndef BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
0010 #define BOOST_CHRONO_IO_IOS_BASE_STATE_HPP
0011 
0012 #include <boost/chrono/config.hpp>
0013 #include <locale>
0014 #include <boost/chrono/io/duration_style.hpp>
0015 #include <boost/chrono/io/timezone.hpp>
0016 #include <boost/chrono/io/utility/ios_base_state_ptr.hpp>
0017 
0018 namespace boost
0019 {
0020   namespace chrono
0021   {
0022 
0023     class fmt_masks : public ios_flags<fmt_masks>
0024     {
0025       typedef ios_flags<fmt_masks> base_type;
0026       fmt_masks& operator=(fmt_masks const& rhs) ;
0027 
0028     public:
0029       fmt_masks(std::ios_base& ios): base_type(ios) {}
0030       enum type
0031       {
0032         uses_symbol = 1 << 0,
0033         uses_local  = 1 << 1
0034       };
0035 
0036       inline duration_style get_duration_style()
0037       {
0038         return (flags() & uses_symbol) ? duration_style::symbol : duration_style::prefix;
0039       }
0040       inline void set_duration_style(duration_style style)
0041       {
0042         if (style == duration_style::symbol)
0043           setf(uses_symbol);
0044         else
0045           unsetf(uses_symbol);
0046       }
0047 
0048       inline timezone get_timezone()
0049       {
0050         return (flags() & uses_local) ? timezone::local : timezone::utc;
0051       }
0052       inline void set_timezone(timezone tz)
0053       {
0054         if (tz == timezone::local)
0055           setf(uses_local);
0056         else
0057           unsetf(uses_local);
0058       }
0059     };
0060     namespace detail
0061     {
0062       namespace /**/ {
0063         xalloc_key_initializer<fmt_masks > fmt_masks_xalloc_key_initializer;
0064       } // namespace
0065     } // namespace detail
0066 
0067     inline duration_style get_duration_style(std::ios_base & ios)
0068     {
0069       return fmt_masks(ios).get_duration_style();
0070     }
0071     inline void set_duration_style(std::ios_base& ios, duration_style style)
0072     {
0073       fmt_masks(ios).set_duration_style(style);
0074     }
0075     inline std::ios_base&  symbol_format(std::ios_base& ios)
0076     {
0077       fmt_masks(ios).setf(fmt_masks::uses_symbol);
0078       return ios;
0079     }
0080     inline std::ios_base&  name_format(std::ios_base& ios)
0081     {
0082       fmt_masks(ios).unsetf(fmt_masks::uses_symbol);
0083       return ios;
0084     }
0085 
0086     inline timezone get_timezone(std::ios_base & ios)
0087     {
0088       return fmt_masks(ios).get_timezone();
0089     }
0090     inline void set_timezone(std::ios_base& ios, timezone tz)
0091     {
0092       fmt_masks(ios).set_timezone(tz);
0093     }
0094     inline std::ios_base& local_timezone(std::ios_base& ios)
0095     {
0096       fmt_masks(ios).setf(fmt_masks::uses_local);
0097       return ios;
0098     }
0099 
0100     inline std::ios_base& utc_timezone(std::ios_base& ios)
0101     {
0102       fmt_masks(ios).unsetf(fmt_masks::uses_local);
0103       return ios;
0104     }
0105 
0106     namespace detail
0107     {
0108 
0109       template<typename CharT>
0110       struct ios_base_data_aux
0111       {
0112         std::basic_string<CharT> time_fmt;
0113         std::basic_string<CharT> duration_fmt;
0114       public:
0115 
0116         ios_base_data_aux()
0117         //:
0118         //  time_fmt(""),
0119         //  duration_fmt("")
0120         {
0121         }
0122       };
0123       template<typename CharT>
0124       struct ios_base_data  {};
0125       namespace /**/ {
0126         xalloc_key_initializer<detail::ios_base_data<char>      > ios_base_data_aux_xalloc_key_initializer;
0127         xalloc_key_initializer<detail::ios_base_data<wchar_t>   > wios_base_data_aux_xalloc_key_initializer;
0128 #if BOOST_CHRONO_HAS_UNICODE_SUPPORT
0129         xalloc_key_initializer<detail::ios_base_data<char16_t>  > u16ios_base_data_aux_xalloc_key_initializer;
0130         xalloc_key_initializer<detail::ios_base_data<char32_t>  > u32ios_base_data_aux_xalloc_key_initializer;
0131 #endif
0132       } // namespace
0133     } // namespace detail
0134 
0135     template<typename CharT>
0136     inline std::basic_string<CharT> get_time_fmt(std::ios_base & ios)
0137     {
0138       ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
0139       return ptr->time_fmt;
0140     }
0141     template<typename CharT>
0142     inline void set_time_fmt(std::ios_base& ios, std::basic_string<
0143         CharT> const& fmt)
0144     {
0145       ios_state_not_null_ptr<detail::ios_base_data<CharT>, detail::ios_base_data_aux<CharT> > ptr(ios);
0146       ptr->time_fmt = fmt;
0147     }
0148 
0149   } // chrono
0150 } // boost
0151 
0152 #endif  // header