1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* datetime.h 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#ifndef DATETIME_H 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define DATETIME_H 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#ifdef __cplusplus 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehextern "C" { 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#endif 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Fields are packed into successive bytes, each viewed as unsigned and 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * big-endian, unless otherwise noted: 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * byte offset 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 0 year 2 bytes, 1-9999 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 2 month 1 byte, 1-12 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 3 day 1 byte, 1-31 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 4 hour 1 byte, 0-23 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 5 minute 1 byte, 0-59 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 6 second 1 byte, 0-59 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 7 usecond 3 bytes, 0-999999 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * 10 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* # of bytes for year, month, and day. */ 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyDateTime_DATE_DATASIZE 4 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* # of bytes for hour, minute, second, and usecond. */ 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyDateTime_TIME_DATASIZE 6 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* # of bytes for year, month, day, hour, minute, second, and usecond. */ 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyDateTime_DATETIME_DATASIZE 10 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject_HEAD 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh long hashcode; /* -1 when unknown */ 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh int seconds; /* 0 <= seconds < 24*3600 is invariant */ 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh int microseconds; /* 0 <= microseconds < 1000000 is invariant */ 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_Delta; 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject_HEAD /* a pure abstract base clase */ 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_TZInfo; 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* The datetime and time types have hashcodes, and an optional tzinfo member, 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * present if and only if hastzinfo is true. 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyTZINFO_HEAD \ 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject_HEAD \ 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh long hashcode; \ 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh char hastzinfo; /* boolean flag */ 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * convenient to cast to, when getting at the hastzinfo member of objects 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * starting with _PyTZINFO_HEAD. 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyTZINFO_HEAD 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} _PyDateTime_BaseTZInfo; 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* All time objects are of PyDateTime_TimeType, but that can be allocated 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * in two ways, with or without a tzinfo member. Without is the same as 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * internal struct used to allocate the right amount of space for the 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * "without" case. 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyDateTime_TIMEHEAD \ 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyTZINFO_HEAD \ 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unsigned char data[_PyDateTime_TIME_DATASIZE]; 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyDateTime_TIMEHEAD 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} _PyDateTime_BaseTime; /* hastzinfo false */ 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyDateTime_TIMEHEAD 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *tzinfo; 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_Time; /* hastzinfo true */ 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* All datetime objects are of PyDateTime_DateTimeType, but that can be 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * allocated in two ways too, just like for time objects above. In addition, 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * the plain date type is a base class for datetime, so it must also have 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh * a hastzinfo member (although it's unused there). 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh */ 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyTZINFO_HEAD 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unsigned char data[_PyDateTime_DATE_DATASIZE]; 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_Date; 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define _PyDateTime_DATETIMEHEAD \ 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyTZINFO_HEAD \ 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh unsigned char data[_PyDateTime_DATETIME_DATASIZE]; 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyDateTime_DATETIMEHEAD 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} _PyDateTime_BaseDateTime; /* hastzinfo false */ 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh{ 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh _PyDateTime_DATETIMEHEAD 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *tzinfo; 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_DateTime; /* hastzinfo true */ 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Apply for date and datetime instances. */ 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ((PyDateTime_Date*)o)->data[1]) 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3]) 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4]) 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5]) 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6]) 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_DATE_GET_MICROSECOND(o) \ 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ((((PyDateTime_DateTime*)o)->data[7] << 16) | \ 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (((PyDateTime_DateTime*)o)->data[8] << 8) | \ 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ((PyDateTime_DateTime*)o)->data[9]) 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Apply for time instances. */ 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1]) 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2]) 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_TIME_GET_MICROSECOND(o) \ 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ((((PyDateTime_Time*)o)->data[3] << 16) | \ 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (((PyDateTime_Time*)o)->data[4] << 8) | \ 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ((PyDateTime_Time*)o)->data[5]) 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Define structure for C API. */ 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtypedef struct { 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh /* type objects */ 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyTypeObject *DateType; 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyTypeObject *DateTimeType; 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyTypeObject *TimeType; 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyTypeObject *DeltaType; 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyTypeObject *TZInfoType; 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh /* constructors */ 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*); 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject*, PyTypeObject*); 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh /* constructors for the DB API */ 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} PyDateTime_CAPI; 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI" 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* "magic" constant used to partially protect against developer mistakes. */ 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define DATETIME_API_MAGIC 0x414548d5 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#ifdef Py_BUILD_CORE 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Macros for type checking when building the Python core. */ 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#else 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Define global variable for the C API and a macro for setting it. */ 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehstatic PyDateTime_CAPI *PyDateTimeAPI = NULL; 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_IMPORT \ 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0) 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Macros for type checking when not building the Python core. */ 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Macros for accessing constructors in a simplified fashion. */ 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_FromDate(year, month, day) \ 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType) 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \ 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \ 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType) 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyTime_FromTime(hour, minute, second, usecond) \ 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \ 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Py_None, PyDateTimeAPI->TimeType) 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDelta_FromDSU(days, seconds, useconds) \ 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \ 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->DeltaType) 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh/* Macros supporting the DB API. */ 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDateTime_FromTimestamp(args) \ 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->DateTime_FromTimestamp( \ 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL) 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#define PyDate_FromTimestamp(args) \ 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh PyDateTimeAPI->Date_FromTimestamp( \ 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (PyObject*) (PyDateTimeAPI->DateType), args) 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#endif /* Py_BUILD_CORE */ 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#ifdef __cplusplus 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh} 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#endif 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#endif 240