cyclone/scheme/cyclone/hashset.sld
Justin Ethier 50e1ec5f84
Update hashset.sld
Clarify use of this module in the header comments.
2019-02-01 10:25:01 -05:00

85 lines
2.2 KiB
Scheme

;;;; Cyclone Scheme
;;;; https://github.com/justinethier/cyclone
;;;;
;;;; Copyright (c) 2018, Justin Ethier
;;;; All rights reserved.
;;;;
;;;; This module contains a hashset based on code from:
;;;; https://github.com/avsej/hashset.c
;;;;
;;;; NOTE this module only checks for shallow equality (IE: eq?) which
;;;; makes it suitable to test only certain types such as symbols,
;;;; numbers, etc. Hashset should NOT be used to store strings, lists,
;;;; vectors, and objects that require tests for deep equality (IE: equal?).
;;;;
(define-library (scheme cyclone hashset)
(export
hs-create
hs-destroy!
hs-num-items
hs-add!
hs-add-all!
hs-remove!
hs-member?
)
(import (scheme base)
(scheme write))
(include-c-header "cyclone/hashset.h")
(begin
(define-c hs-create
"(void *data, int argc, closure _, object k )"
"
hashset_t hs = hashset_create();
make_c_opaque(opq, hs);
return_closcall1(data, k, &opq);
")
(define-c hs-destroy!
"(void *data, int argc, closure _, object k, object opq )"
"
hashset_t hs = (hashset_t)(opaque_ptr(opq));
hashset_destroy(hs);
return_closcall1(data, k, boolean_t);
")
(define-c hs-num-items
"(void *data, int argc, closure _, object k, object opq )"
"
hashset_t hs = (hashset_t)(opaque_ptr(opq));
int count = hashset_num_items(hs);
return_closcall1(data, k, obj_int2obj(count));
")
(define-c hs-add!
"(void *data, int argc, closure _, object k, object opq, object item )"
"
hashset_t hs = (hashset_t)(opaque_ptr(opq));
int rv = hashset_add(hs, item);
return_closcall1(data, k, obj_int2obj(rv));
")
(define (hs-add-all! hs lis)
(for-each
(lambda (p)
(hs-add! hs p))
lis))
(define-c hs-remove!
"(void *data, int argc, closure _, object k, object opq, object item )"
"
hashset_t hs = (hashset_t)(opaque_ptr(opq));
int rv = hashset_remove(hs, item);
return_closcall1(data, k, obj_int2obj(rv));
")
(define-c hs-member?
"(void *data, int argc, closure _, object k, object opq, object item )"
"
hashset_t hs = (hashset_t)(opaque_ptr(opq));
int rv = hashset_is_member(hs, item);
return_closcall1(data, k, rv ? boolean_t : boolean_f);
")
))