String2

Struct String2 

Source
pub struct String2 { /* private fields */ }
Expand description

A UTF-8 encoded, growable string.

The String2 type is string type that has owership over the char.

§Example

You can create a String2 from a literal string with String2::from:

use string2::String2;

let hello = String2::from("hello, world!");

You can append a char to a String2 with the push method, and append a &str with the push_str method;

use string2::String2;

let mut hello = String2::from("Hello, ");

hello.push('w');
hello.push_str("orld!");

If you have a String, you can create a String2 from it with the from method, and you can convert String2 to String whit the into method:

use string2::String2;

let hello = String::from("Hello world!");

let world = String2::from(hello);

let hello_world: String = world.into();

§Representation

A String2 is made up of three components: a pointer to some chars, a length, and a capacity. The pointer points to an internal buffer String2 uses to store its data. The length is the munber of bytes currently stored in the buffer, and the capacity is the size of the buffer in chars. As such, the length will always be less than or equal to the capacity.

The buffer is always stored on the heap.

You can look at these with the as_ptr, len, and capacity methods:

use std::mem;
use string2::String2;

let story = String2::from("Once upon a time...");

let ptr = story.as_ptr();
let len = story.len();
let capacity = story.capacity();

// story has nineteen chars
assert_eq!(19, len);

// Now that we have our parts, we throw the story away.
mem::forget(story);

// We can re-build a String2 out of ptr, len, and capacity. This is all
// unsafe because we are responsible for making sure the components
// valid:
let s = unsafe { String2::from_raw_parts(ptr as *mut _, len, capacity) };

assert_eq!(String2::from("Once upon a time..."), s);

If a String2 has enough capacity, adding elements to it will not re-allocate. For example, consider this program:

use string2::String2;

let mut s = String2::new();

println!("{}", s.capacity());

for _ in 0..5 {
    s.push_str("hello");
    println!("{}", s.capacity());
}

This will output the following:

0
5
10
20
20
40

At first, we have no memory allocated at all, but as we append to the string, it increases its capacity appropriately. If we instead use the with_capacity method to allocate the correct capacity initially:

use string2::String2;

let mut s = String2::with_capacity(25);

println!("{}", s.capacity());

for _ in 0..5 {
    s.push_str("hello");
    println!("{}", s.capacity());
}

We end up with a different output:

25
25
25
25
25
25

Here, there’s no need to allocate more memory inside the loop.

Implementations§

Source§

impl String2

Source

pub fn new() -> String2

Creates a new empty String2.

Given that the String2 is empty, this will not allocate any initial buffer. While that means that this initial operation is very inexpensive, but may cause excessive allocation later, when you add data. If you have an idea of how much data the String2 will hold, consider the with_capacity method to prevent excessive re-allocation.

§Examples

Basic usage:

use string2::String2;

let s = String2::new();
Source

pub fn with_capacity(capacity: usize) -> String2

Creates a new empty String2 with a particular capacity.

String2s have an internal buffer to hold their data. The capacity is the length of that buffer, and can be queried with the capacity method. This method creates an empty String2, but one with an initial buffer that can hold capacity bytes. This is useful when you may be appending a bunch of data to the String2, reducing the number of reallocations it needs to do.

If the given capacity is 0, no allocation will occur, and this method is identical to the new method.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::with_capacity(10);

// The String2 contains no chars, even though it has capacity for more
assert_eq!(s.len(), 0);

// These are all done without reallocating...
let cap = s.capacity();
for i in 0..10 {
    s.push('a');
}

assert_eq!(s.capacity(), cap);

// ...but this may make the vector reallocate
s.push('a');
Source

pub fn capacity(&self) -> usize

Returns this String2’s capacity, in bytes.

§Examples

Basic usage:

use string2::String2;

let s = String2::with_capacity(10);

assert!(s.capacity() >= 10);
Source

pub fn reserve(&mut self, additional: usize)

Ensures that this String2’s capacity is at least additional bytes larger than its length.

The capacity may be increased by more than additional bytes if it chooses, to prevent frequent reallocations.

If you do not want this “at least” behavior, see the reserve_exact method.

§Panics

Panics if the new capacity overflows usize.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::new();

s.reserve(10);

assert!(s.capacity() >= 10);

This may not actually increase the capacity:

use string2::String2;

let mut s = String2::with_capacity(10);
s.push('a');
s.push('b');

// s now has a length of 2 and a capacity of 10
assert_eq!(2, s.len());
assert_eq!(10, s.capacity());

// Since we already have an extra 8 capacity, calling this...
s.reserve(8);

// ... doesn't actually increase.
assert_eq!(10, s.capacity());
Source

pub fn reserve_exact(&mut self, additional: usize)

