(* $Id$ *)

(** Data representation for shared memory *)

type 'a data_manager = 
    { to_int32_array : 'a -> Netshm.int32_array;
        (** Represent the value as an [int32_array] *)
      of_int32_array : Netshm.int32_array list -> 'a;
        (** Read the value back from its [int32_array] representation.
          * The array is given as list of array fragments in reverse
          * order. The fragments must not be empty.
         *)
      of_int32_array_prefix : (Netshm.int32_array list -> 'a option) option;
	(** Read the value back from its [int32_array] representation.
          * Unlike [of_int32_array], it is allowed to pass a prefix
          * of the whole array to this function. As [of_int32_array],
          * this prefix is given as list of array fragments in reverse
          * order. The function may return [None] if it is not yet
          * possible to reconstruct the value. Otherwise the value is
          * returned as [Some v].
         *)
      hash_fn : 'a -> int32
        (** Hash function *)
    }
  (** The data manager consists of several manager functions.
    * [of_int32_array_prefix] is optional.
   *)

val int32_manager : int32 data_manager
  (** Represents an [int32] as one-element [int32_array] *)

val int64_manager : int64 data_manager
  (** Represents an [int64] as two-element [int32_array] *)

val nativeint_manager : nativeint data_manager
  (** Uses either [int32_manager] or [int64_manager] to represent [nativeint],
    * depending on the size of [nativeint].
   *)

val int_manager : int data_manager
  (** Uses either [int32_manager] or [int64_manager] to represent [int],
    * depending on the size of [int].
   *)

val int32_array_manager : Netshm.int32_array data_manager
  (** The identity representation manager *)

val string_manager : string data_manager
  (** Represents a string in the following way. The first element 
    * is the size of the string. The following elements store the
    * bytes. The last word is filled up with zero bytes if necessary.
   *)

val pair_manager : 'a data_manager -> 'b data_manager -> ('a * 'b) data_manager
  (** Creates a compound manager for pairs from two input managers *)

val left_pair_manager : 'a data_manager -> 'a data_manager
  (** Uses the same representation as [pair_manager], but the resulting
    * data manager only reads the left value of the pair.
    *
    * This data manager does not support [to_int32_array].
   *)

val option_manager : 'a data_manager -> 'a option data_manager
  (** Creates a data manager from an input data manager for optional values *)


