8 releases

0.1.7 May 7, 2021
0.1.6 Feb 10, 2021
0.1.5 Dec 3, 2020

#342 in Parser tooling

MIT/Apache

27KB
575 lines

A String with shared ownership.

Helpfull for some types that need to be parsed from a string and get split into smaller parts like an Url or a Vec containing lines which need to be owned by the parent type.

Note

First try to store references, for example &str which is more efficient.

At the moment if you create a SharedString the underlying bytes cannot be mutated anymore.

Example

use shared_string::SharedString;
// or SharedSyncString if `Sync` is required

struct Name {
    firstname: SharedString,
    middlename: SharedString,
    lastname: SharedString
    // to be faster than string
    // you should use at least 3 fields
}

impl Name {
    pub fn new(fullname: impl Into<SharedString>) -> Option<Self> {
        let mut split = fullname.into().split(b' ');
        Some(Self {
            firstname: split.next()?,
            middlename: split.next()?,
            lastname: split.next()?
        })
    }
}

let name = Name::new("Bartholomew Jojo Simpson").unwrap();
assert_eq!(name.firstname, "Bartholomew");
assert_eq!(name.middlename, "Jojo");
assert_eq!(name.lastname, "Simpson");

Performance

SharedString can increase the perfomance in situations such as the example above by over 30%. See benches/* for benchmarks.

No runtime deps