summaryrefslogtreecommitdiff
path: root/boost/chrono/io/ios_base_state.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/chrono/io/ios_base_state.hpp')
-rw-r--r--boost/chrono/io/ios_base_state.hpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/boost/chrono/io/ios_base_state.hpp b/boost/chrono/io/ios_base_state.hpp
new file mode 100644
index 0000000000..6e320a5678
--- /dev/null
+++ b/boost/chrono/io/ios_base_state.hpp
@@ -0,0 +1,151 @@
+// (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