diff options
Diffstat (limited to 'Include')
-rw-r--r-- | Include/datetime.h | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/Include/datetime.h b/Include/datetime.h index 5c31162..4df0753 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -27,35 +27,52 @@ /* # of bytes for year, month, day, hour, minute, second, and usecond. */ #define _PyDateTime_DATETIME_DATASIZE 10 -#define _PyTZINFO_HEAD \ - PyObject_HEAD \ - long hashcode; \ - char hastzinfo; /* boolean flag */ typedef struct { PyObject_HEAD - long hashcode; - unsigned char data[_PyDateTime_DATE_DATASIZE]; -} PyDateTime_Date; + long hashcode; /* -1 when unknown */ + int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ + int seconds; /* 0 <= seconds < 24*3600 is invariant */ + int microseconds; /* 0 <= microseconds < 1000000 is invariant */ +} PyDateTime_Delta; typedef struct { - PyObject_HEAD - long hashcode; - unsigned char data[_PyDateTime_DATETIME_DATASIZE]; -} PyDateTime_DateTime; + PyObject_HEAD /* a pure abstract base clase */ +} PyDateTime_TZInfo; typedef struct { PyObject_HEAD long hashcode; - unsigned char data[_PyDateTime_DATETIME_DATASIZE]; - PyObject *tzinfo; -} PyDateTime_DateTimeTZ; + unsigned char data[_PyDateTime_DATE_DATASIZE]; +} PyDateTime_Date; +/* The datetime and time types have hashcodes, and an optional tzinfo member, + * present if and only if hastzinfo is true. + */ +#define _PyTZINFO_HEAD \ + PyObject_HEAD \ + long hashcode; \ + char hastzinfo; /* boolean flag */ +/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something + * convenient to cast to, when getting at the hastzinfo member of objects + * starting with _PyTZINFO_HEAD. + */ +typedef struct +{ + _PyTZINFO_HEAD +} _PyDateTime_BaseTZInfo; + +/* All time objects are of PyDateTime_TimeType, but that can be allocated + * in two ways, with or without a tzinfo member. Without is the same as + * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an + * internal struct used to allocate the right amount of space for the + * "without" case. + */ #define _PyDateTime_TIMEHEAD \ _PyTZINFO_HEAD \ unsigned char data[_PyDateTime_TIME_DATASIZE]; @@ -71,20 +88,23 @@ typedef struct PyObject *tzinfo; } PyDateTime_Time; /* hastzinfo true */ +/* XXX The date type will be reworked similarly. */ typedef struct { PyObject_HEAD - long hashcode; /* -1 when unknown */ - int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */ - int seconds; /* 0 <= seconds < 24*3600 is invariant */ - int microseconds; /* 0 <= microseconds < 1000000 is invariant */ -} PyDateTime_Delta; + long hashcode; + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; +} PyDateTime_DateTime; typedef struct { - PyObject_HEAD /* a pure abstract base clase */ -} PyDateTime_TZInfo; + PyObject_HEAD + long hashcode; + unsigned char data[_PyDateTime_DATETIME_DATASIZE]; + PyObject *tzinfo; +} PyDateTime_DateTimeTZ; + /* Apply for date, datetime, and datetimetz instances. */ #define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ |