Index  Source Files  Annotated Class List  Alphabetical Class List  Class Hierarchy  Graphical Class Hierarchy 

FieldTypes.h

Go to the documentation of this file.
00001 /* -*- C++ -*- */
00002 
00003 /****************************************************************************
00004 ** Copyright (c) quickfixengine.org  All rights reserved.
00005 **
00006 ** This file is part of the QuickFIX FIX Engine
00007 **
00008 ** This file may be distributed under the terms of the quickfixengine.org
00009 ** license as defined by quickfixengine.org and appearing in the file
00010 ** LICENSE included in the packaging of this file.
00011 **
00012 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00013 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00014 **
00015 ** See http://www.quickfixengine.org/LICENSE for licensing information.
00016 **
00017 ** Contact ask@quickfixengine.org if any conditions of this licensing are
00018 ** not clear to you.
00019 **
00020 ****************************************************************************/
00021 
00022 #ifndef FIX_FIELDTYPES_H
00023 #define FIX_FIELDTYPES_H
00024 
00025 #ifdef _MSC_VER
00026 #pragma warning( disable : 4503 4355 4786 4290 )
00027 #endif
00028 
00029 #include "Utility.h"
00030 #include <string>
00031 #include <time.h>
00032 
00033 namespace FIX
00034 {
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 struct DateTime 
00051 {
00052   int m_date;
00053   int m_time;
00054 
00056   enum 
00057   {
00058     SECONDS_PER_DAY = 86400,
00059     SECONDS_PER_HOUR = 3600,
00060     SECONDS_PER_MIN = 60,
00061     MINUTES_PER_HOUR = 60,
00062 
00063     MILLIS_PER_DAY = 86400000,
00064     MILLIS_PER_HOUR = 3600000,
00065     MILLIS_PER_MIN = 60000,
00066     MILLIS_PER_SEC = 1000,
00067 
00068     // time_t epoch (1970-01-01) as a Julian date
00069     JULIAN_19700101 = 2440588
00070   };
00071 
00073   DateTime () : m_date (0), m_time (0) {}
00074 
00076   DateTime (int date, int time) : m_date (date), m_time (time) {}
00077 
00079   DateTime( int year, int month, int day,
00080             int hour, int minute, int second, int millis ) 
00081   {
00082     m_date = julianDate( year, month, day );
00083     m_time = makeHMS( hour, minute, second, millis );
00084   }
00085 
00086   virtual ~DateTime() {}
00087 
00089   inline int getYear() const 
00090   {
00091     int y, m, d;
00092     getYMD( y, m, d );
00093     return y;
00094   }
00095     
00097   inline int getMonth() const 
00098   {
00099     int y, m, d;
00100     getYMD( y, m, d );
00101     return m;
00102   }
00103 
00105   inline int getDay() const 
00106   {
00107     int y, m, d;
00108     getYMD( y, m, d );
00109     return d;
00110   }
00111 
00114   inline int getDate() const { return getDay(); }
00115 
00117   inline int getJulianDate() const { return m_date; }
00118 
00120   inline int getHour() const 
00121   {
00122     return m_time / MILLIS_PER_HOUR;
00123   }
00124 
00126   inline int getMinute() const 
00127   {
00128     return (m_time / MILLIS_PER_MIN) % MINUTES_PER_HOUR;
00129   }
00130 
00132   inline int getSecond() const 
00133   {
00134     return (m_time / MILLIS_PER_SEC) % SECONDS_PER_MIN;
00135   }
00136 
00138   inline int getMillisecond() const 
00139   {
00140     return m_time % MILLIS_PER_SEC;
00141   }
00142 
00145   inline void getYMD (int& year, int& month, int& day) const 
00146   {
00147     getYMD( m_date, year, month, day );
00148   }
00149 
00152   inline void getHMS( int& hour, int& minute, int& second, int& millis ) const 
00153   {
00154     int ticks = m_time / MILLIS_PER_SEC;
00155     hour = ticks / SECONDS_PER_HOUR;
00156     minute = (ticks / SECONDS_PER_MIN) % MINUTES_PER_HOUR;
00157     second = ticks % SECONDS_PER_MIN;
00158     millis = m_time % MILLIS_PER_SEC;
00159   }
00160 
00162   inline int getWeekDay() const 
00163   {
00164     int Y, M, D;
00165     getYMD (Y, M, D);
00166     int m = M >= 3 ? M - 2 : M + 10;
00167     int Yprime = M >= 3 ? Y : Y - 1;
00168     int y = Yprime % 100;
00169     int c = Yprime / 100;
00170     int wd = (D + int (2.6 * m - 0.2) + y + int (y / 4) + int (c / 4) -
00171               (2 * c)) % 7;
00172     return 1 + (wd < 0 ? 7 + wd : wd);
00173   }
00174 
00177   inline time_t getTimeT() const 
00178   {
00179     return (SECONDS_PER_DAY * (m_date - JULIAN_19700101) +
00180             m_time / MILLIS_PER_SEC);
00181   }
00182 
00184   tm getTmUtc() const 
00185   {
00186     int year, month, day;
00187     int hour, minute, second, millis;
00188     tm result = { 0 };
00189 
00190     getYMD( year, month, day );
00191     getHMS( hour, minute, second, millis );
00192 
00193     result.tm_year = year - 1900;
00194     result.tm_mon = month - 1;
00195     result.tm_mday = day;
00196     result.tm_hour = hour;
00197     result.tm_min = minute;
00198     result.tm_sec = second;
00199     result.tm_isdst = -1;
00200 
00201     return result;
00202   }
00203 
00205   void setYMD( int year, int month, int day ) 
00206   {
00207     m_date = julianDate( year, month, day );
00208   }
00209 
00211   void setHMS( int hour, int minute, int second, int millis )
00212   {
00213     m_time = makeHMS( hour, minute, second, millis );
00214   }
00215 
00217   void setHour( int hour )
00218   {
00219     int old_hour, min, sec, millis;
00220     getHMS( old_hour, min, sec, millis );
00221     setHMS( hour, min, sec, millis );
00222   }
00223 
00225   void setMinute( int min )
00226   {
00227     int hour, old_min, sec, millis;
00228     getHMS( hour, old_min, sec, millis );
00229     setHMS( hour, min, sec, millis );
00230   }
00231 
00233   void setSecond( int sec )
00234   {
00235     int hour, min, old_sec, millis;
00236     getHMS( hour, min, old_sec, millis );
00237     setHMS( hour, min, sec, millis );
00238   }
00239 
00241   void setMillisecond( int millis )
00242   {
00243     int hour, min, sec, old_millis;
00244     getHMS( hour, min, sec, old_millis );
00245     setHMS( hour, min, sec, millis );
00246   }
00247 
00249   void clearDate() 
00250   {
00251     m_date = 0;
00252   }
00253 
00255   void clearTime() 
00256   {
00257     m_time = 0;
00258   }
00259 
00261   void set( int date, int time ) { m_date = date; m_time = time; }
00262 
00264   void set( const DateTime& other ) 
00265   {
00266     m_date = other.m_date;
00267     m_time = other.m_time;
00268   }
00269 
00271   void operator+=( int seconds ) 
00272   {
00273     int d = seconds / SECONDS_PER_DAY;
00274     int s = seconds % SECONDS_PER_DAY;
00275 
00276     m_date += d;
00277     m_time += s * MILLIS_PER_SEC;
00278 
00279     if( m_time > MILLIS_PER_DAY )
00280     {
00281       m_date++;
00282       m_time %= MILLIS_PER_DAY;
00283     }
00284     else if( m_time < 0 )
00285     {
00286       m_date--;
00287       m_time += MILLIS_PER_DAY;
00288     }
00289   }
00290 
00293   static int makeHMS( int hour, int minute, int second, int millis )
00294   {
00295     return MILLIS_PER_SEC * (SECONDS_PER_HOUR * hour +
00296                              SECONDS_PER_MIN * minute +
00297                              second) + millis;
00298   }
00299 
00301   static DateTime nowUtc();
00302 
00304   static DateTime nowLocal();
00305 
00307   static DateTime fromUtcTimeT( time_t t, int millis = 0 ) 
00308   {
00309     struct tm tm = time_gmtime( &t );
00310     return fromTm( tm, millis );
00311   }
00312 
00313   static DateTime fromLocalTimeT( time_t t, int millis = 0 )
00314   {
00315     struct tm tm = time_localtime( &t );
00316     return fromTm( tm, millis );
00317   }
00318 
00321   static DateTime fromTm( const tm& tm, int millis = 0 )
00322   {
00323     return DateTime ( julianDate(tm.tm_year + 1900, tm.tm_mon + 1,
00324                                  tm.tm_mday),
00325                      makeHMS(tm.tm_hour, tm.tm_min, tm.tm_sec, millis) );
00326   }
00327 
00329   static int julianDate( int year, int month, int day )
00330   {
00331     int a = (14 - month) / 12;
00332     int y = year + 4800 - a;
00333     int m = month + 12 * a - 3;
00334     return (day + int ((153 * m + 2) / 5) + y * 365 +
00335             int (y / 4) - int (y / 100) + int (y / 400) - 32045);
00336   }
00337 
00339   static void getYMD( int jday, int& year, int& month, int& day )
00340   {
00341     int a = jday + 32044;
00342     int b = (4 * a + 3) / 146097;
00343     int c = a - int ((b * 146097) / 4);
00344     int d = (4 * c + 3) / 1461;
00345     int e = c - int ((1461 * d) / 4);
00346     int m = (5 * e + 2) / 153;
00347     day = e - int ((153 * m + 2) / 5) + 1;
00348     month = m + 3 - 12 * int (m / 10);
00349     year = b * 100 + d - 4800 + int (m / 10);
00350   }
00351 };
00352 
00353 inline bool operator==( const DateTime& lhs, const DateTime& rhs )
00354 {
00355   return lhs.m_date == rhs.m_date && lhs.m_time == rhs.m_time;
00356 }
00357 
00358 inline bool operator!=( const DateTime& lhs, const DateTime& rhs )
00359 {
00360   return !(lhs == rhs);
00361 }
00362 
00363 inline bool operator<( const DateTime& lhs, const DateTime& rhs )
00364 {
00365   if( lhs.m_date < rhs.m_date )
00366     return true;
00367   else if( lhs.m_date > rhs.m_date )
00368     return false;
00369   else if( lhs.m_time < rhs.m_time )
00370     return true;
00371   return false;
00372 }
00373 
00374 inline bool operator>( const DateTime& lhs, const DateTime& rhs )
00375 {
00376   return !(lhs == rhs || lhs < rhs);
00377 }
00378 
00379 inline bool operator<=( const DateTime& lhs, const DateTime& rhs )
00380 {
00381   return lhs == rhs || lhs < rhs;
00382 }
00383 
00384 inline bool operator>=( const DateTime& lhs, const DateTime& rhs )
00385 {
00386   return lhs == rhs || lhs > rhs;
00387 }
00388 
00391 inline int operator-( const DateTime& lhs, const DateTime& rhs )
00392 {
00393   return (DateTime::SECONDS_PER_DAY * (lhs.m_date - rhs.m_date) +
00394           // Truncate the millis before subtracting
00395           lhs.m_time / 1000 - rhs.m_time / 1000);
00396 }
00397 
00399 class UtcTimeStamp : public DateTime
00400 {
00401 public:
00403   UtcTimeStamp()
00404   : DateTime( DateTime::nowUtc() ) {}
00405 
00407   UtcTimeStamp( int hour, int minute, int second, int millisecond = 0 )
00408   : DateTime( DateTime::nowUtc() )
00409   {
00410     setHMS( hour, minute, second, millisecond );
00411   }
00412 
00413   UtcTimeStamp( int hour, int minute, int second,
00414                 int date, int month, int year )
00415   : DateTime( year, month, date, hour, minute, second, 0 ) {}
00416 
00417   UtcTimeStamp( int hour, int minute, int second, int millisecond,
00418                 int date, int month, int year )
00419   : DateTime( year, month, date, hour, minute, second, millisecond ) {}
00420 
00421   UtcTimeStamp( time_t time, int millisecond = 0 )
00422   : DateTime( fromUtcTimeT (time, millisecond) ) {}
00423 
00424   UtcTimeStamp( const tm* time, int millisecond = 0 )
00425   : DateTime( fromTm (*time, millisecond) ) {}
00426 
00427   void setCurrent() 
00428   {
00429     set( DateTime::nowUtc() );
00430   }
00431 };
00432 
00434 class LocalTimeStamp : public DateTime
00435 {
00436 public:
00438   LocalTimeStamp()
00439   : DateTime( DateTime::nowLocal() ) {}
00440 
00442   LocalTimeStamp( int hour, int minute, int second, int millisecond = 0 )
00443   : DateTime( DateTime::nowLocal() )
00444   {
00445     setHMS( hour, minute, second, millisecond );
00446   }
00447 
00448   LocalTimeStamp( int hour, int minute, int second,
00449                 int date, int month, int year )
00450   : DateTime( year, month, date, hour, minute, second, 0 ) {}
00451 
00452   LocalTimeStamp( int hour, int minute, int second, int millisecond,
00453                 int date, int month, int year )
00454   : DateTime( year, month, date, hour, minute, second, millisecond ) {}
00455 
00456   LocalTimeStamp( time_t time, int millisecond = 0 )
00457   : DateTime( fromLocalTimeT (time, millisecond) ) {}
00458 
00459   LocalTimeStamp( const tm* time, int millisecond = 0 )
00460   : DateTime( fromTm (*time, millisecond) ) {}
00461 
00462   void setCurrent() 
00463   {
00464     set( DateTime::nowLocal() );
00465   }
00466 };
00467 
00469 class UtcTimeOnly : public DateTime
00470 {
00471 public:
00473   UtcTimeOnly()
00474   {
00475     setCurrent();
00476   }
00477 
00478   UtcTimeOnly( const DateTime& val )
00479   : DateTime(val)
00480   {
00481     clearDate();
00482   }
00483 
00484   UtcTimeOnly( int hour, int minute, int second, int millisecond = 0 )
00485   {
00486     setHMS( hour, minute, second, millisecond );
00487   }
00488 
00489   UtcTimeOnly( time_t time, int millisecond = 0 )
00490   : DateTime( fromUtcTimeT (time, millisecond) )
00491   {
00492     clearDate();
00493   }
00494 
00495   UtcTimeOnly( const tm* time, int millisecond = 0 )
00496   : DateTime( fromTm (*time, millisecond) )
00497   {
00498     clearDate();
00499   }
00500 
00502   void setCurrent()
00503   {
00504     DateTime d = nowUtc();
00505     m_time = d.m_time;
00506   }
00507 };
00508 
00510 class LocalTimeOnly : public DateTime
00511 {
00512 public:
00514   LocalTimeOnly()
00515   {
00516     setCurrent();
00517   }
00518 
00519   LocalTimeOnly( const DateTime& val )
00520   : DateTime(val)
00521   {
00522     clearDate();
00523   }
00524 
00525   LocalTimeOnly( int hour, int minute, int second, int millisecond = 0 )
00526   {
00527     setHMS( hour, minute, second, millisecond );
00528   }
00529 
00530   LocalTimeOnly( time_t time, int millisecond = 0 )
00531   : DateTime( fromLocalTimeT (time, millisecond) )
00532   {
00533     clearDate();
00534   }
00535 
00536   LocalTimeOnly( const tm* time, int millisecond = 0 )
00537   : DateTime( fromTm (*time, millisecond) )
00538   {
00539     clearDate();
00540   }
00541 
00543   void setCurrent()
00544   {
00545     DateTime d = nowLocal();
00546     m_time = d.m_time;
00547   }
00548 };
00549 
00551 class UtcDate : public DateTime
00552 {
00553 public:
00555   UtcDate()
00556   {
00557     setCurrent();
00558   }
00559 
00560   UtcDate( const DateTime& val )
00561   : DateTime( val )
00562   {
00563     clearTime();
00564   }
00565 
00566   UtcDate( int date, int month, int year )
00567   : DateTime(year, month, date, 0, 0, 0, 0) {}
00568 
00569   UtcDate( long sec )
00570   : DateTime( sec / DateTime::SECONDS_PER_DAY, 0 ) {}
00571 
00572   UtcDate( const tm* time )
00573   : DateTime( fromTm (*time) )
00574   {
00575     clearTime();
00576   }
00577 
00579   void setCurrent()
00580   {
00581     DateTime d = nowUtc();
00582     m_date = d.m_date;
00583   }
00584 };
00585 
00587 class LocalDate : public DateTime
00588 {
00589 public:
00591   LocalDate()
00592   {
00593     setCurrent();
00594   }
00595 
00596   LocalDate( const DateTime& val )
00597   : DateTime( val )
00598   {
00599     clearTime();
00600   }
00601 
00602   LocalDate( int date, int month, int year )
00603   : DateTime(year, month, date, 0, 0, 0, 0) {}
00604 
00605   LocalDate( long sec )
00606   : DateTime( sec / DateTime::SECONDS_PER_DAY, 0 ) {}
00607 
00608   LocalDate( const tm* time )
00609   : DateTime( fromTm (*time) )
00610   {
00611     clearTime();
00612   }
00613 
00615   void setCurrent()
00616   {
00617     DateTime d = nowLocal();
00618     m_date = d.m_date;
00619   }
00620 };
00621 
00624 typedef UtcDate UtcDateOnly;
00625 
00626 typedef std::string FIX_STRING;
00627 typedef char FIX_CHAR;
00628 typedef double FIX_PRICE;
00629 typedef int FIX_INT;
00630 typedef double FIX_AMT;
00631 typedef double FIX_QTY;
00632 typedef std::string FIX_CURRENCY;
00633 typedef std::string FIX_MULTIPLEVALUESTRING;
00634 typedef std::string FIX_MULTIPLESTRINGVALUE;
00635 typedef std::string FIX_MULTIPLECHARVALUE;
00636 typedef std::string FIX_EXCHANGE;
00637 typedef UtcTimeStamp FIX_UTCTIMESTAMP;
00638 typedef bool FIX_BOOLEAN;
00639 typedef std::string FIX_LOCALMKTDATE;
00640 typedef std::string FIX_DATA;
00641 typedef double FIX_FLOAT;
00642 typedef double FIX_PRICEOFFSET;
00643 typedef std::string FIX_MONTHYEAR;
00644 typedef std::string FIX_DAYOFMONTH;
00645 typedef UtcDate FIX_UTCDATE;
00646 typedef UtcDateOnly FIX_UTCDATEONLY;
00647 typedef UtcTimeOnly FIX_UTCTIMEONLY;
00648 typedef int FIX_NUMINGROUP;
00649 typedef double FIX_PERCENTAGE;
00650 typedef int FIX_SEQNUM;
00651 typedef int FIX_LENGTH;
00652 typedef std::string FIX_COUNTRY;
00653 typedef std::string FIX_TZTIMEONLY;
00654 typedef std::string FIX_TZTIMESTAMP;
00655 
00656 namespace TYPE
00657 {
00658 enum Type
00659 {
00660   Unknown,
00661   String,
00662   Char,
00663   Price,
00664   Int,
00665   Amt,
00666   Qty,
00667   Currency,
00668   MultipleValueString,
00669   MultipleStringValue,
00670   MultipleCharValue,
00671   Exchange,
00672   UtcTimeStamp,
00673   Boolean,
00674   LocalMktDate,
00675   Data,
00676   Float,
00677   PriceOffset,
00678   MonthYear,
00679   DayOfMonth,
00680   UtcDate,
00681   UtcDateOnly = UtcDate,
00682   UtcTimeOnly,
00683   NumInGroup,
00684   Percentage,
00685   SeqNum,
00686   Length,
00687   Country,
00688   TzTimeOnly,
00689   TzTimeStamp
00690 };
00691 }
00692 }
00693 
00694 #endif //FIX_FIELDTYPES_H

Generated on Mon Mar 1 13:41:38 2010 for QuickFIX by doxygen 1.5.8 written by Dimitri van Heesch, © 1997-2001