home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / CLASSINC.PAK / DATE.H < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  8.1 KB  |  298 lines

  1. //----------------------------------------------------------------------------
  2. // Borland Class Library
  3. // Copyright (c) 1993, 1997 by Borland International, All Rights Reserved
  4. //
  5. //$Revision:   5.6  $
  6. //
  7. //----------------------------------------------------------------------------
  8. #if !defined(CLASSLIB_DATE_H)
  9. #define CLASSLIB_DATE_H
  10.  
  11. #if !defined(CLASSLIB_DEFS_H)
  12. # include <classlib/defs.h>
  13. #endif
  14.  
  15. #if defined(BI_CLASSLIB_NO_po)
  16. # pragma option -po-
  17. #endif
  18.  
  19. class _EXPCLASS string;
  20. class _EXPCLASS istream;
  21. class _EXPCLASS ostream;
  22.  
  23. #if defined(BI_NAMESPACE)
  24. namespace ClassLib {
  25. #endif
  26.  
  27. class _BIDSCLASS TTime;
  28. class _BIDSCLASS ipstream;
  29. class _BIDSCLASS opstream;
  30.  
  31. typedef unsigned DayTy;
  32. typedef unsigned MonthTy;
  33. typedef unsigned YearTy;
  34. typedef unsigned long JulTy;
  35.  
  36. static const JulTy jul1901 = 2415386L;  // Julian day for 1/1/1901
  37.  
  38. /*------------------------------------------------------------------------*/
  39. /*                                                                        */
  40. /*  class TDate                                                           */
  41. /*                                                                        */
  42. /*------------------------------------------------------------------------*/
  43.  
  44. class _BIDSCLASS TDate
  45. {
  46.  
  47. public:
  48.  
  49.     enum HowToPrint
  50.         {
  51.         Normal,
  52.         Terse,
  53.         Numbers,
  54.         EuropeanNumbers,
  55.         European
  56.         };
  57.  
  58.     // Construct a TDate with the current date
  59.  
  60.     TDate();
  61.  
  62.     // Construct a TDate with a given day of the year and a given year.
  63.     // The base date for this computation is Dec. 31 of the previous year.
  64.     // If year == 0, Construct a TDate with Jan. 1, 1901 as the "day zero".
  65.     // i.e., TDate(-1,0) = Dec. 31, 1900 and TDate(1,0) = Jan. 2, 1901.
  66.  
  67.     TDate( DayTy day, YearTy year );
  68.  
  69.     //  Construct a TDate for the given day, month, and year.
  70.     TDate( DayTy, const _TCHAR _BIDSFAR * month, YearTy );
  71.     TDate( DayTy, MonthTy, YearTy );
  72.     TDate( istream _BIDSFAR & s );      // Read date from stream.
  73.     TDate( const TTime _BIDSFAR & );    // Construct a TDate from a TTime
  74.  
  75.     string AsString() const;
  76.     int Between( const TDate _BIDSFAR & d1, const TDate _BIDSFAR & d2 ) const;
  77.     int CompareTo( const TDate _BIDSFAR & ) const;
  78.     DayTy Day() const;            // 1-365
  79.     DayTy DayOfMonth() const;     // 1-31
  80.     DayTy FirstDayOfMonth() const;
  81.     DayTy FirstDayOfMonth( MonthTy ) const;
  82.     unsigned Hash() const;
  83.     int IsValid() const;
  84.     int Leap()  const;                             // leap year?
  85.     TDate Max( const TDate _BIDSFAR & dt ) const;
  86.     TDate Min( const TDate _BIDSFAR & dt ) const;
  87.     MonthTy Month() const;
  88.     const _TCHAR _BIDSFAR *NameOfDay() const;
  89.     const _TCHAR _BIDSFAR *NameOfMonth() const;
  90.     TDate Previous( const _TCHAR _BIDSFAR *dayName ) const;  // Return date of previous dayName
  91.     TDate Previous( DayTy ) const;                // Same as above, but use day of week
  92.     DayTy WeekDay() const;
  93.     YearTy Year() const;
  94.  
  95.     // Date comparisons:
  96.     int operator <  ( const TDate _BIDSFAR & date ) const;
  97.     int operator <= ( const TDate _BIDSFAR & date ) const;
  98.     int operator >  ( const TDate _BIDSFAR & date ) const;
  99.     int operator >= ( const TDate _BIDSFAR & date ) const;
  100.     int operator == ( const TDate _BIDSFAR & date ) const;
  101.     int operator != ( const TDate _BIDSFAR & date ) const;
  102.  
  103.     // Arithmetic operators:
  104.     JulTy operator - ( const TDate _BIDSFAR & dt ) const;
  105.     friend TDate _BIDSFUNC operator + ( const TDate _BIDSFAR & dt, int dd );
  106.     friend TDate _BIDSFUNC operator + ( int dd, const TDate _BIDSFAR & dt );
  107.     friend TDate _BIDSFUNC operator - ( const TDate _BIDSFAR & dt, int dd );
  108.     void operator ++ ();
  109.     void operator -- ();
  110.     void operator += ( int dd );
  111.     void operator -= ( int dd );
  112.  
  113.     // Read or write dates:
  114.     friend ostream _BIDSFAR & _BIDSFUNC operator << ( ostream _BIDSFAR & s, const TDate _BIDSFAR & d );
  115.     friend istream _BIDSFAR & _BIDSFUNC operator >> ( istream _BIDSFAR & s, TDate _BIDSFAR & d );
  116.  
  117.     // Read or write dates on persistent streams
  118.     friend opstream _BIDSFAR & _BIDSFUNC operator << ( opstream _BIDSFAR & s, const TDate _BIDSFAR & d );
  119.     friend ipstream _BIDSFAR & _BIDSFUNC operator >> ( ipstream _BIDSFAR & s, TDate _BIDSFAR & d );
  120.  
  121.     // Static member functions:
  122.     static const _TCHAR _BIDSFAR *DayName( DayTy weekDayNumber );
  123.     static DayTy DayOfWeek( const _TCHAR _BIDSFAR * dayName );
  124.     static int DayWithinMonth( MonthTy, DayTy, YearTy );
  125.     static DayTy DaysInYear( YearTy );
  126.     static MonthTy IndexOfMonth( const _TCHAR * _BIDSFAR monthName );
  127.     static JulTy Jday( MonthTy, DayTy, YearTy );
  128.     static int LeapYear( YearTy year );
  129.     static const _TCHAR _BIDSFAR *MonthName( MonthTy monthNumber );
  130.     static HowToPrint SetPrintOption( HowToPrint h );
  131.  
  132. protected:
  133.  
  134.     static int AssertWeekDayNumber( DayTy d );
  135.     static int AssertIndexOfMonth( MonthTy m );
  136.  
  137. private:
  138.  
  139.     JulTy Julnum;                   // Julian Day Number (Not same as Julian date.)
  140.     static HowToPrint PrintOption;  // Printing with different formats
  141.  
  142.     void ParseFrom( istream _BIDSFAR & );     // Reading dates
  143.     void _BIDSNEARFUNC Mdy( MonthTy _BIDSFAR &, DayTy _BIDSFAR &, YearTy _BIDSFAR & ) const;
  144.     TDate( JulTy j );
  145.  
  146. };
  147.  
  148. #if defined( BI_OLDNAMES )
  149. #define BI_Date TDate
  150. #endif
  151.  
  152. /*------------------------------------------------------------------------*/
  153. /*                                                                        */
  154. /*  TDate inline functions                                                */
  155. /*                                                                        */
  156. /*------------------------------------------------------------------------*/
  157.  
  158. inline TDate::TDate( istream& s )
  159. {
  160.     ParseFrom(s);
  161. }
  162.  
  163. inline int TDate::Between( const TDate& d1, const TDate& d2 ) const
  164. {
  165.     return Julnum >= d1.Julnum && Julnum <= d2.Julnum;
  166. }
  167.  
  168. inline DayTy TDate::FirstDayOfMonth() const
  169. {
  170.     return FirstDayOfMonth(Month());
  171. }
  172.  
  173. inline int TDate::IsValid() const
  174. {
  175.     return Julnum>0;
  176. }
  177.  
  178. inline int TDate::Leap() const
  179. {
  180.     return LeapYear(Year());
  181. }
  182.  
  183. inline const _TCHAR *TDate::NameOfDay() const
  184. {
  185.     return DayName(WeekDay());
  186. }
  187.  
  188. inline const _TCHAR *TDate::NameOfMonth() const
  189. {
  190.     return MonthName(Month());
  191. }
  192.  
  193. inline int TDate::operator < ( const TDate& date ) const
  194. {
  195.     return Julnum < date.Julnum;
  196. }
  197.  
  198. inline int TDate::operator <= ( const TDate& date ) const
  199. {
  200.     return Julnum <= date.Julnum;
  201. }
  202.  
  203. inline int TDate::operator > ( const TDate& date ) const
  204. {
  205.     return Julnum > date.Julnum;
  206. }
  207.  
  208. inline int TDate::operator >= ( const TDate& date ) const
  209. {
  210.     return Julnum >= date.Julnum;
  211. }
  212.  
  213. inline int TDate::operator == ( const TDate& date ) const
  214. {
  215.     return Julnum == date.Julnum;
  216. }
  217.  
  218. inline int TDate::operator != ( const TDate& date ) const
  219. {
  220.     return Julnum != date.Julnum;
  221. }
  222.  
  223. inline JulTy TDate::operator - ( const TDate& dt ) const
  224. {
  225.     return Julnum - dt.Julnum;
  226. }
  227.  
  228. inline TDate _BIDSFUNC operator + ( const TDate& dt, int dd )
  229. {
  230.     return TDate(dt.Julnum + dd);
  231. }
  232.  
  233. inline TDate _BIDSFUNC operator + ( int dd, const TDate& dt )
  234. {
  235.     return TDate(dt.Julnum + dd);
  236. }
  237.  
  238. inline TDate _BIDSFUNC operator - ( const TDate& dt, int dd )
  239. {
  240.     return TDate(dt.Julnum - dd);
  241. }
  242.  
  243. inline void TDate::operator ++ ()
  244. {
  245.     Julnum += 1;
  246. }
  247.  
  248. inline void TDate::operator -- ()
  249. {
  250.     Julnum -= 1;
  251. }
  252.  
  253. inline void TDate::operator += ( int dd )
  254. {
  255.     Julnum += dd;
  256. }
  257.  
  258. inline void TDate::operator -= ( int dd )
  259. {
  260.     Julnum -= dd;
  261. }
  262.  
  263. inline istream& _BIDSFUNC operator >> ( istream& s, TDate& d )
  264. {
  265.     d.ParseFrom(s);
  266.     return s;
  267. }
  268.  
  269. inline int TDate::AssertWeekDayNumber( DayTy d )
  270. {
  271.     return d>=1 && d<=7;
  272. }
  273.  
  274. inline int TDate::AssertIndexOfMonth( MonthTy m )
  275. {
  276.     return m>=1 && m<=12;
  277. }
  278.  
  279. inline TDate::TDate( JulTy j )
  280. {
  281.     Julnum = j;
  282. }
  283.  
  284. inline HashValue( TDate _BIDSFAR & d )
  285. {
  286.     return d.Hash();
  287. }
  288.  
  289. #if defined(BI_NAMESPACE)
  290. }   // namespace ClassLib
  291. #endif
  292.  
  293. #if defined( BI_CLASSLIB_NO_po )
  294. # pragma option -po.
  295. #endif
  296.  
  297. #endif  // CLASSLIB_DATE_H
  298.