[mcclim-cvs] CVS mcclim
rgoldman
rgoldman at common-lisp.net
Fri Sep 7 16:49:11 UTC 2007
Update of /project/mcclim/cvsroot/mcclim
In directory clnet:/tmp/cvs-serv11817
Modified Files:
recording.lisp
Log Message:
Two fixes to the output-record protocol implementation, per discussion
on #lisp in the week of 3 September 2007:
1. The standard-tree-output-record did not implement an
output-record-count method. antifuchs supplied one.
2. There was a default method for output-record-count that masked the
bug in #1. It returned zero for any object of any output-record
subclass that did not implement output-record-count. Per hefner's
suggestion, this method has been moved down from basic-output-record
to displayed-output-record. We hope that this will cause earlier
failure in cases where methods are missing.
--- /project/mcclim/cvsroot/mcclim/recording.lisp 2007/07/18 16:31:27 1.134
+++ /project/mcclim/cvsroot/mcclim/recording.lisp 2007/09/07 16:49:11 1.135
@@ -619,7 +619,7 @@
record
(setf (rectangle-edges* record) (values x y x y))))
-(defmethod output-record-count ((record basic-output-record))
+(defmethod output-record-count ((record displayed-output-record))
0)
(defmethod map-over-output-records-1
@@ -971,6 +971,7 @@
((children :initform (%make-tree-output-record-tree)
:accessor %tree-record-children)
(children-hash :initform (make-hash-table :test #'eql) :reader %tree-record-children-cache)
+ (child-count :initform 0)
(last-insertion-nr :initform 0 :accessor last-insertion-nr)))
(defun %entry-in-children-cache (record entry)
@@ -992,25 +993,33 @@
(let ((entry (make-tree-output-record-entry child (incf (last-insertion-nr record)))))
(spatial-trees:insert entry (%tree-record-children record))
(setf (output-record-parent child) record)
- (setf (%entry-in-children-cache record child) entry)))
+ (setf (%entry-in-children-cache record child) entry))
+ (incf (slot-value record 'child-count))
+ (values))
(defmethod delete-output-record (child (record standard-tree-output-record) &optional (errorp t))
(let ((entry (find child (spatial-trees:search (%entry-in-children-cache record child)
(%tree-record-children record))
:key #'tree-output-record-entry-record)))
- (cond
- ((not (null entry))
- (spatial-trees:delete entry (%tree-record-children record))
- (%remove-entry-from-children-cache record child)
- (setf (output-record-parent child) nil))
- (errorp (error "~S is not a child of ~S" child record)))))
+ (decf (slot-value record 'child-count))
+ (cond
+ ((not (null entry))
+ (spatial-trees:delete entry (%tree-record-children record))
+ (%remove-entry-from-children-cache record child)
+ (setf (output-record-parent child) nil))
+ (errorp (error "~S is not a child of ~S" child record)))))
(defmethod clear-output-record ((record standard-tree-output-record))
- (dolist (child (output-record-children record))
- (setf (output-record-parent child) nil)
- (%remove-entry-from-children-cache record child))
+ (map nil (lambda (child)
+ (setf (output-record-parent child) nil)
+ (%remove-entry-from-children-cache record child))
+ (output-record-children record))
+ (setf (slot-value record 'child-count) 0)
(setf (%tree-record-children record) (%make-tree-output-record-tree)))
+(defmethod output-record-count ((record standard-tree-output-record))
+ (slot-value record 'child-count))
+
(defun map-over-tree-output-records (function record rectangle sort-order function-args)
(dolist (child (sort (spatial-trees:search rectangle
(%tree-record-children record))
More information about the Mcclim-cvs
mailing list