~ chicken-core (chicken-5) 3c7b16605cdb170bb7c3d4c2b1eb06a8e0cf610f
commit 3c7b16605cdb170bb7c3d4c2b1eb06a8e0cf610f
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Aug 8 05:35:32 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Aug 8 05:35:32 2011 +0200
added queue-length
diff --git a/data-structures.import.scm b/data-structures.import.scm
index 7328cc2a..fc2f3760 100644
--- a/data-structures.import.scm
+++ b/data-structures.import.scm
@@ -61,6 +61,7 @@
queue-empty?
queue-first
queue-last
+ queue-length
queue-push-back!
queue-push-back-list!
queue-remove!
diff --git a/data-structures.scm b/data-structures.scm
index 8844e160..4cc30a89 100644
--- a/data-structures.scm
+++ b/data-structures.scm
@@ -793,9 +793,13 @@ EOF
; is stored in the queue type so that datums can be added in constant
; time.
-(define (make-queue) (##sys#make-structure 'queue '() '()))
+(define (make-queue) (##sys#make-structure 'queue '() '() 0))
(define (queue? x) (##sys#structure? x 'queue))
+(define (queue-length q) ; thread-safe
+ (##sys#check-structure q 'queue 'queue-length)
+ (##sys#slot q 3))
+
(define (queue-empty? q) ; thread-safe
(##sys#check-structure q 'queue 'queue-empty?)
(eq? '() (##sys#slot q 1)) )
@@ -822,6 +826,7 @@ EOF
(cond ((eq? '() (##sys#slot q 1)) (##sys#setslot q 1 new-pair))
(else (##sys#setslot (##sys#slot q 2) 1 new-pair)) )
(##sys#setslot q 2 new-pair)
+ (##sys#setislot q 3 (fx+ (##sys#slot q 3) 1))
(##core#undefined) ) )
(define queue-remove! ; thread-safe
@@ -834,6 +839,7 @@ EOF
(##sys#setslot q 1 first-cdr)
(if (eq? '() first-cdr)
(##sys#setslot q 2 '()) )
+ (##sys#setislot q 3 (fx- (##sys#slot q 3) 1))
(##sys#slot first-pair 0) ) ) ) )
(define (queue->list q)
@@ -864,7 +870,8 @@ EOF
(let ((newlist (cons item (##sys#slot q 1))))
(##sys#setslot q 1 newlist)
(if (eq? '() (##sys#slot q 2))
- (##sys#setslot q 2 newlist))))
+ (##sys#setslot q 2 newlist))
+ (##sys#setislot q 3 (fx+ (##sys#slot q 3) 1))))
; (queue-push-back-list! queue item-list)
; Pushes the items in item-list back onto the queue,
@@ -882,4 +889,5 @@ EOF
'()
(last-pair newlist))))
(##sys#setslot q 1 newlist)
- (##sys#setslot q 2 newtail)))
+ (##sys#setslot q 2 newtail)
+ (##sys#setislot q 3 (fx+ (##sys#slot q 3) (##core#inline "C_i_length" itemlist)))))
diff --git a/manual/Unit data-structures b/manual/Unit data-structures
index e8388236..0151d122 100644
--- a/manual/Unit data-structures
+++ b/manual/Unit data-structures
@@ -149,6 +149,13 @@ Returns a newly created queue.
Returns {{#t}} if {{X}} is a queue, or {{#f}} otherwise.
+==== queue-length
+
+<procedure>(queue-length QUEUE)</procedure>
+
+Returns the current number of items stored in {{QUEUE}}.
+
+
==== queue->list
<procedure>(queue->list QUEUE)</procedure>
diff --git a/types.db b/types.db
index e1076349..e5154d6e 100644
--- a/types.db
+++ b/types.db
@@ -963,6 +963,10 @@
(queue-first (procedure! queue-first ((struct queue)) *))
(queue-last (procedure! queue-last ((struct queue)) *))
+
+(queue-length (procedure! queue-length ((struct queue)) fixnum)
+ (((struct queue)) (##sys#slot #(1) '3)))
+
(queue-push-back! (procedure! queue-push-back! ((struct queue) *) undefined))
(queue-push-back-list! (procedure! queue-push-back-list! ((struct queue) list) undefined))
(queue-remove! (procedure! queue-remove! ((struct queue)) *))
Trap