+(** Handle struct list_head linked lists. *)
+(* Memory info command for virtual domains.
+ (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+ http://libvirt.org/
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *)
+
+type t
+
+val create : Virt_mem_types.image -> Virt_mem_mmap.addr -> int -> t
+ (** [create image head offset] creates a list_head handle.
+
+ [head] is the address of the base [list_head] in kernel memory.
+
+ [offset] is the offset of the [list_head] within the whole
+ structure.
+
+ Note that [head] may be an isolated [struct list_head] or
+ it may be a member of a structure. In the case where the
+ head is in a structure, the head structure is ignored (as is
+ generally the case in kernel code too).
+
+ If the memory might not have been loaded yet, you should
+ call {!load} or {!load_all} immediately after this.
+ *)
+
+val create_base : Virt_mem_types.image -> Virt_mem_mmap.addr -> int -> t
+ (** Same as {!create} but the address passed in is the base address
+ of the head structure {i not} the address of the list_head
+ within that structure.
+ *)
+
+val load : t ->
+ (Virt_mem_types.image -> Virt_mem_mmap.addr -> Virt_mem_types.image) ->
+ Virt_mem_types.image * t
+ (** This call allows you to load the kernel memory for each
+ structure in the list.
+
+ You supply a function to do the loading, given the
+ address of each structure in turn. This returns an
+ updated memory map and {!t}.
+ *)
+
+val load_all : t -> int -> Virt_mem_types.image * t
+ (** More convenient version of {!load} where you specify the
+ structure size, and this function does all the rest.
+ *)
+
+val iter : t -> (Virt_mem_mmap.addr -> unit) -> unit
+ (** [iter t f] applies function [f] to every element of the list [t]. *)
+
+val map : t -> (Virt_mem_mmap.addr -> 'a) -> 'a list
+ (** [map t f] applies function [f] to every element of the list [t] and
+ returns a list of the results.
+ *)
+
+val fold : t -> 'a -> ('a -> Virt_mem_mmap.addr -> 'a) -> 'a
+ (** [fold t b f] folds function [f] over every element of the list [t]
+ with [b] as the base case.
+ *)