pub struct SmallIndex(/* private fields */);
Expand description
A type that represents a “small” index.
The main idea of this type is to provide something that can index memory,
but uses less memory than usize
on 64-bit systems. Specifically, its
representation is always a u32
and has repr(transparent)
enabled. (So
it is safe to transmute between a u32
and a SmallIndex
.)
A small index is typically useful in cases where there is no practical way
that the index will overflow a 32-bit integer. A good example of this is
an NFA state. If you could somehow build an NFA with 2^30
states, its
memory usage would be exorbitant and its runtime execution would be so
slow as to be completely worthless. Therefore, this crate generally deems
it acceptable to return an error if it would otherwise build an NFA that
requires a slice longer than what a 32-bit integer can index. In exchange,
we can use 32-bit indices instead of 64-bit indices in various places.
This type ensures this by providing a constructor that will return an error if its argument cannot fit into the type. This makes it much easier to handle these sorts of boundary cases that are otherwise extremely subtle.
On all targets, this type guarantees that its value will fit in a u32
,
i32
, usize
and an isize
. This means that on 16-bit targets, for
example, this type’s maximum value will never overflow an isize
,
which means it will never overflow a i16
even though its internal
representation is still a u32
.
The purpose for making the type fit into even signed integer types like
isize
is to guarantee that the difference between any two small indices
is itself also a small index. This is useful in certain contexts, e.g.,
for delta encoding.
§Other types
The following types wrap SmallIndex
to provide a more focused use case:
PatternID
is for representing the identifiers of patterns.StateID
is for representing the identifiers of states in finite automata. It is used for both NFAs and DFAs.
§Representation
This type is always represented internally by a u32
and is marked as
repr(transparent)
. Thus, this type always has the same representation as
a u32
. It is thus safe to transmute between a u32
and a SmallIndex
.
§Indexing
For convenience, callers may use a SmallIndex
to index slices.
§Safety
While a SmallIndex
is meant to guarantee that its value fits into usize
without using as much space as a usize
on all targets, callers must
not rely on this property for safety. Callers may choose to rely on this
property for correctness however. For example, creating a SmallIndex
with
an invalid value can be done in entirely safe code. This may in turn result
in panics or silent logical errors.
Implementations§
Source§impl SmallIndex
impl SmallIndex
Sourcepub const MAX: SmallIndex = _
pub const MAX: SmallIndex = _
The maximum index value.
Sourcepub const LIMIT: usize = 2_147_483_647usize
pub const LIMIT: usize = 2_147_483_647usize
The total number of values that can be represented as a small index.
Sourcepub const ZERO: SmallIndex = _
pub const ZERO: SmallIndex = _
The zero index value.
Sourcepub fn new(index: usize) -> Result<SmallIndex, SmallIndexError>
pub fn new(index: usize) -> Result<SmallIndex, SmallIndexError>
Create a new small index.
If the given index exceeds SmallIndex::MAX
, then this returns
an error.
Sourcepub const fn new_unchecked(index: usize) -> SmallIndex
pub const fn new_unchecked(index: usize) -> SmallIndex
Create a new small index without checking whether the given value
exceeds SmallIndex::MAX
.
Using this routine with an invalid index value will result in unspecified behavior, but not undefined behavior. In particular, an invalid index value is likely to cause panics or possibly even silent logical errors.
Callers must never rely on a SmallIndex
to be within a certain range
for memory safety.
Sourcepub fn must(index: usize) -> SmallIndex
pub fn must(index: usize) -> SmallIndex
Like SmallIndex::new
, but panics if the given index is not valid.
Sourcepub const fn as_usize(&self) -> usize
pub const fn as_usize(&self) -> usize
Return this small index as a usize
. This is guaranteed to never
overflow usize
.
Sourcepub const fn as_u64(&self) -> u64
pub const fn as_u64(&self) -> u64
Return this small index as a u64
. This is guaranteed to never
overflow.
Sourcepub const fn as_u32(&self) -> u32
pub const fn as_u32(&self) -> u32
Return the internal u32
of this small index. This is guaranteed to
never overflow u32
.
Sourcepub const fn as_i32(&self) -> i32
pub const fn as_i32(&self) -> i32
Return the internal u32
of this small index represented as an i32
.
This is guaranteed to never overflow an i32
.
Sourcepub fn one_more(&self) -> usize
pub fn one_more(&self) -> usize
Returns one more than this small index as a usize.
Since a small index has constraints on its maximum value, adding 1
to
it will always fit in a usize
, u32
and a i32
.
Sourcepub fn from_ne_bytes(bytes: [u8; 4]) -> Result<SmallIndex, SmallIndexError>
pub fn from_ne_bytes(bytes: [u8; 4]) -> Result<SmallIndex, SmallIndexError>
Decode this small index from the bytes given using the native endian byte order for the current target.
If the decoded integer is not representable as a small index for the current target, then this returns an error.
Sourcepub fn from_ne_bytes_unchecked(bytes: [u8; 4]) -> SmallIndex
pub fn from_ne_bytes_unchecked(bytes: [u8; 4]) -> SmallIndex
Decode this small index from the bytes given using the native endian byte order for the current target.
This is analogous to SmallIndex::new_unchecked
in that is does not
check whether the decoded integer is representable as a small index.
Sourcepub fn to_ne_bytes(&self) -> [u8; 4]
pub fn to_ne_bytes(&self) -> [u8; 4]
Return the underlying small index integer as raw bytes in native endian format.
Trait Implementations§
Source§impl Clone for SmallIndex
impl Clone for SmallIndex
Source§fn clone(&self) -> SmallIndex
fn clone(&self) -> SmallIndex
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more