diff options
Diffstat (limited to 'lib/hipe/util/hipe_vectors.erl')
-rw-r--r-- | lib/hipe/util/hipe_vectors.erl | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/hipe/util/hipe_vectors.erl b/lib/hipe/util/hipe_vectors.erl new file mode 100644 index 0000000000..d153f3a50d --- /dev/null +++ b/lib/hipe/util/hipe_vectors.erl @@ -0,0 +1,111 @@ +%% -*- erlang-indent-level: 2 -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% VECTORS IN ERLANG +%% +%% Abstract interface to vectors, indexed from 0 to size-1. + +-module(hipe_vectors). +-export([new/2, + set/3, + get/2, + size/1, + vector_to_list/1, + %% list_to_vector/1, + list/1]). + +-include("hipe_vectors.hrl"). + +%% --------------------------------------------------------------------- + +-ifdef(USE_TUPLES). + +new(N, V) -> + erlang:make_tuple(N, V). + +size(V) -> erlang:tuple_size(V). + +list(Vec) -> + index(tuple_to_list(Vec), 0). + +index([X|Xs],N) -> + [{N,X} | index(Xs,N+1)]; +index([],_) -> + []. + +%% list_to_vector(Xs) -> +%% list_to_tuple(Xs). + +vector_to_list(V) -> + tuple_to_list(V). + +set(Vec, Ix, V) -> + setelement(Ix+1, Vec, V). + +get(Vec, Ix) -> element(Ix+1, Vec). + +-endif. %% ifdef USE_TUPLES + +%% --------------------------------------------------------------------- + +-ifdef(USE_GBTREES). + +-spec new(non_neg_integer(), _) -> hipe_vector(). +new(N, V) when is_integer(N), N >= 0 -> + gb_trees:from_orddict(mklist(N, V)). + +mklist(N, V) -> + mklist(0, N, V). + +mklist(M, N, V) when M < N -> + [{M, V} | mklist(M+1, N, V)]; +mklist(_, _, _) -> + []. + +-spec size(hipe_vector()) -> non_neg_integer(). +size(V) -> gb_trees:size(V). + +-spec list(hipe_vector()) -> [{_, _}]. +list(Vec) -> + gb_trees:to_list(Vec). + +%% -spec list_to_vector([_]) -> hipe_vector(). +%% list_to_vector(Xs) -> +%% gb_trees:from_orddict(index(Xs, 0)). +%% +%% index([X|Xs], N) -> +%% [{N, X} | index(Xs, N+1)]; +%% index([],_) -> +%% []. + +-spec vector_to_list(hipe_vector()) -> [_]. +vector_to_list(V) -> + gb_trees:values(V). + +-spec set(hipe_vector(), non_neg_integer(), _) -> hipe_vector(). +set(Vec, Ix, V) -> + gb_trees:update(Ix, V, Vec). + +-spec get(hipe_vector(), non_neg_integer()) -> any(). +get(Vec, Ix) -> + gb_trees:get(Ix, Vec). + +-endif. %% ifdef USE_GBTREES |