12
12
13
13
//! Unicode string manipulation (the [`str`](../primitive.str.html) type).
14
14
//!
15
- //! Rust's [`str`](../primitive.str.html) type is one of the core primitive types of the
16
- //! language. `&str` is the borrowed string type. This type of string can only be created
17
- //! from other strings, unless it is a `&'static str` (see below). It is not possible to
18
- //! move out of borrowed strings because they are owned elsewhere.
15
+ //! Rust's [`str`](../primitive.str.html) type is one of the core primitive
16
+ //! types of the language. `&str` is the borrowed string type. This type of
17
+ //! string can only be created from other strings, unless it is a `&'static str`
18
+ //! (see below). It is not possible to move out of borrowed strings because they
19
+ //! are owned elsewhere.
19
20
//!
20
- //! Basic operations are implemented directly by the compiler, but more advanced operations are
21
- //! defined on the [`StrExt`](trait.StrExt.html) trait.
21
+ //! Basic operations are implemented directly by the compiler, but more advanced
22
+ //! operations are defined on the [`StrExt`](trait.StrExt.html) trait.
22
23
//!
23
24
//! # Examples
24
25
//!
28
29
//! let s = "Hello, world.";
29
30
//! ```
30
31
//!
31
- //! This `&str` is a `&'static str`, which is the type of string literals. They're `'static`
32
- //! because literals are available for the entire lifetime of the program.
32
+ //! This `&str` is a `&'static str`, which is the type of string literals.
33
+ //! They're `'static` because literals are available for the entire lifetime of
34
+ //! the program.
33
35
//!
34
36
//! You can get a non-`'static` `&str` by taking a slice of a `String`:
35
37
//!
40
42
//!
41
43
//! # Representation
42
44
//!
43
- //! Rust's string type, `str`, is a sequence of Unicode scalar values encoded as a stream of UTF-8
44
- //! bytes. All [strings](../../reference.html#literals) are guaranteed to be validly encoded UTF-8
45
- //! sequences. Additionally, strings are not null-terminated and can thus contain null bytes.
45
+ //! Rust's string type, `str`, is a sequence of Unicode scalar values encoded as
46
+ //! a stream of UTF-8 bytes. All [strings](../../reference.html#literals) are
47
+ //! guaranteed to be validly encoded UTF-8 sequences. Additionally, strings are
48
+ //! not null-terminated and can thus contain null bytes.
46
49
//!
47
- //! The actual representation of `str`s have direct mappings to slices: `&str` is the same as
48
- //! `&[u8]`.
50
+ //! The actual representation of `str`s have direct mappings to slices: `&str`
51
+ //! is the same as `&[u8]`.
49
52
50
53
#![ doc( primitive = "str" ) ]
51
54
#![ stable( feature = "rust1" , since = "1.0.0" ) ]
52
55
53
56
use self :: RecompositionState :: * ;
54
57
use self :: DecompositionType :: * ;
55
58
56
- use core:: char:: CharExt ;
57
59
use core:: clone:: Clone ;
58
60
use core:: iter:: AdditiveIterator ;
59
- use core:: iter:: { Iterator , IteratorExt } ;
61
+ use core:: iter:: { Iterator , IteratorExt , Extend } ;
60
62
use core:: ops:: Index ;
61
63
use core:: ops:: RangeFull ;
62
64
use core:: option:: Option :: { self , Some , None } ;
63
65
use core:: result:: Result ;
64
66
use core:: slice:: AsSlice ;
65
67
use core:: str as core_str;
68
+ use unicode:: char:: CharExt ;
66
69
use unicode:: str:: { UnicodeStr , Utf16Encoder } ;
67
70
68
71
use vec_deque:: VecDeque ;
@@ -836,17 +839,19 @@ pub trait StrExt: Index<RangeFull, Output = str> {
836
839
837
840
/// Returns a slice of the string from the character range [`begin`..`end`).
838
841
///
839
- /// That is, start at the `begin`-th code point of the string and continue to the `end`-th code
840
- /// point. This does not detect or handle edge cases such as leaving a combining character as
841
- /// the first code point of the string.
842
+ /// That is, start at the `begin`-th code point of the string and continue
843
+ /// to the `end`-th code point. This does not detect or handle edge cases
844
+ /// such as leaving a combining character as the first code point of the
845
+ /// string.
842
846
///
843
- /// Due to the design of UTF-8, this operation is `O(end)`. See `slice`, `slice_to` and
844
- /// `slice_from` for `O(1)` variants that use byte indices rather than code point indices.
847
+ /// Due to the design of UTF-8, this operation is `O(end)`. See `slice`,
848
+ /// `slice_to` and `slice_from` for `O(1)` variants that use byte indices
849
+ /// rather than code point indices.
845
850
///
846
851
/// # Panics
847
852
///
848
- /// Panics if `begin` > `end` or the either `begin` or `end` are beyond the last character of
849
- /// the string.
853
+ /// Panics if `begin` > `end` or the either `begin` or `end` are beyond the
854
+ /// last character of the string.
850
855
///
851
856
/// # Examples
852
857
///
@@ -868,8 +873,8 @@ pub trait StrExt: Index<RangeFull, Output = str> {
868
873
///
869
874
/// # Unsafety
870
875
///
871
- /// Caller must check both UTF-8 character boundaries and the boundaries of the entire slice as
872
- /// well.
876
+ /// Caller must check both UTF-8 character boundaries and the boundaries of
877
+ /// the entire slice as well.
873
878
///
874
879
/// # Examples
875
880
///
@@ -1506,6 +1511,32 @@ pub trait StrExt: Index<RangeFull, Output = str> {
1506
1511
fn trim_right ( & self ) -> & str {
1507
1512
UnicodeStr :: trim_right ( & self [ ..] )
1508
1513
}
1514
+
1515
+ /// Returns the lowercase equivalent of this string.
1516
+ ///
1517
+ /// # Examples
1518
+ ///
1519
+ /// let s = "HELLO";
1520
+ /// assert_eq!(s.to_lowercase(), "hello");
1521
+ #[ unstable( feature = "collections" ) ]
1522
+ fn to_lowercase ( & self ) -> String {
1523
+ let mut s = String :: with_capacity ( self . len ( ) ) ;
1524
+ s. extend ( self [ ..] . chars ( ) . flat_map ( |c| c. to_lowercase ( ) ) ) ;
1525
+ return s;
1526
+ }
1527
+
1528
+ /// Returns the uppercase equivalent of this string.
1529
+ ///
1530
+ /// # Examples
1531
+ ///
1532
+ /// let s = "hello";
1533
+ /// assert_eq!(s.to_uppercase(), "HELLO");
1534
+ #[ unstable( feature = "collections" ) ]
1535
+ fn to_uppercase ( & self ) -> String {
1536
+ let mut s = String :: with_capacity ( self . len ( ) ) ;
1537
+ s. extend ( self [ ..] . chars ( ) . flat_map ( |c| c. to_uppercase ( ) ) ) ;
1538
+ return s;
1539
+ }
1509
1540
}
1510
1541
1511
1542
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments