[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, &microsecond) < 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, &microsecond) < 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, &microsecond) < 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, &microsecond) < 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 */
 };
 

AltStyle によって変換されたページ (->オリジナル) /