%%% -*- mode: erlang -*-
%%% $Id: hash2.erlang,v 1.1 2001/05/21 02:22:57 doug Exp $
%%% http://www.bagley.org/~doug/shootout/
%% Use ETS tables (Erlang's associative store).
-module(hash2).
-export([main/0, main/1]).
main() -> main(['1']).
main([Arg]) ->
N = list_to_integer(atom_to_list(Arg)),
H1 = ets:new(one, [set]),
H2 = ets:new(two, [set]),
doinserts1(0, H1),
doinserts2(N, H1, H2),
io:format("~w ~w ~w ~w~n", [value(H1, list_to_atom("foo_1")),
value(H1, list_to_atom("foo_9999")),
value(H2, list_to_atom("foo_1")),
value(H2, list_to_atom("foo_9999"))]),
halt(0).
doinserts1(10000, _) -> ok;
doinserts1(I, H) ->
Key = list_to_atom(lists:append("foo_", integer_to_list(I))),
ets:insert(H, { Key, I }),
doinserts1(I+1, H).
doinserts2(0, _, _) -> ok;
doinserts2(I, H1, H2) ->
addTables(H1, H2),
doinserts2(I-1, H1, H2).
addTables(H1, H2) ->
Key = ets:first(H1),
addTables(Key, H1, H2).
value(Tab, Key) -> { _, V } = hd(ets:lookup(Tab, Key)), V.
addTables('$end_of_table', _, _) -> ok;
addTables(Key, H1, H2) ->
Val1 = value(H1, Key),
case (catch ets:update_counter(H2, Key, Val1)) of
{'EXIT', {badarg, _}} -> ets:insert(H2, {Key, Val1});
_ -> true
end,
addTables(ets:next(H1, Key), H1, H2).