time_facet.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 222 行
HPP
222 行
#ifndef POSIX_TIME_DATE_TIME_FACET__HPP__#define POSIX_TIME_DATE_TIME_FACET__HPP__/* Copyright (c) 2004 CrystalClear Software, Inc. * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0) * Author: Martin Andrian, Jeff Garland * $Date: 2004/11/20 10:36:31 $ */#include "boost/date_time/date_facet.hpp"namespace boost {namespace date_time { template <class time_type, class CharT, class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > > class time_facet : public boost::date_time::date_facet<typename time_type::date_type , CharT, OutItrT> { public: typedef typename time_type::date_type date_type; typedef typename time_type::time_duration_type time_duration_type; typedef boost::date_time::period<time_type,time_duration_type> period_type; typedef boost::date_time::date_facet<boost::gregorian::date, CharT, OutItrT> base_type; typedef typename base_type::string_type string_type; typedef typename base_type::char_type char_type; typedef typename base_type::period_formatter_type period_formatter_type; typedef typename base_type::special_values_formatter_type special_values_formatter_type; static const char_type fractional_seconds_format[3]; static const char_type fractional_seconds_or_none_format[3]; static const char_type seconds_with_fractional_seconds_format[3]; static const char_type seconds_format[3]; static const char_type standard_format[3]; static const char_type duration_seperator[2]; static const char_type iso_time_format_specifier[16]; static const char_type iso_time_format_extended_specifier[20]; static std::locale::id id; explicit time_facet(::size_t a_ref = 0) : base_type(standard_format), m_time_duration_seperator(duration_seperator) { set_duration_seperator_from_facet(); //todo fix this } explicit time_facet(const char_type* a_format, period_formatter_type period_formatter = period_formatter_type(), const special_values_formatter_type& special_value_formatter = special_values_formatter_type(), ::size_t a_ref = 0) : base_type(a_format, period_formatter, special_value_formatter, a_ref), m_time_duration_seperator(duration_seperator) {} virtual void set_iso_format() { m_format = iso_time_format_specifier; } virtual void set_iso_extended_format() { m_format = iso_time_format_extended_specifier; } OutItrT put(OutItrT a_next, std::ios_base& a_ios, char_type a_fill, const time_type& a_time) const { if (a_time.is_special()) { return do_put_special(a_next, a_ios, a_fill, a_time.date().as_special()); } string_type format(m_format); string_type frac_str; if (format.find(seconds_with_fractional_seconds_format)) { // replace %s with %S.nnn frac_str = fractional_seconds_as_string(a_time.time_of_day(), false); char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point(); string_type replace_string(seconds_format); replace_string += sep; replace_string += frac_str; boost::algorithm::replace_all(format, seconds_with_fractional_seconds_format, replace_string); } if (format.find(fractional_seconds_format)) { // replace %f with nnnnnnn if (!frac_str.size()) { frac_str = fractional_seconds_as_string(a_time.time_of_day(), false); } boost::algorithm::replace_all(format, fractional_seconds_format, frac_str); } if (format.find(fractional_seconds_or_none_format)) { // replace %F with nnnnnnn or nothing if fs == 0 frac_str = fractional_seconds_as_string(a_time.time_of_day(), true); if (frac_str.size()) { char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point(); string_type replace_string; replace_string += sep; replace_string += frac_str; boost::algorithm::replace_all(format, fractional_seconds_or_none_format, replace_string); } else { boost::algorithm::erase_all(format, fractional_seconds_or_none_format); } } return do_put_tm(a_next, a_ios, a_fill, to_tm(a_time), format); } OutItrT put(OutItrT next, std::ios_base& a_ios, char_type fill, const period_type& p) const { return m_period_formatter.put_period(next, a_ios, fill,p,*this); } protected: static string_type fractional_seconds_as_string(const time_duration_type& a_time, bool null_when_zero) { typename time_duration_type::fractional_seconds_type frac_sec = a_time.fractional_seconds(); if (null_when_zero && (frac_sec == 0)) { return string_type(); } std::basic_ostringstream<char_type> ss; ss.imbue(std::locale::classic()); // don't want any formatting ss << std::setw(time_duration_type::num_fractional_digits()) << std::setfill(static_cast<char_type>('0'));#if (defined(BOOST_MSVC) && (_MSC_VER <= 1200)) // 1200 == VC++ 6.0 // JDG [7/6/02 VC++ compatibility] char_type buff[34]; ss << _i64toa(static_cast<boost::int64_t>(frac_sec), buff, 10);#else ss << frac_sec;#endif return ss.str(); } private: //! Use the std facet to figure out the seperator /*! Simple algorithm here -- print as %X time and search for * non-numeric character. This is assumed to be seperator. * Would be better if the standard facet was enhanced. */ void set_duration_seperator_from_facet() { //todo write this function } string_type m_time_duration_seperator; }; template <class time_type, class CharT, class OutItrT> std::locale::id time_facet<time_type, CharT, OutItrT>::id; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::fractional_seconds_format[3] = {'%','f'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::fractional_seconds_or_none_format[3] = {'%','F'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::seconds_with_fractional_seconds_format[3] = {'%','s'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::seconds_format[3] = {'%','S'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::standard_format[3] = {'%','c'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::duration_seperator[2] = {':'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type,CharT, OutItrT>::char_type time_facet<time_type,CharT, OutItrT>::iso_time_format_specifier[16] = {'%', 'Y', '%', 'm', '%', 'd', 'T', '%', 'H', '%', 'M', '%', 'S', '%', 'F'}; template <class time_type, class CharT, class OutItrT> const typename time_facet<time_type, CharT, OutItrT>::char_type time_facet<time_type, CharT, OutItrT>::iso_time_format_extended_specifier[20] = {'%', 'Y', '-', '%', 'm', '-', '%', 'd', ' ', '%', 'H', ':', '%', 'M', ':', '%', 'S', '%', 'F'};} }#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?