Ensures that this String2’s capacity is additional bytes larger than its length.

Consider using the reserve method unless you absolutely know better than the allocator.

§Panics

Panics if the new capacity overflows usize.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::new();

s.reserve_exact(10);

assert!(s.capacity() >= 10);

This may not actually increase the capacity:

use string2::String2;

let mut s = String2::with_capacity(10);
s.push('a');
s.push('b');

// s now has a length of 2 and a capacity of 10
assert_eq!(2, s.len());
assert_eq!(10, s.capacity());

// Since we already have an extra 8 capacity, calling this...
s.reserve_exact(8);

// ... doesn't actually increase.
assert_eq!(10, s.capacity());
Source

pub fn shrink_to_fit(&mut self)

Shrinks the capacity of this String2 to match its length.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::from("foo");

s.reserve(100);
assert!(s.capacity() >= 100);

s.shrink_to_fit();
assert_eq!(3, s.capacity());
Source

pub fn as_ptr(&self) -> *const char

Converts a String2 to a raw pointer. As String2 are a vector of chars, the raw pointer points to a char. This pointer will be pointing to the first byte of the String2.

§Examples

Basic usage:

use string2::String2;

let s = String2::from("Hello");
let ptr = s.as_ptr();
Source

pub unsafe fn from_raw_parts( buf: *mut char, length: usize, capacity: usize, ) -> String2

Creates a new String2 from a length, capacity, and pointer.

§Safety

This is highly unsafe, due to the number of invariants that aren’t checked:

  • The memory at ptr needs to have been previously allocated by the same allocator the standard library uses.
  • length needs to be less than or equal to capacity.
  • capacity needs to be the correct value.

Violating these may cause problems like corrupting the allocator’s internal datastructures.

The ownership of ptr is effectively transferred to the String2 which may then deallocate, reallocate or change the contents of memory pointed to by the pointer at will. Ensure that nothing else uses the pointer after calling this function.

§Examples

Basic usage:

use std::mem;
use string2::String2;

let s = String2::from("hello");
let ptr = s.as_ptr();
let len = s.len();
let capacity = s.capacity();

mem::forget(s);

let s = unsafe { String2::from_raw_parts(ptr as *mut _, len, capacity) };

assert_eq!(String2::from("hello"), s);
Source

pub fn as_bytes(&self) -> Vec<u8>

Converts a String2 into a byte vector.

§Examples

Basic usage:

use string2::String2;

let s = String2::from("hello");
let bytes = s.as_bytes();

assert_eq!(&[104, 101, 108, 108, 111], &bytes[..]);
Source

pub fn as_slice(&self) -> &[char]

Converts a String2 into a char slice.

This consumes the String2, so we do not need to copy its contents.

§Examples

Basic usage:

use string2::String2;

let s = String2::from("hello");
let bytes = s.as_slice();

assert_eq!(&['h', 'e', 'l', 'l', 'o'][..], &bytes[..]);
Source

pub fn as_mut_slice(&mut self) -> &mut [char]

Converts a String2 into a mut char slice.

This consumes the String2, so we do not need to copy its contents.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::from("hello");
{
    let bytes = s.as_mut_slice();
    bytes[1] = 'a';
}

assert_eq!(String2::from("hallo"), s);
Source

pub fn as_vec(self) -> Vec<char>

Converts a String2 into a char vector.

This consumes the String2, so we do not need to copy its contents.

§Examples

Basic usage:

use string2::String2;

let s = String2::from("hello");
let bytes = s.as_vec();

assert_eq!(&['h', 'e', 'l', 'l', 'o'], &bytes[..]);
Source

pub fn as_mut_vec(&mut self) -> &mut Vec<char>

Converts a String2 into a mut char slice.

This consumes the String2, so we do not need to copy its contents.

§Examples

Basic usage:

use string2::String2;

let mut s = String2::from("hello");
{
    let bytes = s.as_mut_vec();
    bytes[1] = 'a';
}

assert_eq!(String2::from("hallo"), s);
Source

pub fn retain<F>(&mut self, f: F)
where F: FnMut(&char) -> bool,

Source

pub fn get(&self, idx: usize) -> Option<&char>

Source

pub fn get_mut(&mut self, idx: usize) -> Option<&mut char>

Source

pub fn truncate(&mut self, new_len: usize)

Source

pub fn push(&mut self, ch: char)

Source

pub fn push_str(&mut self, string: &str)

Source

pub fn pop(&mut self) -> Option<char>

Source

pub fn remove(&mut self, idx: usize) -> char

Source

pub fn insert(&mut self, idx: usize, ch: char)

Source

pub fn insert_str(&mut self, _idx: usize, _string: &str)

Source

