Hash :
347c0372
Author :
Thomas de Grivel
Date :
2017-06-21T11:48:58
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
(in-package :bordeaux-set)
(deftype fixnum+ (&optional (low 0))
`(integer ,low ,most-positive-fixnum))
(defclass set ()
((hash-table :initarg :hash-table
:initform (make-hash-table)
:reader set-hash-table
:type hash-table)
(size :initform 0
:accessor set-size
:type fixnum+)
(lock :initform (make-lock "set")
:reader set-lock)))
(defgeneric set-add (set item))
(defgeneric set-remove (set item))
(defgeneric set-member-p (set item))
(defgeneric set-empty-p (set))
(defgeneric do-set (fn set))
(defmethod set-add ((set set) item)
(with-lock-held ((set-lock set))
(setf (gethash item (set-hash-table set)) t)
(incf (set-size set))))
(defmethod set-remove ((set set) item)
(with-lock-held ((set-lock set))
(remhash item (set-hash-table set))
(decf (set-size set))))
(defmethod set-member-p ((set set) item)
(with-lock-held ((set-lock set))
(gethash item (set-hash-table set))))
(defmethod set-empty-p ((set set))
(= 0 (set-size set)))
(defmethod set-each ((fn function) (set set))
(with-lock-held ((set-lock set))
(maphash (lambda (key value)
(declare (ignore value))
(funcall fn key))
(set-hash-table set))))