time_facet.hpp
来自「support vector clustering for vc++」· HPP 代码 · 共 1,264 行 · 第 1/4 页
HPP
1,264 行
if(a_time.zone_name(true).empty()) {
/* TODO: this'll probably create problems if a user places
* the zone_*_format flag in the format with a ptime. This
* code removes the flag from the default formats */
// if zone_name() returns an empty string, we want to
// erase zone_iso_extended_format from format
boost::algorithm::replace_all(format,
zone_iso_extended_format,
"");
}
else{
boost::algorithm::replace_all(format,
zone_iso_extended_format,
a_time.zone_name(true));
}
}
if (format.find(zone_iso_format) != string_type::npos) {
if(a_time.zone_abbrev(true).empty()) {
/* TODO: this'll probably create problems if a user places
* the zone_*_format flag in the format with a ptime. This
* code removes the flag from the default formats */
// if zone_abbrev() returns an empty string, we want to
// erase zone_iso_format from format
boost::algorithm::replace_all(format,
zone_iso_format,
"");
}
else{
boost::algorithm::replace_all(format,
zone_iso_format,
a_time.zone_abbrev(true));
}
}
if (format.find(fractional_seconds_format) != string_type::npos) {
// 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) != string_type::npos) {
// 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 this->do_put_tm(a_next, a_ios, a_fill,
to_tm(a_time), format);
}
//! put function for time_duration
OutItrT put(OutItrT a_next,
std::ios_base& a_ios,
char_type a_fill,
const time_duration_type& a_time_dur) const
{
if (a_time_dur.is_special()) {
return this->do_put_special(a_next, a_ios, a_fill,
a_time_dur.get_rep().as_special());
}
string_type format(m_time_duration_format);
if (a_time_dur.is_negative()) {
// replace %- with minus sign. Should we use the numpunct facet?
boost::algorithm::replace_all(format,
duration_sign_negative_only,
negative_sign);
// remove all the %+ in the string with '-'
boost::algorithm::replace_all(format,
duration_sign_always,
negative_sign);
}
else { //duration is positive
// remove all the %- combos from the string
boost::algorithm::replace_all(format,
duration_sign_negative_only,
"");
// remove all the %+ in the string with '+'
boost::algorithm::replace_all(format,
duration_sign_always,
positive_sign);
}
string_type frac_str;
if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
// replace %s with %S.nnn
frac_str =
fractional_seconds_as_string(a_time_dur, 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) != string_type::npos) {
// replace %f with nnnnnnn
if (!frac_str.size()) {
frac_str = fractional_seconds_as_string(a_time_dur, false);
}
boost::algorithm::replace_all(format,
fractional_seconds_format,
frac_str);
}
if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
// replace %F with nnnnnnn or nothing if fs == 0
frac_str =
fractional_seconds_as_string(a_time_dur, 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 this->do_put_tm(a_next, a_ios, a_fill,
to_tm(a_time_dur), format);
}
OutItrT put(OutItrT next, std::ios_base& a_ios,
char_type fill, const period_type& p) const
{
return this->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();
}
//make sure there is no sign
frac_sec = date_time::absolute_value(frac_sec);
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 < 1300))
// 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:
string_type m_time_duration_format;
};
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 = time_formats<CharT>::fractional_seconds_format;
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 = time_formats<CharT>::fractional_seconds_or_none_format;
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 =
time_formats<CharT>::seconds_with_fractional_seconds_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::zone_iso_extended_format =time_formats<CharT>::zone_iso_extended_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::posix_zone_string_format =time_formats<CharT>::posix_zone_string_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
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 = time_formats<CharT>::seconds_format;
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 = time_formats<CharT>::standard_format;
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 = time_formats<CharT>::duration_seperator;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::negative_sign = time_formats<CharT>::negative_sign;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::positive_sign = time_formats<CharT>::positive_sign;
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_sign_negative_only = time_formats<CharT>::duration_sign_negative_only;
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_sign_always = time_formats<CharT>::duration_sign_always;
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 = time_formats<CharT>::iso_time_format_specifier;
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 = time_formats<CharT>::iso_time_format_extended_specifier;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::default_time_format =
time_formats<CharT>::default_time_format;
template <class time_type, class CharT, class OutItrT>
const typename time_facet<time_type, CharT, OutItrT>::char_type*
time_facet<time_type, CharT, OutItrT>::default_time_duration_format =
time_formats<CharT>::default_time_duration_format;
//! Facet for format-based input.
/*!
*/
template <class time_type,
class CharT,
class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
class time_input_facet :
public boost::date_time::date_input_facet<typename time_type::date_type , CharT, InItrT> {
public:
typedef typename time_type::date_type date_type;
typedef typename time_type::time_duration_type time_duration_type;
typedef typename time_duration_type::fractional_seconds_type fracional_seconds_type;
typedef boost::date_time::period<time_type,time_duration_type> period_type;
typedef boost::date_time::date_input_facet<typename time_type::date_type, CharT, InItrT> base_type;
typedef typename base_type::duration_type date_duration_type;
typedef typename base_type::year_type year_type;
typedef typename base_type::month_type month_type;
typedef typename base_type::day_type day_type;
typedef typename base_type::string_type string_type;
typedef typename string_type::const_iterator const_itr;
typedef typename base_type::char_type char_type;
typedef typename base_type::format_date_parser_type format_date_parser_type;
typedef typename base_type::period_parser_type period_parser_type;
typedef typename base_type::special_values_parser_type special_values_parser_type;
typedef typename base_type::date_gen_parser_type date_gen_parser_type;
typedef typename base_type::special_values_parser_type::match_results match_results;
static const char_type* fractional_seconds_format; // f
static const char_type* fractional_seconds_or_none_format; // F
static const char_type* seconds_with_fractional_seconds_format; // s
static const char_type* seconds_format; // S
static const char_type* standard_format; // x X
static const char_type* zone_abbrev_format; // z
static const char_type* zone_name_format; // Z
static const char_type* zone_iso_format; // q
static const char_type* zone_iso_extended_format; // Q
static const char_type* duration_seperator;
static const char_type* iso_time_format_specifier;
static const char_type* iso_time_format_extended_specifier;
static const char_type* default_time_input_format;
static const char_type* default_time_duration_format;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?