Module Ppx_box_lib.Boxed

module type S = sig ... end
module type S1__value = sig ... end
module type S2__value__value = sig ... end
module type S3__value__value__value = sig ... end
module type S4__value__value__value__value = sig ... end
module type S5__value__value__value__value__value = sig ... end
module type S4__value__value__value__immediate = sig ... end
module type S4__value__value__value__immediate64 = sig ... end
module type S4__value__value__value__value_or_null = sig ... end
module type S3__value__value__immediate = sig ... end
module type S4__value__value__immediate__value = sig ... end
module type S4__value__value__immediate__immediate = sig ... end
module type S3__value__value__immediate64 = sig ... end
module type S4__value__value__immediate64__value = sig ... end
module type S3__value__value__value_or_null = sig ... end
module type S4__value__value__value_or_null__value = sig ... end
module type S2__value__immediate = sig ... end
module type S3__value__immediate__value = sig ... end
module type S4__value__immediate__value__value = sig ... end
module type S4__value__immediate__value__immediate = sig ... end
module type S3__value__immediate__immediate = sig ... end
module type S4__value__immediate__immediate__value = sig ... end
module type S3__value__immediate__immediate64 = sig ... end
module type S3__value__immediate__value_or_null = sig ... end
module type S2__value__immediate64 = sig ... end
module type S3__value__immediate64__value = sig ... end
module type S4__value__immediate64__value__value = sig ... end
module type S3__value__immediate64__immediate = sig ... end
module type S3__value__immediate64__immediate64 = sig ... end
module type S3__value__immediate64__value_or_null = sig ... end
module type S2__value__value_or_null = sig ... end
module type S3__value__value_or_null__value = sig ... end
module type S4__value__value_or_null__value__value = sig ... end
module type S3__value__value_or_null__immediate = sig ... end
module type S3__value__value_or_null__immediate64 = sig ... end
module type S3__value__value_or_null__value_or_null = sig ... end
module type S1__immediate = sig ... end
module type S2__immediate__value = sig ... end
module type S3__immediate__value__value = sig ... end
module type S4__immediate__value__value__value = sig ... end
module type S4__immediate__value__value__immediate = sig ... end
module type S3__immediate__value__immediate = sig ... end
module type S4__immediate__value__immediate__value = sig ... end
module type S3__immediate__value__immediate64 = sig ... end
module type S3__immediate__value__value_or_null = sig ... end
module type S2__immediate__immediate = sig ... end
module type S3__immediate__immediate__value = sig ... end
module type S4__immediate__immediate__value__value = sig ... end
module type S3__immediate__immediate__immediate = sig ... end
module type S3__immediate__immediate__immediate64 = sig ... end
module type S3__immediate__immediate__value_or_null = sig ... end
module type S2__immediate__immediate64 = sig ... end
module type S3__immediate__immediate64__value = sig ... end
module type S3__immediate__immediate64__immediate = sig ... end
module type S3__immediate__immediate64__immediate64 = sig ... end
module type S2__immediate__value_or_null = sig ... end
module type S3__immediate__value_or_null__value = sig ... end
module type S3__immediate__value_or_null__immediate = sig ... end
module type S1__immediate64 = sig ... end
module type S2__immediate64__value = sig ... end
module type S3__immediate64__value__value = sig ... end
module type S4__immediate64__value__value__value = sig ... end
module type S3__immediate64__value__immediate = sig ... end
module type S3__immediate64__value__immediate64 = sig ... end
module type S3__immediate64__value__value_or_null = sig ... end
module type S2__immediate64__immediate = sig ... end
module type S3__immediate64__immediate__value = sig ... end
module type S3__immediate64__immediate__immediate = sig ... end
module type S3__immediate64__immediate__immediate64 = sig ... end
module type S2__immediate64__immediate64 = sig ... end
module type S3__immediate64__immediate64__value = sig ... end
module type S3__immediate64__immediate64__immediate = sig ... end
module type S2__immediate64__value_or_null = sig ... end
module type S3__immediate64__value_or_null__value = sig ... end
module type S1__value_or_null = sig ... end
module type S2__value_or_null__value = sig ... end
module type S3__value_or_null__value__value = sig ... end
module type S4__value_or_null__value__value__value = sig ... end
module type S3__value_or_null__value__immediate = sig ... end
module type S3__value_or_null__value__immediate64 = sig ... end
module type S3__value_or_null__value__value_or_null = sig ... end
module type S2__value_or_null__immediate = sig ... end
module type S3__value_or_null__immediate__value = sig ... end
module type S3__value_or_null__immediate__immediate = sig ... end
module type S2__value_or_null__immediate64 = sig ... end
module type S3__value_or_null__immediate64__value = sig ... end
module type S2__value_or_null__value_or_null = sig ... end
module type S3__value_or_null__value_or_null__value = sig ... end
type ('a, ('b : any)) t

An ('a, 'b) t is a witness that 'a _boxes_ 'b. That is, a value of type 'a is represented in memory as an OCaml block, with a valid header, containing a single 'b.

In particular, for any record type r and implicit unboxed record type r#, it is possible to produce a (r, r#) t, serving as a witness that r boxes r#.

For most types, one should use ppx_box to obtain a witness, e.g.

  type r =
    { fst : f64
    ; snd : i64
    }
  [@@deriving_inline box]

  val box : r# @ l -> r @ l
  [@@alloc a @ l = (heap @ global, stack @ local)] [@@zero_alloc_if_stack a]

  val unbox : r @ l -> r# @ l [@@mode l = (global, local)] [@@zero_alloc]
  val boxed : unit -> (r, r#) Ox.Boxed.t [@@zero_alloc]

  [@@@end]

In the future, we expect OxCaml to have a built-in type constructor (_ : any) box, such that the type equality r = r# box holds.

val unsafe_create : 'a 'b. (module S with type t = 'a and type u = 'b) -> ('a, 'b) t @@ stateless

Think twice about calling this yourself! Most instances of t should be generated by ppx_box. Just because it is _possible_ to implement box and unbox does NOT necessarily mean that it is safe to create a witness for two types.

In particular, it would be a mistake to create a witness for basically all of the unboxed number types!