Sentinel
sentinel is a sentinel-terminated slice library.
How it works
Rust Slices
In Rust, the slice type &[T] is basically defined like that: (*const T, usize). The usize
indicates the number of Ts referenced at the *const T. Knowing in advance the size of an array,
like that, has numerous advantages, which won't be discussed here.
There is however two main problems with the &[T] type:
-
It is not (at least, yet) FFI-safe. One cannot create an
extern "C" fn(s: &[u32])function and expect it to work when calling it from C-code. -
The size of
&[T]has the size of twousizes.
Sentinels?
A sentinel is a special value that is used to determine the end of an array. For example, in C, the
char * type can be a pointer to a "null-terminated" string. This is an example of
sentinel-terminated slice.
CString:
char *ptr
|
'H' 'e' 'l' 'l' 'o' '\0'
^ sentinel, anything after this point may be invalid.
str:
*const u8, 5
|
'H' 'e' 'l' 'l' 'o'
^ no sentinel, we know the slice contains 5 elements.
This crate remains generic over how sentinels are defined. It uses the Sentinel trait, which is
roughly defined like that:
It is used to determine whether a specific instance of T should be treated as a "sentinel" value.
SSlice
Finally, in conjonction with the Sentinel trait, this crate defines the SSlice<T> type.
It is generic over T, the type of stored elements, overing great flexibility.
Note that this type actually contains no data. Only references to this type can be created (i.e.
&SSlice<T> or &mut SSlice<T>), and those references have the size a single usize.
FFI
The SSlice<T> type is FFI safe, which mean you can now write this:
// type CStr = sentinel::SSlice<u8>;
extern "C"
Or this!
extern crate libc;
use ;
extern "C"
Features
-
alloc- adds support for thealloccrate. This adds theSBox<T>type. -
nightly- makes use of the unstableextern_typefeature to make sure no instance ofSSlice<T>can be created on the stack by making it!Sized. This feature also enables support for the newallocator_apiunstable feature. -
libc- use the libc'sstrlenandmemchrto look for null characters in sentinel-terminated slices. -
memchr- use thememchrcrate to look for null characters in sentinel-terminated slices.
alloc and memchr are enabled by default.
Old sentinel crate
The name sentinel was kindly given to me by the previous maintainer of this project.
Every pre-0.2 versions (on crates.io) contain the source code of that crate.