#### optint

This library provides two new integer types, `Optint.t`

and `Int63.t`

, which

guarantee efficient representation on 64-bit architectures and provide a

best-effort boxed representation on 32-bit architectures.

### Goal

The standard `Int32.t`

and `Int64.t`

types provided by the standard library have

the same heap-allocated representation on all architectures. This consistent

representation has costs in both memory and run-time performance.

On 64-bit architectures, it's often more efficient to use the native `int`

directly.

This library provides types to do exactly this:

`Optint.t`

: an integer containing*at least*32 bits. On 64-bit, this is an

immediate integer; on 32-bit, it is a boxed 32-bit value. The overflow

behaviour is platform-dependent.`Int63.t`

: an integer containing*exactly*63 bits. On 64-bit, this is an

immediate integer; on 32-bit, it is a boxed 64-bit integer that is wrapped to

provide 63-bit two's complement semantics. The two implementations are

observationally equivalent, modulo use of`Marshal`

and`Obj`

.

In summary:

| Integer type | 32-bit representation | 64-bit representation | Semantics |

| -- | -- | -- | -- |

| `Stdlib.Int.t`

| 31-bit immediate ✅ | 63-bit immediate ✅ | Always immediate |

| `Stdlib.Nativeint.t`

| 32-bit boxed ❌ | 64-bit boxed ❌ | Exactly word size |

| `Stdlib.Int32.t`

| 32-bit boxed ❌ | 32-bit boxed ❌ | Exactly 32 bits |

| `Stdlib.Int64.t`

| 64-bit boxed ❌ | 64-bit boxed ❌ | Exactly 64 bits |

| `Optint.t`

(*new*) | 32-bit boxed ❌ | 63-bit immediate ✅ | *At least* 32 bits |

| `Int63.t`

(*new*) | 64-bit boxed ❌ | 63-bit immediate ✅ | Exactly 63 bits |

These new types are safe and well-tested, but their architecture-dependent

implementation makes them unsuitable for use with the `Marshal`

module. Use the

provided encode and decode functions instead.

sha256=1dcbe0b6b6031f77db33028c87138fdb3bf90f92915e3b6629ddeb30a0d3000b

sha512=7d4b63c82b1dc1e363a892895c1a612bac3dcd33c27e2c27e8ea2e8868d659413226c7a0d7bdcac423f7fb016069d0de90c3eaa68986da6aea69e1f1ca583f18

>= "0.3.1"

>= "0.8"

>= "3.0.0"

>= "1.4.0"

>= "1.4.0"

>= "2.7.0"

>= "0.5.0"

>= "0.2.0"

>= "0.5.0"

< "1.0.0" | >= "1.3.0"