/usr/lib/ocaml/res/weak_intf.ml is in libres-ocaml-dev 4.0.3-4build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 | (*
RES - Automatically Resizing Contiguous Memory for OCaml
Copyright (C) 1999-2002 Markus Mottl
email: markus.mottl@gmail.com
WWW: http://www.ocaml.info
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
(** Interface to weak resizable arrays *)
module type T = sig
(** {6 Signatures and types} *)
(** Module implementing the reallocation strategy *)
module Strategy : Strat.T
type strategy = Strategy.t (** Type of reallocation strategy *)
type 'a t (** Type of parameterized resizable arrays *)
(** {6 Index and length information} *)
val length : 'a t -> int
(** [length ra] @return (virtual) length of resizable array [ra]
excluding the reserved space. *)
val lix : 'a t -> int
(** [lix ra] @return (virtual) last index of resizable array [ra]
excluding the reserved space. *)
val real_length : 'a t -> int
(** [real_length ra] @return (real) length of resizable array [ra]
including the reserved space. *)
val real_lix : 'a t -> int
(** [real_lix ra] @return (real) last index of resizable array [ra]
including the reserved space. *)
(** {6 Getting, setting and checking} *)
val get : 'a t -> int -> 'a option
(** [get ra n] @return the [n]th element of [ra].
@raise Invalid_argument if index out of bounds. *)
val get_copy : 'a t -> int -> 'a option
(** [get_copy ra n] see documentation of module [Weak] in the standard
distribution. *)
val check : 'a t -> int -> bool
(** [check ra n] @return [true] if the [n]th cell of [ra] is
full, [false] if it is empty. Note that even if [check ar n]
returns [true], a subsequent {!get}[ ar n] can return [None]. *)
val set : 'a t -> int -> 'a option -> unit
(** [set ra n] sets the [n]th element of [ra].
@raise Invalid_argument if index out of bounds. *)
(** {6 Creation of resizable arrays} *)
val sempty : strategy -> 'a t
(** [sempty s] @return an empty resizable array using strategy [s]. *)
val empty : unit -> 'a t
(** [empty ()] same as [sempty] but uses default strategy. *)
val screate : strategy -> int -> 'a t
(** [screate s n el] @return a resizable array of length [n]
using strategy [s]. *)
val create : int -> 'a t
(** [create n] same as [screate] but uses default strategy. *)
val sinit : strategy -> int -> (int -> 'a option) -> 'a t
(** [sinit s n f] @return an array of length [n] containing
elements that were created by applying function [f] to the index,
using strategy [s]. *)
val init : int -> (int -> 'a option) -> 'a t
(** [init n f] sames as [sinit] but uses default strategy. *)
(** {6 Strategy handling} *)
val get_strategy : 'a t -> strategy
(** [get_strategy ra] @return the reallocation strategy used by
resizable array [ra]. *)
val set_strategy : 'a t -> strategy -> unit
(** [set_strategy ra s] sets the reallocation strategy of
resizable array [ra] to [s], possibly causing an immediate
reallocation. *)
val put_strategy : 'a t -> strategy -> unit
(** [put_strategy ra s] sets the reallocation strategy of
resizable array [ra] to [s]. Reallocation is only done at later
changes in size. *)
val enforce_strategy : 'a t -> unit
(** [enforce_strategy ra] forces a reallocation if necessary
(e.g. after a [put_strategy]. *)
(** {6 Copying, blitting and range extraction} *)
val copy : 'a t -> 'a t
(** [copy ra] @return a copy of resizable array [ra]. The two
arrays share the same strategy! *)
val sub : 'a t -> int -> int -> 'a t
(** [sub ra ofs len] @return a resizable subarray of length [len]
from resizable array [ra] starting at offset [ofs] using the
default strategy.
@raise Invalid_argument if parameters do not denote a correct
subarray. *)
val fill : 'a t -> int -> int -> 'a option -> unit
(** [fill ra ofs len el] fills resizable array [ra] from offset
[ofs] with [len] elements [el], possibly adding elements at the
end. Raises [Invalid_argument] if offset [ofs] is larger than the
length of the array. *)
val blit : 'a t -> int -> 'a t -> int -> int -> unit
(** [blit ra1 ofs1 ra2 ofs2 len] blits resizable array [ra1] onto
[ra2] reading [len] elements from offset [ofs1] and writing them
to [ofs2], possibly adding elements at the end of ra2. Raises
[Invalid_argument] if [ofs1] and [len] do not designate a valid
subarray of [ra1] or if [ofs2] is larger than the length of
[ra2]. *)
(** {6 Combining resizable arrays} *)
val append : 'a t -> 'a t -> 'a t
(** [append ra1 ra2] @return a new resizable array using the
default strategy and copying [ra1] and [ra2] in this order onto
it. *)
val concat : 'a t list -> 'a t
(** [concat l] @return a new resizable array using the default
strategy and copying all resizable arrays in [l] in their respective
order onto it. *)
(** {6 Adding and removing elements} *)
val add_one : 'a t -> 'a option -> unit
(** [add_one ra el] adds element [el] to resizable array [ra],
possibly causing a reallocation. *)
val remove_one : 'a t -> unit
(** [remove_one ra] removes the last element of resizable array
[ra], possibly causing a reallocation.
@raise Failure if the array is empty. *)
val remove_n : 'a t -> int -> unit
(** [remove_n ra n] removes the last n elements of resizable
array [ra], possibly causing a reallocation.
@raise Invalid_arg if there are not enough elements or [n < 0]. *)
val remove_range : 'a t -> int -> int -> unit
(** [remove_range ra ofs len] removes [len] elements from resizable
array [ra] starting at [ofs] and possibly causing a
reallocation.
@raise Invalid_argument if range is invalid. *)
val clear : 'a t -> unit
(** [clear ra] removes all elements from resizable array [ra],
possibly causing a reallocation. *)
(** {6 Swapping} *)
val swap : 'a t -> int -> int -> unit
(** [swap ra n m] swaps elements at indices [n] and [m].
@raise Invalid_argument if any index is out of range. *)
val swap_in_last : 'a t -> int -> unit
(** [swap_in_last ra n] swaps the last element with the one at
position [n].
@raise Invalid_argument if index [n] is out of range. *)
(** {6 Standard conversions} *)
val to_std : 'a t -> 'a Weak.t
(** [to_std ra] converts a resizable weak array to a standard one. *)
val sof_std : strategy -> 'a Weak.t -> 'a t
(** [sof_std s ar] converts a standard weak array to a resizable
one, using strategy [s]. *)
val of_std : 'a Weak.t -> 'a t
(** [of_std ar] converts a standard weak array to a resizable one
using the default strategy. *)
(** {6 List conversions} *)
val to_list : 'a t -> 'a option list
(** [to_list ra] converts resizable array [ra] to a list. *)
val of_list : 'a option list -> 'a t
(** [of_list l] creates a resizable array using the default
strategy and the elements in list [l]. *)
(** {6 Iterators} *)
val iter : ('a option -> unit) -> 'a t -> unit
(** [iter f ra] applies the unit-function [f] to each element in
resizable array [ra]. *)
val iteri : (int -> 'a option -> unit) -> 'a t -> unit
(** [iteri f ra] applies the unit-function [f] to each index and
element in resizable array [ra]. *)
val fold_left : ('b -> 'a option -> 'b) -> 'b -> 'a t -> 'b
(** [fold_left f a ra] left-folds values in resizable array [ra]
using function [f] and start accumulator [a]. *)
val fold_right : ('a option -> 'b -> 'b) -> 'a t -> 'b -> 'b
(** [fold_right f a ra] right-folds values in resizable array [ra]
using function [f] and start accumulator [a]. *)
(** {6 Scanning of resizable arrays} *)
val for_all : ('a option -> bool) -> 'a t -> bool
(** [for_all p ra] @return [true] if all elements in resizable
array [ra] satisfy the predicate [p], [false] otherwise. *)
val exists : ('a option -> bool) -> 'a t -> bool
(** [exists p ra] @return [true] if at least one element in
resizable array [ra] satisfies the predicate [p], [false]
otherwise. *)
val mem : 'a option -> 'a t -> bool
(** [mem el ra] @return [true] if element [el] is logically equal
to any element in resizable array [ra], [false] otherwise. *)
val memq : 'a option -> 'a t -> bool
(** [memq el ra] @return [true] if element [el] is physically equal
to any element in resizable array [ra], [false] otherwise. *)
val pos : 'a option -> 'a t -> int option
(** [pos el ra] @return [Some index] if [el] is logically
equal to the element at [index] in [ra], [None] otherwise. [index]
is the index of the first element that matches. *)
val posq : 'a option -> 'a t -> int option
(** [posq el ra] @return [Some index] if [el] is physically
equal to the element at [index] in [ra], [None] otherwise. [index]
is the index of the first element that matches. *)
(** {6 Searching of resizable arrays} *)
val find : ('a option -> bool) -> 'a t -> 'a option
(** [find p ra] @return the first element in resizable array [ra]
that satisfies predicate [p].
@raise Not_found if there is no such element. *)
val find_index : ('a option -> bool) -> 'a t -> int -> int
(** [find_index p ra pos] @return the index of the first element
that satisfies predicate [p] in resizable array [ra], starting
search at index [pos].
@raise Not_found if there is no such element or if [pos] is larger
than the highest index.
@raise Invalid_argument if [pos] is negative. *)
val filter : ('a option -> bool) -> 'a t -> 'a t
(** [filter p ra] @return a new resizable array by filtering
out all elements in [ra] that satisfy predicate [p] using the same
strategy as [ra]. *)
val find_all : ('a option -> bool) -> 'a t -> 'a t
(** [find_all p ra] is the same as [filter] *)
val filter_in_place : ('a option -> bool) -> 'a t -> unit
(** [filter_in_place p ra] as [filter], but filters in place. *)
val partition : ('a option -> bool) -> 'a t -> 'a t * 'a t
(** [partition p ra] @return a pair of resizable arrays, the
left part containing only elements of [ra] that satisfy predicate
[p], the right one only those that do not satisfy it. Both returned
arrays are created using the strategy of [ra]. *)
(** {6 {b UNSAFE STUFF - USE WITH CAUTION!}} *)
val unsafe_get : 'a t -> int -> 'a option
val unsafe_set : 'a t -> int -> 'a option -> unit
val unsafe_sub : 'a t -> int -> int -> 'a t
val unsafe_fill : 'a t -> int -> int -> 'a option -> unit
val unsafe_blit : 'a t -> int -> 'a t -> int -> int -> unit
val unsafe_remove_one : 'a t -> unit
val unsafe_remove_n : 'a t -> int -> unit
val unsafe_swap : 'a t -> int -> int -> unit
val unsafe_swap_in_last : 'a t -> int -> unit
end
|