*** date_parsing.hpp.orig	Thu Aug 15 19:57:38 2002
--- date_parsing.hpp	Thu Jul 31 20:31:12 2003
***************
*** 14,39 ****
  
  namespace date_time {
  
  
    //! Generic function to parse a delimited date (eg: 2002-02-10)
    template<class date_type>
    date_type
    parse_date(const std::string& s)
    {
-     typedef typename date_type::year_type year_type;
-     int pos = 0;
-     typename date_type::ymd_type ymd(year_type::min(),1,1);
      boost::tokenizer<boost::char_delimiters_separator<char> > tok(s);
!     for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
!       int i = boost::lexical_cast<int>(*beg);
!       switch(pos) {
!       case 0: ymd.year = i; break;
!       case 1: ymd.month = i; break;
!       case 2: ymd.day = i; break;
!       };
!       pos++;
!     }
!     return date_type(ymd);
    }
  
    //! Generic function to parse undelimited date (eg: 20020201)
--- 14,50 ----
  
  namespace date_time {
  
+ namespace detail {
+   
+   //! Generic function to parse date
+   template<class date_type, class tokenizer>
+   date_type
+   parse_date(const tokenizer& tok) 
+   {
+     typedef typename date_type::year_type year_type;
+     typename date_type::ymd_type ymd(year_type::min(), 1, 1);
+     typedef typename tokenizer::const_iterator iterator;
+     iterator beg = tok.begin(), end = tok.end();
+     if (beg == end)
+       return date_type(ymd);
+     ymd.year = boost::lexical_cast<int>(*beg);
+     if (++beg == end)
+       return date_type(ymd);
+     ymd.month = boost::lexical_cast<int>(*beg);
+     if (++beg == end)
+       return date_type(ymd);
+     ymd.day = boost::lexical_cast<int>(*beg);
+     return date_type(ymd);
+   }
+ } // namespace detail
  
    //! Generic function to parse a delimited date (eg: 2002-02-10)
    template<class date_type>
    date_type
    parse_date(const std::string& s)
    {
      boost::tokenizer<boost::char_delimiters_separator<char> > tok(s);
!     return detail::parse_date<date_type>(tok);
    }
  
    //! Generic function to parse undelimited date (eg: 20020201)
***************
*** 42,63 ****
    parse_undelimited_date(const std::string& s)
    {
      int offsets[] = {4,2,2};
-     int pos = 0;
-     typedef typename date_type::year_type year_type;
-     typename date_type::ymd_type ymd(year_type::min(),1,1);
      boost::offset_separator osf(offsets, offsets+3); 
      boost::tokenizer<boost::offset_separator> tok(s, osf);
!     for(boost::tokenizer<boost::offset_separator>::iterator ti=tok.begin(); ti!=tok.end();++ti){
!       int i = boost::lexical_cast<int>(*ti);
!       //      std::cout << i << std::endl;
!       switch(pos) {
!       case 0: ymd.year = i; break;
!       case 1: ymd.month = i; break;
!       case 2: ymd.day = i; break;
!       };
!       pos++;
!     } 
!     return date_type(ymd);
    }
    
    
--- 53,61 ----
    parse_undelimited_date(const std::string& s)
    {
      int offsets[] = {4,2,2};
      boost::offset_separator osf(offsets, offsets+3); 
      boost::tokenizer<boost::offset_separator> tok(s, osf);
!     return detail::parse_date<date_type>(tok);
    }
    
    
***************
*** 65,86 ****
    date_type
    parse_date2(const std::string& s)
    {
-     //using namespace boost;
-     int pos = 0;
-     typedef typename date_type::year_type year_type;
-     typename date_type::ymd_type ymd(year_type::min(),1,1);
      boost::char_delimiters_separator<char> delim("DT");
      boost::tokenizer<boost::char_delimiters_separator<char> > tok(s);
!     for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
!       int i = boost::lexical_cast<int>(*beg);
!       switch(pos) {
!       case 0: ymd.year = i; break;
!       case 1: ymd.month = i; break;
!       case 2: ymd.day = i; break;
!       };
!       pos++;
!     }
!     return date_type(ymd);
    }
  
  
--- 63,71 ----
    date_type
    parse_date2(const std::string& s)
    {
      boost::char_delimiters_separator<char> delim("DT");
      boost::tokenizer<boost::char_delimiters_separator<char> > tok(s);
!     return detail::parse_date<date_type>(tok);
    }
  
  
