Source file native_pointer.ml
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
type t = private nativeint
external ext_pointer_as_native_pointer
: int
-> (t[@unboxed])
= "caml_ext_pointer_as_native_pointer_bytecode" "caml_ext_pointer_as_native_pointer"
[@@noalloc] [@@builtin] [@@no_effects] [@@no_coeffects]
external unsafe_of_value
: 'a
-> (t[@unboxed])
= "caml_native_pointer_of_value_bytecode" "caml_native_pointer_of_value"
[@@noalloc] [@@builtin] [@@no_effects] [@@no_coeffects]
external unsafe_to_value
: (t[@unboxed])
-> 'a
= "caml_native_pointer_to_value_bytecode" "caml_native_pointer_to_value"
[@@noalloc] [@@builtin] [@@no_effects] [@@no_coeffects]
external load_untagged_int
: (t[@unboxed])
-> (int[@untagged])
= "caml_native_pointer_load_untagged_int_bytecode"
"caml_native_pointer_load_unboxed_nativeint"
[@@noalloc] [@@builtin] [@@no_effects]
external store_untagged_int
: (t[@unboxed])
-> (int[@untagged])
-> unit
= "caml_native_pointer_store_untagged_int_bytecode"
"caml_native_pointer_store_unboxed_nativeint"
[@@noalloc] [@@builtin] [@@no_coeffects]
external load_unboxed_nativeint
: t
-> nativeint
= "caml_native_pointer_load_unboxed_nativeint_bytecode"
"caml_native_pointer_load_unboxed_nativeint"
[@@unboxed] [@@noalloc] [@@builtin] [@@no_effects]
external store_unboxed_nativeint
: (t[@unboxed])
-> (nativeint[@unboxed])
-> unit
= "caml_native_pointer_store_unboxed_nativeint_bytecode"
"caml_native_pointer_store_unboxed_nativeint"
[@@noalloc] [@@builtin] [@@no_coeffects]
external load_unboxed_int64
: t
-> int64
= "caml_native_pointer_load_unboxed_int64_bytecode"
"caml_native_pointer_load_unboxed_int64"
[@@unboxed] [@@noalloc] [@@builtin] [@@no_effects]
external store_unboxed_int64
: (t[@unboxed])
-> (int64[@unboxed])
-> unit
= "caml_native_pointer_store_unboxed_int64_bytecode"
"caml_native_pointer_store_unboxed_int64"
[@@noalloc] [@@builtin] [@@no_coeffects]
external load_unboxed_int32
: t
-> int32
= "caml_native_pointer_load_unboxed_int32_bytecode"
"caml_native_pointer_load_unboxed_int32"
[@@unboxed] [@@noalloc] [@@builtin] [@@no_effects]
external store_unboxed_int32
: (t[@unboxed])
-> (int32[@unboxed])
-> unit
= "caml_native_pointer_store_unboxed_int32_bytecode"
"caml_native_pointer_store_unboxed_int32"
[@@noalloc] [@@builtin] [@@no_coeffects]
external load_unboxed_float
: t
-> float
= "caml_native_pointer_load_unboxed_float_bytecode"
"caml_native_pointer_load_unboxed_float"
[@@unboxed] [@@noalloc] [@@builtin] [@@no_effects]
external store_unboxed_float
: (t[@unboxed])
-> (float[@unboxed])
-> unit
= "caml_native_pointer_store_unboxed_float_bytecode"
"caml_native_pointer_store_unboxed_float"
[@@noalloc] [@@builtin] [@@no_coeffects]
module type Immediate_intf = sig
module V : sig
type t [@@immediate64]
end
external unsafe_load_immediate
: (t[@unboxed])
-> V.t
= "caml_native_pointer_load_immediate_bytecode" "caml_native_pointer_load_immediate"
[@@noalloc] [@@builtin] [@@no_effects]
external store_immediate
: (t[@unboxed])
-> V.t
-> unit
= "caml_native_pointer_store_immediate_bytecode" "caml_native_pointer_store_immediate"
[@@noalloc] [@@builtin] [@@no_coeffects]
end
module Immediate (V : sig
type t [@@immediate64]
end) : Immediate_intf with module V = V = struct
module V = V
external unsafe_load_immediate
: (t[@unboxed])
-> V.t
= "caml_native_pointer_load_immediate_bytecode" "caml_native_pointer_load_immediate"
[@@noalloc] [@@builtin] [@@no_effects]
external store_immediate
: (t[@unboxed])
-> V.t
-> unit
= "caml_native_pointer_store_immediate_bytecode" "caml_native_pointer_store_immediate"
[@@noalloc] [@@builtin] [@@no_coeffects]
end
module Int = Immediate (Stdlib.Int)
module Bool = Immediate (Stdlib.Bool)
module Expert = struct
external of_nativeint : nativeint -> t = "%identity"
external to_nativeint : t -> nativeint = "%identity"
end
open Expert
module NI = Stdlib.Nativeint
let advance (t : t) ~(bytes : nativeint) : t =
of_nativeint (NI.add (to_nativeint t) bytes)
;;
let difference_in_bytes (start : t) (stop : t) : nativeint =
NI.sub (to_nativeint stop) (to_nativeint start)
;;
let ( < ) (l : t) (r : t) = NI.compare (to_nativeint l) (to_nativeint r) < 0
let ( > ) (l : t) (r : t) = NI.compare (to_nativeint l) (to_nativeint r) > 0
let ( <= ) (l : t) (r : t) = l < r || l = r
let ( >= ) (l : t) (r : t) = l > r || l = r
let ( = ) (l : t) (r : t) = NI.equal (to_nativeint l) (to_nativeint r)
let ( <> ) (l : t) (r : t) = not (l = r)