[Python-checkins] python/nondist/sandbox/datetime doc.txt,1.15,1.16 obj_datetime.c,1.20,1.21
tim_one@users.sourceforge.net
tim_one@users.sourceforge.net
2002年12月05日 16:55:30 -0800
Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv22096
Modified Files:
doc.txt obj_datetime.c
Log Message:
Rearranged the datetime code so that related functions are grouped
next to each other. Got rid of datetime_nonzero, and reused date_nonzero
for it (they both return true regardless of input).
Index: doc.txt
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/doc.txt,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** doc.txt 6 Dec 2002 00:20:33 -0000 1.15
--- doc.txt 6 Dec 2002 00:55:28 -0000 1.16
***************
*** 417,421 ****
datetime2 + timedelta == datetime1 after.
! - comparison of datetime1 to datetime, where datetime1 is considered
less than datetime2 when datetime1 precedes datetime2 in time.
--- 417,421 ----
datetime2 + timedelta == datetime1 after.
! - comparison of datetime to datetime, where datetime1 is considered
less than datetime2 when datetime1 precedes datetime2 in time.
Index: obj_datetime.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/obj_datetime.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** obj_datetime.c 5 Dec 2002 23:15:59 -0000 1.20
--- obj_datetime.c 6 Dec 2002 00:55:28 -0000 1.21
***************
*** 3,181 ****
*/
! /* Force all the datetime fields into range. The parameters are both
! * inputs and outputs. Returns < 0 on error.
! */
! static int
! normalize_datetime(long *year, long *month, long *day,
! long *hour, long *minute, long *second,
! long *microsecond)
! {
! normalize_pair(second, microsecond, 1000000);
! normalize_pair(minute, second, 60);
! normalize_pair(hour, minute, 60);
! normalize_pair(day, hour, 24);
! return normalize_date(year, month, day);
! }
!
! static PyObject *
! add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta)
! {
! /* Note that the C-level additions can't overflow, because of
! * invariant bounds on the member values.
! */
! long year = GET_YEAR(date);
! long month = GET_MONTH(date);
! long day = GET_DAY(date) + GET_TD_DAYS(delta);
! long hour = GET_HOUR(date);
! long minute = GET_MINUTE(date);
! long second = GET_SECOND(date) + GET_TD_SECONDS(delta);
! long microsecond = GET_MICROSECOND(date) + GET_TD_MICROSECONDS(delta);
!
! if (normalize_datetime(&year, &month, &day,
! &hour, &minute, &second, µsecond) < 0)
! return NULL;
! else
! return new_datetime(year, month, day,
! hour, minute, second, microsecond);
! }
!
! static PyObject *
! sub_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta)
! {
! /* Note that the C-level subtractions can't overflow, because of
! * invariant bounds on the member values.
! */
! long year = GET_YEAR(date);
! long month = GET_MONTH(date);
! long day = GET_DAY(date) - GET_TD_DAYS(delta);
! long hour = GET_HOUR(date);
! long minute = GET_MINUTE(date);
! long second = GET_SECOND(date) - GET_TD_SECONDS(delta);
! long microsecond = GET_MICROSECOND(date) - GET_TD_MICROSECONDS(delta);
!
! if (normalize_datetime(&year, &month, &day,
! &hour, &minute, &second, µsecond) < 0)
! return NULL;
! else
! return new_datetime(year, month, day,
! hour, minute, second, microsecond);
! }
static PyObject *
! sub_datetime_datetime(PyDateTime_DateTime *left, PyDateTime_DateTime *right)
{
! long days1 = ymd_to_ord(GET_YEAR(left),
! GET_MONTH(left),
! GET_DAY(left));
! long days2 = ymd_to_ord(GET_YEAR(right),
! GET_MONTH(right),
! GET_DAY(right));
!
! /* These can't overflow, since the values are normalized. At most
! * this gives the number of seconds in one day.
! */
! long seconds1 = (GET_HOUR(left) * 60 + GET_MINUTE(left)) * 60 +
! GET_SECOND(left);
! long seconds2 = (GET_HOUR(right) * 60 + GET_MINUTE(right)) * 60 +
! GET_SECOND(right);
! long delta_us = GET_MICROSECOND(left) - GET_MICROSECOND(right);
!
! return new_delta(days1 - days2, seconds1 - seconds2, delta_us, 1);
}
static PyObject *
! datetime_add(PyObject *left, PyObject *right)
{
! PyTypeObject *left_type = left->ob_type;
! PyTypeObject *right_type = right->ob_type;
!
! if (PyType_IsSubtype(left_type, &PyDateTime_DateTimeType)) {
! /* datetime + ??? */
! if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType))
! /* datetime + delta */
! return add_datetime_timedelta(
! (PyDateTime_DateTime *)left,
! (PyDateTime_Delta *)right);
! }
! else if (PyType_IsSubtype(left_type, &PyDateTime_DeltaType)) {
! /* delta + datetime */
! return add_datetime_timedelta((PyDateTime_DateTime *) right,
! (PyDateTime_Delta *) left);
! }
! Py_INCREF(Py_NotImplemented);
! return Py_NotImplemented;
}
static PyObject *
! datetime_subtract(PyObject *left, PyObject *right)
{
! PyTypeObject *left_type = left->ob_type;
! PyTypeObject *right_type = right->ob_type;
! PyObject *result = Py_NotImplemented;
!
! if (PyType_IsSubtype(left_type, &PyDateTime_DateTimeType)) {
! /* datetime - ??? */
! if (PyType_IsSubtype(right_type, &PyDateTime_DateTimeType)) {
! /* datetime - datetime */
! result = sub_datetime_datetime(
! (PyDateTime_DateTime *)left,
! (PyDateTime_DateTime *)right);
! }
! else if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType)) {
! /* datetime - delta */
! result = sub_datetime_timedelta(
! (PyDateTime_DateTime *)left,
! (PyDateTime_Delta *)right);
! }
! }
!
! if (result == Py_NotImplemented)
! Py_INCREF(result);
! return result;
}
- /* This is more natural as a tp_compare, but doesn't work then: for whatever
- * reason, Python's try_3way_compare ignores tp_compare unless
- * PyInstance_Check returns true, but these aren't old-style classes.
- */
static PyObject *
! datetime_richcompare(PyDateTime_DateTime *self, PyObject *other, int op)
{
! long diff;
!
! if (!PyType_IsSubtype(other->ob_type, &PyDateTime_DateTimeType)) {
! PyErr_Format(PyExc_TypeError,
! "can't compare datetime to %s instance",
! other->ob_type->tp_name);
! return NULL;
! }
! diff = memcmp(self->data, ((PyDateTime_DateTime *)other)->data,
! _PyDateTime_DATETIME_DATA_SIZE);
! return diff_to_bool(diff, op);
}
! static PyObject *
! datetime_ctime(PyDateTime_DateTime *self)
! {
! return format_ctime((PyDateTime_Date *)self,
! GET_HOUR(self), GET_MINUTE(self), GET_SECOND(self));
! }
! static long
! datetime_hash(PyDateTime_DateTime *self)
! {
! if (self->hashcode == -1) {
! PyObject *temp;
! temp = Py_BuildValue("lllllll", GET_YEAR(self),
! GET_MONTH(self), GET_DAY(self),
! GET_HOUR(self), GET_MINUTE(self),
! GET_SECOND(self), GET_MICROSECOND(self));
! if (temp != NULL) {
! self->hashcode = PyObject_Hash(temp);
! Py_DECREF(temp);
! }
! }
! return self->hashcode;
! }
static PyObject *
--- 3,41 ----
*/
! /* Accessor properties. */
static PyObject *
! datetime_hour(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_HOUR(self));
}
static PyObject *
! datetime_minute(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_MINUTE(self));
}
static PyObject *
! datetime_second(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_SECOND(self));
}
static PyObject *
! datetime_microsecond(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_MICROSECOND(self));
}
! static PyGetSetDef datetime_getset[] = {
! {"hour", (getter)datetime_hour},
! {"minute", (getter)datetime_minute},
! {"second", (getter)datetime_second},
! {"microsecond", (getter)datetime_microsecond},
! {NULL}
! };
! /* Constructors. */
static PyObject *
***************
*** 333,367 ****
}
static PyObject *
! datetime_hour(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_HOUR(self));
}
static PyObject *
! datetime_minute(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_MINUTE(self));
}
static PyObject *
! datetime_second(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_SECOND(self));
}
static PyObject *
! datetime_microsecond(PyDateTime_DateTime *self, void *unused)
{
! return PyInt_FromLong(GET_MICROSECOND(self));
}
! static PyGetSetDef datetime_getset[] = {
! {"hour", (getter)datetime_hour},
! {"minute", (getter)datetime_minute},
! {"second", (getter)datetime_second},
! {"microsecond", (getter)datetime_microsecond},
! {NULL}
! };
static PyObject *
--- 193,331 ----
}
+ /* datetime arithmetic. */
+
+ /* Force all the datetime fields into range. The parameters are both
+ * inputs and outputs. Returns < 0 on error.
+ */
+ static int
+ normalize_datetime(long *year, long *month, long *day,
+ long *hour, long *minute, long *second,
+ long *microsecond)
+ {
+ normalize_pair(second, microsecond, 1000000);
+ normalize_pair(minute, second, 60);
+ normalize_pair(hour, minute, 60);
+ normalize_pair(day, hour, 24);
+ return normalize_date(year, month, day);
+ }
+
static PyObject *
! add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta)
{
! /* Note that the C-level additions can't overflow, because of
! * invariant bounds on the member values.
! */
! long year = GET_YEAR(date);
! long month = GET_MONTH(date);
! long day = GET_DAY(date) + GET_TD_DAYS(delta);
! long hour = GET_HOUR(date);
! long minute = GET_MINUTE(date);
! long second = GET_SECOND(date) + GET_TD_SECONDS(delta);
! long microsecond = GET_MICROSECOND(date) + GET_TD_MICROSECONDS(delta);
!
! if (normalize_datetime(&year, &month, &day,
! &hour, &minute, &second, µsecond) < 0)
! return NULL;
! else
! return new_datetime(year, month, day,
! hour, minute, second, microsecond);
}
static PyObject *
! sub_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta)
{
! /* Note that the C-level subtractions can't overflow, because of
! * invariant bounds on the member values.
! */
! long year = GET_YEAR(date);
! long month = GET_MONTH(date);
! long day = GET_DAY(date) - GET_TD_DAYS(delta);
! long hour = GET_HOUR(date);
! long minute = GET_MINUTE(date);
! long second = GET_SECOND(date) - GET_TD_SECONDS(delta);
! long microsecond = GET_MICROSECOND(date) - GET_TD_MICROSECONDS(delta);
!
! if (normalize_datetime(&year, &month, &day,
! &hour, &minute, &second, µsecond) < 0)
! return NULL;
! else
! return new_datetime(year, month, day,
! hour, minute, second, microsecond);
}
static PyObject *
! sub_datetime_datetime(PyDateTime_DateTime *left, PyDateTime_DateTime *right)
{
! long days1 = ymd_to_ord(GET_YEAR(left),
! GET_MONTH(left),
! GET_DAY(left));
! long days2 = ymd_to_ord(GET_YEAR(right),
! GET_MONTH(right),
! GET_DAY(right));
!
! /* These can't overflow, since the values are normalized. At most
! * this gives the number of seconds in one day.
! */
! long seconds1 = (GET_HOUR(left) * 60 + GET_MINUTE(left)) * 60 +
! GET_SECOND(left);
! long seconds2 = (GET_HOUR(right) * 60 + GET_MINUTE(right)) * 60 +
! GET_SECOND(right);
! long delta_us = GET_MICROSECOND(left) - GET_MICROSECOND(right);
!
! return new_delta(days1 - days2, seconds1 - seconds2, delta_us, 1);
}
static PyObject *
! datetime_add(PyObject *left, PyObject *right)
{
! PyTypeObject *left_type = left->ob_type;
! PyTypeObject *right_type = right->ob_type;
!
! if (PyType_IsSubtype(left_type, &PyDateTime_DateTimeType)) {
! /* datetime + ??? */
! if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType))
! /* datetime + delta */
! return add_datetime_timedelta(
! (PyDateTime_DateTime *)left,
! (PyDateTime_Delta *)right);
! }
! else if (PyType_IsSubtype(left_type, &PyDateTime_DeltaType)) {
! /* delta + datetime */
! return add_datetime_timedelta((PyDateTime_DateTime *) right,
! (PyDateTime_Delta *) left);
! }
! Py_INCREF(Py_NotImplemented);
! return Py_NotImplemented;
}
! static PyObject *
! datetime_subtract(PyObject *left, PyObject *right)
! {
! PyTypeObject *left_type = left->ob_type;
! PyTypeObject *right_type = right->ob_type;
! PyObject *result = Py_NotImplemented;
!
! if (PyType_IsSubtype(left_type, &PyDateTime_DateTimeType)) {
! /* datetime - ??? */
! if (PyType_IsSubtype(right_type, &PyDateTime_DateTimeType)) {
! /* datetime - datetime */
! result = sub_datetime_datetime(
! (PyDateTime_DateTime *)left,
! (PyDateTime_DateTime *)right);
! }
! else if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType)) {
! /* datetime - delta */
! result = sub_datetime_timedelta(
! (PyDateTime_DateTime *)left,
! (PyDateTime_Delta *)right);
! }
! }
!
! if (result == Py_NotImplemented)
! Py_INCREF(result);
! return result;
! }
!
! /* Various ways to turn a datetime into a string. */
static PyObject *
***************
*** 431,439 ****
}
! static int
! datetime_nonzero(PyDateTime_DateTime *self)
{
! assert(GET_YEAR(self) >= 1);
! return 1;
}
--- 395,444 ----
}
! static PyObject *
! datetime_ctime(PyDateTime_DateTime *self)
{
! return format_ctime((PyDateTime_Date *)self,
! GET_HOUR(self),
! GET_MINUTE(self),
! GET_SECOND(self));
! }
!
! /* Miscellaneous methods. */
!
! /* This is more natural as a tp_compare, but doesn't work then: for whatever
! * reason, Python's try_3way_compare ignores tp_compare unless
! * PyInstance_Check returns true, but these aren't old-style classes.
! */
! static PyObject *
! datetime_richcompare(PyDateTime_DateTime *self, PyObject *other, int op)
! {
! long diff;
!
! if (!PyType_IsSubtype(other->ob_type, &PyDateTime_DateTimeType)) {
! PyErr_Format(PyExc_TypeError,
! "can't compare datetime to %s instance",
! other->ob_type->tp_name);
! return NULL;
! }
! diff = memcmp(self->data, ((PyDateTime_DateTime *)other)->data,
! _PyDateTime_DATETIME_DATA_SIZE);
! return diff_to_bool(diff, op);
! }
!
! static long
! datetime_hash(PyDateTime_DateTime *self)
! {
! if (self->hashcode == -1) {
! PyObject *temp;
! temp = Py_BuildValue("lllllll", GET_YEAR(self),
! GET_MONTH(self), GET_DAY(self),
! GET_HOUR(self), GET_MINUTE(self),
! GET_SECOND(self), GET_MICROSECOND(self));
! if (temp != NULL) {
! self->hashcode = PyObject_Hash(temp);
! Py_DECREF(temp);
! }
! }
! return self->hashcode;
}
***************
*** 529,542 ****
static PyNumberMethods datetime_as_number = {
datetime_add, /* nb_add */
! datetime_subtract, /* nb_subtract */
! 0, /* nb_multiply */
! 0, /* nb_divide */
! 0, /* nb_remainder */
! 0, /* nb_divmod */
! 0, /* nb_power */
! 0, /* nb_negative */
! 0, /* nb_positive */
! 0, /* nb_absolute */
! (inquiry)datetime_nonzero, /* nb_nonzero */
};
--- 534,547 ----
static PyNumberMethods datetime_as_number = {
datetime_add, /* nb_add */
! datetime_subtract, /* nb_subtract */
! 0, /* nb_multiply */
! 0, /* nb_divide */
! 0, /* nb_remainder */
! 0, /* nb_divmod */
! 0, /* nb_power */
! 0, /* nb_negative */
! 0, /* nb_positive */
! 0, /* nb_absolute */
! (inquiry)date_nonzero, /* nb_nonzero */
};