(define-interface finite-queues-interface (export make-finite-queue finite-queue-empty? finite-queue-full? add-to-finite-queue! remove-from-finite-queue!)) (define-structure finite-queues finite-queues-interface (open scheme srfi-9 big-util) (begin (define-record-type :finite-queue (really-make-buffer max-size vector size begin end) finite-queue? (max-size finite-queue-max-size) (vector finite-queue-vector) (size finite-queue-size set-finite-queue-size!) (begin finite-queue-begin set-finite-queue-begin!) (end finite-queue-end set-finite-queue-end!)) (define (make-finite-queue max-size) (really-make-buffer max-size (make-vector max-size) 0 0 0)) (define (finite-queue-empty? finite-queue) (zero? (finite-queue-size finite-queue))) (define (finite-queue-full? finite-queue) (= (finite-queue-size finite-queue) (finite-queue-max-size finite-queue))) (define (add-to-finite-queue! finite-queue element) (if (finite-queue-full? finite-queue) (error "add-to-finite-queue!")) (let ((end (finite-queue-end finite-queue))) (vector-set! (finite-queue-vector finite-queue) end element) (set-finite-queue-end! finite-queue (if (= (+ end 1) (finite-queue-max-size finite-queue)) 0 (+ end 1))) (set-finite-queue-size! finite-queue (+ 1 (finite-queue-size finite-queue))))) (define (remove-from-finite-queue! finite-queue) (if (finite-queue-empty? finite-queue) (error "remove-from-finite-queue!")) (let* ((begin (finite-queue-begin finite-queue))) (set-finite-queue-begin! finite-queue (if (= (+ begin 1) (finite-queue-max-size finite-queue)) 0 (+ begin 1))) (set-finite-queue-size! finite-queue (- (finite-queue-size finite-queue) 1)) (vector-ref (finite-queue-vector finite-queue) begin))) ))