mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-29 06:55:06 +02:00
85 lines
2.2 KiB
Scheme
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);
|
|
")
|
|
|
|
))
|