diff options
author | Linus Nordberg <linus@nordberg.se> | 2014-10-28 15:43:25 +0100 |
---|---|---|
committer | Linus Nordberg <linus@nordberg.se> | 2014-10-28 15:43:25 +0100 |
commit | 3acd182423a17338ebdcd6e8c0ad7749948f81eb (patch) | |
tree | c9e1dced042e050280f34feabe70432208cae312 /src/ts.erl | |
parent | 44e14486eed7f5dc00cc758922207e1864352cae (diff) | |
parent | f06372dd199442110329ed8869d87c76cb16eef1 (diff) |
Merge branch 'map-optimize-startup'
Diffstat (limited to 'src/ts.erl')
-rw-r--r-- | src/ts.erl | 55 |
1 files changed, 28 insertions, 27 deletions
@@ -9,56 +9,57 @@ -export_type([tree_store/0]). -export([new/0, add/3, delete/2, retrieve/2, count/2]). -%% FIXME: Keep the entries in binaries instead of lists? Hashes do -%% have fixed lenght. --record(tree_store, {layers :: list()}). % orddict of lists, keyed on layer. +%% #tree_store{} has one member, layers, holding an array of arrays +%% with binaries, keyed on layer. +-record(tree_store, {layers :: array:array(array:array(binary()))}). -type tree_store() :: #tree_store{}. %%%%%%%%%%%%%%%%%%%% %% Public. new() -> - #tree_store{layers = orddict:new()}. + #tree_store{layers = array:new()}. -spec add(tree_store(), non_neg_integer(), binary()) -> tree_store(). add(S = #tree_store{layers = Layers}, Layer, Entry) -> - {NewLayers, List} = layer(Layers, rw, Layer), - NewList = [Entry | List], - S#tree_store{layers = orddict:store(Layer, NewList, NewLayers)}. + {NewLayers, Array} = layer_rw(Layers, Layer), + NewArray = array:set(array:size(Array), Entry, Array), + S#tree_store{layers = array:set(Layer, NewArray, NewLayers)}. -spec delete(tree_store(), non_neg_integer()) -> tree_store(). delete(S = #tree_store{layers = Layers}, Layer) -> - List = layer(Layers, ro, Layer), - [_ | NewList] = List, - S#tree_store{layers = orddict:store(Layer, NewList, Layers)}. + Array = layer_ro(Layers, Layer), + NewArray = array:resize(array:size(Array) - 1, Array), + S#tree_store{layers = array:set(Layer, NewArray, Layers)}. -spec retrieve(tree_store(), tuple()) -> binary() | undefined. retrieve(#tree_store{layers = Layers}, {Layer, Index}) -> - List = layer(Layers, ro, Layer), - Len = length(List), + Array = layer_ro(Layers, Layer), + Len = array:size(Array), case Index < Len of - true -> lists:nth(Len - Index, List); + true -> array:get(Index, Array); false -> undefined end. -spec count(tree_store(), non_neg_integer()) -> non_neg_integer(). count(#tree_store{layers = Layers}, Layer) -> - length(layer(Layers, ro, Layer)). + array:size(layer_ro(Layers, Layer)). %%%%%%%%%%%%%%%%%%%% %% Private. --spec layer(list(), rw | ro, non_neg_integer()) -> list() | {list(), list()}. -layer(Layers, Access, Layer) -> - case Access of - rw -> - case orddict:find(Layer, Layers) of - error -> {orddict:store(Layer, [], Layers), []}; - {ok, List} -> {Layers, List} - end; - ro -> - case orddict:find(Layer, Layers) of - error -> []; - {ok, List} -> List - end +-spec layer_ro(array:array(array:array(binary())), non_neg_integer()) -> + array:array(binary). +layer_ro(Layers, Layer) -> + case array:get(Layer, Layers) of + undefined -> array:new(); + Array -> Array + end. + +-spec layer_rw(array:array(array:array(binary())), non_neg_integer()) -> + {array:array(), array:array(binary)}. +layer_rw(Layers, Layer) -> + case array:get(Layer, Layers) of + undefined -> {array:set(Layer, array:new(), Layers), array:new()}; + Array -> {Layers, Array} end. %%%%%%%%%%%%%%%%%%%% |