From bbab60545e98bacafbaaaacff63a9584a1d7ae59 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 30 Jan 2012 11:21:30 -0500 Subject: [PATCH] adding gvector-remove-last! --- collects/data/gvector.rkt | 17 +++++++++++++++++ collects/data/scribblings/gvector.scrbl | 6 ++++++ collects/tests/data/gvector.rkt | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/collects/data/gvector.rkt b/collects/data/gvector.rkt index 45a339d31d..af41b31731 100644 --- a/collects/data/gvector.rkt +++ b/collects/data/gvector.rkt @@ -28,6 +28,11 @@ "") index))) +(define (check-nonempty who n) + (unless (> n 0) + (error who "empty"))) + + (define ((bad-index-error who index)) (raise-mismatch-error who "index out of range" index)) @@ -67,6 +72,16 @@ (vector-copy! v index v (add1 index) n) (vector-set! v (sub1 n) #f)]))) +(define (gvector-remove-last! gv) + (let ([n (gvector-n gv)] + [v (gvector-vec gv)]) + (check-nonempty 'gvector-remove-last! n) + (define last-val (vector-ref v (sub1 n))) + (set-gvector-n! gv (sub1 n)) + (vector-set! v (sub1 n) #f) + last-val)) + + (define (gvector-count gv) (gvector-n gv)) @@ -213,6 +228,8 @@ (->* (gvector?) () #:rest any/c any)] [gvector-remove! (-> gvector? exact-nonnegative-integer? any)] + [gvector-remove-last! + (-> gvector? any)] [gvector-count (-> gvector? any)] [gvector->vector diff --git a/collects/data/scribblings/gvector.scrbl b/collects/data/scribblings/gvector.scrbl index bfe5cf3526..4446345b99 100644 --- a/collects/data/scribblings/gvector.scrbl +++ b/collects/data/scribblings/gvector.scrbl @@ -83,6 +83,12 @@ down. Takes time proportional to @racket[(- (gvector-count gv) index)]. } +@defproc[(gvector-remove-last! [gv gvector?]) + any/c]{ +Removes the element at the end and returns it. Takes constant time. +} + + @defproc[(gvector-count [gv gvector?]) exact-nonnegative-integer?]{ diff --git a/collects/tests/data/gvector.rkt b/collects/tests/data/gvector.rkt index cf60fc1302..2dc15b7e60 100644 --- a/collects/tests/data/gvector.rkt +++ b/collects/tests/data/gvector.rkt @@ -53,6 +53,25 @@ (gvector->vector gv)) '#(2 3)) +(test-equal? "gvector-remove-last!" + (let ([gv (gvector 1 2 3)]) + (check-equal? (gvector-remove-last! gv) 3) + (check-equal? (gvector-remove-last! gv) 2) + (check-equal? (gvector-remove-last! gv) 1) + (gvector->vector gv)) + '#()) + +(test-equal? "gvector-add and gvector-remove-last!" + (let ([gv (gvector)]) + (gvector-add! gv 'rock) + (gvector-add! gv 'paper) + (check-equal? (gvector-remove-last! gv) 'paper) + (gvector-add! gv 'scissor) + (check-equal? (gvector-remove-last! gv) 'scissor) + (check-equal? (gvector-remove-last! gv) 'rock) + (gvector->vector gv)) + '#()) + (test-equal? "gvector-count" (gvector-count (gvector 1 2 3)) 3)