Next: version_bitmap, Previous: version_array, Up: Top [Contents]
%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 2004-2006, 2011 The University of Melbourne. % Copyright (C) 2013-2015, 2017-2019, 2022 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: version_array2d.m. % Author: Ralph Becket <rafe@cs.mu.oz.au>. % Stability: medium-low. % % Two-dimensional rectangular (i.e. not ragged) version arrays. % % See the header comments in version_array.m for more details about version % structures. % %--------------------------------------------------% %--------------------------------------------------% :- module version_array2d. :- interface. :- import_module list. %--------------------------------------------------% % A version_array2d is a two-dimensional version array stored in row-major % order (that is, the elements of the first row in left-to-right order, % followed by the elements of the second row, and so on.) % :- type version_array2d(T). % version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN]]) constructs % a 2d version array of size M * N, with the special case that % bounds(version_array2d([]), 0, 0). % % An exception is thrown if the sublists are not all the same length. % :- func version_array2d(list(list(T))) = version_array2d(T). % init(M, N, X) = version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN]]) % where each XIJ = X. % % An exception is thrown if M < 0 or N < 0. % :- func init(int, int, T) = version_array2d(T). % bounds(version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN]), M, N) % :- pred bounds(version_array2d(T)::in, int::out, int::out) is det. % in_bounds(version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN]), I, J) % succeeds iff 0 =< I < M, 0 =< J < N. % :- pred in_bounds(version_array2d(T)::in, int::in, int::in) is semidet. % version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN]]) ^ elem(I, J) = X % where X is the J+1th element of the I+1th row (i.e. indices start from % zero.) % % An exception is thrown unless 0 =< I < M, 0 =< J < N. % :- func version_array2d(T) ^ elem(int, int) = T. % ( VA2D0 ^ elem(I, J) := X ) = VA2D % where VA2D ^ elem(II, JJ) = X if I = II, J = JJ % and VA2D ^ elem(II, JJ) = VA2D0 ^ elem(II, JJ) otherwise. % % An exception is thrown unless 0 =< I < M, 0 =< J < N. % % A predicate version is also provided. % :- func ( version_array2d(T) ^ elem(int, int) := T ) = version_array2d(T). :- pred set(int::in, int::in, T::in, version_array2d(T)::in, version_array2d(T)::out) is det. % lists(version_array2d([[X11, ..., X1N], ..., [XM1, ..., XMN])) = % [[X11, ..., X1N], ..., [XM1, ..., XMN]] % :- func lists(version_array2d(T)) = list(list(T)). % copy(VA2D) returns a copy of VA2D with O(1) access times. % :- func copy(version_array2d(T)) = version_array2d(T). % resize(VA2D, M, N, X) returns a copy of VA2D resized to M * N. % Items with coordinates in common are copied from VA2D; other % items are initialised to X. % % An exception is thrown if M < 0 or N < 0. % :- func resize(version_array2d(T), int, int, T) = version_array2d(T). % unsafe_rewind(VA2D) returns a new 2d version array with O(1) access % times, at the cost of rendering VA2D and its descendants undefined. % Only call this function if you are absolutely certain there are no % remaining live references to VA2D or any descendent of VA2D. % :- func unsafe_rewind(version_array2d(T)) = version_array2d(T). %--------------------------------------------------% %--------------------------------------------------%
Next: version_bitmap, Previous: version_array, Up: Top [Contents]