mirror of
https://github.com/yuzu-emu/ext-boost.git
synced 2025-01-09 13:55:29 +00:00
153 lines
4.3 KiB
C++
153 lines
4.3 KiB
C++
// (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
|