quickfix_ruby 1.14.3.1 → 1.15.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/quickfix/Acceptor.h +2 -0
- data/ext/quickfix/AtomicCount.h +82 -12
- data/ext/quickfix/DOMDocument.h +9 -7
- data/ext/quickfix/DataDictionary.cpp +77 -14
- data/ext/quickfix/DataDictionary.h +90 -16
- data/ext/quickfix/Dictionary.cpp +1 -2
- data/ext/quickfix/Exceptions.h +3 -5
- data/ext/quickfix/Field.h +83 -32
- data/ext/quickfix/FieldConvertors.cpp +93 -0
- data/ext/quickfix/FieldConvertors.h +129 -275
- data/ext/quickfix/FieldMap.cpp +53 -13
- data/ext/quickfix/FieldMap.h +200 -62
- data/ext/quickfix/FieldTypes.cpp +10 -10
- data/ext/quickfix/FieldTypes.h +293 -44
- data/ext/quickfix/FileLog.cpp +6 -10
- data/ext/quickfix/FileLog.h +4 -10
- data/ext/quickfix/FileStore.cpp +19 -6
- data/ext/quickfix/FileStore.h +4 -0
- data/ext/quickfix/FixFieldNumbers.h +1462 -1461
- data/ext/quickfix/FixFields.h +1462 -1461
- data/ext/quickfix/FixValues.h +3230 -3227
- data/ext/quickfix/HttpConnection.cpp +1 -1
- data/ext/quickfix/Initiator.cpp +7 -1
- data/ext/quickfix/Initiator.h +2 -0
- data/ext/quickfix/Log.h +6 -12
- data/ext/quickfix/Message.cpp +186 -57
- data/ext/quickfix/Message.h +109 -47
- data/ext/quickfix/MySQLConnection.h +1 -1
- data/ext/quickfix/PostgreSQLConnection.h +1 -1
- data/ext/quickfix/QuickfixRuby.cpp +79141 -77959
- data/ext/quickfix/QuickfixRuby.h +1 -1
- data/ext/quickfix/SSLSocketAcceptor.cpp +410 -0
- data/ext/quickfix/SSLSocketAcceptor.h +185 -0
- data/ext/quickfix/SSLSocketConnection.cpp +427 -0
- data/ext/quickfix/SSLSocketConnection.h +206 -0
- data/ext/quickfix/SSLSocketInitiator.cpp +485 -0
- data/ext/quickfix/SSLSocketInitiator.h +196 -0
- data/ext/quickfix/Session.cpp +113 -20
- data/ext/quickfix/Session.h +18 -4
- data/ext/quickfix/SessionFactory.cpp +10 -3
- data/ext/quickfix/SessionSettings.cpp +5 -3
- data/ext/quickfix/SessionSettings.h +97 -5
- data/ext/quickfix/Settings.cpp +72 -2
- data/ext/quickfix/Settings.h +3 -0
- data/ext/quickfix/SharedArray.h +140 -6
- data/ext/quickfix/SocketConnection.cpp +2 -2
- data/ext/quickfix/SocketConnector.cpp +5 -2
- data/ext/quickfix/SocketConnector.h +3 -2
- data/ext/quickfix/SocketInitiator.cpp +28 -4
- data/ext/quickfix/SocketInitiator.h +1 -1
- data/ext/quickfix/SocketMonitor.cpp +5 -5
- data/ext/quickfix/ThreadedSSLSocketAcceptor.cpp +455 -0
- data/ext/quickfix/ThreadedSSLSocketAcceptor.h +217 -0
- data/ext/quickfix/ThreadedSSLSocketConnection.cpp +404 -0
- data/ext/quickfix/ThreadedSSLSocketConnection.h +189 -0
- data/ext/quickfix/ThreadedSSLSocketInitiator.cpp +469 -0
- data/ext/quickfix/ThreadedSSLSocketInitiator.h +201 -0
- data/ext/quickfix/ThreadedSocketAcceptor.cpp +5 -1
- data/ext/quickfix/ThreadedSocketConnection.cpp +8 -2
- data/ext/quickfix/ThreadedSocketConnection.h +4 -1
- data/ext/quickfix/ThreadedSocketInitiator.cpp +24 -4
- data/ext/quickfix/ThreadedSocketInitiator.h +1 -1
- data/ext/quickfix/Utility.cpp +23 -1
- data/ext/quickfix/Utility.h +28 -2
- data/ext/quickfix/UtilitySSL.cpp +1733 -0
- data/ext/quickfix/UtilitySSL.h +277 -0
- data/ext/quickfix/config-all.h +10 -0
- data/ext/quickfix/dirent_windows.h +838 -0
- data/ext/quickfix/double-conversion/bignum-dtoa.cc +641 -0
- data/ext/quickfix/double-conversion/bignum-dtoa.h +84 -0
- data/ext/quickfix/double-conversion/bignum.cc +766 -0
- data/ext/quickfix/double-conversion/bignum.h +144 -0
- data/ext/quickfix/double-conversion/cached-powers.cc +176 -0
- data/ext/quickfix/double-conversion/cached-powers.h +64 -0
- data/ext/quickfix/double-conversion/diy-fp.cc +57 -0
- data/ext/quickfix/double-conversion/diy-fp.h +118 -0
- data/ext/quickfix/double-conversion/double-conversion.cc +994 -0
- data/ext/quickfix/double-conversion/double-conversion.h +543 -0
- data/ext/quickfix/double-conversion/fast-dtoa.cc +665 -0
- data/ext/quickfix/double-conversion/fast-dtoa.h +88 -0
- data/ext/quickfix/double-conversion/fixed-dtoa.cc +404 -0
- data/ext/quickfix/double-conversion/fixed-dtoa.h +56 -0
- data/ext/quickfix/double-conversion/ieee.h +402 -0
- data/ext/quickfix/double-conversion/strtod.cc +557 -0
- data/ext/quickfix/double-conversion/strtod.h +45 -0
- data/ext/quickfix/double-conversion/utils.h +372 -0
- data/ext/quickfix/stdint_msvc.h +254 -0
- data/lib/quickfix44.rb +3329 -10
- data/lib/quickfix50.rb +6649 -81
- data/lib/quickfix50sp1.rb +8054 -142
- data/lib/quickfix50sp2.rb +10900 -234
- data/lib/quickfix_fields.rb +7662 -7649
- data/spec/FIX40.xml +28 -28
- data/spec/FIX41.xml +29 -29
- data/spec/FIX42.xml +47 -47
- data/spec/FIX43.xml +148 -148
- data/spec/FIX44.xml +1078 -1081
- data/spec/FIX50.xml +1292 -1289
- data/spec/FIX50SP1.xml +1811 -1802
- data/spec/FIX50SP2.xml +1948 -1939
- data/spec/FIXT11.xml +5 -8
- data/test/test_FieldBaseTestCase.rb +1 -1
- data/test/test_MessageTestCase.rb +2 -2
- metadata +42 -6
data/ext/quickfix/FieldTypes.cpp
CHANGED
@@ -33,14 +33,14 @@ namespace FIX {
|
|
33
33
|
|
34
34
|
DateTime DateTime::nowUtc()
|
35
35
|
{
|
36
|
-
#if defined(
|
36
|
+
#if defined( _POSIX_SOURCE ) || defined(HAVE_GETTIMEOFDAY)
|
37
|
+
struct timeval tv;
|
38
|
+
gettimeofday (&tv, 0);
|
39
|
+
return fromUtcTimeT( tv.tv_sec, tv.tv_usec, 6 );
|
40
|
+
#elif defined( HAVE_FTIME )
|
37
41
|
timeb tb;
|
38
42
|
ftime (&tb);
|
39
43
|
return fromUtcTimeT (tb.time, tb.millitm);
|
40
|
-
#elif defined( _POSIX_SOURCE )
|
41
|
-
struct timeval tv;
|
42
|
-
gettimeofday (&tv, 0);
|
43
|
-
return fromUtcTimeT( tv.tv_sec, tv.tv_usec / 1000 );
|
44
44
|
#else
|
45
45
|
return fromUtcTimeT( ::time (0), 0 );
|
46
46
|
#endif
|
@@ -48,14 +48,14 @@ DateTime DateTime::nowUtc()
|
|
48
48
|
|
49
49
|
DateTime DateTime::nowLocal()
|
50
50
|
{
|
51
|
-
#if defined(
|
51
|
+
#if defined( _POSIX_SOURCE ) || defined(HAVE_GETTIMEOFDAY)
|
52
|
+
struct timeval tv;
|
53
|
+
gettimeofday (&tv, 0);
|
54
|
+
return fromLocalTimeT( tv.tv_sec, tv.tv_usec, 6 );
|
55
|
+
#elif defined( HAVE_FTIME )
|
52
56
|
timeb tb;
|
53
57
|
ftime (&tb);
|
54
58
|
return fromLocalTimeT( tb.time, tb.millitm );
|
55
|
-
#elif defined( _POSIX_SOURCE )
|
56
|
-
struct timeval tv;
|
57
|
-
gettimeofday (&tv, 0);
|
58
|
-
return fromLocalTimeT( tv.tv_sec, tv.tv_usec / 1000 );
|
59
59
|
#else
|
60
60
|
return fromLocalTimeT( ::time (0), 0 );
|
61
61
|
#endif
|
data/ext/quickfix/FieldTypes.h
CHANGED
@@ -26,6 +26,12 @@
|
|
26
26
|
#pragma warning( disable : 4503 4355 4786 4290 )
|
27
27
|
#endif
|
28
28
|
|
29
|
+
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
30
|
+
#include "stdint_msvc.h"
|
31
|
+
#else
|
32
|
+
#include <stdint.h> /* integer types int8_t .. uint64_t, intptr_t */
|
33
|
+
#endif
|
34
|
+
|
29
35
|
#include "Utility.h"
|
30
36
|
#include <string>
|
31
37
|
#include <time.h>
|
@@ -37,7 +43,7 @@ namespace FIX
|
|
37
43
|
*/
|
38
44
|
|
39
45
|
/// Date and Time stored as a Julian day number and number of
|
40
|
-
///
|
46
|
+
/// nanoseconds since midnight. Does not perform any timezone
|
41
47
|
/// calculations. All magic numbers and related calculations
|
42
48
|
/// have been taken from:
|
43
49
|
///
|
@@ -47,40 +53,50 @@ namespace FIX
|
|
47
53
|
/// \sa http://scienceworld.wolfram.com/astronomy/Weekday.html
|
48
54
|
///
|
49
55
|
/// \author Caleb Epstein <caleb.epstein at gmail dot com>
|
56
|
+
|
57
|
+
// Precision factor of timestamp. [0] - second, [9] - nanosecond
|
58
|
+
static const int PRECISION_FACTOR[10] = {1000000000, 100000000, 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};
|
59
|
+
|
50
60
|
struct DateTime
|
51
61
|
{
|
52
62
|
int m_date;
|
53
|
-
|
63
|
+
int64_t m_time;
|
54
64
|
|
55
65
|
/// Magic numbers
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
SECONDS_PER_MIN = 60,
|
61
|
-
MINUTES_PER_HOUR = 60,
|
66
|
+
static const int64_t SECONDS_PER_DAY = 86400;
|
67
|
+
static const int64_t SECONDS_PER_HOUR = 3600;
|
68
|
+
static const int64_t SECONDS_PER_MIN = 60;
|
69
|
+
static const int64_t MINUTES_PER_HOUR = 60;
|
62
70
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
71
|
+
static const int64_t NANOS_PER_DAY = 86400000000000;
|
72
|
+
static const int64_t NANOS_PER_HOUR = 3600000000000;
|
73
|
+
static const int64_t NANOS_PER_MIN = 60000000000;
|
74
|
+
static const int64_t NANOS_PER_SEC = 1000000000;
|
67
75
|
|
68
|
-
|
69
|
-
|
70
|
-
};
|
76
|
+
// time_t epoch (1970-01-01) as a Julian date
|
77
|
+
static const int64_t JULIAN_19700101 = 2440588;
|
71
78
|
|
72
79
|
/// Default constructor - initializes to zero
|
73
80
|
DateTime () : m_date (0), m_time (0) {}
|
74
81
|
|
75
82
|
/// Construct from a Julian day number and time in millis
|
76
|
-
DateTime (int date,
|
83
|
+
DateTime (int date, int64_t time) : m_date (date), m_time (time) {}
|
77
84
|
|
78
85
|
/// Construct from the specified components
|
79
86
|
DateTime( int year, int month, int day,
|
80
87
|
int hour, int minute, int second, int millis )
|
81
88
|
{
|
82
89
|
m_date = julianDate( year, month, day );
|
83
|
-
m_time = makeHMS( hour, minute, second, millis );
|
90
|
+
m_time = makeHMS( hour, minute, second, millis * PRECISION_FACTOR[3] );
|
91
|
+
}
|
92
|
+
|
93
|
+
/// Construct from the specified components
|
94
|
+
DateTime( int year, int month, int day,
|
95
|
+
int hour, int minute, int second, int fraction, int precision )
|
96
|
+
{
|
97
|
+
m_date = julianDate( year, month, day );
|
98
|
+
int nanos = convertToNanos(fraction, precision);
|
99
|
+
m_time = makeHMS( hour, minute, second, nanos );
|
84
100
|
}
|
85
101
|
|
86
102
|
virtual ~DateTime() {}
|
@@ -117,27 +133,77 @@ struct DateTime
|
|
117
133
|
inline int getJulianDate() const { return m_date; }
|
118
134
|
|
119
135
|
/// Return the hour portion of the time (0-23)
|
120
|
-
inline int getHour() const
|
136
|
+
inline int getHour() const
|
121
137
|
{
|
122
|
-
return m_time /
|
138
|
+
return (int)(m_time / NANOS_PER_HOUR);
|
123
139
|
}
|
124
140
|
|
125
141
|
/// Return the minute portion of the time (0-59)
|
126
|
-
inline int getMinute() const
|
142
|
+
inline int getMinute() const
|
127
143
|
{
|
128
|
-
return (m_time /
|
144
|
+
return (m_time / NANOS_PER_MIN) % MINUTES_PER_HOUR;
|
129
145
|
}
|
130
146
|
|
131
147
|
/// Return the second portion of the time (0-59)
|
132
|
-
inline int getSecond() const
|
148
|
+
inline int getSecond() const
|
149
|
+
{
|
150
|
+
return (m_time / NANOS_PER_SEC) % SECONDS_PER_MIN;
|
151
|
+
}
|
152
|
+
|
153
|
+
/// Return the millisecond portion of the time (0-999)
|
154
|
+
inline int getMillisecond() const
|
133
155
|
{
|
134
|
-
return (
|
156
|
+
return (getNanosecond() / PRECISION_FACTOR[3]);
|
135
157
|
}
|
136
158
|
|
137
|
-
/// Return the
|
138
|
-
inline int
|
159
|
+
/// Return the microsecond portion of the time
|
160
|
+
inline int getMicroecond() const
|
139
161
|
{
|
140
|
-
return
|
162
|
+
return (getNanosecond() / PRECISION_FACTOR[6]);
|
163
|
+
}
|
164
|
+
|
165
|
+
/// Return the nanosecond portion of the time
|
166
|
+
inline unsigned int getNanosecond() const
|
167
|
+
{
|
168
|
+
return static_cast<uint64_t>(m_time) % NANOS_PER_SEC;
|
169
|
+
}
|
170
|
+
|
171
|
+
/// Return the fraction portion of the time
|
172
|
+
inline int getFraction(int precision) const
|
173
|
+
{
|
174
|
+
switch (precision)
|
175
|
+
{
|
176
|
+
case 0:
|
177
|
+
return (getNanosecond() / PRECISION_FACTOR[0]);
|
178
|
+
|
179
|
+
case 1:
|
180
|
+
return (getNanosecond() / PRECISION_FACTOR[1]);
|
181
|
+
|
182
|
+
case 2:
|
183
|
+
return (getNanosecond() / PRECISION_FACTOR[2]);
|
184
|
+
|
185
|
+
case 3:
|
186
|
+
return (getNanosecond() / PRECISION_FACTOR[3]);
|
187
|
+
|
188
|
+
case 4:
|
189
|
+
return (getNanosecond() / PRECISION_FACTOR[4]);
|
190
|
+
|
191
|
+
case 5:
|
192
|
+
return (getNanosecond() / PRECISION_FACTOR[5]);
|
193
|
+
|
194
|
+
case 6:
|
195
|
+
return (getNanosecond() / PRECISION_FACTOR[6]);
|
196
|
+
|
197
|
+
case 7:
|
198
|
+
return (getNanosecond() / PRECISION_FACTOR[7]);
|
199
|
+
|
200
|
+
case 8:
|
201
|
+
return (getNanosecond() / PRECISION_FACTOR[8]);
|
202
|
+
|
203
|
+
case 9:
|
204
|
+
default:
|
205
|
+
return (getNanosecond() / PRECISION_FACTOR[9]);
|
206
|
+
}
|
141
207
|
}
|
142
208
|
|
143
209
|
/// Load the referenced values with the year, month and day
|
@@ -151,11 +217,22 @@ struct DateTime
|
|
151
217
|
/// millisecond portions of the time in a single operation
|
152
218
|
inline void getHMS( int& hour, int& minute, int& second, int& millis ) const
|
153
219
|
{
|
154
|
-
int ticks = m_time /
|
220
|
+
int ticks = (int)(m_time / NANOS_PER_SEC);
|
221
|
+
hour = ticks / SECONDS_PER_HOUR;
|
222
|
+
minute = (ticks / SECONDS_PER_MIN) % MINUTES_PER_HOUR;
|
223
|
+
second = ticks % SECONDS_PER_MIN;
|
224
|
+
millis = getMillisecond();
|
225
|
+
}
|
226
|
+
|
227
|
+
/// Load the referenced values with the hour, minute, second and
|
228
|
+
/// fraction portions of the time in a single operation
|
229
|
+
inline void getHMS( int& hour, int& minute, int& second, int& fraction, int precision ) const
|
230
|
+
{
|
231
|
+
int ticks = (int)(m_time / NANOS_PER_SEC);
|
155
232
|
hour = ticks / SECONDS_PER_HOUR;
|
156
233
|
minute = (ticks / SECONDS_PER_MIN) % MINUTES_PER_HOUR;
|
157
234
|
second = ticks % SECONDS_PER_MIN;
|
158
|
-
|
235
|
+
fraction = getFraction(precision);
|
159
236
|
}
|
160
237
|
|
161
238
|
/// Calculate the weekday of the date (Sunday is 1, Saturday is 7)
|
@@ -177,7 +254,7 @@ struct DateTime
|
|
177
254
|
inline time_t getTimeT() const
|
178
255
|
{
|
179
256
|
return (SECONDS_PER_DAY * (m_date - JULIAN_19700101) +
|
180
|
-
m_time /
|
257
|
+
m_time / NANOS_PER_SEC);
|
181
258
|
}
|
182
259
|
|
183
260
|
/// Convert the DateTime to a struct tm which is in UTC
|
@@ -210,7 +287,15 @@ struct DateTime
|
|
210
287
|
/// Set the time portion of the DateTime
|
211
288
|
void setHMS( int hour, int minute, int second, int millis )
|
212
289
|
{
|
213
|
-
m_time = makeHMS( hour, minute, second, millis );
|
290
|
+
m_time = makeHMS( hour, minute, second, millis * PRECISION_FACTOR[3] );
|
291
|
+
}
|
292
|
+
|
293
|
+
/// Set the time portion of the DateTime
|
294
|
+
void setHMS( int hour, int minute, int second, int fraction, int precision )
|
295
|
+
{
|
296
|
+
int nanos = convertToNanos(fraction, precision);
|
297
|
+
|
298
|
+
m_time = makeHMS( hour, minute, second, nanos);
|
214
299
|
}
|
215
300
|
|
216
301
|
/// Set the hour portion of the time
|
@@ -245,6 +330,30 @@ struct DateTime
|
|
245
330
|
setHMS( hour, min, sec, millis );
|
246
331
|
}
|
247
332
|
|
333
|
+
/// Set the microsecond portion of the time
|
334
|
+
void setMicrosecond( int micros )
|
335
|
+
{
|
336
|
+
int hour, min, sec, old_nanos;
|
337
|
+
getHMS( hour, min, sec, old_nanos, 9 );
|
338
|
+
setHMS( hour, min, sec, micros, 6 );
|
339
|
+
}
|
340
|
+
|
341
|
+
/// Set the nanosecond portion of the time
|
342
|
+
void setNanosecond( int nanos )
|
343
|
+
{
|
344
|
+
int hour, min, sec, old_nanos;
|
345
|
+
getHMS( hour, min, sec, old_nanos, 9 );
|
346
|
+
setHMS( hour, min, sec, nanos, 9 );
|
347
|
+
}
|
348
|
+
|
349
|
+
/// Set the fraction portion of the time
|
350
|
+
void setFraction( int fraction, int precision )
|
351
|
+
{
|
352
|
+
int hour, min, sec, old_nanos;
|
353
|
+
getHMS( hour, min, sec, old_nanos, 9 );
|
354
|
+
setHMS( hour, min, sec, fraction, precision );
|
355
|
+
}
|
356
|
+
|
248
357
|
/// Clear the date portion of the DateTime
|
249
358
|
void clearDate()
|
250
359
|
{
|
@@ -258,7 +367,7 @@ struct DateTime
|
|
258
367
|
}
|
259
368
|
|
260
369
|
/// Set the internal date and time members
|
261
|
-
void set( int date,
|
370
|
+
void set( int date, int64_t time ) { m_date = date; m_time = time; }
|
262
371
|
|
263
372
|
/// Initialize from another DateTime
|
264
373
|
void set( const DateTime& other )
|
@@ -268,33 +377,85 @@ struct DateTime
|
|
268
377
|
}
|
269
378
|
|
270
379
|
/// Add a number of seconds to this
|
271
|
-
void operator+=( int seconds )
|
380
|
+
void operator+=( int seconds )
|
272
381
|
{
|
273
382
|
int d = seconds / SECONDS_PER_DAY;
|
274
383
|
int s = seconds % SECONDS_PER_DAY;
|
275
384
|
|
276
385
|
m_date += d;
|
277
|
-
m_time += s *
|
386
|
+
m_time += s * NANOS_PER_SEC;
|
278
387
|
|
279
|
-
if( m_time >
|
388
|
+
if( m_time > NANOS_PER_DAY )
|
280
389
|
{
|
281
390
|
m_date++;
|
282
|
-
m_time %=
|
391
|
+
m_time %= NANOS_PER_DAY;
|
283
392
|
}
|
284
393
|
else if( m_time < 0 )
|
285
394
|
{
|
286
395
|
m_date--;
|
287
|
-
m_time +=
|
396
|
+
m_time += NANOS_PER_DAY;
|
397
|
+
}
|
398
|
+
}
|
399
|
+
|
400
|
+
/// Convert to internal nanos
|
401
|
+
static int convertToNanos(int fraction, int precision)
|
402
|
+
{
|
403
|
+
int nanos;
|
404
|
+
|
405
|
+
switch (precision)
|
406
|
+
{
|
407
|
+
case 0:
|
408
|
+
nanos = fraction * PRECISION_FACTOR[0];
|
409
|
+
break;
|
410
|
+
|
411
|
+
case 1:
|
412
|
+
nanos = fraction * PRECISION_FACTOR[1];
|
413
|
+
break;
|
414
|
+
|
415
|
+
case 2:
|
416
|
+
nanos = fraction * PRECISION_FACTOR[2];
|
417
|
+
break;
|
418
|
+
|
419
|
+
case 3:
|
420
|
+
nanos = fraction * PRECISION_FACTOR[3];
|
421
|
+
break;
|
422
|
+
|
423
|
+
case 4:
|
424
|
+
nanos = fraction * PRECISION_FACTOR[4];
|
425
|
+
break;
|
426
|
+
|
427
|
+
case 5:
|
428
|
+
nanos = fraction * PRECISION_FACTOR[5];
|
429
|
+
break;
|
430
|
+
|
431
|
+
case 6:
|
432
|
+
nanos = fraction * PRECISION_FACTOR[6];
|
433
|
+
break;
|
434
|
+
|
435
|
+
case 7:
|
436
|
+
nanos = fraction * PRECISION_FACTOR[7];
|
437
|
+
break;
|
438
|
+
|
439
|
+
case 8:
|
440
|
+
nanos = fraction * PRECISION_FACTOR[8];
|
441
|
+
break;
|
442
|
+
|
443
|
+
case 9:
|
444
|
+
default:
|
445
|
+
nanos = fraction * PRECISION_FACTOR[9];
|
446
|
+
break;
|
288
447
|
}
|
448
|
+
|
449
|
+
return nanos;
|
289
450
|
}
|
290
451
|
|
291
452
|
/// Helper method to convert a broken down time to a number of
|
292
|
-
///
|
293
|
-
static
|
453
|
+
/// nanoseconds since midnight
|
454
|
+
static int64_t makeHMS( int hour, int minute, int second, int nanos )
|
294
455
|
{
|
295
|
-
return
|
296
|
-
|
297
|
-
|
456
|
+
return NANOS_PER_SEC * (SECONDS_PER_HOUR * hour +
|
457
|
+
SECONDS_PER_MIN * minute +
|
458
|
+
second) + nanos;
|
298
459
|
}
|
299
460
|
|
300
461
|
/// Return the current wall-clock time as a utc DateTime
|
@@ -316,13 +477,35 @@ struct DateTime
|
|
316
477
|
return fromTm( tm, millis );
|
317
478
|
}
|
318
479
|
|
480
|
+
static DateTime fromUtcTimeT( time_t t, int fraction, int precision )
|
481
|
+
{
|
482
|
+
struct tm tm = time_gmtime( &t );
|
483
|
+
return fromTm( tm, fraction, precision );
|
484
|
+
}
|
485
|
+
|
486
|
+
static DateTime fromLocalTimeT( time_t t, int fraction, int precision )
|
487
|
+
{
|
488
|
+
struct tm tm = time_localtime( &t );
|
489
|
+
return fromTm( tm, fraction, precision );
|
490
|
+
}
|
491
|
+
|
319
492
|
/// Convert a tm and optional milliseconds to a DateTime. \note
|
320
493
|
/// the tm structure is assumed to contain a date specified in UTC
|
321
494
|
static DateTime fromTm( const tm& tm, int millis = 0 )
|
322
495
|
{
|
323
496
|
return DateTime ( julianDate(tm.tm_year + 1900, tm.tm_mon + 1,
|
324
497
|
tm.tm_mday),
|
325
|
-
makeHMS(tm.tm_hour, tm.tm_min, tm.tm_sec, millis) );
|
498
|
+
makeHMS(tm.tm_hour, tm.tm_min, tm.tm_sec, millis * PRECISION_FACTOR[3]) );
|
499
|
+
}
|
500
|
+
|
501
|
+
/// Convert a tm and optional milliseconds to a DateTime. \note
|
502
|
+
/// the tm structure is assumed to contain a date specified in UTC
|
503
|
+
static DateTime fromTm( const tm& tm, int fraction, int precision )
|
504
|
+
{
|
505
|
+
int nanos = convertToNanos(fraction, precision);
|
506
|
+
return DateTime ( julianDate(tm.tm_year + 1900, tm.tm_mon + 1,
|
507
|
+
tm.tm_mday),
|
508
|
+
makeHMS(tm.tm_hour, tm.tm_min, tm.tm_sec, nanos) );
|
326
509
|
}
|
327
510
|
|
328
511
|
/// Helper method to calculate a Julian day number.
|
@@ -391,8 +574,8 @@ inline bool operator>=( const DateTime& lhs, const DateTime& rhs )
|
|
391
574
|
inline int operator-( const DateTime& lhs, const DateTime& rhs )
|
392
575
|
{
|
393
576
|
return (DateTime::SECONDS_PER_DAY * (lhs.m_date - rhs.m_date) +
|
394
|
-
// Truncate the
|
395
|
-
lhs.m_time /
|
577
|
+
// Truncate the nanos before subtracting
|
578
|
+
(int)(lhs.m_time / DateTime::NANOS_PER_SEC) - (int)(rhs.m_time / DateTime::NANOS_PER_SEC));
|
396
579
|
}
|
397
580
|
|
398
581
|
/// Date and Time represented in UTC.
|
@@ -410,6 +593,12 @@ public:
|
|
410
593
|
setHMS( hour, minute, second, millisecond );
|
411
594
|
}
|
412
595
|
|
596
|
+
UtcTimeStamp( int hour, int minute, int second, int fraction, int precision )
|
597
|
+
: DateTime( DateTime::nowUtc() )
|
598
|
+
{
|
599
|
+
setHMS( hour, minute, second, fraction, precision );
|
600
|
+
}
|
601
|
+
|
413
602
|
UtcTimeStamp( int hour, int minute, int second,
|
414
603
|
int date, int month, int year )
|
415
604
|
: DateTime( year, month, date, hour, minute, second, 0 ) {}
|
@@ -418,12 +607,22 @@ public:
|
|
418
607
|
int date, int month, int year )
|
419
608
|
: DateTime( year, month, date, hour, minute, second, millisecond ) {}
|
420
609
|
|
610
|
+
UtcTimeStamp( int hour, int minute, int second, int fraction,
|
611
|
+
int date, int month, int year, int precision )
|
612
|
+
: DateTime( year, month, date, hour, minute, second, fraction, precision ) {}
|
613
|
+
|
421
614
|
explicit UtcTimeStamp( time_t time, int millisecond = 0 )
|
422
615
|
: DateTime( fromUtcTimeT (time, millisecond) ) {}
|
423
616
|
|
617
|
+
UtcTimeStamp( time_t time, int fraction, int precision )
|
618
|
+
: DateTime( fromUtcTimeT (time, fraction, precision) ) {}
|
619
|
+
|
424
620
|
UtcTimeStamp( const tm* time, int millisecond = 0 )
|
425
621
|
: DateTime( fromTm (*time, millisecond) ) {}
|
426
622
|
|
623
|
+
UtcTimeStamp( const tm* time, int fraction, int precision )
|
624
|
+
: DateTime( fromTm (*time, fraction, precision) ) {}
|
625
|
+
|
427
626
|
void setCurrent()
|
428
627
|
{
|
429
628
|
set( DateTime::nowUtc() );
|
@@ -445,6 +644,12 @@ public:
|
|
445
644
|
setHMS( hour, minute, second, millisecond );
|
446
645
|
}
|
447
646
|
|
647
|
+
LocalTimeStamp( int hour, int minute, int second, int fraction, int precision )
|
648
|
+
: DateTime( DateTime::nowLocal() )
|
649
|
+
{
|
650
|
+
setHMS( hour, minute, second, fraction, precision );
|
651
|
+
}
|
652
|
+
|
448
653
|
LocalTimeStamp( int hour, int minute, int second,
|
449
654
|
int date, int month, int year )
|
450
655
|
: DateTime( year, month, date, hour, minute, second, 0 ) {}
|
@@ -453,12 +658,22 @@ public:
|
|
453
658
|
int date, int month, int year )
|
454
659
|
: DateTime( year, month, date, hour, minute, second, millisecond ) {}
|
455
660
|
|
661
|
+
LocalTimeStamp( int hour, int minute, int second, int fraction,
|
662
|
+
int date, int month, int year, int precision )
|
663
|
+
: DateTime( year, month, date, hour, minute, second, fraction, precision ) {}
|
664
|
+
|
456
665
|
explicit LocalTimeStamp( time_t time, int millisecond = 0 )
|
457
666
|
: DateTime( fromLocalTimeT (time, millisecond) ) {}
|
458
667
|
|
668
|
+
LocalTimeStamp( time_t time, int fraction, int precision )
|
669
|
+
: DateTime( fromLocalTimeT (time, fraction, precision) ) {}
|
670
|
+
|
459
671
|
LocalTimeStamp( const tm* time, int millisecond = 0 )
|
460
672
|
: DateTime( fromTm (*time, millisecond) ) {}
|
461
673
|
|
674
|
+
LocalTimeStamp( const tm* time, int fraction, int precision )
|
675
|
+
: DateTime( fromTm (*time, fraction, precision) ) {}
|
676
|
+
|
462
677
|
void setCurrent()
|
463
678
|
{
|
464
679
|
set( DateTime::nowLocal() );
|
@@ -486,18 +701,35 @@ public:
|
|
486
701
|
setHMS( hour, minute, second, millisecond );
|
487
702
|
}
|
488
703
|
|
704
|
+
UtcTimeOnly( int hour, int minute, int second, int fraction, int precision )
|
705
|
+
{
|
706
|
+
setHMS( hour, minute, second, fraction, precision );
|
707
|
+
}
|
708
|
+
|
489
709
|
explicit UtcTimeOnly( time_t time, int millisecond = 0 )
|
490
710
|
: DateTime( fromUtcTimeT (time, millisecond) )
|
491
711
|
{
|
492
712
|
clearDate();
|
493
713
|
}
|
494
714
|
|
715
|
+
UtcTimeOnly( time_t time, int fraction, int precision )
|
716
|
+
: DateTime( fromUtcTimeT (time, fraction, precision) )
|
717
|
+
{
|
718
|
+
clearDate();
|
719
|
+
}
|
720
|
+
|
495
721
|
UtcTimeOnly( const tm* time, int millisecond = 0 )
|
496
722
|
: DateTime( fromTm (*time, millisecond) )
|
497
723
|
{
|
498
724
|
clearDate();
|
499
725
|
}
|
500
726
|
|
727
|
+
UtcTimeOnly( const tm* time, int fraction, int precision )
|
728
|
+
: DateTime( fromTm (*time, fraction, precision) )
|
729
|
+
{
|
730
|
+
clearDate();
|
731
|
+
}
|
732
|
+
|
501
733
|
/// Set to the current time.
|
502
734
|
void setCurrent()
|
503
735
|
{
|
@@ -527,18 +759,35 @@ public:
|
|
527
759
|
setHMS( hour, minute, second, millisecond );
|
528
760
|
}
|
529
761
|
|
762
|
+
LocalTimeOnly( int hour, int minute, int second, int fraction, int precision )
|
763
|
+
{
|
764
|
+
setHMS( hour, minute, second, fraction, precision );
|
765
|
+
}
|
766
|
+
|
530
767
|
explicit LocalTimeOnly( time_t time, int millisecond = 0 )
|
531
768
|
: DateTime( fromLocalTimeT (time, millisecond) )
|
532
769
|
{
|
533
770
|
clearDate();
|
534
771
|
}
|
535
772
|
|
773
|
+
LocalTimeOnly( time_t time, int fraction, int precision )
|
774
|
+
: DateTime( fromLocalTimeT (time, fraction, precision) )
|
775
|
+
{
|
776
|
+
clearDate();
|
777
|
+
}
|
778
|
+
|
536
779
|
LocalTimeOnly( const tm* time, int millisecond = 0 )
|
537
780
|
: DateTime( fromTm (*time, millisecond) )
|
538
781
|
{
|
539
782
|
clearDate();
|
540
783
|
}
|
541
784
|
|
785
|
+
LocalTimeOnly( const tm* time, int fraction, int precision )
|
786
|
+
: DateTime( fromTm (*time, fraction, precision) )
|
787
|
+
{
|
788
|
+
clearDate();
|
789
|
+
}
|
790
|
+
|
542
791
|
/// Set to the current time.
|
543
792
|
void setCurrent()
|
544
793
|
{
|