File: eksl-priority-queue.lisp

package info (click to toggle)
cl-containers 20170403-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,072 kB
  • ctags: 1,387
  • sloc: lisp: 8,341; makefile: 14
file content (63 lines) | stat: -rw-r--r-- 2,301 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
(in-package #:containers)

;;; Heap based queue using EKSL priority-queue
;;?? Needs a better name

#+EKSL-PRIORITY-QUEUE
(progn
  (defclass* priority-queue-heap (abstract-queue concrete-container
                                                 iteratable-container-mixin)
    ((contents  :initform nil
                :initarg :contents
                :accessor contents)))
  
  (defmethod make-container ((class (eql 'priority-queue-heap)) &rest args)
    (make-instance 'priority-queue-heap
      :contents (apply #'make-sorted-queue args)))
  
  (defun make-sorted-queue (&key (not-lessp-predicate #'<)
                                 (key #'identity)
                                 (initial-length 42))
    (u:make-priority-queue
     not-lessp-predicate
     :key key
     :size initial-length))
  
  (defmethod insert-item ((container priority-queue-heap) item)
    (u:priority-queue-insert item (contents container)))
  
  (defmethod find-item ((container priority-queue-heap) item)
    (u:priority-queue-find item (contents container)))
  
  (defmethod search-for-item ((container priority-queue-heap) item &key test key)
    (u:priority-queue-find item (contents container) :key key :test test))
  
  (defmethod delete-item ((container priority-queue-heap) item)
    (u:priority-queue-delete item (contents container)))
  
  (defmethod delete-first ((container priority-queue-heap))
    (u:priority-queue-pop (contents container)))
  
  ;; Should not be called on an empty queue... results might be undefined.
  (defmethod first-item ((container priority-queue-heap))
    (u:priority-queue-head (contents container)))
  
  (defmethod empty-p ((container priority-queue-heap))
    (u:priority-queue-empty-p (contents container)))
  
  (defmethod empty! ((container priority-queue-heap))
    (u:priority-queue-empty (contents container))
    (values))
  
  (defmethod iterate-nodes ((container priority-queue-heap) fn)
    (u:priority-queue-map-in-priority-order
     (lambda (element index)
       (declare (ignore index))
       (funcall fn element))
     (contents container)))
  
  (defmethod size ((container priority-queue-heap))
    (u:priority-queue-length (contents container)))
  
  (u:defcopy-methods priority-queue-heap :copy-all t)
  (u:make-load-form* priority-queue-heap))