blob: 524386b72ac7c146f985ceef4d0fe67ae81a0fc2 (
plain) (
tree)
|
|
type protocol = ..
class type obj = object
method reference : bool
method release : unit
method hash : Concepts.Hash.hash
method protocols : protocol list
end
type t = { valid : bool ref; refers_to : obj }
type 'a interface = { handle : t; interface : 'a }
let object_of { valid; refers_to } =
if !valid then
refers_to
else
failwith "Attempt to dereference an invalid handle!"
let interface_of handle interface = { handle; interface }
let make o = { valid = ref true; refers_to = (o :> obj) }
let into handle f =
List.find_map f (object_of handle)#protocols
|> Option.map (interface_of handle)
let invoke { handle; interface } f =
let _ = object_of handle in
f interface
let copy handle =
let o = object_of handle in
if o#reference then
Some (make o)
else
None
let equal h1 h2 =
Concepts.Hash.hash_equals (object_of h1)#hash (object_of h2)#hash
let hash h = (object_of h)#hash
let release ({ valid; _ } as handle) =
let o = object_of handle in
valid := false;
o#release
|