home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C Programming Starter Kit 2.0
/
SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso
/
bc45
/
classinc.pak
/
DATE.H
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-23
|
9KB
|
295 lines
/*------------------------------------------------------------------------*/
/* */
/* DATE.H */
/* */
/* Copyright (c) 1993, 1994 Borland International */
/* All Rights Reserved */
/* */
/*------------------------------------------------------------------------*/
#if !defined( CLASSLIB__DATE_H )
#define CLASSLIB__DATE_H
#if !defined(___DEFS_H)
#include <_defs.h>
#endif
#if !defined( CLASSLIB_DEFS_H )
#include <classlib/defs.h>
#endif
#if defined( BI_CLASSLIB_NO_po )
#pragma option -po-
#endif
class _EXPCLASS string;
class _EXPCLASS istream;
class _EXPCLASS ostream;
class _BIDSCLASS TTime;
class _BIDSCLASS ipstream;
class _BIDSCLASS opstream;
typedef unsigned DayTy;
typedef unsigned MonthTy;
typedef unsigned YearTy;
typedef unsigned long JulTy;
static const JulTy jul1901 = 2415386L; // Julian day for 1/1/1901
/*------------------------------------------------------------------------*/
/* */
/* class TDate */
/* */
/*------------------------------------------------------------------------*/
class _BIDSCLASS TDate
{
public:
enum HowToPrint
{
Normal,
Terse,
Numbers,
EuropeanNumbers,
European
};
// Construct a TDate with the current date
TDate();
// Construct a TDate with a given day of the year and a given year.
// The base date for this computation is Dec. 31 of the previous year.
// If year == 0, Construct a TDate with Jan. 1, 1901 as the "day zero".
// i.e., TDate(-1,0) = Dec. 31, 1900 and TDate(1,0) = Jan. 2, 1901.
TDate( DayTy day, YearTy year );
// Construct a TDate for the given day, month, and year.
TDate( DayTy, const char _BIDSFAR * month, YearTy );
TDate( DayTy, MonthTy, YearTy );
TDate( istream _BIDSFAR & s ); // Read date from stream.
TDate( const TTime _BIDSFAR & ); // Construct a TDate from a TTime
string AsString() const;
int Between( const TDate _BIDSFAR & d1, const TDate _BIDSFAR & d2 ) const;
int CompareTo( const TDate _BIDSFAR & ) const;
DayTy Day() const; // 1-365
DayTy DayOfMonth() const; // 1-31
DayTy FirstDayOfMonth() const;
DayTy FirstDayOfMonth( MonthTy ) const;
unsigned Hash() const;
int IsValid() const;
int Leap() const; // leap year?
TDate Max( const TDate _BIDSFAR & dt ) const;
TDate Min( const TDate _BIDSFAR & dt ) const;
MonthTy Month() const;
const char _BIDSFAR *NameOfDay() const;
const char _BIDSFAR *NameOfMonth() const;
TDate Previous( const char _BIDSFAR *dayName ) const; // Return date of previous dayName
TDate Previous( DayTy ) const; // Same as above, but use day of week
DayTy WeekDay() const;
YearTy Year() const;
// Date comparisons:
int operator < ( const TDate _BIDSFAR & date ) const;
int operator <= ( const TDate _BIDSFAR & date ) const;
int operator > ( const TDate _BIDSFAR & date ) const;
int operator >= ( const TDate _BIDSFAR & date ) const;
int operator == ( const TDate _BIDSFAR & date ) const;
int operator != ( const TDate _BIDSFAR & date ) const;
// Arithmetic operators:
JulTy operator - ( const TDate _BIDSFAR & dt ) const;
friend TDate _BIDSFUNC operator + ( const TDate _BIDSFAR & dt, int dd );
friend TDate _BIDSFUNC operator + ( int dd, const TDate _BIDSFAR & dt );
friend TDate _BIDSFUNC operator - ( const TDate _BIDSFAR & dt, int dd );
void operator ++ ();
void operator -- ();
void operator += ( int dd );
void operator -= ( int dd );
// Read or write dates:
friend ostream _BIDSFAR & _BIDSFUNC operator << ( ostream _BIDSFAR & s, const TDate _BIDSFAR & d );
friend istream _BIDSFAR & _BIDSFUNC operator >> ( istream _BIDSFAR & s, TDate _BIDSFAR & d );
// Read or write dates on persistent streams
friend opstream _BIDSFAR & _BIDSFUNC operator << ( opstream _BIDSFAR & s, const TDate _BIDSFAR & d );
friend ipstream _BIDSFAR & _BIDSFUNC operator >> ( ipstream _BIDSFAR & s, TDate _BIDSFAR & d );
// Static member functions:
static const char _BIDSFAR *DayName( DayTy weekDayNumber );
static DayTy DayOfWeek( const char _BIDSFAR * dayName );
static int DayWithinMonth( MonthTy, DayTy, YearTy );
static DayTy DaysInYear( YearTy );
static MonthTy IndexOfMonth( const char * _BIDSFAR monthName );
static JulTy Jday( MonthTy, DayTy, YearTy );
static int LeapYear( YearTy year );
static const char _BIDSFAR *MonthName( MonthTy monthNumber );
static HowToPrint SetPrintOption( HowToPrint h );
protected:
static int AssertWeekDayNumber( DayTy d );
static int AssertIndexOfMonth( MonthTy m );
private:
JulTy Julnum; // Julian Day Number (Not same as Julian date.)
static HowToPrint PrintOption; // Printing with different formats
void ParseFrom( istream _BIDSFAR & ); // Reading dates
void _BIDSNEARFUNC Mdy( MonthTy _BIDSFAR &, DayTy _BIDSFAR &, YearTy _BIDSFAR & ) const;
TDate( JulTy j );
};
#if defined( BI_OLDNAMES )
#define BI_Date TDate
#endif
/*------------------------------------------------------------------------*/
/* */
/* TDate inline functions */
/* */
/*------------------------------------------------------------------------*/
inline TDate::TDate( istream& s )
{
ParseFrom(s);
}
inline int TDate::Between( const TDate& d1, const TDate& d2 ) const
{
return Julnum >= d1.Julnum && Julnum <= d2.Julnum;
}
inline DayTy TDate::FirstDayOfMonth() const
{
return FirstDayOfMonth(Month());
}
inline int TDate::IsValid() const
{
return Julnum>0;
}
inline int TDate::Leap() const
{
return LeapYear(Year());
}
inline const char *TDate::NameOfDay() const
{
return DayName(WeekDay());
}
inline const char *TDate::NameOfMonth() const
{
return MonthName(Month());
}
inline int TDate::operator < ( const TDate& date ) const
{
return Julnum < date.Julnum;
}
inline int TDate::operator <= ( const TDate& date ) const
{
return Julnum <= date.Julnum;
}
inline int TDate::operator > ( const TDate& date ) const
{
return Julnum > date.Julnum;
}
inline int TDate::operator >= ( const TDate& date ) const
{
return Julnum >= date.Julnum;
}
inline int TDate::operator == ( const TDate& date ) const
{
return Julnum == date.Julnum;
}
inline int TDate::operator != ( const TDate& date ) const
{
return Julnum != date.Julnum;
}
inline JulTy TDate::operator - ( const TDate& dt ) const
{
return Julnum - dt.Julnum;
}
inline TDate _BIDSFUNC operator + ( const TDate& dt, int dd )
{
return TDate(dt.Julnum + dd);
}
inline TDate _BIDSFUNC operator + ( int dd, const TDate& dt )
{
return TDate(dt.Julnum + dd);
}
inline TDate _BIDSFUNC operator - ( const TDate& dt, int dd )
{
return TDate(dt.Julnum - dd);
}
inline void TDate::operator ++ ()
{
Julnum += 1;
}
inline void TDate::operator -- ()
{
Julnum -= 1;
}
inline void TDate::operator += ( int dd )
{
Julnum += dd;
}
inline void TDate::operator -= ( int dd )
{
Julnum -= dd;
}
inline istream& _BIDSFUNC operator >> ( istream& s, TDate& d )
{
d.ParseFrom(s);
return s;
}
inline int TDate::AssertWeekDayNumber( DayTy d )
{
return d>=1 && d<=7;
}
inline int TDate::AssertIndexOfMonth( MonthTy m )
{
return m>=1 && m<=12;
}
inline TDate::TDate( JulTy j )
{
Julnum = j;
}
inline HashValue( TDate _BIDSFAR & d )
{
return d.Hash();
}
#if defined( BI_CLASSLIB_NO_po )
#pragma option -po.
#endif
#endif // CLASSLIB_DATE_H