time_facet.hpp
来自「support vector clustering for vc++」· HPP 代码 · 共 1,264 行 · 第 1/4 页
HPP
1,264 行
catch(std::out_of_range bad_weekday) { // base class for bad_weekday exception
if(this->m_sv_parser.match(sitr, stream_end, mr)) {
t = time_type(static_cast<special_values>(mr.current_match));
return sitr;
}
else {
throw; // rethrow bad_weekday
}
}
// did m_parser already advance sitr to next char?
if(mr.has_remaining()) {
use_current_char = true;
}
break;
}
case 'j':
{
// code that gets julian day (from format_date_parser)
match_results mr;
day_of_year = fixed_string_to_int<unsigned short, CharT>(sitr, stream_end, mr, 3);
if(day_of_year == -1) {
if(this->m_sv_parser.match(sitr, stream_end, mr)) {
t = time_type(static_cast<special_values>(mr.current_match));
return sitr;
}
}
// these next two lines are so we get an exception with bad input
typedef typename time_type::date_type::day_of_year_type day_of_year_type;
day_of_year_type t_day_of_year(day_of_year);
break;
}
case 'd':
{
try {
t_day = this->m_parser.parse_day_of_month(sitr, stream_end);
}
catch(std::out_of_range bad_day_of_month) { // base class for exception
match_results mr;
if(this->m_sv_parser.match(sitr, stream_end, mr)) {
t = time_type(static_cast<special_values>(mr.current_match));
return sitr;
}
else {
throw; // rethrow bad_year
}
}
break;
}
// time flags
case 'H':
{
match_results mr;
hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
if(hour == -1){
return check_special_value(sitr, stream_end, t, c);
}
break;
}
case 'M':
{
match_results mr;
min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
if(min == -1){
return check_special_value(sitr, stream_end, t, c);
}
break;
}
case 'S':
{
match_results mr;
sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
if(sec == -1){
return check_special_value(sitr, stream_end, t, c);
}
break;
}
case 's':
{
match_results mr;
sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
if(sec == -1){
return check_special_value(sitr, stream_end, t, c);
}
// %s is the same as %S%f so we drop through into %f
//break;
}
case 'f':
{
// check for decimal, check SV if missing
if(*sitr == '.') {
++sitr;
parse_frac_type(sitr, stream_end, frac);
// sitr will point to next expected char after this parsing
// is complete so no need to advance it
use_current_char = true;
}
else {
return check_special_value(sitr, stream_end, t, c);
}
break;
}
case 'F':
{
// check for decimal, skip if missing
if(*sitr == '.') {
++sitr;
parse_frac_type(sitr, stream_end, frac);
// sitr will point to next expected char after this parsing
// is complete so no need to advance it
use_current_char = true;
}
else {
// nothing was parsed so we don't want to advance sitr
use_current_char = true;
}
break;
}
// time_zone flags
//case 'q':
//case 'Q':
//case 'z':
case 'Z':
{
if(time_is_local) { // skip if 't' is a ptime
++itr;
if(*itr == 'P') {
// skip leading whitespace
while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
// parse zone
while((sitr != stream_end) && (!std::isspace(*sitr))) {
tz_str += *sitr;
++sitr;
}
}
else {
use_current_format_char = true;
}
}
else {
// nothing was parsed so we don't want to advance sitr
use_current_char = true;
}
break;
}
default:
{} // ignore what we don't understand?
}// switch
}
else { // itr == '%', second consecutive
sitr++;
}
if(use_current_format_char) {
use_current_format_char = false;
}
else {
itr++; //advance past format specifier
}
}
else { //skip past chars in format and in buffer
itr++;
// set use_current_char when sitr is already
// pointing at the next character to process
if (use_current_char) {
use_current_char = false;
}
else {
sitr++;
}
}
}
date_type d(not_a_date_time);
if (day_of_year > 0) {
d = date_type(static_cast<unsigned short>(t_year-1),12,31) + date_duration_type(day_of_year);
}
else {
d = date_type(t_year, t_month, t_day);
}
time_duration_type td(hour, min, sec, frac);
t = time_type(d, td);
return sitr;
}
//! Helper function to check for special_value
/*! First character may have been consumed during original parse
* attempt. Parameter 'c' should be a copy of that character.
* Throws ios_base::failure if parse fails. */
template<class temporal_type>
inline
InItrT check_special_value(InItrT& sitr,InItrT& stream_end, temporal_type& tt, char_type c='\0') const
{
match_results mr;
if((c == '-' || c == '+') && (*sitr != c)) { // was the first character consumed?
mr.cache += c;
}
this->m_sv_parser.match(sitr, stream_end, mr);
if(mr.current_match == match_results::PARSE_ERROR) {
std::string tmp = convert_string_type<char_type, char>(mr.cache);
throw std::ios_base::failure("Parse failed. No match found for '" + tmp + "'");
}
tt = temporal_type(static_cast<special_values>(mr.current_match));
return sitr;
}
//! Helper function for parsing a fractional second type from the stream
void parse_frac_type(InItrT& sitr,
InItrT& stream_end,
fracional_seconds_type& frac) const
{
string_type cache;
while((sitr != stream_end) && std::isdigit(*sitr)) {
cache += *sitr;
++sitr;
}
if(cache.size() > 0) {
unsigned short precision = time_duration_type::num_fractional_digits();
// input may be only the first few decimal places
if(cache.size() < precision) {
frac = lexical_cast<fracional_seconds_type>(cache);
frac = decimal_adjust(frac, static_cast<unsigned short>(precision - cache.size()));
}
else {
// if input has too many decimal places, drop excess digits
frac = lexical_cast<fracional_seconds_type>(cache.substr(0, precision));
}
}
}
private:
string_type m_time_duration_format;
//! Helper function to adjust trailing zeros when parsing fractional digits
template<class int_type>
inline
int_type decimal_adjust(int_type val, const unsigned short places) const
{
unsigned long factor = 1;
for(int i = 0; i < places; ++i){
factor *= 10; // shift decimal to the right
}
return val * factor;
}
};
template <class time_type, class CharT, class InItrT>
std::locale::id time_input_facet<time_type, CharT, InItrT>::id;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::fractional_seconds_format = time_formats<CharT>::fractional_seconds_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::fractional_seconds_or_none_format = time_formats<CharT>::fractional_seconds_or_none_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::seconds_with_fractional_seconds_format = time_formats<CharT>::seconds_with_fractional_seconds_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::seconds_format = time_formats<CharT>::seconds_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::standard_format = time_formats<CharT>::standard_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::zone_iso_extended_format = time_formats<CharT>::zone_iso_extended_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::duration_seperator = time_formats<CharT>::duration_seperator;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::iso_time_format_specifier = time_formats<CharT>::iso_time_format_specifier;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::iso_time_format_extended_specifier = time_formats<CharT>::iso_time_format_extended_specifier;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::default_time_input_format = time_formats<CharT>::default_time_input_format;
template <class time_type, class CharT, class InItrT>
const typename time_input_facet<time_type, CharT, InItrT>::char_type*
time_input_facet<time_type, CharT, InItrT>::default_time_duration_format = time_formats<CharT>::default_time_duration_format;
} } // namespaces
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?