103 lines
2.5 KiB
Erlang
103 lines
2.5 KiB
Erlang
-module(aeso_ets_manager).
|
|
|
|
-export([ ets_init/0
|
|
, ets_new/2
|
|
, ets_lookup/2
|
|
, ets_insert/2
|
|
, ets_insert_new/2
|
|
, ets_insert_ordered/2
|
|
, ets_delete/1
|
|
, ets_delete/2
|
|
, ets_match_delete/2
|
|
, ets_tab2list/1
|
|
, ets_tab2list_ordered/1
|
|
, ets_tab_exists/1
|
|
, clean_up_ets/0
|
|
]).
|
|
|
|
%% Clean up all the ets tables (in case of an exception)
|
|
|
|
ets_tables() ->
|
|
[options, type_vars, constraints, freshen_tvars, type_errors,
|
|
defined_contracts, warnings, function_calls, all_functions,
|
|
type_vars_variance, functions_to_implement].
|
|
|
|
clean_up_ets() ->
|
|
[ catch ets_delete(Tab) || Tab <- ets_tables() ],
|
|
ok.
|
|
|
|
%% Named interface to ETS tables implemented without names.
|
|
%% The interface functions behave as the standard ETS interface.
|
|
|
|
ets_init() ->
|
|
put(aeso_ast_infer_types, #{}).
|
|
|
|
ets_tab_exists(Name) ->
|
|
Tabs = get(aeso_ast_infer_types),
|
|
case maps:find(Name, Tabs) of
|
|
{ok, _} -> true;
|
|
error -> false
|
|
end.
|
|
|
|
ets_tabid(Name) ->
|
|
#{Name := TabId} = get(aeso_ast_infer_types),
|
|
TabId.
|
|
|
|
ets_new(Name, Opts) ->
|
|
%% Ensure the table is NOT named!
|
|
TabId = ets:new(Name, Opts -- [named_table]),
|
|
Tabs = get(aeso_ast_infer_types),
|
|
put(aeso_ast_infer_types, Tabs#{Name => TabId}),
|
|
Name.
|
|
|
|
ets_delete(Name) ->
|
|
Tabs = get(aeso_ast_infer_types),
|
|
#{Name := TabId} = Tabs,
|
|
put(aeso_ast_infer_types, maps:remove(Name, Tabs)),
|
|
ets:delete(TabId).
|
|
|
|
ets_delete(Name, Key) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:delete(TabId, Key).
|
|
|
|
ets_insert(Name, Object) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:insert(TabId, Object).
|
|
|
|
ets_insert_new(Name, Object) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:insert_new(TabId, Object).
|
|
|
|
ets_lookup(Name, Key) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:lookup(TabId, Key).
|
|
|
|
ets_match_delete(Name, Pattern) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:match_delete(TabId, Pattern).
|
|
|
|
ets_tab2list(Name) ->
|
|
TabId = ets_tabid(Name),
|
|
ets:tab2list(TabId).
|
|
|
|
ets_insert_ordered(_, []) -> true;
|
|
ets_insert_ordered(Name, [H|T]) ->
|
|
ets_insert_ordered(Name, H),
|
|
ets_insert_ordered(Name, T);
|
|
ets_insert_ordered(Name, Object) ->
|
|
Count = next_count(),
|
|
TabId = ets_tabid(Name),
|
|
ets:insert(TabId, {Count, Object}).
|
|
|
|
ets_tab2list_ordered(Name) ->
|
|
[E || {_, E} <- ets_tab2list(Name)].
|
|
|
|
next_count() ->
|
|
V = case get(counter) of
|
|
undefined ->
|
|
0;
|
|
X -> X
|
|
end,
|
|
put(counter, V + 1),
|
|
V.
|