* Added hashtable-copy
This commit is contained in:
parent
66263b2d69
commit
007f05989b
|
@ -18,7 +18,7 @@
|
||||||
(export make-eq-hashtable hashtable-ref hashtable-set! hashtable?
|
(export make-eq-hashtable hashtable-ref hashtable-set! hashtable?
|
||||||
hashtable-size hashtable-delete! hashtable-contains?
|
hashtable-size hashtable-delete! hashtable-contains?
|
||||||
hashtable-update! hashtable-keys hashtable-mutable?
|
hashtable-update! hashtable-keys hashtable-mutable?
|
||||||
hashtable-clear! hashtable-entries)
|
hashtable-clear! hashtable-entries hashtable-copy)
|
||||||
(import
|
(import
|
||||||
(ikarus system $pairs)
|
(ikarus system $pairs)
|
||||||
(ikarus system $vectors)
|
(ikarus system $vectors)
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
(except (ikarus) make-eq-hashtable hashtable-ref hashtable-set! hashtable?
|
(except (ikarus) make-eq-hashtable hashtable-ref hashtable-set! hashtable?
|
||||||
hashtable-size hashtable-delete! hashtable-contains?
|
hashtable-size hashtable-delete! hashtable-contains?
|
||||||
hashtable-update! hashtable-keys hashtable-mutable?
|
hashtable-update! hashtable-keys hashtable-mutable?
|
||||||
hashtable-clear! hashtable-entries))
|
hashtable-clear! hashtable-entries hashtable-copy))
|
||||||
|
|
||||||
(define-struct hasht (vec count tc mutable?))
|
(define-struct hasht (vec count tc mutable?))
|
||||||
|
|
||||||
|
@ -280,6 +280,28 @@
|
||||||
[else (f i b kv vv)])))
|
[else (f i b kv vv)])))
|
||||||
($fxsub1 j) kv vv v)))])))))
|
($fxsub1 j) kv vv v)))])))))
|
||||||
|
|
||||||
|
(define (hasht-copy h mutable?)
|
||||||
|
(define (dup-hasht h mutable? n)
|
||||||
|
(let ([x (cons #f #f)])
|
||||||
|
(let ([tc (cons x x)])
|
||||||
|
(make-hasht (make-base-vec n) 0 tc mutable?))))
|
||||||
|
(let ([v (hasht-vec h)] [n (hasht-count h)])
|
||||||
|
(let ([r (dup-hasht h mutable? (vector-length v))])
|
||||||
|
(let f ([i ($fxsub1 n)] [j ($fxsub1 (vector-length v))] [r r] [v v])
|
||||||
|
(cond
|
||||||
|
[($fx= i -1) r]
|
||||||
|
[else
|
||||||
|
(let ([b ($vector-ref v j)])
|
||||||
|
(if (fixnum? b)
|
||||||
|
(f i ($fxsub1 j) r v)
|
||||||
|
(f (let f ([i i] [b b] [r r])
|
||||||
|
(put-hash! r ($tcbucket-key b) ($tcbucket-val b))
|
||||||
|
(let ([b ($tcbucket-next b)] [i ($fxsub1 i)])
|
||||||
|
(cond
|
||||||
|
[(fixnum? b) i]
|
||||||
|
[else (f i b r)])))
|
||||||
|
($fxsub1 j) r v)))])))))
|
||||||
|
|
||||||
;;; public interface
|
;;; public interface
|
||||||
(define (hashtable? x) (hasht? x))
|
(define (hashtable? x) (hasht? x))
|
||||||
|
|
||||||
|
@ -366,4 +388,16 @@
|
||||||
(clear-hash! h)
|
(clear-hash! h)
|
||||||
(error 'hashtable-clear! "hashtable is immutable" h))
|
(error 'hashtable-clear! "hashtable is immutable" h))
|
||||||
(error 'hashtable-clear! "not a hash table" h)))
|
(error 'hashtable-clear! "not a hash table" h)))
|
||||||
|
|
||||||
|
(define hashtable-copy
|
||||||
|
(case-lambda
|
||||||
|
[(h)
|
||||||
|
(if (hasht? h)
|
||||||
|
(hasht-copy h #f)
|
||||||
|
(error 'hashtable-copy "not a hash table" h))]
|
||||||
|
[(h mutable?)
|
||||||
|
(if (hasht? h)
|
||||||
|
(hasht-copy h (and mutable? #t))
|
||||||
|
(error 'hashtable-copy "not a hash table" h))]))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -1163,7 +1163,7 @@
|
||||||
[call-with-output-file i r is se]
|
[call-with-output-file i r is se]
|
||||||
[hashtable-clear! i r ht]
|
[hashtable-clear! i r ht]
|
||||||
[hashtable-contains? i r ht]
|
[hashtable-contains? i r ht]
|
||||||
[hashtable-copy r ht]
|
[hashtable-copy i r ht]
|
||||||
[hashtable-delete! i r ht]
|
[hashtable-delete! i r ht]
|
||||||
[hashtable-entries i r ht]
|
[hashtable-entries i r ht]
|
||||||
[hashtable-keys i r ht]
|
[hashtable-keys i r ht]
|
||||||
|
|
|
@ -683,7 +683,7 @@
|
||||||
;;;
|
;;;
|
||||||
[hashtable-clear! C ht]
|
[hashtable-clear! C ht]
|
||||||
[hashtable-contains? C ht]
|
[hashtable-contains? C ht]
|
||||||
[hashtable-copy S ht]
|
[hashtable-copy C ht]
|
||||||
[hashtable-delete! C ht]
|
[hashtable-delete! C ht]
|
||||||
[hashtable-entries C ht]
|
[hashtable-entries C ht]
|
||||||
[hashtable-keys C ht]
|
[hashtable-keys C ht]
|
||||||
|
|
Loading…
Reference in New Issue