/* * call-seq: * Map.hash => hash_value * * Returns a hash value based on this map's contents. */ VALUE Map_hash(VALUE _self) { Map* self = ruby_to_Map(_self); st_index_t h = rb_hash_start(0); VALUE hash_sym = rb_intern("hash"); upb_strtable_iter it; for (upb_strtable_begin(&it, &self->table); !upb_strtable_done(&it); upb_strtable_next(&it)) { VALUE key = table_key_to_ruby( self, upb_strtable_iter_key(&it), upb_strtable_iter_keylength(&it)); upb_value v = upb_strtable_iter_value(&it); void* mem = value_memory(&v); VALUE value = native_slot_get(self->value_type, self->value_type_class, mem); h = rb_hash_uint(h, NUM2LONG(rb_funcall(key, hash_sym, 0))); h = rb_hash_uint(h, NUM2LONG(rb_funcall(value, hash_sym, 0))); } return INT2FIX(h); }
/* * call-seq: * hash -> Fixnum * * Generates a Fixnum hash value for this object. * * */ DLL_LOCAL VALUE _getHash(VALUE self) { st_index_t h = rb_hash_start(0); h = rb_hash_uint(h, _self->GetWidth()); h = rb_hash_uint(h, _self->GetHeight()); h = rb_hash_end(h); return RB_LONG2FIX(h); }
static VALUE range_hash(VALUE range) { st_index_t hash = EXCL(range); VALUE v; hash = rb_hash_start(hash); v = rb_hash(RANGE_BEG(range)); hash = rb_hash_uint(hash, NUM2LONG(v)); v = rb_hash(RANGE_END(range)); hash = rb_hash_uint(hash, NUM2LONG(v)); hash = rb_hash_uint(hash, EXCL(range) << 24); hash = rb_hash_end(hash); return LONG2FIX(hash); }
/* * call-seq: * hash -> Fixnum * * Generates a Fixnum hash value for this object. * * */ DLL_LOCAL VALUE _getHash(VALUE self) { st_index_t h = rb_hash_start(0); h = rb_hash_uint(h, _self->GetWidth()); h = rb_hash_uint(h, _self->GetHeight()); if(_self->IsOk()) { //if(_self->GetType() == wxBITMAP_TYPE_INVALID) // return Qnil; char* data = (char*)_self->GetData(); if(data) h = rb_hash_uint(h, rb_str_hash(rb_str_new(data,_self->GetHeight() * _self->GetWidth() * 3))); if(_self->HasAlpha()) { h = rb_hash_uint(h, rb_str_hash(rb_str_new((char*) _self->GetAlpha(),_self->GetHeight() * _self->GetWidth()))); } unsigned char r,g,b; if(_self->GetOrFindMaskColour(&r,&g,&b)) { h = rb_hash_uint(h, r); h = rb_hash_uint(h, g); h = rb_hash_uint(h, b); } } h = rb_hash_end(h); return LONG2FIX(h); }
static VALUE recursive_hash(VALUE range, VALUE dummy, int recur) { st_index_t hash = EXCL(range); VALUE v; hash = rb_hash_start(hash); if (!recur) { v = rb_hash(RANGE_BEG(range)); hash = rb_hash_uint(hash, NUM2LONG(v)); v = rb_hash(RANGE_END(range)); hash = rb_hash_uint(hash, NUM2LONG(v)); } hash = rb_hash_uint(hash, EXCL(range) << 24); hash = rb_hash_end(hash); return LONG2FIX(hash); }
VALUE layout_hash(MessageLayout* layout, void* storage) { upb_msg_field_iter it; st_index_t h = rb_hash_start(0); VALUE hash_sym = rb_intern("hash"); for (upb_msg_field_begin(&it, layout->msgdef); !upb_msg_field_done(&it); upb_msg_field_next(&it)) { const upb_fielddef* field = upb_msg_iter_field(&it); VALUE field_val = layout_get(layout, storage, field); h = rb_hash_uint(h, NUM2LONG(rb_funcall(field_val, hash_sym, 0))); } h = rb_hash_end(h); return INT2FIX(h); }
/* * call-seq: * hash -> Fixnum * * Generates a Fixnum hash value for this object. * * */ DLL_LOCAL VALUE _getHash(VALUE self) { st_index_t h = rb_hash_start(_self->IsOk()); h = rb_hash_uint(h, _self->GetPointSize()); h = rb_hash_uint(h, _self->GetFamily()); h = rb_hash_uint(h, _self->GetStyle()); h = rb_hash_uint(h, _self->GetWeight()); h = rb_hash_uint(h, _self->GetUnderlined()); h = rb_hash_uint(h, _self->GetStrikethrough()); h = rb_hash_uint(h, rb_str_hash(wrap(_self->GetFaceName()))); h = rb_hash_end(h); return RB_LONG2FIX(h); }
static VALUE rb_struct_hash(VALUE s) { long i, len; st_index_t h; VALUE n; const VALUE *ptr; h = rb_hash_start(rb_hash(rb_obj_class(s))); ptr = RSTRUCT_CONST_PTR(s); len = RSTRUCT_LEN(s); for (i = 0; i < len; i++) { n = rb_hash(ptr[i]); h = rb_hash_uint(h, NUM2LONG(n)); } h = rb_hash_end(h); return INT2FIX(h); }
static VALUE recursive_hash(VALUE s, VALUE dummy, int recur) { long i, len; st_index_t h; VALUE n, *ptr; h = rb_hash_start(rb_hash(rb_obj_class(s))); if (!recur) { ptr = RSTRUCT_PTR(s); len = RSTRUCT_LEN(s); for (i = 0; i < len; i++) { n = rb_hash(ptr[i]); h = rb_hash_uint(h, NUM2LONG(n)); } } h = rb_hash_end(h); return INT2FIX(h); }
static st_index_t rb_hash_method_definition(st_index_t hash, const rb_method_definition_t *def) { again: hash = rb_hash_uint(hash, def->type); switch (def->type) { case VM_METHOD_TYPE_ISEQ: return rb_hash_uint(hash, (st_index_t)def->body.iseq); case VM_METHOD_TYPE_CFUNC: hash = rb_hash_uint(hash, (st_index_t)def->body.cfunc.func); return rb_hash_uint(hash, def->body.cfunc.argc); case VM_METHOD_TYPE_ATTRSET: case VM_METHOD_TYPE_IVAR: return rb_hash_uint(hash, def->body.attr.id); case VM_METHOD_TYPE_BMETHOD: return rb_hash_proc(hash, def->body.proc); case VM_METHOD_TYPE_MISSING: return rb_hash_uint(hash, def->original_id); case VM_METHOD_TYPE_ZSUPER: case VM_METHOD_TYPE_NOTIMPLEMENTED: case VM_METHOD_TYPE_UNDEF: return hash; case VM_METHOD_TYPE_OPTIMIZED: return rb_hash_uint(hash, def->body.optimize_type); case VM_METHOD_TYPE_REFINED: if (def->body.orig_me) { def = def->body.orig_me->def; goto again; } else { return hash; } default: rb_bug("rb_hash_method_definition: unsupported method type (%d)\n", def->type); } return hash; }