Skip to main content

Crate ref_str

Crate ref_str 

Source
Expand description

Compact borrowed-or-shared string types for no_std Rust.

ref_str stores either:

The public wrappers sit on top of a compact two-word core representation, so they are useful when you want to preserve borrowing when possible while still supporting cheap clones of owned values.

§Type Families

RefStr<'a> and StaticRefStr use Arc<str> for shared ownership and are appropriate when values may cross thread boundaries.

LocalRefStr<'a> and LocalStaticRefStr use Rc<str> instead, which avoids atomic reference counting in single-threaded contexts.

The lifetime-parameterized wrappers can preserve borrowed data during deserialization. The dedicated 'static wrappers always deserialize into shared owned storage, even when the input format exposes borrowed strings.

§Borrowed vs Shared

Each value is always in exactly one of two states:

Borrowed values preserve the original lifetime and can be recovered as &str or Cow<'a, str> without allocation. Shared values own their backing allocation through Arc<str> or Rc<str>, and cloning them only bumps the reference count.

§Common Operations

All four public wrappers expose the same core operations:

§Allocation Notes

as_cow is allocation-free only for borrowed values. When the value is shared, as_cow returns Cow::Owned and clones the string contents, because a Cow<'a, str> cannot borrow directly from Rc<str> or Arc<str>.

Conversions between LocalRefStr<'a> and RefStr<'a> preserve borrowed values without allocation. Shared values must be re-materialized into the target backend, so converting between the Rc and Arc families allocates and copies the string contents.

§Advanced APIs

Advanced raw-pointer escape hatches are available through into_raw_parts, from_raw_parts, into_raw, into_raw_shared, and increment_strong_count.

Most of these APIs are unsafe: callers must preserve the original backend, ownership rules, and encoded tag values.

into_raw is intentionally low-level: its returned *const str may point to either borrowed data or shared backend storage. If you need a raw pointer that is guaranteed to come from shared storage, prefer into_raw_shared. Passing a borrowed pointer from into_raw into increment_strong_count is undefined behavior.

§Examples

use ref_str::{RefStr, StaticRefStr};

let borrowed = RefStr::from("hello");
assert!(borrowed.is_borrowed());
assert_eq!(borrowed.as_str(), "hello");

let shared = RefStr::from(String::from("world"));
assert!(shared.is_shared());
assert_eq!(shared.clone().into_string(), "world");

let borrowed_cow = borrowed.as_cow();
assert_eq!(borrowed_cow.as_ref(), "hello");

let static_value = StaticRefStr::from_static("fixed");
assert!(static_value.is_borrowed());

Structs§

LocalRefStr
A compact string that is either borrowed for 'a or shared via Rc<str>.
LocalStaticRefStr
A 'static compact string that is either borrowed or shared via Rc<str>.
RefStr
A compact string that is either borrowed for 'a or shared via Arc<str>.
StaticRefStr
A 'static compact string that is either borrowed or shared via Arc<str>.