Next: version_hash_table, Previous: version_array2d, Up: Top [Contents]
%--------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%--------------------------------------------------%
% Copyright (C) 2004-2007, 2010-2011 The University of Melbourne
% Copyright (C) 2013-2015, 2017-2018 The Mercury team.
% This file is distributed under the terms specified in COPYING.LIB.
%--------------------------------------------------%
%
% File: version_bitmap.m.
% Author: Ralph Becket <rafe@cs.mu.oz.au>.
% Stability: low.
%
% (See the header comments in version_array.m for an explanation of version
% types.)
%
% Version bitmaps: an implementation of bitmaps using version arrays.
%
% The advantage of version bitmaps is that in the common, singly threaded,
% case, they are almost as fast as unique bitmaps, but can be treated as
% ordinary ground values rather than unique values.
%
%--------------------------------------------------%
%--------------------------------------------------%
:- module version_bitmap.
:- interface.
:- import_module bool.
%--------------------------------------------------%
:- type version_bitmap.
% init(N, B) creates a version_bitmap of size N (indexed 0 .. N-1)
% setting each bit if B = yes and clearing each bit if B = no.
% An exception is thrown if N is negative.
%
:- func init(int, bool) = version_bitmap.
% resize(BM, N, B) resizes version_bitmap BM to have N bits;
% if N is smaller than the current number of bits in BM, then
% the excess are discarded. If N is larger than the current number
% of bits in BM then the new bits are set if B = yes and cleared if
% B = no.
%
:- func resize(version_bitmap, int, bool) = version_bitmap.
% Version of the above suitable for use with state variables.
%
:- pred resize(int::in, bool::in, version_bitmap::in, version_bitmap::out)
is det.
% Returns the number of bits in a version_bitmap.
%
:- func num_bits(version_bitmap) = int.
% Get the given bit.
%
:- func version_bitmap ^ bit(int) = bool.
% Set the given bit.
%
:- func (version_bitmap ^ bit(int) := bool) = version_bitmap.
% set(BM, I), clear(BM, I) and flip(BM, I) set, clear and flip
% bit I in BM respectively. An exception is thrown if I is out
% of range. Predicate versions are also provided.
%
:- func set(version_bitmap, int) = version_bitmap.
:- pred set(int::in, version_bitmap::in, version_bitmap::out) is det.
:- func clear(version_bitmap, int) = version_bitmap.
:- pred clear(int::in, version_bitmap::in, version_bitmap::out) is det.
:- func flip(version_bitmap, int) = version_bitmap.
:- pred flip(int::in, version_bitmap::in, version_bitmap::out) is det.
% is_set(BM, I) and is_clear(BM, I) succeed iff bit I in BM
% is set or clear respectively.
%
:- pred is_set(version_bitmap::in, int::in) is semidet.
:- pred is_clear(version_bitmap::in, int::in) is semidet.
% Create a new copy of a version_bitmap.
%
:- func copy(version_bitmap) = version_bitmap.
% Set operations; the second argument is altered in all cases.
%
:- func complement(version_bitmap) = version_bitmap.
:- func union(version_bitmap, version_bitmap) = version_bitmap.
:- func intersect(version_bitmap, version_bitmap) = version_bitmap.
:- func difference(version_bitmap, version_bitmap) = version_bitmap.
:- func xor(version_bitmap, version_bitmap) = version_bitmap.
% unsafe_rewind(B) produces a version of B for which all accesses are
% O(1). Invoking this predicate renders B and all later versions undefined
% that were derived by performing individual updates. Only use this when
% you are absolutely certain there are no live references to B or later
% versions of B.
%
:- func unsafe_rewind(version_bitmap) = version_bitmap.
% A version of the above suitable for use with state variables.
%
:- pred unsafe_rewind(version_bitmap::in, version_bitmap::out) is det.
%--------------------------------------------------%
%--------------------------------------------------%
Next: version_hash_table, Previous: version_array2d, Up: Top [Contents]