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