/* Copyright 2012. Bloomberg Finance L.P.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions: The above
* copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
// blpapi_datetime.h -*-C++-*-
#ifndef INCLUDED_BLPAPI_DATETIME
#define INCLUDED_BLPAPI_DATETIME
//@PURPOSE: Represents a date and/or time.
//
//@CLASSES:
// blpapi_Datetime_tag: C struct for date and/or msec time
// blpapi_HighPrecisionDatetime_tag: C struct for date and/or psec time
// blpapi::Datetime: C++ class for date and/or psec time
// blpapi::DatetimeParts: Identifiers for fields within date/time
// blpapi::DatetimeUtil: 'Datetime' utility functions
//
//@DESCRIPTION: This file provides a C and C++ data type to represent a
// date and/or time value.
#ifndef INCLUDED_BLPAPI_CALL
#include <blpapi_call.h>
#endif
#ifndef INCLUDED_BLPAPI_DEFS
#include <blpapi_defs.h>
#endif
#ifndef INCLUDED_BLPAPI_EXCEPTION
#include <blpapi_exception.h>
#endif
#ifndef INCLUDED_BLPAPI_STREAMPROXY
#include <blpapi_streamproxy.h>
#endif
#ifndef INCLUDED_BLPAPI_TIMEPOINT
#include <blpapi_timepoint.h>
#endif
#ifndef INCLUDED_BLPAPI_TYPES
#include <blpapi_types.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
struct blpapi_Datetime_tag {
blpapi_UChar_t parts; // bitmask of date/time parts that are set
blpapi_UChar_t hours;
blpapi_UChar_t minutes;
blpapi_UChar_t seconds;
blpapi_UInt16_t milliSeconds;
blpapi_UChar_t month;
blpapi_UChar_t day;
blpapi_UInt16_t year;
blpapi_Int16_t offset; // (signed) minutes ahead of UTC
};
typedef struct blpapi_Datetime_tag blpapi_Datetime_t;
struct blpapi_HighPrecisionDatetime_tag {
blpapi_Datetime_t datetime;
blpapi_UInt32_t picoseconds; // picosecond offset into current
// *millisecond* i.e. the picosecond offset
// into the current full second is
// '1000000000LL * milliSeconds + picoSeconds'
};
typedef struct blpapi_HighPrecisionDatetime_tag blpapi_HighPrecisionDatetime_t;
BLPAPI_EXPORT
int blpapi_Datetime_compare(blpapi_Datetime_t lhs, blpapi_Datetime_t rhs);
BLPAPI_EXPORT
int blpapi_Datetime_print(const blpapi_Datetime_t *datetime,
blpapi_StreamWriter_t streamWriter,
void *stream,
int level,
int spacesPerLevel);
BLPAPI_EXPORT
int blpapi_HighPrecisionDatetime_compare(
const blpapi_HighPrecisionDatetime_t *lhs,
const blpapi_HighPrecisionDatetime_t *rhs);
BLPAPI_EXPORT
int blpapi_HighPrecisionDatetime_print(
const blpapi_HighPrecisionDatetime_t *datetime,
blpapi_StreamWriter_t streamWriter,
void *stream,
int level,
int spacesPerLevel);
BLPAPI_EXPORT
int blpapi_HighPrecisionDatetime_fromTimePoint(
blpapi_HighPrecisionDatetime_t *datetime,
const blpapi_TimePoint_t *timePoint,
short offset);
#ifdef __cplusplus
} // extern "C"
#ifndef INCLUDED_CASSERT
#include <cassert>
#define INCLUDED_CASSERT
#endif
#ifndef INCLUDED_CSTRING
#include <cstring> // for std::memset
#define INCLUDED_CSTRING
#endif
#ifndef INCLUDED_IOSFWD
#include <iosfwd>
#define INCLUDED_IOSFWD
#endif
namespace BloombergLP {
namespace blpapi {
// ====================
// struct DatetimeParts
// ====================
struct DatetimeParts {
// Bit flags and masks used to determine which parts of a Datetime are
// valid.
enum Value {
// Enumeration used to indicate which parts of the 'Datetime' object
// have had their values set. The actual enumeration constants are
// thus *not* consecutive -- they are bit fields that can be combined
// using bitwise operators. Note that the constants themselves are
// defined in 'blpapi_defs.h'.
YEAR = BLPAPI_DATETIME_YEAR_PART // year is set
, MONTH = BLPAPI_DATETIME_MONTH_PART // month is set
, DAY = BLPAPI_DATETIME_DAY_PART // day is set
, OFFSET = BLPAPI_DATETIME_OFFSET_PART // offset is set
, HOURS = BLPAPI_DATETIME_HOURS_PART // hours is set
, MINUTES = BLPAPI_DATETIME_MINUTES_PART // minutes is set
, SECONDS = BLPAPI_DATETIME_SECONDS_PART // seconds is set
, FRACSECONDS = BLPAPI_DATETIME_FRACSECONDS_PART // fraction-of-second (both millisecond and picosecond) is set
, MILLISECONDS = BLPAPI_DATETIME_MILLISECONDS_PART // 'MILLISECONDS' is a (legacy) synonym for 'FRACSECONDS'
, DATE = BLPAPI_DATETIME_DATE_PART // year, month, and day are set
, TIME = BLPAPI_DATETIME_TIME_PART // hours, minutes, and seconds are set
, TIMEFRACSECONDS = BLPAPI_DATETIME_TIMEFRACSECONDS_PART // hours, minutes, seconds, and fraction-of-second are set
, TIMEMILLI = BLPAPI_DATETIME_TIMEMILLI_PART // 'TIMEMILLI' is a (legacy) synonym for 'TIMEFRACSECONDS'
};
};
// ==============
// class Datetime
// ==============
class Datetime {
// Represents a date and/or time.
//
// Datetime can represent a date and/or a time or any combination of the
// components of a date and time. The value is represented as eight parts
// which can be set or queried independently.
//
// These parts are: year; month (from January as 1 to December as 12); day
// (of month, from 1 to 31); hour (from 0 to 23); minute (0 to 59); second
// (0 to 59); fraction-of-second (logically representing arbitrary
// precision, with the current interface providing picosecond resolution);
// and offset (time zone as minutes ahead of UTC).
//
// Methods are provided to set and query the parts individually and in
// groups, e.g. 'setDate()' and 'setTime()'. It is also possible to
// determine which parts of the 'Datetime' have been set (via the 'parts()'
// method).
blpapi_HighPrecisionDatetime_t d_value;
static bool isLeapYear(int year);
struct TimeTag {};
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
TimeTag);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', and 'seconds'. The
// behavior is undefined unless 'hours', 'minutes', and 'seconds'
// represent a valid time as specified by the 'isValidTime' function.
// The resulting 'Datetime' object has the parts specified by 'TIME'
// set, and all other parts unset. In particular, the 'FRACSECONDS'
// part is unset.
// Note that the final 'TimeTag' parameter is used purely to
// disambiguate this constructor from that for year, month, and day.
// A constuctor for 4 PM would be written as follows:
//..
// Datetime dt = Datetime(16, 0, 0, Datetime::TimeTag());
//..
// Note that this constructor is intended for internal use only; client
// code should use the 'createTime' interface.
public:
struct Milliseconds {
int d_msec;
explicit Milliseconds(int milliseconds);
// The behavior is undefined unless '0 <= milliseconds < 1000'.
};
struct Microseconds {
int d_usec;
explicit Microseconds(int microseconds);
// The behavior is undefined unless
// '0 <= microseconds < 1,000,000'.
};
struct Nanoseconds {
int d_nsec;
explicit Nanoseconds(int nanoseconds);
// The behavior is undefined unless
// '0 <= nanoseconds < 1,000,000,000'.
};
struct Picoseconds {
long long d_psec;
explicit Picoseconds(long long picoseconds);
// The behavior is undefined unless
// '0 <= picoseconds < 1,000,000,000,000'.
};
struct Offset {
short d_minutesAheadOfUTC;
explicit Offset(short minutesAheadOfUTC);
// The behavior is undefined unless
// '-840 <= minutesAheadOfUTC <= 840'.
};
static bool isValidDate(int year, int month, int day);
// Return 'true' if the specified 'year', 'month', and 'day' represent
// a valid calendar date, and 'false' otherwise. Note that many
// functions within 'Datetime' provide defined behavior only when valid
// dates are provided as arguments.
static bool isValidTime(int hours,
int minutes,
int seconds);
static bool isValidTime(int hours,
int minutes,
int seconds,
int milliSeconds);
static bool isValidTime(int hours,
int minutes,
int seconds,
Milliseconds fractionOfSecond);
static bool isValidTime(int hours,
int minutes,
int seconds,
Microseconds fractionOfSecond);
static bool isValidTime(int hours,
int minutes,
int seconds,
Nanoseconds fractionOfSecond);
static bool isValidTime(int hours,
int minutes,
int seconds,
Picoseconds fractionOfSecond);
// Return 'true' if the specified 'hours', 'minutes', 'seconds', and
// (optionally specified) 'milliseconds' or 'fractionOfSecond'
// represent a valid time of day, and 'false' otherwise. Note that
// many functions within 'Datetime' provide defined behavior only when
// valid times are provided as arguments.
// CREATORS
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', and 'seconds'
// parts. The behavior is undefined unless 'year', 'month', and 'day'
// represent a valid date as specified by the 'isValidDate' function,
// and 'hours', 'minutes', and 'seconds' represent a valid time as
// specified by the 'isValidTime' function. The resulting 'Datetime'
// object has the parts specified by 'DATE' and 'TIME' set, and the
// 'OFFSET' and 'FRACSECONDS' parts unset.
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Offset offset);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', 'seconds', and
// 'offset' parts. The behavior is undefined unless 'year', 'month',
// and 'day' represent a valid date as specified by the 'isValidDate'
// function, and 'hours', 'minutes', and 'seconds' represent a valid
// time as specified by the 'isValidTime' function. The resulting
// 'Datetime' object has the parts specified by 'DATE', 'TIME', and
// 'OFFSET' set, and the 'FRACSECONDS' part unset.
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond'. The behavior is undefined unless 'year',
// 'month', and 'day' represent a valid date as specified by the
// 'isValidDate' function, and 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'DATE' and 'TIMEFRACSECONDS' set, and the
// 'OFFSET' part unset.
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond,
Offset offset);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond,
Offset offset);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond,
Offset offset);
static Datetime createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond,
Offset offset);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', 'seconds',
// 'fractionOfSecond', and 'offset'. The behavior is undefined unless
// 'year', 'month', and 'day' represent a valid date as specified by
// the 'isValidDate' function, and 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has all
// parts set.
static Datetime createDate(unsigned year,
unsigned month,
unsigned day);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', and 'day'. The behavior is undefined
// unless 'year', 'month', and 'day' represent a valid date as
// specified by the 'isValidDate' function. The resulting 'Datetime'
// object has the parts specified by 'DATE' set, and all other parts
// unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', and 'seconds'. The
// behavior is undefined unless 'hours', 'minutes', and 'seconds'
// represent a valid time as specified by the 'isValidTime' function.
// The resulting 'Datetime' object has the parts specified by 'TIME'
// set, and all other parts unset. Note that the 'FRACSECONDS' part is
// unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Offset offset);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', and 'offset'. The
// behavior is undefined unless 'hours', 'minutes', and 'seconds'
// represent a valid time as specified by the 'isValidTime' function.
// The resulting 'Datetime' object has the parts specified by 'TIME'
// and 'OFFSET' set, and all other parts unset. Note that the
// 'FRACSECONDS' part is unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', and 'milliseconds'. The
// behavior is undefined unless 'hours', 'minutes', 'seconds', and
// 'milliseconds' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'TIMEFRACSECONDS' set, and all other parts unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds,
Offset offset);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', 'milliseconds', and
// 'offset'. The behavior is undefined unless 'hours', 'minutes',
// 'seconds', and 'milliseconds' represent a valid time as specified by
// the 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'TIMEFRACSECONDS' and 'OFFSET' set, and all other
// parts unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', and 'fractionOfSecond'.
// The behavior is undefined unless 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'TIMEFRACSECONDS' set, and all other
// parts unset.
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond,
Offset offset);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond,
Offset offset);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond,
Offset offset);
static Datetime createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond,
Offset offset);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', 'fractionOfSecond', and
// 'offset'. The behavior is undefined unless 'hours', 'minutes',
// 'seconds', and 'fractionOfSecond' represent a valid time as
// specified by the 'isValidTime' function. The resulting 'Datetime'
// object has the parts specified by 'TIMEFRACSECONDS' and 'OFFSET'
// set, and all other parts unset.
Datetime();
// Construct a 'Datetime' object with all parts unset.
Datetime(const Datetime& original);
// Copy constructor.
Datetime(const blpapi_Datetime_t& rawValue);
explicit Datetime(const blpapi_HighPrecisionDatetime_t& rawValue);
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', and 'seconds'
// parts. The behavior is undefined unless 'year', 'month', and 'day'
// represent a valid date as specified by the 'isValidDate' function,
// and 'hours', 'minutes', and 'seconds' represent a valid time as
// specified by the 'isValidTime' function. The resulting 'Datetime'
// object has the parts specified by 'DATE' and 'TIME' set, and the
// 'OFFSET' and 'FRACSECONDS' parts unset.
// Use of this function is discouraged; use 'createDatetime' instead.
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', 'seconds', and
// 'milliseconds'. The behavior is undefined unless 'year', 'month',
// and 'day' represent a valid date as specified by the 'isValidDate'
// function, and 'hours', 'minutes', 'seconds', and 'milliseconds'
// represent a valid time as specified by the 'isValidTime' function.
// The resulting 'Datetime' object has the parts specified by 'DATE'
// and 'TIMEFRACSECONDS' set, and the 'OFFSET' part unset.
// Use of this function is discouraged; use 'createDatetime' instead.
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond);
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond);
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond);
Datetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', 'day', 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond'. The behavior is undefined unless 'year',
// 'month', and 'day' represent a valid date as specified by the
// 'isValidDate' function, and 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'DATE' and 'TIMEFRACSECONDS' set, and the
// 'OFFSET' part unset.
// Use of these functions is discouraged; use 'createDatetime' instead.
Datetime(unsigned year,
unsigned month,
unsigned day);
// Create a 'Datetime' object having the value representing the
// specified 'year', 'month', and 'day'. The behavior is undefined
// unless 'year', 'month', and 'day' represent a valid date as
// specified by the 'isValidDate' function. The resulting 'Datetime'
// object has the parts specified by 'DATE' set, and all other parts
// unset.
// Note that constructing a 'Datetime' from three integers produces a
// date; to create a time from hour, minute, and second (without the
// fraction-of-second part unset) use the constructor taking a
// 'TimeTag'.
// Use of this function is discouraged; use 'createDate' instead.
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', and 'milliseconds'. The
// behavior is undefined unless 'hours', 'minutes', 'seconds', and
// 'milliseconds' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'TIMEFRACSECONDS' set, and all other parts unset.
// Note that removing the final argument from a call to this function
// results in a constructor creating a date, not a time.
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond);
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond);
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond);
Datetime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond);
// Create a 'Datetime' object having the value representing the
// specified 'hours', 'minutes', 'seconds', and 'fractionOfSecond'.
// The behavior is undefined unless 'hours', 'minutes', 'seconds', and
// 'fractionOfSecond' represent a valid time as specified by the
// 'isValidTime' function. The resulting 'Datetime' object has the
// parts specified by 'TIMEFRACSECONDS' set, and all other parts unset.
// Note that removing the final argument from a call to this function
// results in a constructor creating a date, not a time.
// MANIPULATORS
Datetime& operator=(const Datetime& rhs);
// Assignment operator.
void setDate(unsigned year,
unsigned month,
unsigned day);
// Set the 'DATE' parts of this 'Datetime' object to the specified
// 'year', 'month', and 'day'. The behavior is undefined unless
// 'isValidDate(year, month, day)' would return 'true'.
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds);
// Set the 'TIME' parts of this 'Datetime' object to the specified
// 'hours', 'minutes', and 'seconds', and mark the 'FRACSECONDS' part
// of this 'Datetime' as unset. The behavior is undefined unless
// 'isValidTime(hours, minutes, seconds)' would return 'true'.
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds);
// Set the 'TIMEFRACSECONDS' parts of this 'Datetime' object to the
// specified 'hours', 'minutes', 'seconds', and 'milliseconds'. The
// behavior is undefined unless
// 'isValidTime(hours, minutes, seconds, milliseconds)' would return
// 'true'.
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond);
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond);
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond);
void setTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond);
// Set the 'TIMEFRACSECONDS' parts of this 'Datetime' object to the
// specified 'hours', 'minutes', 'seconds', and 'fractionOfSecond'.
// The behavior is undefined unless
// 'isValidTime(hours, minutes, seconds, fractionOfSecond)' would
// return 'true'.
void setOffset(short minutesAheadOfUTC);
// Set the 'OFFSET' (i.e. timezone) part of this 'Datetime' object to
// the specified 'minutesAheadOfUTC'.
// The behavior is undefined unless '-840 <= minutesAheadOfUTC <= 840'.
void setYear(unsigned value);
// Set the 'YEAR' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '1 <= value <= 9999', and either
// the 'MONTH' part is not set, the 'DAY' part is not set, or
// 'isValidDate(value. this->month(), this->day()) == true'.
void setMonth(unsigned value);
// Set the 'MONTH' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '1 <= value <= 12', and either the
// 'DAY' part is not set, the 'YEAR' part is not set, or
// 'isValidDate(this->year(). value, this->day()) == true'.
void setDay(unsigned value);
// Set the 'DAY' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '1 <= value <= 31', and either the
// 'MONTH' part is not set, the 'YEAR' part is not set, or
// 'isValidDate(this->year(). this->month(), value) == true'.
void setHours(unsigned value);
// Set the 'HOURS' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '0 <= value <= 23'.
void setMinutes(unsigned value);
// Set the 'MINUTES' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '0 <= value <= 59'.
void setSeconds(unsigned value);
// Set the 'SECONDS' part of this 'Datetime' object to the specified
// 'value'.
// The behavior is undefined unless '0 <= value <= 59'.
void setMilliseconds(unsigned milliseconds);
// Set the 'FRACSECONDS' part of this 'Datetime' object to the
// specified 'milliseconds'.
// The behavior is undefined unless '0 <= value <= 999'.
void setFractionOfSecond(Milliseconds value);
// Set the 'FRACSECONDS' part of this 'Datetime' object to the
// Set the fraction of a second of the value of this object to the
// specified 'value'. Note that the behavior is undefined unless
// '0 <= value <= 999 ms'.
void setFractionOfSecond(Microseconds value);
// Set the 'FRACSECONDS' part of this 'Datetime' object to the
// specified 'value'. Note that the behavior is undefined unless
// '0 <= value <= 999,999 us'.
void setFractionOfSecond(Nanoseconds value);
// Set the 'FRACSECONDS' part of this 'Datetime' object to the
// specified 'value'. Note that the behavior is undefined unless
// '0 <= value <= 999,999,999 ns'.
void setFractionOfSecond(Picoseconds value);
// Set the 'FRACSECONDS' part of this 'Datetime' object to the
// specified 'value'. Note that the behavior is undefined unless
// '0 <= value <= 999,999,999,999 ps'.
blpapi_Datetime_t& rawValue();
// Return a (modifiable) reference to the millisecond-resolution C
// struct underlying this object. Behavior of the object is undefined
// if the returned struct is modified concurrently with other non-const
// methods of this object, or if the fields of the 'blpapi_Datetime_t'
// are modified such that the 'Datetime::isValid' methods of this class
// would return 'false' when passed those fields of the struct whose
// bits are set in the struct's 'parts' field. Further, direct setting
// of the 'FRACSECONDS' bit in the returned struct's 'parts' field will
// cause this 'Datetime' object to compute its fraction-of-second part
// not just from the struct's 'milliSeconds' field, but also from the
// 'picoseconds' field of the the struct returned from
// 'rawHighPrecisionValue()'; if neither that field nor this 'Datetime'
// objects' fraction-of-second part have been initialized, then
// the behavior of setting the 'FRACSECONDS' bit directly is undefined.
blpapi_HighPrecisionDatetime_t& rawHighPrecisionValue();
// Return a (modifiable) reference to the high-resolution C struct
// underlying this object. Behavior of the object is undefined if the
// returned struct is modified concurrently with other non-const
// methods of this object, or if the fields of the
// 'blpapi_HighPrecisionDatetime_t' are modified such that the
// 'Datetime::isValid*' methods of this class would return 'false' when
// passed those fields of the struct whose bits are set in the struct's
// 'parts' field.
// ACCESSORS
bool hasParts(unsigned parts) const;
// Return true if this 'Datetime' object has all of the specified
// 'parts' set. The 'parts' parameter must be constructed by or'ing
// together values from the 'DatetimeParts' enum.
unsigned parts() const;
// Return a bitmask of all parts that are set in this 'Datetime'
// object. This can be compared to the values in the 'DatetimeParts'
// enum using bitwise operations.
unsigned year() const;
// Return the year value of this 'Datetime' object. The result is
// undefined unless the 'YEAR' part of this object is set.
unsigned month() const;
// Return the month value of this 'Datetime' object. The result is
// undefined unless the 'MONTH' part of this object is set.
unsigned day() const;
// Return the day value of this 'Datetime' object. The result is
// undefined unless the 'DAY' part of this object is set.
unsigned hours() const;
// Return the hours value of this 'Datetime' object. The result is
// undefined unless the 'HOURS' part of this object is set.
unsigned minutes() const;
// Return the minutes value of this 'Datetime' object. The result is
// undefined unless the 'MINUTES' part of this object is set.
unsigned seconds() const;
// Return the seconds value of this 'Datetime' object. The result is
// undefined unless the 'SECONDS' part of this object is set.
unsigned milliSeconds() const;
// Return the milliseconds value of this 'Datetime' object. The result
// is undefined unless the 'FRACSECONDS' part of this object is set.
// This function is deprecated; use 'milliseconds()' instead.
unsigned milliseconds() const;
// Return the number of (whole) milliseconds in the
// fraction-of-a-second part of the value of this object. The result
// is undefined unless the 'FRACSECONDS' part of this object is set.
unsigned microseconds() const;
// Return the number of (whole) microseconds in the
// fraction-of-a-second part of the value of this object. The result
// is undefined unless the 'FRACSECONDS' part of this object is set.
unsigned nanoseconds() const;
// Return the number of (whole) nanoseconds in the fraction-of-a-second
// part of the value of this object. The result is undefined unless
// the 'FRACSECONDS' part of this object is set.
unsigned long long picoseconds() const;
// Return the number of (whole) picoseconds in the fraction-of-a-second
// part of the value of this object. The result is undefined unless
// the 'FRACSECONDS' part of this object is set.
short offset() const;
// Return the number of minutes this 'Datetime' object is ahead of UTC.
// The result is undefined unless the 'OFFSET' part of this object is
// set.
const blpapi_Datetime_t& rawValue() const;
// Return a (read-only) reference to the millisecond-resolution C
// struct underlying this object.
const blpapi_HighPrecisionDatetime_t& rawHighPrecisionValue() const;
// Return a (read-only) reference to the high-precision C struct
// underlying this object.
bool isValid() const;
// Check whether the value of this 'Datetime' is valid. The behaviour
// is undefined unless this object represents a date (has YEAR, MONTH
// and DAY part set) or time (has HOURS, MINUTES, SECONDS and
// MILLISECONDS part set). Note that in almost all cases where this
// function returns 'false', prior member function calls have had
// undefined behavior.
// This function is deprecated; use 'isValidDate' and/or 'isValidTime'
// directly instead.
std::ostream& print(std::ostream& stream,
int level = 0,
int spacesPerLevel = 4) const;
// Write the value of this object to the specified output 'stream' in
// a human-readable format, and return a reference to 'stream'.
// Optionally specify an initial indentation 'level', whose absolute
// value is incremented recursively for nested objects. If 'level' is
// specified, optionally specify 'spacesPerLevel', whose absolute
// value indicates the number of spaces per indentation level for this
// and all of its nested objects. If 'level' is negative, suppress
// indentation of the first line. If 'spacesPerLevel' is negative,
// format the entire output on one line, suppressing all but the
// initial indentation (as governed by 'level'). If 'stream' is not
// valid on entry, this operation has no effect. Note that this
// human-readable format is not fully specified, and can change
// without notice.
};
// FREE OPERATORS
bool operator==(const Datetime& lhs, const Datetime& rhs);
// Return 'true' if the specified 'lhs' and 'rhs' have the same value, and
// 'false' otherwise. Two 'Datetime' objects have the same value if they
// have the same parts set, and the same values for each of those parts.
bool operator!=(const Datetime& lhs, const Datetime& rhs);
// Return 'true' if the specified 'lhs' and 'rhs' do not have the same
// value, and 'false' otherwise. Two 'Datetime' objects have the same
// value if they have the same parts set, and the same values for each of
// those parts.
bool operator<(const Datetime& lhs, const Datetime& rhs);
bool operator<=(const Datetime& lhs, const Datetime& rhs);
bool operator>(const Datetime& lhs, const Datetime& rhs);
bool operator>=(const Datetime& lhs, const Datetime& rhs);
// Compare the specified 'lhs' and 'rhs'. The ordering used is temporal,
// with earlier moments comparing less than later moments, in the case that
// 'lhs.parts() == rhs.parts()' and 'parts()' is one of 'DATE', 'TIME',
// 'TIMEFRACSECONDS', 'DATE | TIME', and 'DATE | TIMEFRACSECONDS'; the
// ordering in all other cases is unspecified, but guaranteed stable within
// process.
std::ostream& operator<<(std::ostream& stream, const Datetime& datetime);
// Write the value of the specified 'datetime' object to the specified
// output 'stream' in a single-line format, and return a reference to
// 'stream'. If 'stream' is not valid on entry, this operation has no
// effect. Note that this human-readable format is not fully specified,
// can change without notice, and is logically equivalent to:
//..
// print(stream, 0, -1);
//..
// ===================
// struct DatetimeUtil
// ===================
struct DatetimeUtil {
// This provides a namespace for 'Datetime' utility functions.
static Datetime fromTimePoint(
const TimePoint& timePoint,
Datetime::Offset offset = Datetime::Offset(0));
// Create and return a 'Datetime' object having the value of the
// specified 'timePoint' and the optionally specified timezone
// 'offset', 0 by default. The resulting 'Datetime' object has the
// parts specified by 'DATE', 'TIMEFRACSECONDS', and 'OFFSET' set.
};
// ============================================================================
// INLINE FUNCTION DEFINITIONS
// ============================================================================
// --------------
// class Datetime
// --------------
inline
bool Datetime::isLeapYear(int y)
{
return 0 == y % 4 && (y <= 1752 || 0 != y % 100 || 0 == y % 400);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
TimeTag)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds);
}
inline
Datetime::Milliseconds::Milliseconds(int milliseconds)
: d_msec(milliseconds)
{
}
inline
Datetime::Microseconds::Microseconds(int microseconds)
: d_usec(microseconds)
{
}
inline
Datetime::Nanoseconds::Nanoseconds(int nanoseconds)
: d_nsec(nanoseconds)
{
}
inline
Datetime::Picoseconds::Picoseconds(long long picoseconds)
: d_psec(picoseconds)
{
}
inline
Datetime::Offset::Offset(short minutesAheadOfUTC)
: d_minutesAheadOfUTC(minutesAheadOfUTC)
{
}
inline
bool Datetime::isValidDate(int year,
int month,
int day)
{
if ((year <= 0) || (year > 9999) ||
(month <= 0) || (month > 12) ||
(day <= 0) || (day > 31) ) {
return false;
}
if (day < 29) {
return true;
}
if (year == 1752) {
if (month == 9 && day > 2 && day < 14) {
return false;
}
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return true;
case 4:
case 6:
case 9:
case 11: {
if (day > 30) {
return false;
}
else {
return true;
}
}
case 2: {
if (isLeapYear(year)) {
if (day > 29) {
return false;
}
else {
return true;
}
}
else if (day > 28) {
return false;
}
else {
return true;
}
}
default: {
return true;
}
}
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds) {
return (hours >= 0) && (hours < 24)
&& (minutes >= 0) && (minutes < 60)
&& (seconds >= 0) && (seconds < 60);
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds,
int milliSeconds)
{
return (hours >= 0) && (hours < 24)
&& (minutes >= 0) && (minutes < 60)
&& (seconds >= 0) && (seconds < 60)
&& (milliSeconds >= 0) && (milliSeconds < 1000);
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds,
Milliseconds fractionOfSecond)
{
return isValidTime(hours, minutes, seconds, fractionOfSecond.d_msec);
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds,
Microseconds fractionOfSecond)
{
return (hours >= 0) && (hours < 24)
&& (minutes >= 0) && (minutes < 60)
&& (seconds >= 0) && (seconds < 60)
&& (fractionOfSecond.d_usec >= 0)
&& (fractionOfSecond.d_usec < 1000 * 1000);
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds,
Nanoseconds fractionOfSecond)
{
return (hours >= 0) && (hours < 24)
&& (minutes >= 0) && (minutes < 60)
&& (seconds >= 0) && (seconds < 60)
&& (fractionOfSecond.d_nsec >= 0)
&& (fractionOfSecond.d_nsec < 1000 * 1000 * 1000);
}
inline
bool Datetime::isValidTime(int hours,
int minutes,
int seconds,
Picoseconds fractionOfSecond)
{
return (hours >= 0) && (hours < 24)
&& (minutes >= 0) && (minutes < 60)
&& (seconds >= 0) && (seconds < 60)
&& (fractionOfSecond.d_psec >= 0)
&& (fractionOfSecond.d_psec < 1000LL * 1000 * 1000 * 1000);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds)
{
return Datetime(year, month, day, hours, minutes, seconds);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Offset offset)
{
Datetime dt(year, month, day, hours, minutes, seconds);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond)
{
return Datetime(year,
month,
day,
hours,
minutes,
seconds,
fractionOfSecond);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond)
{
return Datetime(year,
month,
day,
hours,
minutes,
seconds,
fractionOfSecond);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond)
{
return Datetime(year,
month,
day,
hours,
minutes,
seconds,
fractionOfSecond);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond)
{
return Datetime(year,
month,
day,
hours,
minutes,
seconds,
fractionOfSecond);
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond,
Offset offset)
{
Datetime dt(year, month, day, hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond,
Offset offset)
{
Datetime dt(year, month, day, hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond,
Offset offset)
{
Datetime dt(year, month, day, hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createDatetime(unsigned year,
unsigned month,
unsigned day,
unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond,
Offset offset)
{
Datetime dt(year, month, day, hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createDate(unsigned year,
unsigned month,
unsigned day)
{
return Datetime(year, month, day);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds)
{
return Datetime(hours, minutes, seconds, TimeTag());
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Offset offset)
{
Datetime dt(hours, minutes, seconds, TimeTag());
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds)
{
return Datetime(hours, minutes, seconds, milliseconds);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
unsigned milliseconds,
Offset offset)
{
Datetime dt(hours, minutes, seconds, milliseconds);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond)
{
return Datetime(hours, minutes, seconds, fractionOfSecond);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond)
{
return Datetime(hours, minutes, seconds, fractionOfSecond);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond)
{
return Datetime(hours, minutes, seconds, fractionOfSecond);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond)
{
return Datetime(hours, minutes, seconds, fractionOfSecond);
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Milliseconds fractionOfSecond,
Offset offset)
{
Datetime dt(hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Microseconds fractionOfSecond,
Offset offset)
{
Datetime dt(hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Nanoseconds fractionOfSecond,
Offset offset)
{
Datetime dt(hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime Datetime::createTime(unsigned hours,
unsigned minutes,
unsigned seconds,
Picoseconds fractionOfSecond,
Offset offset)
{
Datetime dt(hours, minutes, seconds, fractionOfSecond);
dt.setOffset(offset.d_minutesAheadOfUTC);
return dt;
}
inline
Datetime::Datetime()
{
std::memset(&d_value, 0, sizeof(d_value));
d_value.datetime.year = 1;
d_value.datetime.month = 1;
d_value.datetime.day = 1;
}
inline
Datetime::Datetime(const Datetime& original)
: d_value(original.d_value)
{
}
inline
Datetime::Datetime(const blpapi_Datetime_t& newRawValue)
{
d_value.datetime = newRawValue;
d_value.picoseconds = 0;
}
inline
Datetime::Datetime(const blpapi_HighPrecisionDatetime_t& newRawValue)
: d_value(newRawValue)
{
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds = 0;
d_value.picoseconds = 0;
d_value.datetime.parts = DatetimeParts::DATE | DatetimeParts::TIME;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
unsigned newMilliSeconds)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(newMilliSeconds);
d_value.picoseconds = 0;
d_value.datetime.parts
= DatetimeParts::DATE | DatetimeParts::TIMEFRACSECONDS;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Milliseconds fractionOfSecond)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_msec);
d_value.picoseconds = 0;
d_value.datetime.parts
= DatetimeParts::DATE | DatetimeParts::TIMEFRACSECONDS;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Microseconds fractionOfSecond)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_usec / 1000);
d_value.picoseconds = (fractionOfSecond.d_usec % 1000) * 1000 * 1000;
d_value.datetime.parts
= DatetimeParts::DATE | DatetimeParts::TIMEFRACSECONDS;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Nanoseconds fractionOfSecond)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_nsec / 1000 / 1000);
d_value.picoseconds = (fractionOfSecond.d_nsec % (1000 * 1000)) * 1000;
d_value.datetime.parts
= DatetimeParts::DATE | DatetimeParts::TIMEFRACSECONDS;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay,
unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Picoseconds fractionOfSecond)
{
d_value.datetime.offset = 0;
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds = static_cast<blpapi_UInt16_t>(
fractionOfSecond.d_psec / 1000 / 1000 / 1000);
d_value.picoseconds
= static_cast<blpapi_UInt32_t>(
fractionOfSecond.d_psec % (1000 * 1000 * 1000));
d_value.datetime.parts
= DatetimeParts::DATE | DatetimeParts::TIMEFRACSECONDS;
}
inline
Datetime::Datetime(unsigned newYear,
unsigned newMonth,
unsigned newDay)
{
std::memset(&d_value, 0, sizeof(d_value));
setDate(newYear, newMonth, newDay);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
unsigned newMilliSeconds)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds, newMilliSeconds);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Milliseconds fractionOfSecond)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds, fractionOfSecond);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Microseconds fractionOfSecond)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds, fractionOfSecond);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Nanoseconds fractionOfSecond)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds, fractionOfSecond);
}
inline
Datetime::Datetime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Picoseconds fractionOfSecond)
{
std::memset(&d_value, 0, sizeof(d_value));
setTime(newHours, newMinutes, newSeconds, fractionOfSecond);
}
inline
Datetime& Datetime::operator=(const Datetime& rhs)
{
d_value = rhs.d_value;
return *this;
}
inline
void Datetime::setDate(unsigned newYear,
unsigned newMonth,
unsigned newDay)
{
d_value.datetime.day = static_cast<blpapi_UChar_t>(newDay);
d_value.datetime.month = static_cast<blpapi_UChar_t>(newMonth);
d_value.datetime.year = static_cast<blpapi_UInt16_t>(newYear);
d_value.datetime.parts |= DatetimeParts::DATE;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds = 0;
d_value.picoseconds = 0;
d_value.datetime.parts = (d_value.datetime.parts
& ~DatetimeParts::FRACSECONDS)
| DatetimeParts::TIME;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
unsigned newMilliSeconds)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(newMilliSeconds);
d_value.picoseconds = 0;
d_value.datetime.parts |= DatetimeParts::TIMEFRACSECONDS;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Milliseconds fractionOfSecond)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_msec);
d_value.picoseconds = 0;
d_value.datetime.parts |= DatetimeParts::TIMEFRACSECONDS;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Microseconds fractionOfSecond)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_usec / 1000);
d_value.picoseconds = fractionOfSecond.d_usec % 1000
* 1000
* 1000;
d_value.datetime.parts |= DatetimeParts::TIMEFRACSECONDS;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Nanoseconds fractionOfSecond)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_nsec / 1000 / 1000);
d_value.picoseconds = fractionOfSecond.d_nsec % (1000 * 1000)
* 1000;
d_value.datetime.parts |= DatetimeParts::TIMEFRACSECONDS;
}
inline
void Datetime::setTime(unsigned newHours,
unsigned newMinutes,
unsigned newSeconds,
Picoseconds fractionOfSecond)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(newHours);
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(newMinutes);
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(newSeconds);
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(fractionOfSecond.d_psec / 1000
/ 1000
/ 1000);
d_value.picoseconds
= static_cast<blpapi_UInt32_t>(
fractionOfSecond.d_psec % (1000 * 1000 * 1000));
d_value.datetime.parts |= DatetimeParts::TIMEFRACSECONDS;
}
inline
void Datetime::setOffset(short value)
{
d_value.datetime.offset = value;
d_value.datetime.parts |= DatetimeParts::OFFSET;
}
inline
void Datetime::setYear(unsigned value)
{
d_value.datetime.year = static_cast<blpapi_UInt16_t>(value);
d_value.datetime.parts |= DatetimeParts::YEAR;
}
inline
void Datetime::setMonth(unsigned value)
{
d_value.datetime.month = static_cast<blpapi_UChar_t>(value);
d_value.datetime.parts |= DatetimeParts::MONTH;
}
inline
void Datetime::setDay(unsigned value)
{
d_value.datetime.day = static_cast<blpapi_UChar_t>(value);
d_value.datetime.parts |= DatetimeParts::DAY;
}
inline
void Datetime::setHours(unsigned value)
{
d_value.datetime.hours = static_cast<blpapi_UChar_t>(value);
d_value.datetime.parts |= DatetimeParts::HOURS;
}
inline
void Datetime::setMinutes(unsigned value)
{
d_value.datetime.minutes = static_cast<blpapi_UChar_t>(value);
d_value.datetime.parts |= DatetimeParts::MINUTES;
}
inline
void Datetime::setSeconds(unsigned value)
{
d_value.datetime.seconds = static_cast<blpapi_UChar_t>(value);
d_value.datetime.parts |= DatetimeParts::SECONDS;
}
inline
void Datetime::setMilliseconds(unsigned value)
{
d_value.datetime.milliSeconds = static_cast<blpapi_UInt16_t>(value);
d_value.picoseconds = 0;
d_value.datetime.parts |= DatetimeParts::FRACSECONDS;
}
inline
void Datetime::setFractionOfSecond(Milliseconds value)
{
d_value.datetime.milliSeconds = static_cast<blpapi_UInt16_t>(value.d_msec);
d_value.picoseconds = 0;
d_value.datetime.parts |= DatetimeParts::FRACSECONDS;
}
inline
void Datetime::setFractionOfSecond(Microseconds value)
{
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(value.d_usec / 1000);
d_value.picoseconds = value.d_usec % 1000 * 1000 * 1000;
d_value.datetime.parts |= DatetimeParts::FRACSECONDS;
}
inline
void Datetime::setFractionOfSecond(Nanoseconds value)
{
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(value.d_nsec / 1000 / 1000);
d_value.picoseconds = value.d_nsec % (1000 * 1000) * 1000;
d_value.datetime.parts |= DatetimeParts::FRACSECONDS;
}
inline
void Datetime::setFractionOfSecond(Picoseconds value)
{
d_value.datetime.milliSeconds
= static_cast<blpapi_UInt16_t>(value.d_psec / 1000 / 1000 / 1000);
d_value.picoseconds
= static_cast<blpapi_UInt32_t>(value.d_psec % (1000 * 1000 * 1000));
d_value.datetime.parts |= DatetimeParts::FRACSECONDS;
}
inline
blpapi_Datetime_t& Datetime::rawValue()
{
return d_value.datetime;
}
inline
blpapi_HighPrecisionDatetime_t& Datetime::rawHighPrecisionValue()
{
return d_value;
}
inline
bool Datetime::hasParts(unsigned newParts) const
{
return newParts == (d_value.datetime.parts & newParts);
}
inline
unsigned Datetime::parts() const
{
return d_value.datetime.parts;
}
inline
unsigned Datetime::year() const
{
return d_value.datetime.year;
}
inline
unsigned Datetime::month() const
{
return d_value.datetime.month;
}
inline
unsigned Datetime::day() const
{
return d_value.datetime.day;
}
inline
unsigned Datetime::hours() const
{
return d_value.datetime.hours;
}
inline
unsigned Datetime::minutes() const
{
return d_value.datetime.minutes;
}
inline
unsigned Datetime::seconds() const
{
return d_value.datetime.seconds;
}
inline
unsigned Datetime::milliSeconds() const
{
return d_value.datetime.milliSeconds;
}
inline
unsigned Datetime::milliseconds() const
{
return d_value.datetime.milliSeconds;
}
inline
unsigned Datetime::microseconds() const
{
return d_value.datetime.milliSeconds * 1000
+ d_value.picoseconds / 1000 / 1000;
}
inline
unsigned Datetime::nanoseconds() const
{
return d_value.datetime.milliSeconds * 1000 * 1000
+ d_value.picoseconds / 1000;
}
inline
unsigned long long Datetime::picoseconds() const
{
return d_value.datetime.milliSeconds * 1000LL * 1000 * 1000
+ d_value.picoseconds;
}
inline
short Datetime::offset() const
{
return d_value.datetime.offset;
}
inline
const blpapi_Datetime_t& Datetime::rawValue() const
{
return d_value.datetime;
}
inline
const blpapi_HighPrecisionDatetime_t& Datetime::rawHighPrecisionValue() const
{
return d_value;
}
inline
bool Datetime::isValid() const
{
if ( (hasParts(DatetimeParts::YEAR)
|| hasParts(DatetimeParts::MONTH)
|| hasParts(DatetimeParts::DAY) )
&& !isValidDate(year(), month(), day()) ) {
return false;
}
if ( (hasParts(DatetimeParts::HOURS)
|| hasParts(DatetimeParts::MINUTES)
|| hasParts(DatetimeParts::SECONDS)
|| hasParts(DatetimeParts::MILLISECONDS))
&& !isValidTime(hours(), minutes(), seconds(), milliSeconds()) ) {
return false;
}
if ( hasParts(DatetimeParts::FRACSECONDS)
&& (picoseconds() >= 1000LL * 1000 * 1000 * 1000)) {
return false;
}
return true;
}
inline
std::ostream& Datetime::print(std::ostream& stream,
int level,
int spacesPerLevel) const
{
BLPAPI_CALL_HIGHPRECISIONDATETIME_PRINT(&d_value,
StreamProxyOstream::writeToStream,
&stream,
level,
spacesPerLevel);
return stream;
}
inline
bool operator==(const Datetime& lhs, const Datetime& rhs)
{
if (lhs.parts() == rhs.parts()) {
return (BLPAPI_CALL_HIGHPRECISIONDATETIME_COMPARE(
&lhs.rawHighPrecisionValue(),
&rhs.rawHighPrecisionValue())
== 0);
}
return false;
}
inline
bool operator!=(const Datetime& lhs, const Datetime& rhs)
{
return !(lhs == rhs);
}
inline
bool operator<(const Datetime& lhs, const Datetime& rhs)
{
return (BLPAPI_CALL_HIGHPRECISIONDATETIME_COMPARE(
&lhs.rawHighPrecisionValue(),
&rhs.rawHighPrecisionValue())
< 0);
}
inline
bool operator<=(const Datetime& lhs, const Datetime& rhs)
{
return !(rhs < lhs);
}
inline
bool operator>(const Datetime& lhs, const Datetime& rhs)
{
return rhs < lhs;
}
inline
bool operator>=(const Datetime& lhs, const Datetime& rhs)
{
return !(lhs < rhs);
}
inline
std::ostream& operator<<(std::ostream& stream, const Datetime& datetime)
{
return datetime.print(stream, 0, -1);
}
// ------------------
// class DatetimeUtil
// ------------------
inline
Datetime DatetimeUtil::fromTimePoint(const TimePoint& timePoint,
Datetime::Offset offset)
{
blpapi_HighPrecisionDatetime_t highPrecisionDatetime;
BLPAPI_CALL_HIGHPRECISIONDATETIME_FROMTIMEPOINT(
&highPrecisionDatetime,
&timePoint,
offset.d_minutesAheadOfUTC);
return Datetime(highPrecisionDatetime);
}
} // close namespace blpapi
} // close namespace BloombergLP
#endif // #ifdef __cplusplus
#endif // #ifndef INCLUDED_BLPAPI_DATETIME