summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
Diffstat (limited to 'Include')
-rw-r--r--Include/datetime.h62
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) | \