Skip to content

Commit

Permalink
much faster iteration over ObjectIdDict
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Jun 24, 2014
1 parent 2144283 commit c60ad43
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 14 deletions.
8 changes: 4 additions & 4 deletions base/dict.jl
Original file line number Diff line number Diff line change
Expand Up @@ -288,11 +288,11 @@ end

empty!(t::ObjectIdDict) = (t.ht = cell(length(t.ht)); t)

start(t::ObjectIdDict) = 0
done(t::ObjectIdDict, i) = is(next(t,i),())
next(t::ObjectIdDict, i) = ccall(:jl_eqtable_next, Any, (Any, Uint32), t.ht, i)
_oidd_nextind(a, i) = int(ccall(:jl_eqtable_nextind, Csize_t, (Any, Csize_t), a, i))

isempty(t::ObjectIdDict) = is(next(t,0),())
start(t::ObjectIdDict) = _oidd_nextind(t.ht, 0)
done(t::ObjectIdDict, i) = (i == -1)
next(t::ObjectIdDict, i) = ((t.ht[i+1],t.ht[i+2]), _oidd_nextind(t.ht, i+2))

function length(d::ObjectIdDict)
n = 0
Expand Down
13 changes: 3 additions & 10 deletions src/table.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,21 +132,14 @@ jl_value_t *jl_eqtable_pop(jl_array_t *h, void *key, jl_value_t *deflt)
}

DLLEXPORT
jl_value_t *jl_eqtable_next(jl_array_t *t, uint32_t i)
size_t jl_eqtable_nextind(jl_array_t *t, size_t i)
{
if (i&1) i++;
size_t alen = jl_array_dim0(t);
while (i < alen && ((void**)t->data)[i+1] == NULL)
i+=2;
if (i >= alen) return (jl_value_t*)jl_null;
jl_value_t *vi=NULL, *vt=NULL, *vv=NULL;
JL_GC_PUSH2(&vi, &vt);
vi = jl_box_uint32(i+2);
vt = (jl_value_t*)jl_tuple2(((jl_value_t**)t->data)[i],
((jl_value_t**)t->data)[i+1]);
vv = (jl_value_t*)jl_tuple2(vt, vi);
JL_GC_POP();
return vv;
if (i >= alen) return (size_t)-1;
return i;
}

#undef hash_size
Expand Down

0 comments on commit c60ad43

Please sign in to comment.