[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