pub fn append(&mut self, other: &mut Self)

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn split_off(&mut self, at: usize) -> String2

Source

pub fn split_at(&self, mid: usize) -> (String2, String2)

Source

pub fn clear(&mut self)

Source

pub fn iter(self) -> StrIterator

Trait Implementations§

Source§

impl<'a> Add<&'a str> for String2

Source§

type Output = String2

The resulting type after applying the + operator.
Source§

fn add(self, other: &str) -> String2

Performs the + operation. Read more
Source§

impl Add<char> for String2

Source§

type Output = String2

The resulting type after applying the + operator.
Source§

fn add(self, other: char) -> String2

Performs the + operation. Read more
Source§

impl Add for String2

Source§

type Output = String2

The resulting type after applying the + operator.
Source§

fn add(self, other: String2) -> String2

Performs the + operation. Read more
Source§

impl<'a> AddAssign<&'a str> for String2

Source§

fn add_assign(&mut self, other: &str)

Performs the += operation. Read more
Source§

impl AddAssign<char> for String2

Source§

fn add_assign(&mut self, other: char)

Performs the += operation. Read more
Source§

impl AddAssign for String2

Source§

fn add_assign(&mut self, other: String2)

Performs the += operation. Read more
Source§

impl AsMut<[char]> for String2

Source§

fn as_mut(&mut self) -> &mut [char]

Converts this type into a mutable reference of the (usually inferred) input type.
Source§

impl AsMut<String2> for String2

Source§

fn as_mut(&mut self) -> &mut String2

Converts this type into a mutable reference of the (usually inferred) input type.
Source§

impl AsRef<[char]> for String2

Source§

fn as_ref(&self) -> &[char]

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<String2> for String2

Source§

fn as_ref(&self) -> &String2

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for String2

Source§

fn clone(&self) -> String2

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for String2

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for String2

Source§

fn default() -> String2

Returns the “default value” for a type. Read more
Source§

impl Display for String2

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> From<&'a [char]> for String2

Source§

fn from(s: &'a [char]) -> String2

Converts to this type from the input type.
Source§

impl<'a> From<&'a mut [char]> for String2

Source§

fn from(s: &'a mut [char]) -> String2

Converts to this type from the input type.
Source§

impl<'a> From<&'a str> for String2

Source§

fn from(string: &'a str) -> String2

Converts to this type from the input type.
Source§

impl From<String> for String2

Source§

fn from(string: String) -> String2

Converts to this type from the input type.
Source§

impl From<Vec<char>> for String2

Source§

fn from(s: Vec<char>) -> String2

Converts to this type from the input type.
Source§

impl Index<Range<usize>> for String2

Source§

type Output = [char]

The returned type after indexing.
Source§

fn index(&self, range: Range<usize>) -> &[char]

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<RangeFrom<usize>> for String2

Source§

type Output = [char]

The returned type after indexing.
Source§

fn index(&self, range: RangeFrom<usize>) -> &[char]

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<RangeFull> for String2

Source§

type Output = [char]

The returned type after indexing.
Source§

fn index(&self, _range: RangeFull) -> &[char]

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<RangeTo<usize>> for String2

Source§

type Output = [char]

The returned type after indexing.
Source§

fn index(&self, range: RangeTo<usize>) -> &[char]

Performs the indexing (container[index]) operation. Read more
Source§

impl Index<usize> for String2

Source§

type Output = char

The returned type after indexing.
Source§

fn index(&self, idx: usize) -> &char

Performs the indexing (container[index]) operation. Read more
Source§

impl IndexMut<Range<usize>> for String2

Source§

fn index_mut(&mut self, range: Range<usize>) -> &mut [char]

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<RangeFrom<usize>> for String2

Source§

fn index_mut(&mut self, range: RangeFrom<usize>) -> &mut [char]

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<RangeFull> for String2

Source§

fn index_mut(&mut self, range: RangeFull) -> &mut [char]

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<RangeTo<usize>> for String2

Source§

fn index_mut(&mut self, range: RangeTo<usize>) -> &mut [char]

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl IndexMut<usize> for String2

Source§

fn index_mut(&mut self, idx: usize) -> &mut char

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl<'a> Into<String> for &'a String2

Source§

fn into(self) -> String

Converts this type into the (usually inferred) input type.
Source§

impl Into<String> for String2

Source§

fn into(self) -> String

Converts this type into the (usually inferred) input type.
Source§

impl IntoIterator for String2

Source§

type Item = char

The type of the elements being iterated over.
Source§

type IntoIter = StrIterator

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl Ord for String2

Source§

fn cmp(&self, other: &String2) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for String2

Source§

fn eq(&self, other: &String2) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for String2

Source§

fn partial_cmp(&self, other: &String2) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Eq for String2

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.