[bknr-cvs] hans changed trunk/projects/bos/m2/allocation.lisp

BKNR Commits bknr at bknr.net
Wed Jul 23 15:28:01 UTC 2008


Revision: 3587
Author: hans
URL: http://bknr.net/trac/changeset/3587

try again!

U   trunk/projects/bos/m2/allocation.lisp

Modified: trunk/projects/bos/m2/allocation.lisp
===================================================================
--- trunk/projects/bos/m2/allocation.lisp	2008-07-23 15:07:18 UTC (rev 3586)
+++ trunk/projects/bos/m2/allocation.lisp	2008-07-23 15:28:01 UTC (rev 3587)
@@ -291,47 +291,43 @@
     consistent-p))
 
 ;;; allocation
-(defun try-allocation (n x y pred)
+(defun try-allocation (n start-x start-y pred)
   "Try to find N free square meters that are adjacent and that begin
 at X and Y.  PRED is a predicate function of two arguments that
 returns a true value if the arguments specify the coordinates of an
 allocatable square meter."
-  (unless (funcall pred x y)
+  (unless (funcall pred start-x start-y)
     (error "sqm ~A/~A not allocatable" x y))
   (let* ((allocated (make-hash-table :test #'equal))
-         (initial-key (list x y))
          (border-queue (bos.web::make-queue))
          connected)
-    (setf (gethash initial-key allocated) t)
     (labels
-        ((try-get (&rest key)           
-           (when (and (not (gethash key allocated))
-                      (apply pred key))             
-             (setf key (copy-list key))
+        ((enqueue (x y)
+           (let ((key (list x y)))
              (setf (gethash key allocated) t)
-             (bos.web::enqueue key border-queue)
-             key))
+             (bos.web::enqueue key border-queue)))
+         (try-get (&rest key)           
+           (and (not (gethash key allocated))
+                (apply pred key)))
          (get-next-neighbor (x y)
-           "Return the next neighbor of M2 that can be allocated or NIL if none of the neighbor can be allocated."
            (or (try-get (1+ x) y)
                (try-get x (1+ y))
                (try-get (1- x) y)
                (try-get x (1- y)))))
+      (enqueue start-x start-y)
       (dotimes (i (1- n)
-                (append #+nil(list initial-key)
-                        connected
-                        (bos.web::queue-elements border-queue)))
+                (append connected (bos.web::queue-elements border-queue)))
         (tagbody
          retry
-           (let ((next (get-next-neighbor x y)))
-             (unless next
+           (destructuring-bind (x y) (bos.web::peek-queue border-queue)
+             (let ((next (get-next-neighbor x y)))
                (cond
+                 (next
+                  (apply #'enqueue next))
                  ((bos.web::queue-empty-p border-queue)
                   (return nil))
                  (t
-                  (push (list x y) connected)
-                  (multiple-value-setq (x y)
-                    (values-list (bos.web::dequeue border-queue)))
+                  (push (bos.web::dequeue border-queue) connected)
                   (go retry))))))))))
 
 (defun allocate-in-area (area n)




More information about the Bknr-cvs mailing list