Date_std.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Date_std.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:32:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Date_std.cpp,v 1000.1 2004/06/01 19:32:17 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Aaron Ucko, NCBI
  35.  *
  36.  * File Description:
  37.  *   Useful member functions for standard dates: comparison and formatting
  38.  *
  39.  * Remark:
  40.  *   This code was originally generated by application DATATOOL
  41.  *   using specifications from the ASN data definition file
  42.  *   'general.asn'.
  43.  *
  44.  */
  45. // standard includes
  46. // generated includes
  47. #include <ncbi_pch.hpp>
  48. #include <objects/general/Date_std.hpp>
  49. #include <objects/general/general_exception.hpp>
  50. #include <vector>
  51. // generated classes
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_objects_SCOPE // namespace ncbi::objects::
  54. // destructor
  55. CDate_std::~CDate_std(void)
  56. {
  57. }
  58. void CDate_std::SetToTime(const CTime& time, CDate::EPrecision prec)
  59. {
  60.     switch (prec) {
  61.     case CDate::ePrecision_second:
  62.         SetSecond(time.Second());
  63.         SetMinute(time.Minute());
  64.         SetHour  (time.Hour());
  65.         // fall through
  66.     case CDate::ePrecision_day:
  67.         SetDay   (time.Day());
  68.         SetMonth (time.Month());
  69.         SetYear  (time.Year());
  70.         break;
  71.     default:
  72.         break;
  73.     }
  74. }
  75. CTime CDate_std::AsCTime(CTime::ETimeZone tz) const
  76. {
  77.     return CTime(GetYear(), GetMonth(), GetDay(),
  78.                  GetHour(), GetMinute(), GetSecond(), 0, tz);
  79. }
  80. CDate::ECompare CDate_std::Compare(const CDate_std& date) const
  81. {
  82.     if (GetYear() < date.GetYear()) {
  83.         return CDate::eCompare_before;
  84.     } else if (GetYear() > date.GetYear()) {
  85.         return CDate::eCompare_after;
  86.     }
  87.     if ((IsSetSeason()  ||  date.IsSetSeason())
  88.         && ( !IsSetSeason()  ||  !date.IsSetSeason()
  89.             || GetSeason()  !=  date.GetSeason())) {
  90.         return CDate::eCompare_unknown;
  91.     }
  92.     if (IsSetMonth()  ||  date.IsSetMonth()) {
  93.         if ( !IsSetMonth()  ||  !date.IsSetMonth()) {
  94.             return CDate::eCompare_unknown;
  95.         } else if (GetMonth() < date.GetMonth()) {
  96.             return CDate::eCompare_before;
  97.         } else if (GetMonth() > date.GetMonth()) {
  98.             return CDate::eCompare_after;
  99.         }
  100.     }
  101.     if (IsSetDay()  ||  date.IsSetDay()) {
  102.         if ( !IsSetDay()  ||  !date.IsSetDay()) {
  103.             return CDate::eCompare_unknown;
  104.         } else if (GetDay() < date.GetDay()) {
  105.             return CDate::eCompare_before;
  106.         } else if (GetDay() > date.GetDay()) {
  107.             return CDate::eCompare_after;
  108.         }
  109.     }
  110.     if (IsSetHour()  ||  date.IsSetHour()) {
  111.         if ( !IsSetHour()  ||  !date.IsSetHour()) {
  112.             return CDate::eCompare_unknown;
  113.         } else if (GetHour() < date.GetHour()) {
  114.             return CDate::eCompare_before;
  115.         } else if (GetHour() > date.GetHour()) {
  116.             return CDate::eCompare_after;
  117.         }
  118.     }
  119.     if (IsSetMinute()  ||  date.IsSetMinute()) {
  120.         if ( !IsSetMinute()  ||  !date.IsSetMinute()) {
  121.             return CDate::eCompare_unknown;
  122.         } else if (GetMinute() < date.GetMinute()) {
  123.             return CDate::eCompare_before;
  124.         } else if (GetMinute() > date.GetMinute()) {
  125.             return CDate::eCompare_after;
  126.         }
  127.     }
  128.     if (IsSetSecond()  ||  date.IsSetSecond()) {
  129.         if ( !IsSetSecond()  ||  !date.IsSetSecond()) {
  130.             return CDate::eCompare_unknown;
  131.         } else if (GetSecond() < date.GetSecond()) {
  132.             return CDate::eCompare_before;
  133.         } else if (GetSecond() > date.GetSecond()) {
  134.             return CDate::eCompare_after;
  135.         }
  136.     }
  137.     return CDate::eCompare_same;
  138. }
  139. void CDate_std::GetDate(string* label, const string& format) const
  140. {
  141.     static const char* const kMonths[] = {
  142.         "0", "January", "February", "March", "April", "May", "June",
  143.         "July", "August", "September", "October", "November", "December"
  144.     };
  145.     if (!label) {
  146.         return;
  147.     }
  148.     unsigned int                        depth = 0;
  149.     vector<pair<SIZE_TYPE, SIZE_TYPE> > starts;
  150.     starts.push_back(make_pair(label->size(), (SIZE_TYPE)0));
  151.     ITERATE (string, it, format) {
  152.         if (*it != '%') {
  153.             *label += *it;
  154.             continue;
  155.         }
  156.         if (++it == format.end()) {
  157.             NCBI_THROW2(CGeneralParseException, eFormat,
  158.                         "CDate_std::GetDate(): incomplete % expression",
  159.                         it - format.begin());
  160.         }
  161.         // Check for things that can only immediately follow %
  162.         if (*it == '%') {
  163.             *label += '%';
  164.             continue;
  165.         }
  166.         else if (*it == '{') {
  167.             depth++;
  168.             starts.push_back(make_pair(label->size(),
  169.                                        SIZE_TYPE(it - format.begin())));
  170.             continue;
  171.         } else if (*it == '}') {
  172.             if (depth == 0) {
  173.                 NCBI_THROW2(CGeneralParseException, eFormat,
  174.                             "CDate_std::GetDate(): unbalanced %}",
  175.                             it - format.begin());
  176.             }
  177.             depth--;
  178.             starts.pop_back();
  179.             continue;
  180.         } else if (*it == '|') {
  181.             // We survived, so just look for the appropriate %}.
  182.             if (depth == 0) {
  183.                 return; // Can ignore rest of format
  184.             }
  185.             unsigned int depth2 = 0;
  186.             for (;;) {
  187.                 while (++it != format.end()  &&  *it != '%')
  188.                     ;
  189.                 if (it == format.end()  ||  ++it == format.end()) {
  190.                     NCBI_THROW2(CGeneralParseException, eFormat,
  191.                                 "CDate_std::GetDate(): unbalanced %{",
  192.                                 starts.back().second);
  193.                 }
  194.                 if (*it == '}') {
  195.                     if (depth2 == 0) {
  196.                         depth--;
  197.                         starts.pop_back();
  198.                         break;
  199.                     } else {
  200.                         depth2--;
  201.                     }
  202.                 } else if (*it == '{') {
  203.                     depth2++;
  204.                 }
  205.             }
  206.             continue;
  207.         }
  208.         unsigned int length = 0;
  209.         int          value  = -1;
  210.         while (isdigit(*it)) {
  211.             length = length * 10 + *it - '0';
  212.             if (++it == format.end()) {
  213.                 NCBI_THROW2(CGeneralParseException, eFormat,
  214.                             "CDate_std::GetDate(): incomplete % expression",
  215.                             it - format.begin());
  216.             }
  217.         }
  218.         switch (*it) {
  219.         case 'Y': value = GetYear(); break;
  220.         case 'M':
  221.         case 'N': value = IsSetMonth()  ? GetMonth()  : -1; break;
  222.         case 'D': value = IsSetDay()    ? GetDay()    : -1; break;
  223.         case 'S': value = IsSetSeason() ? 1           : -1; break;
  224.         case 'h': value = IsSetHour()   ? GetHour()   : -1; break;
  225.         case 'm': value = IsSetMinute() ? GetMinute() : -1; break;
  226.         case 's': value = IsSetSecond() ? GetSecond() : -1; break;
  227.         default:
  228.             NCBI_THROW2(CGeneralParseException, eFormat,
  229.                         "CDate_std::GetDate(): unrecognized format specifier",
  230.                         it - format.begin());
  231.         }
  232.         if (value >= 0) {
  233.             if (*it == 'N') { // special cases
  234.                 const char* name = kMonths[value];
  235.                 if (length > 0) {
  236.                     label->append(name, length);
  237.                 } else {
  238.                     *label += name;
  239.                 }
  240.             } else if (*it == 'S') {
  241.                 if (length > 0) {
  242.                     label->append(GetSeason(), 0, length);
  243.                 } else {
  244.                     *label += GetSeason();
  245.                 }
  246.             } else { // just a number
  247.                 if (length > 0) {
  248.                     // We want exactly <length> digits.
  249.                     CNcbiOstrstream oss;
  250.                     oss << setfill('0') << setw(length) << value;
  251.                     string s = CNcbiOstrstreamToString(oss);
  252.                     label->append(s, s.size() > length ? s.size() - length : 0,
  253.                                   length);
  254.                 } else {
  255.                     *label += NStr::IntToString(value);
  256.                 }
  257.             }
  258.         } else {
  259.             // missing...roll back label and look for alternatives, or
  260.             // throw if at top level and none found
  261.             label->erase(starts.back().first);
  262.             char         request = *it;
  263.             unsigned int depth2  = 0;
  264.             for (;;) {
  265.                 while (++it != format.end()  &&  *it != '%')
  266.                     ;
  267.                 if (it == format.end()  ||  ++it == format.end()) {
  268.                     if (depth > 0  ||  depth2 > 0) {
  269.                         NCBI_THROW2(CGeneralParseException, eFormat,
  270.                                     "CDate_std::GetDate(): unbalanced %{",
  271.                                     starts.back().second);
  272.                     } else {
  273.                         NCBI_THROW2(CGeneralParseException, eFormat,
  274.                                    string("CDate_std::GetDate():"
  275.                                           " missing required field %")
  276.                                    + request, it - format.begin() - 1);
  277.                     }
  278.                 }
  279.                 if (*it == '|'  &&  depth2 == 0) {
  280.                     break;
  281.                 } else if (*it == '}') {
  282.                     if (depth2 == 0) {
  283.                         if (depth == 0) {
  284.                             NCBI_THROW2(CGeneralParseException, eFormat,
  285.                                         "CDate_std::GetDate(): unbalanced %}",
  286.                                         it - format.begin());
  287.                         }
  288.                         depth--;
  289.                         starts.pop_back();
  290.                         break;
  291.                     } else {
  292.                         depth2--;
  293.                     }
  294.                 } else if (*it == '{') {
  295.                     depth2++;
  296.                 }
  297.             }
  298.         }
  299.     }
  300. }
  301. END_objects_SCOPE // namespace ncbi::objects::
  302. END_NCBI_SCOPE
  303. /*
  304.  * ===========================================================================
  305.  *
  306.  * $Log: Date_std.cpp,v $
  307.  * Revision 1000.1  2004/06/01 19:32:17  gouriano
  308.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.7
  309.  *
  310.  * Revision 6.7  2004/05/19 17:21:39  gorelenk
  311.  * Added include of PCH - ncbi_pch.hpp
  312.  *
  313.  * Revision 6.6  2003/03/11 15:38:42  kuznets
  314.  * iterate -> ITERATE
  315.  *
  316.  * Revision 6.5  2003/02/24 20:02:36  gouriano
  317.  * use template-based exceptions instead of errno and parse exceptions
  318.  *
  319.  * Revision 6.4  2002/12/09 17:30:11  ucko
  320.  * Rename Assign to SetToTime to avoid shadowing CSerialObject; propagate tz
  321.  *
  322.  * Revision 6.3  2002/12/06 20:03:16  ucko
  323.  * Support conversion to/from CTime and from time_t
  324.  *
  325.  * Revision 6.2  2002/10/04 14:45:09  ucko
  326.  * Add a generic date formatter with flexible support for missing fields.
  327.  *
  328.  * Revision 6.1  2001/11/16 20:54:52  ucko
  329.  * Added comparison for dates.
  330.  *
  331.  * ===========================================================================
  332.  */
  333. /* Original file checksum: lines: 61, chars: 1885, CRC32: 4ef42d28 */