Use segmented list to implement `Hash` [Experimental]

I know it's not hash at all, but reduce memory consumption.
parent 01c2f59e
...@@ -18,7 +18,7 @@ MRB_BEGIN_DECL ...@@ -18,7 +18,7 @@ MRB_BEGIN_DECL
struct RHash { struct RHash {
MRB_OBJECT_HEADER; MRB_OBJECT_HEADER;
struct iv_tbl *iv; struct iv_tbl *iv;
struct kh_ht *ht; struct seglist *ht;
}; };
#define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v))) #define mrb_hash_ptr(v) ((struct RHash*)(mrb_ptr(v)))
...@@ -76,7 +76,7 @@ MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key); ...@@ -76,7 +76,7 @@ MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key);
* *
* Equivalent to: * Equivalent to:
* *
* hash.hash_key?(key) ? hash[key] : def * hash.key?(key) ? hash[key] : def
* *
* @param mrb The mruby state reference. * @param mrb The mruby state reference.
* @param hash The target hash. * @param hash The target hash.
...@@ -199,7 +199,6 @@ KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE) ...@@ -199,7 +199,6 @@ KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
#define RHASH_TBL(h) (RHASH(h)->ht) #define RHASH_TBL(h) (RHASH(h)->ht)
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone")) #define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone"))
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h) #define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
#define MRB_HASH_DEFAULT 1 #define MRB_HASH_DEFAULT 1
#define MRB_HASH_PROC_DEFAULT 2 #define MRB_HASH_PROC_DEFAULT 2
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment