~ 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