Hex Artifact Content
Not logged in

Artifact 597035ffe941c1195a4b275e9af7b2a35f0295c2:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 32 2d 32 30 31 34 20 54 68 65 20 52 75 73 74 20  2-2014 The Rust 
0020: 50 72 6f 6a 65 63 74 20 44 65 76 65 6c 6f 70 65  Project Develope
0030: 72 73 2e 20 53 65 65 20 74 68 65 20 43 4f 50 59  rs. See the COPY
0040: 52 49 47 48 54 0a 2f 2f 20 66 69 6c 65 20 61 74  RIGHT.// file at
0050: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 64   the top-level d
0060: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 69 73  irectory of this
0070: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e   distribution an
0080: 64 20 61 74 0a 2f 2f 20 68 74 74 70 3a 2f 2f 72  d at.// http://r
0090: 75 73 74 2d 6c 61 6e 67 2e 6f 72 67 2f 43 4f 50  ust-lang.org/COP
00a0: 59 52 49 47 48 54 2e 0a 2f 2f 0a 2f 2f 20 4c 69  YRIGHT..//.// Li
00b0: 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68 65  censed under the
00c0: 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65 2c   Apache License,
00d0: 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 3c 4c 49   Version 2.0 <LI
00e0: 43 45 4e 53 45 2d 41 50 41 43 48 45 20 6f 72 0a  CENSE-APACHE or.
00f0: 2f 2f 20 68 74 74 70 3a 2f 2f 77 77 77 2e 61 70  // http://www.ap
0100: 61 63 68 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 65  ache.org/license
0110: 73 2f 4c 49 43 45 4e 53 45 2d 32 2e 30 3e 20 6f  s/LICENSE-2.0> o
0120: 72 20 74 68 65 20 4d 49 54 20 6c 69 63 65 6e 73  r the MIT licens
0130: 65 0a 2f 2f 20 3c 4c 49 43 45 4e 53 45 2d 4d 49  e.// <LICENSE-MI
0140: 54 20 6f 72 20 68 74 74 70 3a 2f 2f 6f 70 65 6e  T or http://open
0150: 73 6f 75 72 63 65 2e 6f 72 67 2f 6c 69 63 65 6e  source.org/licen
0160: 73 65 73 2f 4d 49 54 3e 2c 20 61 74 20 79 6f 75  ses/MIT>, at you
0170: 72 0a 2f 2f 20 6f 70 74 69 6f 6e 2e 20 54 68 69  r.// option. Thi
0180: 73 20 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 62  s file may not b
0190: 65 20 63 6f 70 69 65 64 2c 20 6d 6f 64 69 66 69  e copied, modifi
01a0: 65 64 2c 20 6f 72 20 64 69 73 74 72 69 62 75 74  ed, or distribut
01b0: 65 64 0a 2f 2f 20 65 78 63 65 70 74 20 61 63 63  ed.// except acc
01c0: 6f 72 64 69 6e 67 20 74 6f 20 74 68 6f 73 65 20  ording to those 
01d0: 74 65 72 6d 73 2e 0a 0a 2f 2f 21 20 53 74 72 69  terms...//! Stri
01e0: 6e 67 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 0a  ng manipulation.
01f0: 2f 2f 21 0a 2f 2f 21 20 46 6f 72 20 6d 6f 72 65  //!.//! For more
0200: 20 64 65 74 61 69 6c 73 2c 20 73 65 65 20 73 74   details, see st
0210: 64 3a 3a 73 74 72 0a 0a 23 21 5b 73 74 61 62 6c  d::str..#![stabl
0220: 65 28 66 65 61 74 75 72 65 20 3d 20 22 72 75 73  e(feature = "rus
0230: 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e  t1", since = "1.
0240: 30 2e 30 22 29 5d 0a 0a 75 73 65 20 73 65 6c 66  0.0")]..use self
0250: 3a 3a 70 61 74 74 65 72 6e 3a 3a 50 61 74 74 65  ::pattern::Patte
0260: 72 6e 3b 0a 75 73 65 20 73 65 6c 66 3a 3a 70 61  rn;.use self::pa
0270: 74 74 65 72 6e 3a 3a 7b 53 65 61 72 63 68 65 72  ttern::{Searcher
0280: 2c 20 52 65 76 65 72 73 65 53 65 61 72 63 68 65  , ReverseSearche
0290: 72 2c 20 44 6f 75 62 6c 65 45 6e 64 65 64 53 65  r, DoubleEndedSe
02a0: 61 72 63 68 65 72 7d 3b 0a 0a 75 73 65 20 63 68  archer};..use ch
02b0: 61 72 3b 0a 75 73 65 20 63 6f 6e 76 65 72 74 3a  ar;.use convert:
02c0: 3a 54 72 79 46 72 6f 6d 3b 0a 75 73 65 20 66 6d  :TryFrom;.use fm
02d0: 74 3b 0a 75 73 65 20 69 74 65 72 3a 3a 7b 4d 61  t;.use iter::{Ma
02e0: 70 2c 20 43 6c 6f 6e 65 64 2c 20 46 75 73 65 64  p, Cloned, Fused
02f0: 49 74 65 72 61 74 6f 72 7d 3b 0a 75 73 65 20 73  Iterator};.use s
0300: 6c 69 63 65 3a 3a 7b 73 65 6c 66 2c 20 53 6c 69  lice::{self, Sli
0310: 63 65 49 6e 64 65 78 7d 3b 0a 75 73 65 20 6d 65  ceIndex};.use me
0320: 6d 3b 0a 0a 70 75 62 20 6d 6f 64 20 70 61 74 74  m;..pub mod patt
0330: 65 72 6e 3b 0a 0a 2f 2f 2f 20 41 20 74 72 61 69  ern;../// A trai
0340: 74 20 74 6f 20 61 62 73 74 72 61 63 74 20 74 68  t to abstract th
0350: 65 20 69 64 65 61 20 6f 66 20 63 72 65 61 74 69  e idea of creati
0360: 6e 67 20 61 20 6e 65 77 20 69 6e 73 74 61 6e 63  ng a new instanc
0370: 65 20 6f 66 20 61 20 74 79 70 65 20 66 72 6f 6d  e of a type from
0380: 20 61 0a 2f 2f 2f 20 73 74 72 69 6e 67 2e 0a 2f   a./// string../
0390: 2f 2f 0a 2f 2f 2f 20 60 46 72 6f 6d 53 74 72 60  //./// `FromStr`
03a0: 27 73 20 5b 60 66 72 6f 6d 5f 73 74 72 60 5d 20  's [`from_str`] 
03b0: 6d 65 74 68 6f 64 20 69 73 20 6f 66 74 65 6e 20  method is often 
03c0: 75 73 65 64 20 69 6d 70 6c 69 63 69 74 6c 79 2c  used implicitly,
03d0: 20 74 68 72 6f 75 67 68 0a 2f 2f 2f 20 5b 60 73   through./// [`s
03e0: 74 72 60 5d 27 73 20 5b 60 70 61 72 73 65 60 5d  tr`]'s [`parse`]
03f0: 20 6d 65 74 68 6f 64 2e 20 53 65 65 20 5b 60 70   method. See [`p
0400: 61 72 73 65 60 5d 27 73 20 64 6f 63 75 6d 65 6e  arse`]'s documen
0410: 74 61 74 69 6f 6e 20 66 6f 72 20 65 78 61 6d 70  tation for examp
0420: 6c 65 73 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 66  les..///./// [`f
0430: 72 6f 6d 5f 73 74 72 60 5d 3a 20 23 74 79 6d 65  rom_str`]: #tyme
0440: 74 68 6f 64 2e 66 72 6f 6d 5f 73 74 72 0a 2f 2f  thod.from_str.//
0450: 2f 20 5b 60 73 74 72 60 5d 3a 20 2e 2e 2f 2e 2e  / [`str`]: ../..
0460: 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73  /std/primitive.s
0470: 74 72 2e 68 74 6d 6c 0a 2f 2f 2f 20 5b 60 70 61  tr.html./// [`pa
0480: 72 73 65 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64  rse`]: ../../std
0490: 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68  /primitive.str.h
04a0: 74 6d 6c 23 6d 65 74 68 6f 64 2e 70 61 72 73 65  tml#method.parse
04b0: 0a 2f 2f 2f 0a 2f 2f 2f 20 23 20 45 78 61 6d 70  .///./// # Examp
04c0: 6c 65 73 0a 2f 2f 2f 0a 2f 2f 2f 20 42 61 73 69  les.///./// Basi
04d0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
04e0: 20 6f 66 20 60 46 72 6f 6d 53 74 72 60 20 6f 6e   of `FromStr` on
04f0: 20 61 6e 20 65 78 61 6d 70 6c 65 20 60 50 6f 69   an example `Poi
0500: 6e 74 60 20 74 79 70 65 3a 0a 2f 2f 2f 0a 2f 2f  nt` type:.///.//
0510: 2f 20 60 60 60 0a 2f 2f 2f 20 75 73 65 20 73 74  / ```./// use st
0520: 64 3a 3a 73 74 72 3a 3a 46 72 6f 6d 53 74 72 3b  d::str::FromStr;
0530: 0a 2f 2f 2f 20 75 73 65 20 73 74 64 3a 3a 6e 75  ./// use std::nu
0540: 6d 3a 3a 50 61 72 73 65 49 6e 74 45 72 72 6f 72  m::ParseIntError
0550: 3b 0a 2f 2f 2f 0a 2f 2f 2f 20 23 5b 64 65 72 69  ;.///./// #[deri
0560: 76 65 28 44 65 62 75 67 2c 20 50 61 72 74 69 61  ve(Debug, Partia
0570: 6c 45 71 29 5d 0a 2f 2f 2f 20 73 74 72 75 63 74  lEq)]./// struct
0580: 20 50 6f 69 6e 74 20 7b 0a 2f 2f 2f 20 20 20 20   Point {.///    
0590: 20 78 3a 20 69 33 32 2c 0a 2f 2f 2f 20 20 20 20   x: i32,.///    
05a0: 20 79 3a 20 69 33 32 0a 2f 2f 2f 20 7d 0a 2f 2f   y: i32./// }.//
05b0: 2f 0a 2f 2f 2f 20 69 6d 70 6c 20 46 72 6f 6d 53  /./// impl FromS
05c0: 74 72 20 66 6f 72 20 50 6f 69 6e 74 20 7b 0a 2f  tr for Point {./
05d0: 2f 2f 20 20 20 20 20 74 79 70 65 20 45 72 72 20  //     type Err 
05e0: 3d 20 50 61 72 73 65 49 6e 74 45 72 72 6f 72 3b  = ParseIntError;
05f0: 0a 2f 2f 2f 0a 2f 2f 2f 20 20 20 20 20 66 6e 20  .///.///     fn 
0600: 66 72 6f 6d 5f 73 74 72 28 73 3a 20 26 73 74 72  from_str(s: &str
0610: 29 20 2d 3e 20 52 65 73 75 6c 74 3c 53 65 6c 66  ) -> Result<Self
0620: 2c 20 53 65 6c 66 3a 3a 45 72 72 3e 20 7b 0a 2f  , Self::Err> {./
0630: 2f 2f 20 20 20 20 20 20 20 20 20 6c 65 74 20 63  //         let c
0640: 6f 6f 72 64 73 3a 20 56 65 63 3c 26 73 74 72 3e  oords: Vec<&str>
0650: 20 3d 20 73 2e 74 72 69 6d 5f 6d 61 74 63 68 65   = s.trim_matche
0660: 73 28 7c 70 7c 20 70 20 3d 3d 20 27 28 27 20 7c  s(|p| p == '(' |
0670: 7c 20 70 20 3d 3d 20 27 29 27 20 29 0a 2f 2f 2f  | p == ')' ).///
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 20 20 2e 73 70 6c 69 74 28 22 2c 22 29 0a 2f 2f    .split(",").//
06b0: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 2f     .collect();./
06e0: 2f 2f 0a 2f 2f 2f 20 20 20 20 20 20 20 20 20 6c  //.///         l
06f0: 65 74 20 78 5f 66 72 6f 6d 73 74 72 20 3d 20 63  et x_fromstr = c
0700: 6f 6f 72 64 73 5b 30 5d 2e 70 61 72 73 65 3a 3a  oords[0].parse::
0710: 3c 69 33 32 3e 28 29 3f 3b 0a 2f 2f 2f 20 20 20  <i32>()?;.///   
0720: 20 20 20 20 20 20 6c 65 74 20 79 5f 66 72 6f 6d        let y_from
0730: 73 74 72 20 3d 20 63 6f 6f 72 64 73 5b 31 5d 2e  str = coords[1].
0740: 70 61 72 73 65 3a 3a 3c 69 33 32 3e 28 29 3f 3b  parse::<i32>()?;
0750: 0a 2f 2f 2f 0a 2f 2f 2f 20 20 20 20 20 20 20 20  .///.///        
0760: 20 4f 6b 28 50 6f 69 6e 74 20 7b 20 78 3a 20 78   Ok(Point { x: x
0770: 5f 66 72 6f 6d 73 74 72 2c 20 79 3a 20 79 5f 66  _fromstr, y: y_f
0780: 72 6f 6d 73 74 72 20 7d 29 0a 2f 2f 2f 20 20 20  romstr }).///   
0790: 20 20 7d 0a 2f 2f 2f 20 7d 0a 2f 2f 2f 0a 2f 2f    }./// }.///.//
07a0: 2f 20 6c 65 74 20 70 20 3d 20 50 6f 69 6e 74 3a  / let p = Point:
07b0: 3a 66 72 6f 6d 5f 73 74 72 28 22 28 31 2c 32 29  :from_str("(1,2)
07c0: 22 29 3b 0a 2f 2f 2f 20 61 73 73 65 72 74 5f 65  ");./// assert_e
07d0: 71 21 28 70 2e 75 6e 77 72 61 70 28 29 2c 20 50  q!(p.unwrap(), P
07e0: 6f 69 6e 74 7b 20 78 3a 20 31 2c 20 79 3a 20 32  oint{ x: 1, y: 2
07f0: 7d 20 29 0a 2f 2f 2f 20 60 60 60 0a 23 5b 73 74  } )./// ```.#[st
0800: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
0810: 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20  rust1", since = 
0820: 22 31 2e 30 2e 30 22 29 5d 0a 70 75 62 20 74 72  "1.0.0")].pub tr
0830: 61 69 74 20 46 72 6f 6d 53 74 72 3a 20 53 69 7a  ait FromStr: Siz
0840: 65 64 20 7b 0a 20 20 20 20 2f 2f 2f 20 54 68 65  ed {.    /// The
0850: 20 61 73 73 6f 63 69 61 74 65 64 20 65 72 72 6f   associated erro
0860: 72 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72  r which can be r
0870: 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 70 61 72  eturned from par
0880: 73 69 6e 67 2e 0a 20 20 20 20 23 5b 73 74 61 62  sing..    #[stab
0890: 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 72 75  le(feature = "ru
08a0: 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  st1", since = "1
08b0: 2e 30 2e 30 22 29 5d 0a 20 20 20 20 74 79 70 65  .0.0")].    type
08c0: 20 45 72 72 3b 0a 0a 20 20 20 20 2f 2f 2f 20 50   Err;..    /// P
08d0: 61 72 73 65 73 20 61 20 73 74 72 69 6e 67 20 60  arses a string `
08e0: 73 60 20 74 6f 20 72 65 74 75 72 6e 20 61 20 76  s` to return a v
08f0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 74 79 70  alue of this typ
0900: 65 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  e..    ///.    /
0910: 2f 2f 20 49 66 20 70 61 72 73 69 6e 67 20 73 75  // If parsing su
0920: 63 63 65 65 64 73 2c 20 72 65 74 75 72 6e 20 74  cceeds, return t
0930: 68 65 20 76 61 6c 75 65 20 69 6e 73 69 64 65 20  he value inside 
0940: 60 4f 6b 60 2c 20 6f 74 68 65 72 77 69 73 65 0a  `Ok`, otherwise.
0950: 20 20 20 20 2f 2f 2f 20 77 68 65 6e 20 74 68 65      /// when the
0960: 20 73 74 72 69 6e 67 20 69 73 20 69 6c 6c 2d 66   string is ill-f
0970: 6f 72 6d 61 74 74 65 64 20 72 65 74 75 72 6e 20  ormatted return 
0980: 61 6e 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  an error specifi
0990: 63 20 74 6f 20 74 68 65 0a 20 20 20 20 2f 2f 2f  c to the.    ///
09a0: 20 69 6e 73 69 64 65 20 60 45 72 72 60 2e 20 54   inside `Err`. T
09b0: 68 65 20 65 72 72 6f 72 20 74 79 70 65 20 69 73  he error type is
09c0: 20 73 70 65 63 69 66 69 63 20 74 6f 20 69 6d 70   specific to imp
09d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
09e0: 68 65 20 74 72 61 69 74 2e 0a 20 20 20 20 2f 2f  he trait..    //
09f0: 2f 0a 20 20 20 20 2f 2f 2f 20 23 20 45 78 61 6d  /.    /// # Exam
0a00: 70 6c 65 73 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  ples.    ///.   
0a10: 20 2f 2f 2f 20 42 61 73 69 63 20 75 73 61 67 65   /// Basic usage
0a20: 20 77 69 74 68 20 5b 60 69 33 32 60 5d 5b 69 74   with [`i32`][it
0a30: 68 69 72 74 79 74 77 6f 5d 2c 20 61 20 74 79 70  hirtytwo], a typ
0a40: 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  e that implement
0a50: 73 20 60 46 72 6f 6d 53 74 72 60 3a 0a 20 20 20  s `FromStr`:.   
0a60: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 5b 69 74   ///.    /// [it
0a70: 68 69 72 74 79 74 77 6f 5d 3a 20 2e 2e 2f 2e 2e  hirtytwo]: ../..
0a80: 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 69  /std/primitive.i
0a90: 33 32 2e 68 74 6d 6c 0a 20 20 20 20 2f 2f 2f 0a  32.html.    ///.
0aa0: 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20 20 20 20      /// ```.    
0ab0: 2f 2f 2f 20 75 73 65 20 73 74 64 3a 3a 73 74 72  /// use std::str
0ac0: 3a 3a 46 72 6f 6d 53 74 72 3b 0a 20 20 20 20 2f  ::FromStr;.    /
0ad0: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 6c 65 74 20 73  //.    /// let s
0ae0: 20 3d 20 22 35 22 3b 0a 20 20 20 20 2f 2f 2f 20   = "5";.    /// 
0af0: 6c 65 74 20 78 20 3d 20 69 33 32 3a 3a 66 72 6f  let x = i32::fro
0b00: 6d 5f 73 74 72 28 73 29 2e 75 6e 77 72 61 70 28  m_str(s).unwrap(
0b10: 29 3b 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  );.    ///.    /
0b20: 2f 2f 20 61 73 73 65 72 74 5f 65 71 21 28 35 2c  // assert_eq!(5,
0b30: 20 78 29 3b 0a 20 20 20 20 2f 2f 2f 20 60 60 60   x);.    /// ```
0b40: 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65  .    #[stable(fe
0b50: 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c  ature = "rust1",
0b60: 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22   since = "1.0.0"
0b70: 29 5d 0a 20 20 20 20 66 6e 20 66 72 6f 6d 5f 73  )].    fn from_s
0b80: 74 72 28 73 3a 20 26 73 74 72 29 20 2d 3e 20 52  tr(s: &str) -> R
0b90: 65 73 75 6c 74 3c 53 65 6c 66 2c 20 53 65 6c 66  esult<Self, Self
0ba0: 3a 3a 45 72 72 3e 3b 0a 7d 0a 0a 23 5b 73 74 61  ::Err>;.}..#[sta
0bb0: 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 72  ble(feature = "r
0bc0: 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22  ust1", since = "
0bd0: 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c 20 46 72  1.0.0")].impl Fr
0be0: 6f 6d 53 74 72 20 66 6f 72 20 62 6f 6f 6c 20 7b  omStr for bool {
0bf0: 0a 20 20 20 20 74 79 70 65 20 45 72 72 20 3d 20  .    type Err = 
0c00: 50 61 72 73 65 42 6f 6f 6c 45 72 72 6f 72 3b 0a  ParseBoolError;.
0c10: 0a 20 20 20 20 2f 2f 2f 20 50 61 72 73 65 20 61  .    /// Parse a
0c20: 20 60 62 6f 6f 6c 60 20 66 72 6f 6d 20 61 20 73   `bool` from a s
0c30: 74 72 69 6e 67 2e 0a 20 20 20 20 2f 2f 2f 0a 20  tring..    ///. 
0c40: 20 20 20 2f 2f 2f 20 59 69 65 6c 64 73 20 61 20     /// Yields a 
0c50: 60 52 65 73 75 6c 74 3c 62 6f 6f 6c 2c 20 50 61  `Result<bool, Pa
0c60: 72 73 65 42 6f 6f 6c 45 72 72 6f 72 3e 60 2c 20  rseBoolError>`, 
0c70: 62 65 63 61 75 73 65 20 60 73 60 20 6d 61 79 20  because `s` may 
0c80: 6f 72 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 2f  or may not.    /
0c90: 2f 2f 20 61 63 74 75 61 6c 6c 79 20 62 65 20 70  // actually be p
0ca0: 61 72 73 65 61 62 6c 65 2e 0a 20 20 20 20 2f 2f  arseable..    //
0cb0: 2f 0a 20 20 20 20 2f 2f 2f 20 23 20 45 78 61 6d  /.    /// # Exam
0cc0: 70 6c 65 73 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  ples.    ///.   
0cd0: 20 2f 2f 2f 20 60 60 60 0a 20 20 20 20 2f 2f 2f   /// ```.    ///
0ce0: 20 75 73 65 20 73 74 64 3a 3a 73 74 72 3a 3a 46   use std::str::F
0cf0: 72 6f 6d 53 74 72 3b 0a 20 20 20 20 2f 2f 2f 0a  romStr;.    ///.
0d00: 20 20 20 20 2f 2f 2f 20 61 73 73 65 72 74 5f 65      /// assert_e
0d10: 71 21 28 46 72 6f 6d 53 74 72 3a 3a 66 72 6f 6d  q!(FromStr::from
0d20: 5f 73 74 72 28 22 74 72 75 65 22 29 2c 20 4f 6b  _str("true"), Ok
0d30: 28 74 72 75 65 29 29 3b 0a 20 20 20 20 2f 2f 2f  (true));.    ///
0d40: 20 61 73 73 65 72 74 5f 65 71 21 28 46 72 6f 6d   assert_eq!(From
0d50: 53 74 72 3a 3a 66 72 6f 6d 5f 73 74 72 28 22 66  Str::from_str("f
0d60: 61 6c 73 65 22 29 2c 20 4f 6b 28 66 61 6c 73 65  alse"), Ok(false
0d70: 29 29 3b 0a 20 20 20 20 2f 2f 2f 20 61 73 73 65  ));.    /// asse
0d80: 72 74 21 28 3c 62 6f 6f 6c 20 61 73 20 46 72 6f  rt!(<bool as Fro
0d90: 6d 53 74 72 3e 3a 3a 66 72 6f 6d 5f 73 74 72 28  mStr>::from_str(
0da0: 22 6e 6f 74 20 65 76 65 6e 20 61 20 62 6f 6f 6c  "not even a bool
0db0: 65 61 6e 22 29 2e 69 73 5f 65 72 72 28 29 29 3b  ean").is_err());
0dc0: 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20 20 20  .    /// ```.   
0dd0: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 4e 6f 74   ///.    /// Not
0de0: 65 2c 20 69 6e 20 6d 61 6e 79 20 63 61 73 65 73  e, in many cases
0df0: 2c 20 74 68 65 20 60 2e 70 61 72 73 65 28 29 60  , the `.parse()`
0e00: 20 6d 65 74 68 6f 64 20 6f 6e 20 60 73 74 72 60   method on `str`
0e10: 20 69 73 20 6d 6f 72 65 20 70 72 6f 70 65 72 2e   is more proper.
0e20: 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f  .    ///.    ///
0e30: 20 60 60 60 0a 20 20 20 20 2f 2f 2f 20 61 73 73   ```.    /// ass
0e40: 65 72 74 5f 65 71 21 28 22 74 72 75 65 22 2e 70  ert_eq!("true".p
0e50: 61 72 73 65 28 29 2c 20 4f 6b 28 74 72 75 65 29  arse(), Ok(true)
0e60: 29 3b 0a 20 20 20 20 2f 2f 2f 20 61 73 73 65 72  );.    /// asser
0e70: 74 5f 65 71 21 28 22 66 61 6c 73 65 22 2e 70 61  t_eq!("false".pa
0e80: 72 73 65 28 29 2c 20 4f 6b 28 66 61 6c 73 65 29  rse(), Ok(false)
0e90: 29 3b 0a 20 20 20 20 2f 2f 2f 20 61 73 73 65 72  );.    /// asser
0ea0: 74 21 28 22 6e 6f 74 20 65 76 65 6e 20 61 20 62  t!("not even a b
0eb0: 6f 6f 6c 65 61 6e 22 2e 70 61 72 73 65 3a 3a 3c  oolean".parse::<
0ec0: 62 6f 6f 6c 3e 28 29 2e 69 73 5f 65 72 72 28 29  bool>().is_err()
0ed0: 29 3b 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20  );.    /// ```. 
0ee0: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
0ef0: 20 66 6e 20 66 72 6f 6d 5f 73 74 72 28 73 3a 20   fn from_str(s: 
0f00: 26 73 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c  &str) -> Result<
0f10: 62 6f 6f 6c 2c 20 50 61 72 73 65 42 6f 6f 6c 45  bool, ParseBoolE
0f20: 72 72 6f 72 3e 20 7b 0a 20 20 20 20 20 20 20 20  rror> {.        
0f30: 6d 61 74 63 68 20 73 20 7b 0a 20 20 20 20 20 20  match s {.      
0f40: 20 20 20 20 20 20 22 74 72 75 65 22 20 20 3d 3e        "true"  =>
0f50: 20 4f 6b 28 74 72 75 65 29 2c 0a 20 20 20 20 20   Ok(true),.     
0f60: 20 20 20 20 20 20 20 22 66 61 6c 73 65 22 20 3d         "false" =
0f70: 3e 20 4f 6b 28 66 61 6c 73 65 29 2c 0a 20 20 20  > Ok(false),.   
0f80: 20 20 20 20 20 20 20 20 20 5f 20 20 20 20 20 20           _      
0f90: 20 3d 3e 20 45 72 72 28 50 61 72 73 65 42 6f 6f   => Err(ParseBoo
0fa0: 6c 45 72 72 6f 72 20 7b 20 5f 70 72 69 76 3a 20  lError { _priv: 
0fb0: 28 29 20 7d 29 2c 0a 20 20 20 20 20 20 20 20 7d  () }),.        }
0fc0: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 41 6e  .    }.}../// An
0fd0: 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   error returned 
0fe0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 60  when parsing a `
0ff0: 62 6f 6f 6c 60 20 75 73 69 6e 67 20 5b 60 66 72  bool` using [`fr
1000: 6f 6d 5f 73 74 72 60 5d 20 66 61 69 6c 73 0a 2f  om_str`] fails./
1010: 2f 2f 0a 2f 2f 2f 20 5b 60 66 72 6f 6d 5f 73 74  //./// [`from_st
1020: 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70  r`]: ../../std/p
1030: 72 69 6d 69 74 69 76 65 2e 62 6f 6f 6c 2e 68 74  rimitive.bool.ht
1040: 6d 6c 23 6d 65 74 68 6f 64 2e 66 72 6f 6d 5f 73  ml#method.from_s
1050: 74 72 0a 23 5b 64 65 72 69 76 65 28 44 65 62 75  tr.#[derive(Debu
1060: 67 2c 20 43 6c 6f 6e 65 2c 20 50 61 72 74 69 61  g, Clone, Partia
1070: 6c 45 71 2c 20 45 71 29 5d 0a 23 5b 73 74 61 62  lEq, Eq)].#[stab
1080: 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 72 75  le(feature = "ru
1090: 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  st1", since = "1
10a0: 2e 30 2e 30 22 29 5d 0a 70 75 62 20 73 74 72 75  .0.0")].pub stru
10b0: 63 74 20 50 61 72 73 65 42 6f 6f 6c 45 72 72 6f  ct ParseBoolErro
10c0: 72 20 7b 20 5f 70 72 69 76 3a 20 28 29 20 7d 0a  r { _priv: () }.
10d0: 0a 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72  .#[stable(featur
10e0: 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e  e = "rust1", sin
10f0: 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 69  ce = "1.0.0")].i
1100: 6d 70 6c 20 66 6d 74 3a 3a 44 69 73 70 6c 61 79  mpl fmt::Display
1110: 20 66 6f 72 20 50 61 72 73 65 42 6f 6f 6c 45 72   for ParseBoolEr
1120: 72 6f 72 20 7b 0a 20 20 20 20 66 6e 20 66 6d 74  ror {.    fn fmt
1130: 28 26 73 65 6c 66 2c 20 66 3a 20 26 6d 75 74 20  (&self, f: &mut 
1140: 66 6d 74 3a 3a 46 6f 72 6d 61 74 74 65 72 29 20  fmt::Formatter) 
1150: 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b  -> fmt::Result {
1160: 0a 20 20 20 20 20 20 20 20 22 70 72 6f 76 69 64  .        "provid
1170: 65 64 20 73 74 72 69 6e 67 20 77 61 73 20 6e 6f  ed string was no
1180: 74 20 60 74 72 75 65 60 20 6f 72 20 60 66 61 6c  t `true` or `fal
1190: 73 65 60 22 2e 66 6d 74 28 66 29 0a 20 20 20 20  se`".fmt(f).    
11a0: 7d 0a 7d 0a 0a 2f 2a 0a 53 65 63 74 69 6f 6e 3a  }.}../*.Section:
11b0: 20 43 72 65 61 74 69 6e 67 20 61 20 73 74 72 69   Creating a stri
11c0: 6e 67 0a 2a 2f 0a 0a 2f 2f 2f 20 45 72 72 6f 72  ng.*/../// Error
11d0: 73 20 77 68 69 63 68 20 63 61 6e 20 6f 63 63 75  s which can occu
11e0: 72 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e  r when attemptin
11f0: 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61  g to interpret a
1200: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 5b 60 75   sequence of [`u
1210: 38 60 5d 0a 2f 2f 2f 20 61 73 20 61 20 73 74 72  8`]./// as a str
1220: 69 6e 67 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 75  ing..///./// [`u
1230: 38 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70  8`]: ../../std/p
1240: 72 69 6d 69 74 69 76 65 2e 75 38 2e 68 74 6d 6c  rimitive.u8.html
1250: 0a 2f 2f 2f 0a 2f 2f 2f 20 41 73 20 73 75 63 68  .///./// As such
1260: 2c 20 74 68 65 20 60 66 72 6f 6d 5f 75 74 66 38  , the `from_utf8
1270: 60 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63  ` family of func
1280: 74 69 6f 6e 73 20 61 6e 64 20 6d 65 74 68 6f 64  tions and method
1290: 73 20 66 6f 72 20 62 6f 74 68 20 5b 60 53 74 72  s for both [`Str
12a0: 69 6e 67 60 5d 73 0a 2f 2f 2f 20 61 6e 64 20 5b  ing`]s./// and [
12b0: 60 26 73 74 72 60 5d 73 20 6d 61 6b 65 20 75 73  `&str`]s make us
12c0: 65 20 6f 66 20 74 68 69 73 20 65 72 72 6f 72 2c  e of this error,
12d0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 2f 2f   for example..//
12e0: 2f 0a 2f 2f 2f 20 5b 60 53 74 72 69 6e 67 60 5d  /./// [`String`]
12f0: 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 73 74 72 69  : ../../std/stri
1300: 6e 67 2f 73 74 72 75 63 74 2e 53 74 72 69 6e 67  ng/struct.String
1310: 2e 68 74 6d 6c 23 6d 65 74 68 6f 64 2e 66 72 6f  .html#method.fro
1320: 6d 5f 75 74 66 38 0a 2f 2f 2f 20 5b 60 26 73 74  m_utf8./// [`&st
1330: 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 73  r`]: ../../std/s
1340: 74 72 2f 66 6e 2e 66 72 6f 6d 5f 75 74 66 38 2e  tr/fn.from_utf8.
1350: 68 74 6d 6c 0a 23 5b 64 65 72 69 76 65 28 43 6f  html.#[derive(Co
1360: 70 79 2c 20 45 71 2c 20 50 61 72 74 69 61 6c 45  py, Eq, PartialE
1370: 71 2c 20 43 6c 6f 6e 65 2c 20 44 65 62 75 67 29  q, Clone, Debug)
1380: 5d 0a 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75  ].#[stable(featu
1390: 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69  re = "rust1", si
13a0: 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a  nce = "1.0.0")].
13b0: 70 75 62 20 73 74 72 75 63 74 20 55 74 66 38 45  pub struct Utf8E
13c0: 72 72 6f 72 20 7b 0a 20 20 20 20 76 61 6c 69 64  rror {.    valid
13d0: 5f 75 70 5f 74 6f 3a 20 75 73 69 7a 65 2c 0a 20  _up_to: usize,. 
13e0: 20 20 20 65 72 72 6f 72 5f 6c 65 6e 3a 20 4f 70     error_len: Op
13f0: 74 69 6f 6e 3c 75 38 3e 2c 0a 7d 0a 0a 69 6d 70  tion<u8>,.}..imp
1400: 6c 20 55 74 66 38 45 72 72 6f 72 20 7b 0a 20 20  l Utf8Error {.  
1410: 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68    /// Returns th
1420: 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 67  e index in the g
1430: 69 76 65 6e 20 73 74 72 69 6e 67 20 75 70 20 74  iven string up t
1440: 6f 20 77 68 69 63 68 20 76 61 6c 69 64 20 55 54  o which valid UT
1450: 46 2d 38 20 77 61 73 0a 20 20 20 20 2f 2f 2f 20  F-8 was.    /// 
1460: 76 65 72 69 66 69 65 64 2e 0a 20 20 20 20 2f 2f  verified..    //
1470: 2f 0a 20 20 20 20 2f 2f 2f 20 49 74 20 69 73 20  /.    /// It is 
1480: 74 68 65 20 6d 61 78 69 6d 75 6d 20 69 6e 64 65  the maximum inde
1490: 78 20 73 75 63 68 20 74 68 61 74 20 60 66 72 6f  x such that `fro
14a0: 6d 5f 75 74 66 38 28 26 69 6e 70 75 74 5b 2e 2e  m_utf8(&input[..
14b0: 69 6e 64 65 78 5d 29 60 0a 20 20 20 20 2f 2f 2f  index])`.    ///
14c0: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 60 4f   would return `O
14d0: 6b 28 5f 29 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20  k(_)`..    ///. 
14e0: 20 20 20 2f 2f 2f 20 23 20 45 78 61 6d 70 6c 65     /// # Example
14f0: 73 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  s.    ///.    //
1500: 2f 20 42 61 73 69 63 20 75 73 61 67 65 3a 0a 20  / Basic usage:. 
1510: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 60     ///.    /// `
1520: 60 60 0a 20 20 20 20 2f 2f 2f 20 75 73 65 20 73  ``.    /// use s
1530: 74 64 3a 3a 73 74 72 3b 0a 20 20 20 20 2f 2f 2f  td::str;.    ///
1540: 0a 20 20 20 20 2f 2f 2f 20 2f 2f 20 73 6f 6d 65  .    /// // some
1550: 20 69 6e 76 61 6c 69 64 20 62 79 74 65 73 2c 20   invalid bytes, 
1560: 69 6e 20 61 20 76 65 63 74 6f 72 0a 20 20 20 20  in a vector.    
1570: 2f 2f 2f 20 6c 65 74 20 73 70 61 72 6b 6c 65 5f  /// let sparkle_
1580: 68 65 61 72 74 20 3d 20 76 65 63 21 5b 30 2c 20  heart = vec![0, 
1590: 31 35 39 2c 20 31 34 36 2c 20 31 35 30 5d 3b 0a  159, 146, 150];.
15a0: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
15b0: 2f 2f 20 73 74 64 3a 3a 73 74 72 3a 3a 66 72 6f  // std::str::fro
15c0: 6d 5f 75 74 66 38 20 72 65 74 75 72 6e 73 20 61  m_utf8 returns a
15d0: 20 55 74 66 38 45 72 72 6f 72 0a 20 20 20 20 2f   Utf8Error.    /
15e0: 2f 2f 20 6c 65 74 20 65 72 72 6f 72 20 3d 20 73  // let error = s
15f0: 74 72 3a 3a 66 72 6f 6d 5f 75 74 66 38 28 26 73  tr::from_utf8(&s
1600: 70 61 72 6b 6c 65 5f 68 65 61 72 74 29 2e 75 6e  parkle_heart).un
1610: 77 72 61 70 5f 65 72 72 28 29 3b 0a 20 20 20 20  wrap_err();.    
1620: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 2f 2f 20 74  ///.    /// // t
1630: 68 65 20 73 65 63 6f 6e 64 20 62 79 74 65 20 69  he second byte i
1640: 73 20 69 6e 76 61 6c 69 64 20 68 65 72 65 0a 20  s invalid here. 
1650: 20 20 20 2f 2f 2f 20 61 73 73 65 72 74 5f 65 71     /// assert_eq
1660: 21 28 31 2c 20 65 72 72 6f 72 2e 76 61 6c 69 64  !(1, error.valid
1670: 5f 75 70 5f 74 6f 28 29 29 3b 0a 20 20 20 20 2f  _up_to());.    /
1680: 2f 2f 20 60 60 60 0a 20 20 20 20 23 5b 73 74 61  // ```.    #[sta
1690: 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 75  ble(feature = "u
16a0: 74 66 38 5f 65 72 72 6f 72 22 2c 20 73 69 6e 63  tf8_error", sinc
16b0: 65 20 3d 20 22 31 2e 35 2e 30 22 29 5d 0a 20 20  e = "1.5.0")].  
16c0: 20 20 70 75 62 20 66 6e 20 76 61 6c 69 64 5f 75    pub fn valid_u
16d0: 70 5f 74 6f 28 26 73 65 6c 66 29 20 2d 3e 20 75  p_to(&self) -> u
16e0: 73 69 7a 65 20 7b 20 73 65 6c 66 2e 76 61 6c 69  size { self.vali
16f0: 64 5f 75 70 5f 74 6f 20 7d 0a 0a 20 20 20 20 2f  d_up_to }..    /
1700: 2f 2f 20 50 72 6f 76 69 64 65 20 6d 6f 72 65 20  // Provide more 
1710: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1720: 74 20 74 68 65 20 66 61 69 6c 75 72 65 3a 0a 20  t the failure:. 
1730: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 2a     ///.    /// *
1740: 20 60 4e 6f 6e 65 60 3a 20 74 68 65 20 65 6e 64   `None`: the end
1750: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 77 61   of the input wa
1760: 73 20 72 65 61 63 68 65 64 20 75 6e 65 78 70 65  s reached unexpe
1770: 63 74 65 64 6c 79 2e 0a 20 20 20 20 2f 2f 2f 20  ctedly..    /// 
1780: 20 20 60 73 65 6c 66 2e 76 61 6c 69 64 5f 75 70    `self.valid_up
1790: 5f 74 6f 28 29 60 20 69 73 20 31 20 74 6f 20 33  _to()` is 1 to 3
17a0: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
17b0: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74  end of the input
17c0: 2e 0a 20 20 20 20 2f 2f 2f 20 20 20 49 66 20 61  ..    ///   If a
17d0: 20 62 79 74 65 20 73 74 72 65 61 6d 20 28 73 75   byte stream (su
17e0: 63 68 20 61 73 20 61 20 66 69 6c 65 20 6f 72 20  ch as a file or 
17f0: 61 20 6e 65 74 77 6f 72 6b 20 73 6f 63 6b 65 74  a network socket
1800: 29 20 69 73 20 62 65 69 6e 67 20 64 65 63 6f 64  ) is being decod
1810: 65 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  ed incrementally
1820: 2c 0a 20 20 20 20 2f 2f 2f 20 20 20 74 68 69 73  ,.    ///   this
1830: 20 63 6f 75 6c 64 20 62 65 20 61 20 76 61 6c 69   could be a vali
1840: 64 20 60 63 68 61 72 60 20 77 68 6f 73 65 20 55  d `char` whose U
1850: 54 46 2d 38 20 62 79 74 65 20 73 65 71 75 65 6e  TF-8 byte sequen
1860: 63 65 20 69 73 20 73 70 61 6e 6e 69 6e 67 20 6d  ce is spanning m
1870: 75 6c 74 69 70 6c 65 20 63 68 75 6e 6b 73 2e 0a  ultiple chunks..
1880: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
1890: 2a 20 60 53 6f 6d 65 28 6c 65 6e 29 60 3a 20 61  * `Some(len)`: a
18a0: 6e 20 75 6e 65 78 70 65 63 74 65 64 20 62 79 74  n unexpected byt
18b0: 65 20 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65  e was encountere
18c0: 64 2e 0a 20 20 20 20 2f 2f 2f 20 20 20 54 68 65  d..    ///   The
18d0: 20 6c 65 6e 67 74 68 20 70 72 6f 76 69 64 65 64   length provided
18e0: 20 69 73 20 74 68 61 74 20 6f 66 20 74 68 65 20   is that of the 
18f0: 69 6e 76 61 6c 69 64 20 62 79 74 65 20 73 65 71  invalid byte seq
1900: 75 65 6e 63 65 0a 20 20 20 20 2f 2f 2f 20 20 20  uence.    ///   
1910: 74 68 61 74 20 73 74 61 72 74 73 20 61 74 20 74  that starts at t
1920: 68 65 20 69 6e 64 65 78 20 67 69 76 65 6e 20 62  he index given b
1930: 79 20 60 76 61 6c 69 64 5f 75 70 5f 74 6f 28 29  y `valid_up_to()
1940: 60 2e 0a 20 20 20 20 2f 2f 2f 20 20 20 44 65 63  `..    ///   Dec
1950: 6f 64 69 6e 67 20 73 68 6f 75 6c 64 20 72 65 73  oding should res
1960: 75 6d 65 20 61 66 74 65 72 20 74 68 61 74 20 73  ume after that s
1970: 65 71 75 65 6e 63 65 0a 20 20 20 20 2f 2f 2f 20  equence.    /// 
1980: 20 20 28 61 66 74 65 72 20 69 6e 73 65 72 74 69    (after inserti
1990: 6e 67 20 61 20 55 2b 46 46 46 44 20 52 45 50 4c  ng a U+FFFD REPL
19a0: 41 43 45 4d 45 4e 54 20 43 48 41 52 41 43 54 45  ACEMENT CHARACTE
19b0: 52 29 20 69 6e 20 63 61 73 65 20 6f 66 20 6c 6f  R) in case of lo
19c0: 73 73 79 20 64 65 63 6f 64 69 6e 67 2e 0a 20 20  ssy decoding..  
19d0: 20 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61    #[unstable(fea
19e0: 74 75 72 65 20 3d 20 22 75 74 66 38 5f 65 72 72  ture = "utf8_err
19f0: 6f 72 5f 65 72 72 6f 72 5f 6c 65 6e 22 2c 20 72  or_error_len", r
1a00: 65 61 73 6f 6e 20 3d 22 6e 65 77 22 2c 20 69 73  eason ="new", is
1a10: 73 75 65 20 3d 20 22 34 30 34 39 34 22 29 5d 0a  sue = "40494")].
1a20: 20 20 20 20 70 75 62 20 66 6e 20 65 72 72 6f 72      pub fn error
1a30: 5f 6c 65 6e 28 26 73 65 6c 66 29 20 2d 3e 20 4f  _len(&self) -> O
1a40: 70 74 69 6f 6e 3c 75 73 69 7a 65 3e 20 7b 0a 20  ption<usize> {. 
1a50: 20 20 20 20 20 20 20 73 65 6c 66 2e 65 72 72 6f         self.erro
1a60: 72 5f 6c 65 6e 2e 6d 61 70 28 7c 6c 65 6e 7c 20  r_len.map(|len| 
1a70: 6c 65 6e 20 61 73 20 75 73 69 7a 65 29 0a 20 20  len as usize).  
1a80: 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 43 6f 6e 76 65    }.}../// Conve
1a90: 72 74 73 20 61 20 73 6c 69 63 65 20 6f 66 20 62  rts a slice of b
1aa0: 79 74 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67  ytes to a string
1ab0: 20 73 6c 69 63 65 2e 0a 2f 2f 2f 0a 2f 2f 2f 20   slice..///./// 
1ac0: 41 20 73 74 72 69 6e 67 20 73 6c 69 63 65 20 28  A string slice (
1ad0: 5b 60 26 73 74 72 60 5d 29 20 69 73 20 6d 61 64  [`&str`]) is mad
1ae0: 65 20 6f 66 20 62 79 74 65 73 20 28 5b 60 75 38  e of bytes ([`u8
1af0: 60 5d 29 2c 20 61 6e 64 20 61 20 62 79 74 65 20  `]), and a byte 
1b00: 73 6c 69 63 65 0a 2f 2f 2f 20 28 5b 60 26 5b 75  slice./// ([`&[u
1b10: 38 5d 60 5d 5b 62 79 74 65 73 6c 69 63 65 5d 29  8]`][byteslice])
1b20: 20 69 73 20 6d 61 64 65 20 6f 66 20 62 79 74 65   is made of byte
1b30: 73 2c 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74  s, so this funct
1b40: 69 6f 6e 20 63 6f 6e 76 65 72 74 73 20 62 65 74  ion converts bet
1b50: 77 65 65 6e 0a 2f 2f 2f 20 74 68 65 20 74 77 6f  ween./// the two
1b60: 2e 20 4e 6f 74 20 61 6c 6c 20 62 79 74 65 20 73  . Not all byte s
1b70: 6c 69 63 65 73 20 61 72 65 20 76 61 6c 69 64 20  lices are valid 
1b80: 73 74 72 69 6e 67 20 73 6c 69 63 65 73 2c 20 68  string slices, h
1b90: 6f 77 65 76 65 72 3a 20 5b 60 26 73 74 72 60 5d  owever: [`&str`]
1ba0: 20 72 65 71 75 69 72 65 73 0a 2f 2f 2f 20 74 68   requires./// th
1bb0: 61 74 20 69 74 20 69 73 20 76 61 6c 69 64 20 55  at it is valid U
1bc0: 54 46 2d 38 2e 20 60 66 72 6f 6d 5f 75 74 66 38  TF-8. `from_utf8
1bd0: 28 29 60 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  ()` checks to en
1be0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
1bf0: 74 65 73 20 61 72 65 20 76 61 6c 69 64 0a 2f 2f  tes are valid.//
1c00: 2f 20 55 54 46 2d 38 2c 20 61 6e 64 20 74 68 65  / UTF-8, and the
1c10: 6e 20 64 6f 65 73 20 74 68 65 20 63 6f 6e 76 65  n does the conve
1c20: 72 73 69 6f 6e 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b  rsion..///./// [
1c30: 60 26 73 74 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73  `&str`]: ../../s
1c40: 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72  td/primitive.str
1c50: 2e 68 74 6d 6c 0a 2f 2f 2f 20 5b 60 75 38 60 5d  .html./// [`u8`]
1c60: 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d  : ../../std/prim
1c70: 69 74 69 76 65 2e 75 38 2e 68 74 6d 6c 0a 2f 2f  itive.u8.html.//
1c80: 2f 20 5b 62 79 74 65 73 6c 69 63 65 5d 3a 20 2e  / [byteslice]: .
1c90: 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69  ./../std/primiti
1ca0: 76 65 2e 73 6c 69 63 65 2e 68 74 6d 6c 0a 2f 2f  ve.slice.html.//
1cb0: 2f 0a 2f 2f 2f 20 49 66 20 79 6f 75 20 61 72 65  /./// If you are
1cc0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62   sure that the b
1cd0: 79 74 65 20 73 6c 69 63 65 20 69 73 20 76 61 6c  yte slice is val
1ce0: 69 64 20 55 54 46 2d 38 2c 20 61 6e 64 20 79 6f  id UTF-8, and yo
1cf0: 75 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 0a  u don't want to.
1d00: 2f 2f 2f 20 69 6e 63 75 72 20 74 68 65 20 6f 76  /// incur the ov
1d10: 65 72 68 65 61 64 20 6f 66 20 74 68 65 20 76 61  erhead of the va
1d20: 6c 69 64 69 74 79 20 63 68 65 63 6b 2c 20 74 68  lidity check, th
1d30: 65 72 65 20 69 73 20 61 6e 20 75 6e 73 61 66 65  ere is an unsafe
1d40: 20 76 65 72 73 69 6f 6e 20 6f 66 0a 2f 2f 2f 20   version of./// 
1d50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 5b  this function, [
1d60: 60 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65  `from_utf8_unche
1d70: 63 6b 65 64 60 5d 5b 66 72 6f 6d 75 74 66 38 75  cked`][fromutf8u
1d80: 5d 2c 20 77 68 69 63 68 20 68 61 73 20 74 68 65  ], which has the
1d90: 20 73 61 6d 65 0a 2f 2f 2f 20 62 65 68 61 76 69   same./// behavi
1da0: 6f 72 20 62 75 74 20 73 6b 69 70 73 20 74 68 65  or but skips the
1db0: 20 63 68 65 63 6b 2e 0a 2f 2f 2f 0a 2f 2f 2f 20   check..///./// 
1dc0: 5b 66 72 6f 6d 75 74 66 38 75 5d 3a 20 66 6e 2e  [fromutf8u]: fn.
1dd0: 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65 63  from_utf8_unchec
1de0: 6b 65 64 2e 68 74 6d 6c 0a 2f 2f 2f 0a 2f 2f 2f  ked.html.///.///
1df0: 20 49 66 20 79 6f 75 20 6e 65 65 64 20 61 20 60   If you need a `
1e00: 53 74 72 69 6e 67 60 20 69 6e 73 74 65 61 64 20  String` instead 
1e10: 6f 66 20 61 20 60 26 73 74 72 60 2c 20 63 6f 6e  of a `&str`, con
1e20: 73 69 64 65 72 0a 2f 2f 2f 20 5b 60 53 74 72 69  sider./// [`Stri
1e30: 6e 67 3a 3a 66 72 6f 6d 5f 75 74 66 38 60 5d 5b  ng::from_utf8`][
1e40: 73 74 72 69 6e 67 5d 2e 0a 2f 2f 2f 0a 2f 2f 2f  string]..///.///
1e50: 20 5b 73 74 72 69 6e 67 5d 3a 20 2e 2e 2f 2e 2e   [string]: ../..
1e60: 2f 73 74 64 2f 73 74 72 69 6e 67 2f 73 74 72 75  /std/string/stru
1e70: 63 74 2e 53 74 72 69 6e 67 2e 68 74 6d 6c 23 6d  ct.String.html#m
1e80: 65 74 68 6f 64 2e 66 72 6f 6d 5f 75 74 66 38 0a  ethod.from_utf8.
1e90: 2f 2f 2f 0a 2f 2f 2f 20 42 65 63 61 75 73 65 20  ///./// Because 
1ea0: 79 6f 75 20 63 61 6e 20 73 74 61 63 6b 2d 61 6c  you can stack-al
1eb0: 6c 6f 63 61 74 65 20 61 20 60 5b 75 38 3b 20 4e  locate a `[u8; N
1ec0: 5d 60 2c 20 61 6e 64 20 79 6f 75 20 63 61 6e 20  ]`, and you can 
1ed0: 74 61 6b 65 20 61 0a 2f 2f 2f 20 5b 60 26 5b 75  take a./// [`&[u
1ee0: 38 5d 60 5d 5b 62 79 74 65 73 6c 69 63 65 5d 20  8]`][byteslice] 
1ef0: 6f 66 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  of it, this func
1f00: 74 69 6f 6e 20 69 73 20 6f 6e 65 20 77 61 79 20  tion is one way 
1f10: 74 6f 20 68 61 76 65 20 61 0a 2f 2f 2f 20 73 74  to have a./// st
1f20: 61 63 6b 2d 61 6c 6c 6f 63 61 74 65 64 20 73 74  ack-allocated st
1f30: 72 69 6e 67 2e 20 54 68 65 72 65 20 69 73 20 61  ring. There is a
1f40: 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 74 68 69  n example of thi
1f50: 73 20 69 6e 20 74 68 65 0a 2f 2f 2f 20 65 78 61  s in the./// exa
1f60: 6d 70 6c 65 73 20 73 65 63 74 69 6f 6e 20 62 65  mples section be
1f70: 6c 6f 77 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 62 79  low..///./// [by
1f80: 74 65 73 6c 69 63 65 5d 3a 20 2e 2e 2f 2e 2e 2f  teslice]: ../../
1f90: 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73 6c  std/primitive.sl
1fa0: 69 63 65 2e 68 74 6d 6c 0a 2f 2f 2f 0a 2f 2f 2f  ice.html.///.///
1fb0: 20 23 20 45 72 72 6f 72 73 0a 2f 2f 2f 0a 2f 2f   # Errors.///.//
1fc0: 2f 20 52 65 74 75 72 6e 73 20 60 45 72 72 60 20  / Returns `Err` 
1fd0: 69 66 20 74 68 65 20 73 6c 69 63 65 20 69 73 20  if the slice is 
1fe0: 6e 6f 74 20 55 54 46 2d 38 20 77 69 74 68 20 61  not UTF-8 with a
1ff0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 73 20   description as 
2000: 74 6f 20 77 68 79 20 74 68 65 0a 2f 2f 2f 20 70  to why the./// p
2010: 72 6f 76 69 64 65 64 20 73 6c 69 63 65 20 69 73  rovided slice is
2020: 20 6e 6f 74 20 55 54 46 2d 38 2e 0a 2f 2f 2f 0a   not UTF-8..///.
2030: 2f 2f 2f 20 23 20 45 78 61 6d 70 6c 65 73 0a 2f  /// # Examples./
2040: 2f 2f 0a 2f 2f 2f 20 42 61 73 69 63 20 75 73 61  //./// Basic usa
2050: 67 65 3a 0a 2f 2f 2f 0a 2f 2f 2f 20 60 60 60 0a  ge:.///./// ```.
2060: 2f 2f 2f 20 75 73 65 20 73 74 64 3a 3a 73 74 72  /// use std::str
2070: 3b 0a 2f 2f 2f 0a 2f 2f 2f 20 2f 2f 20 73 6f 6d  ;.///./// // som
2080: 65 20 62 79 74 65 73 2c 20 69 6e 20 61 20 76 65  e bytes, in a ve
2090: 63 74 6f 72 0a 2f 2f 2f 20 6c 65 74 20 73 70 61  ctor./// let spa
20a0: 72 6b 6c 65 5f 68 65 61 72 74 20 3d 20 76 65 63  rkle_heart = vec
20b0: 21 5b 32 34 30 2c 20 31 35 39 2c 20 31 34 36 2c  ![240, 159, 146,
20c0: 20 31 35 30 5d 3b 0a 2f 2f 2f 0a 2f 2f 2f 20 2f   150];.///./// /
20d0: 2f 20 57 65 20 6b 6e 6f 77 20 74 68 65 73 65 20  / We know these 
20e0: 62 79 74 65 73 20 61 72 65 20 76 61 6c 69 64 2c  bytes are valid,
20f0: 20 73 6f 20 6a 75 73 74 20 75 73 65 20 60 75 6e   so just use `un
2100: 77 72 61 70 28 29 60 2e 0a 2f 2f 2f 20 6c 65 74  wrap()`../// let
2110: 20 73 70 61 72 6b 6c 65 5f 68 65 61 72 74 20 3d   sparkle_heart =
2120: 20 73 74 72 3a 3a 66 72 6f 6d 5f 75 74 66 38 28   str::from_utf8(
2130: 26 73 70 61 72 6b 6c 65 5f 68 65 61 72 74 29 2e  &sparkle_heart).
2140: 75 6e 77 72 61 70 28 29 3b 0a 2f 2f 2f 0a 2f 2f  unwrap();.///.//
2150: 2f 20 61 73 73 65 72 74 5f 65 71 21 28 22 f0 9f  / assert_eq!("..
2160: 92 96 22 2c 20 73 70 61 72 6b 6c 65 5f 68 65 61  ..", sparkle_hea
2170: 72 74 29 3b 0a 2f 2f 2f 20 60 60 60 0a 2f 2f 2f  rt);./// ```.///
2180: 0a 2f 2f 2f 20 49 6e 63 6f 72 72 65 63 74 20 62  ./// Incorrect b
2190: 79 74 65 73 3a 0a 2f 2f 2f 0a 2f 2f 2f 20 60 60  ytes:.///./// ``
21a0: 60 0a 2f 2f 2f 20 75 73 65 20 73 74 64 3a 3a 73  `./// use std::s
21b0: 74 72 3b 0a 2f 2f 2f 0a 2f 2f 2f 20 2f 2f 20 73  tr;.///./// // s
21c0: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 62 79 74 65  ome invalid byte
21d0: 73 2c 20 69 6e 20 61 20 76 65 63 74 6f 72 0a 2f  s, in a vector./
21e0: 2f 2f 20 6c 65 74 20 73 70 61 72 6b 6c 65 5f 68  // let sparkle_h
21f0: 65 61 72 74 20 3d 20 76 65 63 21 5b 30 2c 20 31  eart = vec![0, 1
2200: 35 39 2c 20 31 34 36 2c 20 31 35 30 5d 3b 0a 2f  59, 146, 150];./
2210: 2f 2f 0a 2f 2f 2f 20 61 73 73 65 72 74 21 28 73  //./// assert!(s
2220: 74 72 3a 3a 66 72 6f 6d 5f 75 74 66 38 28 26 73  tr::from_utf8(&s
2230: 70 61 72 6b 6c 65 5f 68 65 61 72 74 29 2e 69 73  parkle_heart).is
2240: 5f 65 72 72 28 29 29 3b 0a 2f 2f 2f 20 60 60 60  _err());./// ```
2250: 0a 2f 2f 2f 0a 2f 2f 2f 20 53 65 65 20 74 68 65  .///./// See the
2260: 20 64 6f 63 73 20 66 6f 72 20 5b 60 55 74 66 38   docs for [`Utf8
2270: 45 72 72 6f 72 60 5d 5b 65 72 72 6f 72 5d 20 66  Error`][error] f
2280: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 20  or more details 
2290: 6f 6e 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a  on the kinds of.
22a0: 2f 2f 2f 20 65 72 72 6f 72 73 20 74 68 61 74 20  /// errors that 
22b0: 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e  can be returned.
22c0: 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 65 72 72 6f 72 5d  .///./// [error]
22d0: 3a 20 73 74 72 75 63 74 2e 55 74 66 38 45 72 72  : struct.Utf8Err
22e0: 6f 72 2e 68 74 6d 6c 0a 2f 2f 2f 0a 2f 2f 2f 20  or.html.///./// 
22f0: 41 20 22 73 74 61 63 6b 20 61 6c 6c 6f 63 61 74  A "stack allocat
2300: 65 64 20 73 74 72 69 6e 67 22 3a 0a 2f 2f 2f 0a  ed string":.///.
2310: 2f 2f 2f 20 60 60 60 0a 2f 2f 2f 20 75 73 65 20  /// ```./// use 
2320: 73 74 64 3a 3a 73 74 72 3b 0a 2f 2f 2f 0a 2f 2f  std::str;.///.//
2330: 2f 20 2f 2f 20 73 6f 6d 65 20 62 79 74 65 73 2c  / // some bytes,
2340: 20 69 6e 20 61 20 73 74 61 63 6b 2d 61 6c 6c 6f   in a stack-allo
2350: 63 61 74 65 64 20 61 72 72 61 79 0a 2f 2f 2f 20  cated array./// 
2360: 6c 65 74 20 73 70 61 72 6b 6c 65 5f 68 65 61 72  let sparkle_hear
2370: 74 20 3d 20 5b 32 34 30 2c 20 31 35 39 2c 20 31  t = [240, 159, 1
2380: 34 36 2c 20 31 35 30 5d 3b 0a 2f 2f 2f 0a 2f 2f  46, 150];.///.//
2390: 2f 20 2f 2f 20 57 65 20 6b 6e 6f 77 20 74 68 65  / // We know the
23a0: 73 65 20 62 79 74 65 73 20 61 72 65 20 76 61 6c  se bytes are val
23b0: 69 64 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 20  id, so just use 
23c0: 60 75 6e 77 72 61 70 28 29 60 2e 0a 2f 2f 2f 20  `unwrap()`../// 
23d0: 6c 65 74 20 73 70 61 72 6b 6c 65 5f 68 65 61 72  let sparkle_hear
23e0: 74 20 3d 20 73 74 72 3a 3a 66 72 6f 6d 5f 75 74  t = str::from_ut
23f0: 66 38 28 26 73 70 61 72 6b 6c 65 5f 68 65 61 72  f8(&sparkle_hear
2400: 74 29 2e 75 6e 77 72 61 70 28 29 3b 0a 2f 2f 2f  t).unwrap();.///
2410: 0a 2f 2f 2f 20 61 73 73 65 72 74 5f 65 71 21 28  ./// assert_eq!(
2420: 22 f0 9f 92 96 22 2c 20 73 70 61 72 6b 6c 65 5f  "....", sparkle_
2430: 68 65 61 72 74 29 3b 0a 2f 2f 2f 20 60 60 60 0a  heart);./// ```.
2440: 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
2450: 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63   = "rust1", sinc
2460: 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 70 75  e = "1.0.0")].pu
2470: 62 20 66 6e 20 66 72 6f 6d 5f 75 74 66 38 28 76  b fn from_utf8(v
2480: 3a 20 26 5b 75 38 5d 29 20 2d 3e 20 52 65 73 75  : &[u8]) -> Resu
2490: 6c 74 3c 26 73 74 72 2c 20 55 74 66 38 45 72 72  lt<&str, Utf8Err
24a0: 6f 72 3e 20 7b 0a 20 20 20 20 72 75 6e 5f 75 74  or> {.    run_ut
24b0: 66 38 5f 76 61 6c 69 64 61 74 69 6f 6e 28 76 29  f8_validation(v)
24c0: 3f 3b 0a 20 20 20 20 4f 6b 28 75 6e 73 61 66 65  ?;.    Ok(unsafe
24d0: 20 7b 20 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63   { from_utf8_unc
24e0: 68 65 63 6b 65 64 28 76 29 20 7d 29 0a 7d 0a 0a  hecked(v) }).}..
24f0: 2f 2f 2f 20 43 6f 6e 76 65 72 74 73 20 61 20 6d  /// Converts a m
2500: 75 74 61 62 6c 65 20 73 6c 69 63 65 20 6f 66 20  utable slice of 
2510: 62 79 74 65 73 20 74 6f 20 61 20 6d 75 74 61 62  bytes to a mutab
2520: 6c 65 20 73 74 72 69 6e 67 20 73 6c 69 63 65 2e  le string slice.
2530: 0a 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74  .#[unstable(feat
2540: 75 72 65 20 3d 20 22 73 74 72 5f 6d 75 74 5f 65  ure = "str_mut_e
2550: 78 74 72 61 73 22 2c 20 69 73 73 75 65 20 3d 20  xtras", issue = 
2560: 22 34 31 31 31 39 22 29 5d 0a 70 75 62 20 66 6e  "41119")].pub fn
2570: 20 66 72 6f 6d 5f 75 74 66 38 5f 6d 75 74 28 76   from_utf8_mut(v
2580: 3a 20 26 6d 75 74 20 5b 75 38 5d 29 20 2d 3e 20  : &mut [u8]) -> 
2590: 52 65 73 75 6c 74 3c 26 6d 75 74 20 73 74 72 2c  Result<&mut str,
25a0: 20 55 74 66 38 45 72 72 6f 72 3e 20 7b 0a 20 20   Utf8Error> {.  
25b0: 20 20 72 75 6e 5f 75 74 66 38 5f 76 61 6c 69 64    run_utf8_valid
25c0: 61 74 69 6f 6e 28 76 29 3f 3b 0a 20 20 20 20 4f  ation(v)?;.    O
25d0: 6b 28 75 6e 73 61 66 65 20 7b 20 66 72 6f 6d 5f  k(unsafe { from_
25e0: 75 74 66 38 5f 75 6e 63 68 65 63 6b 65 64 5f 6d  utf8_unchecked_m
25f0: 75 74 28 76 29 20 7d 29 0a 7d 0a 0a 2f 2f 2f 20  ut(v) }).}../// 
2600: 46 6f 72 6d 73 20 61 20 73 74 72 20 66 72 6f 6d  Forms a str from
2610: 20 61 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 61   a pointer and a
2620: 20 6c 65 6e 67 74 68 2e 0a 2f 2f 2f 0a 2f 2f 2f   length..///.///
2630: 20 54 68 65 20 60 6c 65 6e 60 20 61 72 67 75 6d   The `len` argum
2640: 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
2650: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
2660: 65 20 73 74 72 69 6e 67 2e 0a 2f 2f 2f 0a 2f 2f  e string..///.//
2670: 2f 20 23 20 53 61 66 65 74 79 0a 2f 2f 2f 0a 2f  / # Safety.///./
2680: 2f 2f 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  // This function
2690: 20 69 73 20 75 6e 73 61 66 65 20 61 73 20 74 68   is unsafe as th
26a0: 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
26b0: 74 65 65 20 74 68 61 74 20 74 68 65 20 67 69 76  tee that the giv
26c0: 65 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 2f 2f  en pointer is.//
26d0: 2f 20 76 61 6c 69 64 20 66 6f 72 20 60 6c 65 6e  / valid for `len
26e0: 60 20 62 79 74 65 73 2c 20 6e 6f 72 20 77 68 65  ` bytes, nor whe
26f0: 74 68 65 72 20 74 68 65 20 6c 69 66 65 74 69 6d  ther the lifetim
2700: 65 20 69 6e 66 65 72 72 65 64 20 69 73 20 61 20  e inferred is a 
2710: 73 75 69 74 61 62 6c 65 0a 2f 2f 2f 20 6c 69 66  suitable./// lif
2720: 65 74 69 6d 65 20 66 6f 72 20 74 68 65 20 72 65  etime for the re
2730: 74 75 72 6e 65 64 20 73 74 72 2e 0a 2f 2f 2f 0a  turned str..///.
2740: 2f 2f 2f 20 54 68 65 20 64 61 74 61 20 6d 75 73  /// The data mus
2750: 74 20 62 65 20 76 61 6c 69 64 20 55 54 46 2d 38  t be valid UTF-8
2760: 0a 2f 2f 2f 0a 2f 2f 2f 20 60 70 60 20 6d 75 73  .///./// `p` mus
2770: 74 20 62 65 20 6e 6f 6e 2d 6e 75 6c 6c 2c 20 65  t be non-null, e
2780: 76 65 6e 20 66 6f 72 20 7a 65 72 6f 2d 6c 65 6e  ven for zero-len
2790: 67 74 68 20 73 74 72 73 2c 20 62 65 63 61 75 73  gth strs, becaus
27a0: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 69 74 73 0a  e non-zero bits.
27b0: 2f 2f 2f 20 61 72 65 20 72 65 71 75 69 72 65 64  /// are required
27c0: 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20   to distinguish 
27d0: 62 65 74 77 65 65 6e 20 61 20 7a 65 72 6f 2d 6c  between a zero-l
27e0: 65 6e 67 74 68 20 73 74 72 20 77 69 74 68 69 6e  ength str within
27f0: 20 60 53 6f 6d 65 28 29 60 0a 2f 2f 2f 20 66 72   `Some()`./// fr
2800: 6f 6d 20 60 4e 6f 6e 65 60 2e 20 60 70 60 20 63  om `None`. `p` c
2810: 61 6e 20 62 65 20 61 20 62 6f 67 75 73 20 6e 6f  an be a bogus no
2820: 6e 2d 64 65 72 65 66 65 72 65 6e 63 61 62 6c 65  n-dereferencable
2830: 20 70 6f 69 6e 74 65 72 2c 20 73 75 63 68 20 61   pointer, such a
2840: 73 20 60 30 78 31 60 2c 0a 2f 2f 2f 20 66 6f 72  s `0x1`,./// for
2850: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
2860: 73 2c 20 74 68 6f 75 67 68 2e 0a 2f 2f 2f 0a 2f  s, though..///./
2870: 2f 2f 20 23 20 43 61 76 65 61 74 0a 2f 2f 2f 0a  // # Caveat.///.
2880: 2f 2f 2f 20 54 68 65 20 6c 69 66 65 74 69 6d 65  /// The lifetime
2890: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
28a0: 64 20 73 74 72 20 69 73 20 69 6e 66 65 72 72 65  d str is inferre
28b0: 64 20 66 72 6f 6d 20 69 74 73 20 75 73 61 67 65  d from its usage
28c0: 2e 20 54 6f 0a 2f 2f 2f 20 70 72 65 76 65 6e 74  . To./// prevent
28d0: 20 61 63 63 69 64 65 6e 74 61 6c 20 6d 69 73 75   accidental misu
28e0: 73 65 2c 20 69 74 27 73 20 73 75 67 67 65 73 74  se, it's suggest
28f0: 65 64 20 74 6f 20 74 69 65 20 74 68 65 20 6c 69  ed to tie the li
2900: 66 65 74 69 6d 65 20 74 6f 20 77 68 69 63 68 65  fetime to whiche
2910: 76 65 72 0a 2f 2f 2f 20 73 6f 75 72 63 65 20 6c  ver./// source l
2920: 69 66 65 74 69 6d 65 20 69 73 20 73 61 66 65 20  ifetime is safe 
2930: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 2c 20  in the context, 
2940: 73 75 63 68 20 61 73 20 62 79 20 70 72 6f 76 69  such as by provi
2950: 64 69 6e 67 20 61 20 68 65 6c 70 65 72 0a 2f 2f  ding a helper.//
2960: 2f 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  / function takin
2970: 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  g the lifetime o
2980: 66 20 61 20 68 6f 73 74 20 76 61 6c 75 65 20 66  f a host value f
2990: 6f 72 20 74 68 65 20 73 74 72 2c 20 6f 72 20 62  or the str, or b
29a0: 79 20 65 78 70 6c 69 63 69 74 0a 2f 2f 2f 20 61  y explicit./// a
29b0: 6e 6e 6f 74 61 74 69 6f 6e 2e 0a 2f 2f 2f 20 50  nnotation../// P
29c0: 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65  erforms the same
29d0: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 61   functionality a
29e0: 73 20 60 66 72 6f 6d 5f 72 61 77 5f 70 61 72 74  s `from_raw_part
29f0: 73 60 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  s`, except that 
2a00: 61 20 6d 75 74 61 62 6c 65 0a 2f 2f 2f 20 73 74  a mutable./// st
2a10: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2f  r is returned../
2a20: 2f 2f 0a 75 6e 73 61 66 65 20 66 6e 20 66 72 6f  //.unsafe fn fro
2a30: 6d 5f 72 61 77 5f 70 61 72 74 73 5f 6d 75 74 3c  m_raw_parts_mut<
2a40: 27 61 3e 28 70 3a 20 2a 6d 75 74 20 75 38 2c 20  'a>(p: *mut u8, 
2a50: 6c 65 6e 3a 20 75 73 69 7a 65 29 20 2d 3e 20 26  len: usize) -> &
2a60: 27 61 20 6d 75 74 20 73 74 72 20 7b 0a 20 20 20  'a mut str {.   
2a70: 20 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65   from_utf8_unche
2a80: 63 6b 65 64 5f 6d 75 74 28 73 6c 69 63 65 3a 3a  cked_mut(slice::
2a90: 66 72 6f 6d 5f 72 61 77 5f 70 61 72 74 73 5f 6d  from_raw_parts_m
2aa0: 75 74 28 70 2c 20 6c 65 6e 29 29 0a 7d 0a 0a 2f  ut(p, len)).}../
2ab0: 2f 2f 20 43 6f 6e 76 65 72 74 73 20 61 20 73 6c  // Converts a sl
2ac0: 69 63 65 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ice of bytes to 
2ad0: 61 20 73 74 72 69 6e 67 20 73 6c 69 63 65 20 77  a string slice w
2ae0: 69 74 68 6f 75 74 20 63 68 65 63 6b 69 6e 67 0a  ithout checking.
2af0: 2f 2f 2f 20 74 68 61 74 20 74 68 65 20 73 74 72  /// that the str
2b00: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ing contains val
2b10: 69 64 20 55 54 46 2d 38 2e 0a 2f 2f 2f 0a 2f 2f  id UTF-8..///.//
2b20: 2f 20 53 65 65 20 74 68 65 20 73 61 66 65 20 76  / See the safe v
2b30: 65 72 73 69 6f 6e 2c 20 5b 60 66 72 6f 6d 5f 75  ersion, [`from_u
2b40: 74 66 38 60 5d 5b 66 72 6f 6d 75 74 66 38 5d 2c  tf8`][fromutf8],
2b50: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   for more inform
2b60: 61 74 69 6f 6e 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b  ation..///./// [
2b70: 66 72 6f 6d 75 74 66 38 5d 3a 20 66 6e 2e 66 72  fromutf8]: fn.fr
2b80: 6f 6d 5f 75 74 66 38 2e 68 74 6d 6c 0a 2f 2f 2f  om_utf8.html.///
2b90: 0a 2f 2f 2f 20 23 20 53 61 66 65 74 79 0a 2f 2f  ./// # Safety.//
2ba0: 2f 0a 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 74  /./// This funct
2bb0: 69 6f 6e 20 69 73 20 75 6e 73 61 66 65 20 62 65  ion is unsafe be
2bc0: 63 61 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f  cause it does no
2bd0: 74 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  t check that the
2be0: 20 62 79 74 65 73 20 70 61 73 73 65 64 20 74 6f   bytes passed to
2bf0: 0a 2f 2f 2f 20 69 74 20 61 72 65 20 76 61 6c 69  ./// it are vali
2c00: 64 20 55 54 46 2d 38 2e 20 49 66 20 74 68 69 73  d UTF-8. If this
2c10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 76   constraint is v
2c20: 69 6f 6c 61 74 65 64 2c 20 75 6e 64 65 66 69 6e  iolated, undefin
2c30: 65 64 20 62 65 68 61 76 69 6f 72 0a 2f 2f 2f 20  ed behavior./// 
2c40: 72 65 73 75 6c 74 73 2c 20 61 73 20 74 68 65 20  results, as the 
2c50: 72 65 73 74 20 6f 66 20 52 75 73 74 20 61 73 73  rest of Rust ass
2c60: 75 6d 65 73 20 74 68 61 74 20 5b 60 26 73 74 72  umes that [`&str
2c70: 60 5d 73 20 61 72 65 20 76 61 6c 69 64 20 55 54  `]s are valid UT
2c80: 46 2d 38 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 26  F-8..///./// [`&
2c90: 73 74 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64  str`]: ../../std
2ca0: 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68  /primitive.str.h
2cb0: 74 6d 6c 0a 2f 2f 2f 0a 2f 2f 2f 20 23 20 45 78  tml.///./// # Ex
2cc0: 61 6d 70 6c 65 73 0a 2f 2f 2f 0a 2f 2f 2f 20 42  amples.///./// B
2cd0: 61 73 69 63 20 75 73 61 67 65 3a 0a 2f 2f 2f 0a  asic usage:.///.
2ce0: 2f 2f 2f 20 60 60 60 0a 2f 2f 2f 20 75 73 65 20  /// ```./// use 
2cf0: 73 74 64 3a 3a 73 74 72 3b 0a 2f 2f 2f 0a 2f 2f  std::str;.///.//
2d00: 2f 20 2f 2f 20 73 6f 6d 65 20 62 79 74 65 73 2c  / // some bytes,
2d10: 20 69 6e 20 61 20 76 65 63 74 6f 72 0a 2f 2f 2f   in a vector.///
2d20: 20 6c 65 74 20 73 70 61 72 6b 6c 65 5f 68 65 61   let sparkle_hea
2d30: 72 74 20 3d 20 76 65 63 21 5b 32 34 30 2c 20 31  rt = vec![240, 1
2d40: 35 39 2c 20 31 34 36 2c 20 31 35 30 5d 3b 0a 2f  59, 146, 150];./
2d50: 2f 2f 0a 2f 2f 2f 20 6c 65 74 20 73 70 61 72 6b  //./// let spark
2d60: 6c 65 5f 68 65 61 72 74 20 3d 20 75 6e 73 61 66  le_heart = unsaf
2d70: 65 20 7b 0a 2f 2f 2f 20 20 20 20 20 73 74 72 3a  e {.///     str:
2d80: 3a 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65  :from_utf8_unche
2d90: 63 6b 65 64 28 26 73 70 61 72 6b 6c 65 5f 68 65  cked(&sparkle_he
2da0: 61 72 74 29 0a 2f 2f 2f 20 7d 3b 0a 2f 2f 2f 0a  art)./// };.///.
2db0: 2f 2f 2f 20 61 73 73 65 72 74 5f 65 71 21 28 22  /// assert_eq!("
2dc0: f0 9f 92 96 22 2c 20 73 70 61 72 6b 6c 65 5f 68  ....", sparkle_h
2dd0: 65 61 72 74 29 3b 0a 2f 2f 2f 20 60 60 60 0a 23  eart);./// ```.#
2de0: 5b 69 6e 6c 69 6e 65 28 61 6c 77 61 79 73 29 5d  [inline(always)]
2df0: 0a 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72  .#[stable(featur
2e00: 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e  e = "rust1", sin
2e10: 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 70  ce = "1.0.0")].p
2e20: 75 62 20 75 6e 73 61 66 65 20 66 6e 20 66 72 6f  ub unsafe fn fro
2e30: 6d 5f 75 74 66 38 5f 75 6e 63 68 65 63 6b 65 64  m_utf8_unchecked
2e40: 28 76 3a 20 26 5b 75 38 5d 29 20 2d 3e 20 26 73  (v: &[u8]) -> &s
2e50: 74 72 20 7b 0a 20 20 20 20 6d 65 6d 3a 3a 74 72  tr {.    mem::tr
2e60: 61 6e 73 6d 75 74 65 28 76 29 0a 7d 0a 0a 2f 2f  ansmute(v).}..//
2e70: 2f 20 43 6f 6e 76 65 72 74 73 20 61 20 73 6c 69  / Converts a sli
2e80: 63 65 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  ce of bytes to a
2e90: 20 73 74 72 69 6e 67 20 73 6c 69 63 65 20 77 69   string slice wi
2ea0: 74 68 6f 75 74 20 63 68 65 63 6b 69 6e 67 0a 2f  thout checking./
2eb0: 2f 2f 20 74 68 61 74 20 74 68 65 20 73 74 72 69  // that the stri
2ec0: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  ng contains vali
2ed0: 64 20 55 54 46 2d 38 3b 20 6d 75 74 61 62 6c 65  d UTF-8; mutable
2ee0: 20 76 65 72 73 69 6f 6e 2e 0a 2f 2f 2f 0a 2f 2f   version..///.//
2ef0: 2f 20 53 65 65 20 74 68 65 20 69 6d 6d 75 74 61  / See the immuta
2f00: 62 6c 65 20 76 65 72 73 69 6f 6e 2c 20 5b 60 66  ble version, [`f
2f10: 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65 63 6b  rom_utf8_uncheck
2f20: 65 64 28 29 60 5d 5b 66 72 6f 6d 75 74 66 38 5d  ed()`][fromutf8]
2f30: 2c 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72  , for more infor
2f40: 6d 61 74 69 6f 6e 2e 0a 2f 2f 2f 0a 2f 2f 2f 20  mation..///./// 
2f50: 5b 66 72 6f 6d 75 74 66 38 5d 3a 20 66 6e 2e 66  [fromutf8]: fn.f
2f60: 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65 63 6b  rom_utf8_uncheck
2f70: 65 64 2e 68 74 6d 6c 0a 23 5b 69 6e 6c 69 6e 65  ed.html.#[inline
2f80: 28 61 6c 77 61 79 73 29 5d 0a 23 5b 75 6e 73 74  (always)].#[unst
2f90: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
2fa0: 73 74 72 5f 6d 75 74 5f 65 78 74 72 61 73 22 2c  str_mut_extras",
2fb0: 20 69 73 73 75 65 20 3d 20 22 34 31 31 31 39 22   issue = "41119"
2fc0: 29 5d 0a 70 75 62 20 75 6e 73 61 66 65 20 66 6e  )].pub unsafe fn
2fd0: 20 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65   from_utf8_unche
2fe0: 63 6b 65 64 5f 6d 75 74 28 76 3a 20 26 6d 75 74  cked_mut(v: &mut
2ff0: 20 5b 75 38 5d 29 20 2d 3e 20 26 6d 75 74 20 73   [u8]) -> &mut s
3000: 74 72 20 7b 0a 20 20 20 20 6d 65 6d 3a 3a 74 72  tr {.    mem::tr
3010: 61 6e 73 6d 75 74 65 28 76 29 0a 7d 0a 0a 23 5b  ansmute(v).}..#[
3020: 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
3030: 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20   "rust1", since 
3040: 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c  = "1.0.0")].impl
3050: 20 66 6d 74 3a 3a 44 69 73 70 6c 61 79 20 66 6f   fmt::Display fo
3060: 72 20 55 74 66 38 45 72 72 6f 72 20 7b 0a 20 20  r Utf8Error {.  
3070: 20 20 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c 20    fn fmt(&self, 
3080: 66 3a 20 26 6d 75 74 20 66 6d 74 3a 3a 46 6f 72  f: &mut fmt::For
3090: 6d 61 74 74 65 72 29 20 2d 3e 20 66 6d 74 3a 3a  matter) -> fmt::
30a0: 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20 20  Result {.       
30b0: 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 65 72 72   if let Some(err
30c0: 6f 72 5f 6c 65 6e 29 20 3d 20 73 65 6c 66 2e 65  or_len) = self.e
30d0: 72 72 6f 72 5f 6c 65 6e 20 7b 0a 20 20 20 20 20  rror_len {.     
30e0: 20 20 20 20 20 20 20 77 72 69 74 65 21 28 66 2c         write!(f,
30f0: 20 22 69 6e 76 61 6c 69 64 20 75 74 66 2d 38 20   "invalid utf-8 
3100: 73 65 71 75 65 6e 63 65 20 6f 66 20 7b 7d 20 62  sequence of {} b
3110: 79 74 65 73 20 66 72 6f 6d 20 69 6e 64 65 78 20  ytes from index 
3120: 7b 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  {}",.           
3130: 20 20 20 20 20 20 20 20 65 72 72 6f 72 5f 6c 65          error_le
3140: 6e 2c 20 73 65 6c 66 2e 76 61 6c 69 64 5f 75 70  n, self.valid_up
3150: 5f 74 6f 29 0a 20 20 20 20 20 20 20 20 7d 20 65  _to).        } e
3160: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
3170: 20 20 77 72 69 74 65 21 28 66 2c 20 22 69 6e 63    write!(f, "inc
3180: 6f 6d 70 6c 65 74 65 20 75 74 66 2d 38 20 62 79  omplete utf-8 by
3190: 74 65 20 73 65 71 75 65 6e 63 65 20 66 72 6f 6d  te sequence from
31a0: 20 69 6e 64 65 78 20 7b 7d 22 2c 20 73 65 6c 66   index {}", self
31b0: 2e 76 61 6c 69 64 5f 75 70 5f 74 6f 29 0a 20 20  .valid_up_to).  
31c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
31d0: 0a 2f 2a 0a 53 65 63 74 69 6f 6e 3a 20 49 74 65  ./*.Section: Ite
31e0: 72 61 74 6f 72 73 0a 2a 2f 0a 0a 2f 2f 2f 20 41  rators.*/../// A
31f0: 6e 20 69 74 65 72 61 74 6f 72 20 6f 76 65 72 20  n iterator over 
3200: 74 68 65 20 5b 60 63 68 61 72 60 5d 73 20 6f 66  the [`char`]s of
3210: 20 61 20 73 74 72 69 6e 67 20 73 6c 69 63 65 2e   a string slice.
3220: 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 63 68 61 72 60  .///./// [`char`
3230: 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69  ]: ../../std/pri
3240: 6d 69 74 69 76 65 2e 63 68 61 72 2e 68 74 6d 6c  mitive.char.html
3250: 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 69 73 20 73 74  .///./// This st
3260: 72 75 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ruct is created 
3270: 62 79 20 74 68 65 20 5b 60 63 68 61 72 73 60 5d  by the [`chars`]
3280: 20 6d 65 74 68 6f 64 20 6f 6e 20 5b 60 73 74 72   method on [`str
3290: 60 5d 2e 0a 2f 2f 2f 20 53 65 65 20 69 74 73 20  `]../// See its 
32a0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
32b0: 72 20 6d 6f 72 65 2e 0a 2f 2f 2f 0a 2f 2f 2f 20  r more..///./// 
32c0: 5b 60 63 68 61 72 73 60 5d 3a 20 2e 2e 2f 2e 2e  [`chars`]: ../..
32d0: 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73  /std/primitive.s
32e0: 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f 64 2e 63  tr.html#method.c
32f0: 68 61 72 73 0a 2f 2f 2f 20 5b 60 73 74 72 60 5d  hars./// [`str`]
3300: 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d  : ../../std/prim
3310: 69 74 69 76 65 2e 73 74 72 2e 68 74 6d 6c 0a 23  itive.str.html.#
3320: 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44  [derive(Clone, D
3330: 65 62 75 67 29 5d 0a 23 5b 73 74 61 62 6c 65 28  ebug)].#[stable(
3340: 66 65 61 74 75 72 65 20 3d 20 22 72 75 73 74 31  feature = "rust1
3350: 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e  ", since = "1.0.
3360: 30 22 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20  0")].pub struct 
3370: 43 68 61 72 73 3c 27 61 3e 20 7b 0a 20 20 20 20  Chars<'a> {.    
3380: 69 74 65 72 3a 20 73 6c 69 63 65 3a 3a 49 74 65  iter: slice::Ite
3390: 72 3c 27 61 2c 20 75 38 3e 0a 7d 0a 0a 2f 2f 2f  r<'a, u8>.}..///
33a0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 69 6e 69   Returns the ini
33b0: 74 69 61 6c 20 63 6f 64 65 70 6f 69 6e 74 20 61  tial codepoint a
33c0: 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74  ccumulator for t
33d0: 68 65 20 66 69 72 73 74 20 62 79 74 65 2e 0a 2f  he first byte../
33e0: 2f 2f 20 54 68 65 20 66 69 72 73 74 20 62 79 74  // The first byt
33f0: 65 20 69 73 20 73 70 65 63 69 61 6c 2c 20 6f 6e  e is special, on
3400: 6c 79 20 77 61 6e 74 20 62 6f 74 74 6f 6d 20 35  ly want bottom 5
3410: 20 62 69 74 73 20 66 6f 72 20 77 69 64 74 68 20   bits for width 
3420: 32 2c 20 34 20 62 69 74 73 0a 2f 2f 2f 20 66 6f  2, 4 bits./// fo
3430: 72 20 77 69 64 74 68 20 33 2c 20 61 6e 64 20 33  r width 3, and 3
3440: 20 62 69 74 73 20 66 6f 72 20 77 69 64 74 68 20   bits for width 
3450: 34 2e 0a 23 5b 69 6e 6c 69 6e 65 5d 0a 66 6e 20  4..#[inline].fn 
3460: 75 74 66 38 5f 66 69 72 73 74 5f 62 79 74 65 28  utf8_first_byte(
3470: 62 79 74 65 3a 20 75 38 2c 20 77 69 64 74 68 3a  byte: u8, width:
3480: 20 75 33 32 29 20 2d 3e 20 75 33 32 20 7b 20 28   u32) -> u32 { (
3490: 62 79 74 65 20 26 20 28 30 78 37 46 20 3e 3e 20  byte & (0x7F >> 
34a0: 77 69 64 74 68 29 29 20 61 73 20 75 33 32 20 7d  width)) as u32 }
34b0: 0a 0a 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68  ../// Returns th
34c0: 65 20 76 61 6c 75 65 20 6f 66 20 60 63 68 60 20  e value of `ch` 
34d0: 75 70 64 61 74 65 64 20 77 69 74 68 20 63 6f 6e  updated with con
34e0: 74 69 6e 75 61 74 69 6f 6e 20 62 79 74 65 20 60  tinuation byte `
34f0: 62 79 74 65 60 2e 0a 23 5b 69 6e 6c 69 6e 65 5d  byte`..#[inline]
3500: 0a 66 6e 20 75 74 66 38 5f 61 63 63 5f 63 6f 6e  .fn utf8_acc_con
3510: 74 5f 62 79 74 65 28 63 68 3a 20 75 33 32 2c 20  t_byte(ch: u32, 
3520: 62 79 74 65 3a 20 75 38 29 20 2d 3e 20 75 33 32  byte: u8) -> u32
3530: 20 7b 20 28 63 68 20 3c 3c 20 36 29 20 7c 20 28   { (ch << 6) | (
3540: 62 79 74 65 20 26 20 43 4f 4e 54 5f 4d 41 53 4b  byte & CONT_MASK
3550: 29 20 61 73 20 75 33 32 20 7d 0a 0a 2f 2f 2f 20  ) as u32 }../// 
3560: 43 68 65 63 6b 73 20 77 68 65 74 68 65 72 20 74  Checks whether t
3570: 68 65 20 62 79 74 65 20 69 73 20 61 20 55 54 46  he byte is a UTF
3580: 2d 38 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  -8 continuation 
3590: 62 79 74 65 20 28 69 2e 65 2e 20 73 74 61 72 74  byte (i.e. start
35a0: 73 20 77 69 74 68 20 74 68 65 0a 2f 2f 2f 20 62  s with the./// b
35b0: 69 74 73 20 60 31 30 60 29 2e 0a 23 5b 69 6e 6c  its `10`)..#[inl
35c0: 69 6e 65 5d 0a 66 6e 20 75 74 66 38 5f 69 73 5f  ine].fn utf8_is_
35d0: 63 6f 6e 74 5f 62 79 74 65 28 62 79 74 65 3a 20  cont_byte(byte: 
35e0: 75 38 29 20 2d 3e 20 62 6f 6f 6c 20 7b 20 28 62  u8) -> bool { (b
35f0: 79 74 65 20 26 20 21 43 4f 4e 54 5f 4d 41 53 4b  yte & !CONT_MASK
3600: 29 20 3d 3d 20 54 41 47 5f 43 4f 4e 54 5f 55 38  ) == TAG_CONT_U8
3610: 20 7d 0a 0a 23 5b 69 6e 6c 69 6e 65 5d 0a 66 6e   }..#[inline].fn
3620: 20 75 6e 77 72 61 70 5f 6f 72 5f 30 28 6f 70 74   unwrap_or_0(opt
3630: 3a 20 4f 70 74 69 6f 6e 3c 26 75 38 3e 29 20 2d  : Option<&u8>) -
3640: 3e 20 75 38 20 7b 0a 20 20 20 20 6d 61 74 63 68  > u8 {.    match
3650: 20 6f 70 74 20 7b 0a 20 20 20 20 20 20 20 20 53   opt {.        S
3660: 6f 6d 65 28 26 62 79 74 65 29 20 3d 3e 20 62 79  ome(&byte) => by
3670: 74 65 2c 0a 20 20 20 20 20 20 20 20 4e 6f 6e 65  te,.        None
3680: 20 3d 3e 20 30 2c 0a 20 20 20 20 7d 0a 7d 0a 0a   => 0,.    }.}..
3690: 2f 2f 2f 20 52 65 61 64 73 20 74 68 65 20 6e 65  /// Reads the ne
36a0: 78 74 20 63 6f 64 65 20 70 6f 69 6e 74 20 6f 75  xt code point ou
36b0: 74 20 6f 66 20 61 20 62 79 74 65 20 69 74 65 72  t of a byte iter
36c0: 61 74 6f 72 20 28 61 73 73 75 6d 69 6e 67 20 61  ator (assuming a
36d0: 0a 2f 2f 2f 20 55 54 46 2d 38 2d 6c 69 6b 65 20  ./// UTF-8-like 
36e0: 65 6e 63 6f 64 69 6e 67 29 2e 0a 23 5b 75 6e 73  encoding)..#[uns
36f0: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
3700: 22 73 74 72 5f 69 6e 74 65 72 6e 61 6c 73 22 2c  "str_internals",
3710: 20 69 73 73 75 65 20 3d 20 22 30 22 29 5d 0a 23   issue = "0")].#
3720: 5b 69 6e 6c 69 6e 65 5d 0a 70 75 62 20 66 6e 20  [inline].pub fn 
3730: 6e 65 78 74 5f 63 6f 64 65 5f 70 6f 69 6e 74 3c  next_code_point<
3740: 27 61 2c 20 49 3a 20 49 74 65 72 61 74 6f 72 3c  'a, I: Iterator<
3750: 49 74 65 6d 20 3d 20 26 27 61 20 75 38 3e 3e 28  Item = &'a u8>>(
3760: 62 79 74 65 73 3a 20 26 6d 75 74 20 49 29 20 2d  bytes: &mut I) -
3770: 3e 20 4f 70 74 69 6f 6e 3c 75 33 32 3e 20 7b 0a  > Option<u32> {.
3780: 20 20 20 20 2f 2f 20 44 65 63 6f 64 65 20 55 54      // Decode UT
3790: 46 2d 38 0a 20 20 20 20 6c 65 74 20 78 20 3d 20  F-8.    let x = 
37a0: 6d 61 74 63 68 20 62 79 74 65 73 2e 6e 65 78 74  match bytes.next
37b0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 4e 6f 6e  () {.        Non
37c0: 65 20 3d 3e 20 72 65 74 75 72 6e 20 4e 6f 6e 65  e => return None
37d0: 2c 0a 20 20 20 20 20 20 20 20 53 6f 6d 65 28 26  ,.        Some(&
37e0: 6e 65 78 74 5f 62 79 74 65 29 20 69 66 20 6e 65  next_byte) if ne
37f0: 78 74 5f 62 79 74 65 20 3c 20 31 32 38 20 3d 3e  xt_byte < 128 =>
3800: 20 72 65 74 75 72 6e 20 53 6f 6d 65 28 6e 65 78   return Some(nex
3810: 74 5f 62 79 74 65 20 61 73 20 75 33 32 29 2c 0a  t_byte as u32),.
3820: 20 20 20 20 20 20 20 20 53 6f 6d 65 28 26 6e 65          Some(&ne
3830: 78 74 5f 62 79 74 65 29 20 3d 3e 20 6e 65 78 74  xt_byte) => next
3840: 5f 62 79 74 65 2c 0a 20 20 20 20 7d 3b 0a 0a 20  _byte,.    };.. 
3850: 20 20 20 2f 2f 20 4d 75 6c 74 69 62 79 74 65 20     // Multibyte 
3860: 63 61 73 65 20 66 6f 6c 6c 6f 77 73 0a 20 20 20  case follows.   
3870: 20 2f 2f 20 44 65 63 6f 64 65 20 66 72 6f 6d 20   // Decode from 
3880: 61 20 62 79 74 65 20 63 6f 6d 62 69 6e 61 74 69  a byte combinati
3890: 6f 6e 20 6f 75 74 20 6f 66 3a 20 5b 5b 5b 78 20  on out of: [[[x 
38a0: 79 5d 20 7a 5d 20 77 5d 0a 20 20 20 20 2f 2f 20  y] z] w].    // 
38b0: 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 61 6e 63  NOTE: Performanc
38c0: 65 20 69 73 20 73 65 6e 73 69 74 69 76 65 20 74  e is sensitive t
38d0: 6f 20 74 68 65 20 65 78 61 63 74 20 66 6f 72 6d  o the exact form
38e0: 75 6c 61 74 69 6f 6e 20 68 65 72 65 0a 20 20 20  ulation here.   
38f0: 20 6c 65 74 20 69 6e 69 74 20 3d 20 75 74 66 38   let init = utf8
3900: 5f 66 69 72 73 74 5f 62 79 74 65 28 78 2c 20 32  _first_byte(x, 2
3910: 29 3b 0a 20 20 20 20 6c 65 74 20 79 20 3d 20 75  );.    let y = u
3920: 6e 77 72 61 70 5f 6f 72 5f 30 28 62 79 74 65 73  nwrap_or_0(bytes
3930: 2e 6e 65 78 74 28 29 29 3b 0a 20 20 20 20 6c 65  .next());.    le
3940: 74 20 6d 75 74 20 63 68 20 3d 20 75 74 66 38 5f  t mut ch = utf8_
3950: 61 63 63 5f 63 6f 6e 74 5f 62 79 74 65 28 69 6e  acc_cont_byte(in
3960: 69 74 2c 20 79 29 3b 0a 20 20 20 20 69 66 20 78  it, y);.    if x
3970: 20 3e 3d 20 30 78 45 30 20 7b 0a 20 20 20 20 20   >= 0xE0 {.     
3980: 20 20 20 2f 2f 20 5b 5b 78 20 79 20 7a 5d 20 77     // [[x y z] w
3990: 5d 20 63 61 73 65 0a 20 20 20 20 20 20 20 20 2f  ] case.        /
39a0: 2f 20 35 74 68 20 62 69 74 20 69 6e 20 30 78 45  / 5th bit in 0xE
39b0: 30 20 2e 2e 20 30 78 45 46 20 69 73 20 61 6c 77  0 .. 0xEF is alw
39c0: 61 79 73 20 63 6c 65 61 72 2c 20 73 6f 20 60 69  ays clear, so `i
39d0: 6e 69 74 60 20 69 73 20 73 74 69 6c 6c 20 76 61  nit` is still va
39e0: 6c 69 64 0a 20 20 20 20 20 20 20 20 6c 65 74 20  lid.        let 
39f0: 7a 20 3d 20 75 6e 77 72 61 70 5f 6f 72 5f 30 28  z = unwrap_or_0(
3a00: 62 79 74 65 73 2e 6e 65 78 74 28 29 29 3b 0a 20  bytes.next());. 
3a10: 20 20 20 20 20 20 20 6c 65 74 20 79 5f 7a 20 3d         let y_z =
3a20: 20 75 74 66 38 5f 61 63 63 5f 63 6f 6e 74 5f 62   utf8_acc_cont_b
3a30: 79 74 65 28 28 79 20 26 20 43 4f 4e 54 5f 4d 41  yte((y & CONT_MA
3a40: 53 4b 29 20 61 73 20 75 33 32 2c 20 7a 29 3b 0a  SK) as u32, z);.
3a50: 20 20 20 20 20 20 20 20 63 68 20 3d 20 69 6e 69          ch = ini
3a60: 74 20 3c 3c 20 31 32 20 7c 20 79 5f 7a 3b 0a 20  t << 12 | y_z;. 
3a70: 20 20 20 20 20 20 20 69 66 20 78 20 3e 3d 20 30         if x >= 0
3a80: 78 46 30 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xF0 {.          
3a90: 20 20 2f 2f 20 5b 78 20 79 20 7a 20 77 5d 20 63    // [x y z w] c
3aa0: 61 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ase.            
3ab0: 2f 2f 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  // use only the 
3ac0: 6c 6f 77 65 72 20 33 20 62 69 74 73 20 6f 66 20  lower 3 bits of 
3ad0: 60 69 6e 69 74 60 0a 20 20 20 20 20 20 20 20 20  `init`.         
3ae0: 20 20 20 6c 65 74 20 77 20 3d 20 75 6e 77 72 61     let w = unwra
3af0: 70 5f 6f 72 5f 30 28 62 79 74 65 73 2e 6e 65 78  p_or_0(bytes.nex
3b00: 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t());.          
3b10: 20 20 63 68 20 3d 20 28 69 6e 69 74 20 26 20 37    ch = (init & 7
3b20: 29 20 3c 3c 20 31 38 20 7c 20 75 74 66 38 5f 61  ) << 18 | utf8_a
3b30: 63 63 5f 63 6f 6e 74 5f 62 79 74 65 28 79 5f 7a  cc_cont_byte(y_z
3b40: 2c 20 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , w);.        }.
3b50: 20 20 20 20 7d 0a 0a 20 20 20 20 53 6f 6d 65 28      }..    Some(
3b60: 63 68 29 0a 7d 0a 0a 2f 2f 2f 20 52 65 61 64 73  ch).}../// Reads
3b70: 20 74 68 65 20 6c 61 73 74 20 63 6f 64 65 20 70   the last code p
3b80: 6f 69 6e 74 20 6f 75 74 20 6f 66 20 61 20 62 79  oint out of a by
3b90: 74 65 20 69 74 65 72 61 74 6f 72 20 28 61 73 73  te iterator (ass
3ba0: 75 6d 69 6e 67 20 61 0a 2f 2f 2f 20 55 54 46 2d  uming a./// UTF-
3bb0: 38 2d 6c 69 6b 65 20 65 6e 63 6f 64 69 6e 67 29  8-like encoding)
3bc0: 2e 0a 23 5b 69 6e 6c 69 6e 65 5d 0a 66 6e 20 6e  ..#[inline].fn n
3bd0: 65 78 74 5f 63 6f 64 65 5f 70 6f 69 6e 74 5f 72  ext_code_point_r
3be0: 65 76 65 72 73 65 3c 27 61 2c 20 49 3e 28 62 79  everse<'a, I>(by
3bf0: 74 65 73 3a 20 26 6d 75 74 20 49 29 20 2d 3e 20  tes: &mut I) -> 
3c00: 4f 70 74 69 6f 6e 3c 75 33 32 3e 0a 20 20 20 20  Option<u32>.    
3c10: 77 68 65 72 65 20 49 3a 20 44 6f 75 62 6c 65 45  where I: DoubleE
3c20: 6e 64 65 64 49 74 65 72 61 74 6f 72 3c 49 74 65  ndedIterator<Ite
3c30: 6d 20 3d 20 26 27 61 20 75 38 3e 2c 0a 7b 0a 20  m = &'a u8>,.{. 
3c40: 20 20 20 2f 2f 20 44 65 63 6f 64 65 20 55 54 46     // Decode UTF
3c50: 2d 38 0a 20 20 20 20 6c 65 74 20 77 20 3d 20 6d  -8.    let w = m
3c60: 61 74 63 68 20 62 79 74 65 73 2e 6e 65 78 74 5f  atch bytes.next_
3c70: 62 61 63 6b 28 29 20 7b 0a 20 20 20 20 20 20 20  back() {.       
3c80: 20 4e 6f 6e 65 20 3d 3e 20 72 65 74 75 72 6e 20   None => return 
3c90: 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 53 6f  None,.        So
3ca0: 6d 65 28 26 6e 65 78 74 5f 62 79 74 65 29 20 69  me(&next_byte) i
3cb0: 66 20 6e 65 78 74 5f 62 79 74 65 20 3c 20 31 32  f next_byte < 12
3cc0: 38 20 3d 3e 20 72 65 74 75 72 6e 20 53 6f 6d 65  8 => return Some
3cd0: 28 6e 65 78 74 5f 62 79 74 65 20 61 73 20 75 33  (next_byte as u3
3ce0: 32 29 2c 0a 20 20 20 20 20 20 20 20 53 6f 6d 65  2),.        Some
3cf0: 28 26 62 61 63 6b 5f 62 79 74 65 29 20 3d 3e 20  (&back_byte) => 
3d00: 62 61 63 6b 5f 62 79 74 65 2c 0a 20 20 20 20 7d  back_byte,.    }
3d10: 3b 0a 0a 20 20 20 20 2f 2f 20 4d 75 6c 74 69 62  ;..    // Multib
3d20: 79 74 65 20 63 61 73 65 20 66 6f 6c 6c 6f 77 73  yte case follows
3d30: 0a 20 20 20 20 2f 2f 20 44 65 63 6f 64 65 20 66  .    // Decode f
3d40: 72 6f 6d 20 61 20 62 79 74 65 20 63 6f 6d 62 69  rom a byte combi
3d50: 6e 61 74 69 6f 6e 20 6f 75 74 20 6f 66 3a 20 5b  nation out of: [
3d60: 78 20 5b 79 20 5b 7a 20 77 5d 5d 5d 0a 20 20 20  x [y [z w]]].   
3d70: 20 6c 65 74 20 6d 75 74 20 63 68 3b 0a 20 20 20   let mut ch;.   
3d80: 20 6c 65 74 20 7a 20 3d 20 75 6e 77 72 61 70 5f   let z = unwrap_
3d90: 6f 72 5f 30 28 62 79 74 65 73 2e 6e 65 78 74 5f  or_0(bytes.next_
3da0: 62 61 63 6b 28 29 29 3b 0a 20 20 20 20 63 68 20  back());.    ch 
3db0: 3d 20 75 74 66 38 5f 66 69 72 73 74 5f 62 79 74  = utf8_first_byt
3dc0: 65 28 7a 2c 20 32 29 3b 0a 20 20 20 20 69 66 20  e(z, 2);.    if 
3dd0: 75 74 66 38 5f 69 73 5f 63 6f 6e 74 5f 62 79 74  utf8_is_cont_byt
3de0: 65 28 7a 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  e(z) {.        l
3df0: 65 74 20 79 20 3d 20 75 6e 77 72 61 70 5f 6f 72  et y = unwrap_or
3e00: 5f 30 28 62 79 74 65 73 2e 6e 65 78 74 5f 62 61  _0(bytes.next_ba
3e10: 63 6b 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63  ck());.        c
3e20: 68 20 3d 20 75 74 66 38 5f 66 69 72 73 74 5f 62  h = utf8_first_b
3e30: 79 74 65 28 79 2c 20 33 29 3b 0a 20 20 20 20 20  yte(y, 3);.     
3e40: 20 20 20 69 66 20 75 74 66 38 5f 69 73 5f 63 6f     if utf8_is_co
3e50: 6e 74 5f 62 79 74 65 28 79 29 20 7b 0a 20 20 20  nt_byte(y) {.   
3e60: 20 20 20 20 20 20 20 20 20 6c 65 74 20 78 20 3d           let x =
3e70: 20 75 6e 77 72 61 70 5f 6f 72 5f 30 28 62 79 74   unwrap_or_0(byt
3e80: 65 73 2e 6e 65 78 74 5f 62 61 63 6b 28 29 29 3b  es.next_back());
3e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 20  .            ch 
3ea0: 3d 20 75 74 66 38 5f 66 69 72 73 74 5f 62 79 74  = utf8_first_byt
3eb0: 65 28 78 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  e(x, 4);.       
3ec0: 20 20 20 20 20 63 68 20 3d 20 75 74 66 38 5f 61       ch = utf8_a
3ed0: 63 63 5f 63 6f 6e 74 5f 62 79 74 65 28 63 68 2c  cc_cont_byte(ch,
3ee0: 20 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   y);.        }. 
3ef0: 20 20 20 20 20 20 20 63 68 20 3d 20 75 74 66 38         ch = utf8
3f00: 5f 61 63 63 5f 63 6f 6e 74 5f 62 79 74 65 28 63  _acc_cont_byte(c
3f10: 68 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  h, z);.    }.   
3f20: 20 63 68 20 3d 20 75 74 66 38 5f 61 63 63 5f 63   ch = utf8_acc_c
3f30: 6f 6e 74 5f 62 79 74 65 28 63 68 2c 20 77 29 3b  ont_byte(ch, w);
3f40: 0a 0a 20 20 20 20 53 6f 6d 65 28 63 68 29 0a 7d  ..    Some(ch).}
3f50: 0a 0a 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75  ..#[stable(featu
3f60: 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69  re = "rust1", si
3f70: 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a  nce = "1.0.0")].
3f80: 69 6d 70 6c 3c 27 61 3e 20 49 74 65 72 61 74 6f  impl<'a> Iterato
3f90: 72 20 66 6f 72 20 43 68 61 72 73 3c 27 61 3e 20  r for Chars<'a> 
3fa0: 7b 0a 20 20 20 20 74 79 70 65 20 49 74 65 6d 20  {.    type Item 
3fb0: 3d 20 63 68 61 72 3b 0a 0a 20 20 20 20 23 5b 69  = char;..    #[i
3fc0: 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 65  nline].    fn ne
3fd0: 78 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e  xt(&mut self) ->
3fe0: 20 4f 70 74 69 6f 6e 3c 63 68 61 72 3e 20 7b 0a   Option<char> {.
3ff0: 20 20 20 20 20 20 20 20 6e 65 78 74 5f 63 6f 64          next_cod
4000: 65 5f 70 6f 69 6e 74 28 26 6d 75 74 20 73 65 6c  e_point(&mut sel
4010: 66 2e 69 74 65 72 29 2e 6d 61 70 28 7c 63 68 7c  f.iter).map(|ch|
4020: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
4030: 2f 20 73 74 72 20 69 6e 76 61 72 69 61 6e 74 20  / str invariant 
4040: 73 61 79 73 20 60 63 68 60 20 69 73 20 61 20 76  says `ch` is a v
4050: 61 6c 69 64 20 55 6e 69 63 6f 64 65 20 53 63 61  alid Unicode Sca
4060: 6c 61 72 20 56 61 6c 75 65 0a 20 20 20 20 20 20  lar Value.      
4070: 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20        unsafe {. 
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4090: 68 61 72 3a 3a 66 72 6f 6d 5f 75 33 32 5f 75 6e  har::from_u32_un
40a0: 63 68 65 63 6b 65 64 28 63 68 29 0a 20 20 20 20  checked(ch).    
40b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
40c0: 20 20 7d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20    }).    }..    
40d0: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e  #[inline].    fn
40e0: 20 63 6f 75 6e 74 28 73 65 6c 66 29 20 2d 3e 20   count(self) -> 
40f0: 75 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20 20  usize {.        
4100: 2f 2f 20 6c 65 6e 67 74 68 20 69 6e 20 60 63 68  // length in `ch
4110: 61 72 60 20 69 73 20 65 71 75 61 6c 20 74 6f 20  ar` is equal to 
4120: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  the number of no
4130: 6e 2d 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 62  n-continuation b
4140: 79 74 65 73 0a 20 20 20 20 20 20 20 20 6c 65 74  ytes.        let
4150: 20 62 79 74 65 73 5f 6c 65 6e 20 3d 20 73 65 6c   bytes_len = sel
4160: 66 2e 69 74 65 72 2e 6c 65 6e 28 29 3b 0a 20 20  f.iter.len();.  
4170: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63 6f        let mut co
4180: 6e 74 5f 62 79 74 65 73 20 3d 20 30 3b 0a 20 20  nt_bytes = 0;.  
4190: 20 20 20 20 20 20 66 6f 72 20 26 62 79 74 65 20        for &byte 
41a0: 69 6e 20 73 65 6c 66 2e 69 74 65 72 20 7b 0a 20  in self.iter {. 
41b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 5f             cont_
41c0: 62 79 74 65 73 20 2b 3d 20 75 74 66 38 5f 69 73  bytes += utf8_is
41d0: 5f 63 6f 6e 74 5f 62 79 74 65 28 62 79 74 65 29  _cont_byte(byte)
41e0: 20 61 73 20 75 73 69 7a 65 3b 0a 20 20 20 20 20   as usize;.     
41f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74     }.        byt
4200: 65 73 5f 6c 65 6e 20 2d 20 63 6f 6e 74 5f 62 79  es_len - cont_by
4210: 74 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  tes.    }..    #
4220: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20  [inline].    fn 
4230: 73 69 7a 65 5f 68 69 6e 74 28 26 73 65 6c 66 29  size_hint(&self)
4240: 20 2d 3e 20 28 75 73 69 7a 65 2c 20 4f 70 74 69   -> (usize, Opti
4250: 6f 6e 3c 75 73 69 7a 65 3e 29 20 7b 0a 20 20 20  on<usize>) {.   
4260: 20 20 20 20 20 6c 65 74 20 6c 65 6e 20 3d 20 73       let len = s
4270: 65 6c 66 2e 69 74 65 72 2e 6c 65 6e 28 29 3b 0a  elf.iter.len();.
4280: 20 20 20 20 20 20 20 20 2f 2f 20 60 28 6c 65 6e          // `(len
4290: 20 2b 20 33 29 60 20 63 61 6e 27 74 20 6f 76 65   + 3)` can't ove
42a0: 72 66 6c 6f 77 2c 20 62 65 63 61 75 73 65 20 77  rflow, because w
42b0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
42c0: 60 73 6c 69 63 65 3a 3a 49 74 65 72 60 0a 20 20  `slice::Iter`.  
42d0: 20 20 20 20 20 20 2f 2f 20 62 65 6c 6f 6e 67 73        // belongs
42e0: 20 74 6f 20 61 20 73 6c 69 63 65 20 69 6e 20 6d   to a slice in m
42f0: 65 6d 6f 72 79 20 77 68 69 63 68 20 68 61 73 20  emory which has 
4300: 61 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  a maximum length
4310: 20 6f 66 0a 20 20 20 20 20 20 20 20 2f 2f 20 60   of.        // `
4320: 69 73 69 7a 65 3a 3a 4d 41 58 60 20 28 74 68 61  isize::MAX` (tha
4330: 74 27 73 20 77 65 6c 6c 20 62 65 6c 6f 77 20 60  t's well below `
4340: 75 73 69 7a 65 3a 3a 4d 41 58 60 29 2e 0a 20 20  usize::MAX`)..  
4350: 20 20 20 20 20 20 28 28 6c 65 6e 20 2b 20 33 29        ((len + 3)
4360: 20 2f 20 34 2c 20 53 6f 6d 65 28 6c 65 6e 29 29   / 4, Some(len))
4370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
4380: 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6c 61 73  line].    fn las
4390: 74 28 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f  t(mut self) -> O
43a0: 70 74 69 6f 6e 3c 63 68 61 72 3e 20 7b 0a 20 20  ption<char> {.  
43b0: 20 20 20 20 20 20 2f 2f 20 4e 6f 20 6e 65 65 64        // No need
43c0: 20 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74   to go through t
43d0: 68 65 20 65 6e 74 69 72 65 20 73 74 72 69 6e 67  he entire string
43e0: 2e 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e  ..        self.n
43f0: 65 78 74 5f 62 61 63 6b 28 29 0a 20 20 20 20 7d  ext_back().    }
4400: 0a 7d 0a 0a 23 5b 73 74 61 62 6c 65 28 66 65 61  .}..#[stable(fea
4410: 74 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20  ture = "rust1", 
4420: 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29  since = "1.0.0")
4430: 5d 0a 69 6d 70 6c 3c 27 61 3e 20 44 6f 75 62 6c  ].impl<'a> Doubl
4440: 65 45 6e 64 65 64 49 74 65 72 61 74 6f 72 20 66  eEndedIterator f
4450: 6f 72 20 43 68 61 72 73 3c 27 61 3e 20 7b 0a 20  or Chars<'a> {. 
4460: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
4470: 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28 26 6d   fn next_back(&m
4480: 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69  ut self) -> Opti
4490: 6f 6e 3c 63 68 61 72 3e 20 7b 0a 20 20 20 20 20  on<char> {.     
44a0: 20 20 20 6e 65 78 74 5f 63 6f 64 65 5f 70 6f 69     next_code_poi
44b0: 6e 74 5f 72 65 76 65 72 73 65 28 26 6d 75 74 20  nt_reverse(&mut 
44c0: 73 65 6c 66 2e 69 74 65 72 29 2e 6d 61 70 28 7c  self.iter).map(|
44d0: 63 68 7c 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ch| {.          
44e0: 20 20 2f 2f 20 73 74 72 20 69 6e 76 61 72 69 61    // str invaria
44f0: 6e 74 20 73 61 79 73 20 60 63 68 60 20 69 73 20  nt says `ch` is 
4500: 61 20 76 61 6c 69 64 20 55 6e 69 63 6f 64 65 20  a valid Unicode 
4510: 53 63 61 6c 61 72 20 56 61 6c 75 65 0a 20 20 20  Scalar Value.   
4520: 20 20 20 20 20 20 20 20 20 75 6e 73 61 66 65 20           unsafe 
4530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4540: 20 20 63 68 61 72 3a 3a 66 72 6f 6d 5f 75 33 32    char::from_u32
4550: 5f 75 6e 63 68 65 63 6b 65 64 28 63 68 29 0a 20  _unchecked(ch). 
4560: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4570: 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 0a 7d 0a       }).    }.}.
4580: 0a 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74  .#[unstable(feat
4590: 75 72 65 20 3d 20 22 66 75 73 65 64 22 2c 20 69  ure = "fused", i
45a0: 73 73 75 65 20 3d 20 22 33 35 36 30 32 22 29 5d  ssue = "35602")]
45b0: 0a 69 6d 70 6c 3c 27 61 3e 20 46 75 73 65 64 49  .impl<'a> FusedI
45c0: 74 65 72 61 74 6f 72 20 66 6f 72 20 43 68 61 72  terator for Char
45d0: 73 3c 27 61 3e 20 7b 7d 0a 0a 69 6d 70 6c 3c 27  s<'a> {}..impl<'
45e0: 61 3e 20 43 68 61 72 73 3c 27 61 3e 20 7b 0a 20  a> Chars<'a> {. 
45f0: 20 20 20 2f 2f 2f 20 56 69 65 77 20 74 68 65 20     /// View the 
4600: 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 20  underlying data 
4610: 61 73 20 61 20 73 75 62 73 6c 69 63 65 20 6f 66  as a subslice of
4620: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4630: 74 61 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  ta..    ///.    
4640: 2f 2f 2f 20 54 68 69 73 20 68 61 73 20 74 68 65  /// This has the
4650: 20 73 61 6d 65 20 6c 69 66 65 74 69 6d 65 20 61   same lifetime a
4660: 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  s the original s
4670: 6c 69 63 65 2c 20 61 6e 64 20 73 6f 20 74 68 65  lice, and so the
4680: 0a 20 20 20 20 2f 2f 2f 20 69 74 65 72 61 74 6f  .    /// iterato
4690: 72 20 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74  r can continue t
46a0: 6f 20 62 65 20 75 73 65 64 20 77 68 69 6c 65 20  o be used while 
46b0: 74 68 69 73 20 65 78 69 73 74 73 2e 0a 20 20 20  this exists..   
46c0: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 23 20 45   ///.    /// # E
46d0: 78 61 6d 70 6c 65 73 0a 20 20 20 20 2f 2f 2f 0a  xamples.    ///.
46e0: 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20 20 20 20      /// ```.    
46f0: 2f 2f 2f 20 6c 65 74 20 6d 75 74 20 63 68 61 72  /// let mut char
4700: 73 20 3d 20 22 61 62 63 22 2e 63 68 61 72 73 28  s = "abc".chars(
4710: 29 3b 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f  );.    ///.    /
4720: 2f 2f 20 61 73 73 65 72 74 5f 65 71 21 28 63 68  // assert_eq!(ch
4730: 61 72 73 2e 61 73 5f 73 74 72 28 29 2c 20 22 61  ars.as_str(), "a
4740: 62 63 22 29 3b 0a 20 20 20 20 2f 2f 2f 20 63 68  bc");.    /// ch
4750: 61 72 73 2e 6e 65 78 74 28 29 3b 0a 20 20 20 20  ars.next();.    
4760: 2f 2f 2f 20 61 73 73 65 72 74 5f 65 71 21 28 63  /// assert_eq!(c
4770: 68 61 72 73 2e 61 73 5f 73 74 72 28 29 2c 20 22  hars.as_str(), "
4780: 62 63 22 29 3b 0a 20 20 20 20 2f 2f 2f 20 63 68  bc");.    /// ch
4790: 61 72 73 2e 6e 65 78 74 28 29 3b 0a 20 20 20 20  ars.next();.    
47a0: 2f 2f 2f 20 63 68 61 72 73 2e 6e 65 78 74 28 29  /// chars.next()
47b0: 3b 0a 20 20 20 20 2f 2f 2f 20 61 73 73 65 72 74  ;.    /// assert
47c0: 5f 65 71 21 28 63 68 61 72 73 2e 61 73 5f 73 74  _eq!(chars.as_st
47d0: 72 28 29 2c 20 22 22 29 3b 0a 20 20 20 20 2f 2f  r(), "");.    //
47e0: 2f 20 60 60 60 0a 20 20 20 20 23 5b 73 74 61 62  / ```.    #[stab
47f0: 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 69 74  le(feature = "it
4800: 65 72 5f 74 6f 5f 73 6c 69 63 65 22 2c 20 73 69  er_to_slice", si
4810: 6e 63 65 20 3d 20 22 31 2e 34 2e 30 22 29 5d 0a  nce = "1.4.0")].
4820: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
4830: 20 20 70 75 62 20 66 6e 20 61 73 5f 73 74 72 28    pub fn as_str(
4840: 26 73 65 6c 66 29 20 2d 3e 20 26 27 61 20 73 74  &self) -> &'a st
4850: 72 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 61  r {.        unsa
4860: 66 65 20 7b 20 66 72 6f 6d 5f 75 74 66 38 5f 75  fe { from_utf8_u
4870: 6e 63 68 65 63 6b 65 64 28 73 65 6c 66 2e 69 74  nchecked(self.it
4880: 65 72 2e 61 73 5f 73 6c 69 63 65 28 29 29 20 7d  er.as_slice()) }
4890: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 41 6e  .    }.}../// An
48a0: 20 69 74 65 72 61 74 6f 72 20 6f 76 65 72 20 74   iterator over t
48b0: 68 65 20 5b 60 63 68 61 72 60 5d 73 20 6f 66 20  he [`char`]s of 
48c0: 61 20 73 74 72 69 6e 67 20 73 6c 69 63 65 2c 20  a string slice, 
48d0: 61 6e 64 20 74 68 65 69 72 20 70 6f 73 69 74 69  and their positi
48e0: 6f 6e 73 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 63  ons..///./// [`c
48f0: 68 61 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64  har`]: ../../std
4900: 2f 70 72 69 6d 69 74 69 76 65 2e 63 68 61 72 2e  /primitive.char.
4910: 68 74 6d 6c 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 69  html.///./// Thi
4920: 73 20 73 74 72 75 63 74 20 69 73 20 63 72 65 61  s struct is crea
4930: 74 65 64 20 62 79 20 74 68 65 20 5b 60 63 68 61  ted by the [`cha
4940: 72 5f 69 6e 64 69 63 65 73 60 5d 20 6d 65 74 68  r_indices`] meth
4950: 6f 64 20 6f 6e 20 5b 60 73 74 72 60 5d 2e 0a 2f  od on [`str`]../
4960: 2f 2f 20 53 65 65 20 69 74 73 20 64 6f 63 75 6d  // See its docum
4970: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 6d 6f 72  entation for mor
4980: 65 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 5b 60 63 68 61  e..///./// [`cha
4990: 72 5f 69 6e 64 69 63 65 73 60 5d 3a 20 2e 2e 2f  r_indices`]: ../
49a0: 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65  ../std/primitive
49b0: 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f 64  .str.html#method
49c0: 2e 63 68 61 72 5f 69 6e 64 69 63 65 73 0a 2f 2f  .char_indices.//
49d0: 2f 20 5b 60 73 74 72 60 5d 3a 20 2e 2e 2f 2e 2e  / [`str`]: ../..
49e0: 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73  /std/primitive.s
49f0: 74 72 2e 68 74 6d 6c 0a 23 5b 64 65 72 69 76 65  tr.html.#[derive
4a00: 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 29 5d 0a  (Clone, Debug)].
4a10: 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
4a20: 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63   = "rust1", sinc
4a30: 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 70 75  e = "1.0.0")].pu
4a40: 62 20 73 74 72 75 63 74 20 43 68 61 72 49 6e 64  b struct CharInd
4a50: 69 63 65 73 3c 27 61 3e 20 7b 0a 20 20 20 20 66  ices<'a> {.    f
4a60: 72 6f 6e 74 5f 6f 66 66 73 65 74 3a 20 75 73 69  ront_offset: usi
4a70: 7a 65 2c 0a 20 20 20 20 69 74 65 72 3a 20 43 68  ze,.    iter: Ch
4a80: 61 72 73 3c 27 61 3e 2c 0a 7d 0a 0a 23 5b 73 74  ars<'a>,.}..#[st
4a90: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
4aa0: 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20  rust1", since = 
4ab0: 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c 3c 27  "1.0.0")].impl<'
4ac0: 61 3e 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  a> Iterator for 
4ad0: 43 68 61 72 49 6e 64 69 63 65 73 3c 27 61 3e 20  CharIndices<'a> 
4ae0: 7b 0a 20 20 20 20 74 79 70 65 20 49 74 65 6d 20  {.    type Item 
4af0: 3d 20 28 75 73 69 7a 65 2c 20 63 68 61 72 29 3b  = (usize, char);
4b00: 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
4b10: 20 20 20 20 66 6e 20 6e 65 78 74 28 26 6d 75 74      fn next(&mut
4b20: 20 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e   self) -> Option
4b30: 3c 28 75 73 69 7a 65 2c 20 63 68 61 72 29 3e 20  <(usize, char)> 
4b40: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 72  {.        let pr
4b50: 65 5f 6c 65 6e 20 3d 20 73 65 6c 66 2e 69 74 65  e_len = self.ite
4b60: 72 2e 69 74 65 72 2e 6c 65 6e 28 29 3b 0a 20 20  r.iter.len();.  
4b70: 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66        match self
4b80: 2e 69 74 65 72 2e 6e 65 78 74 28 29 20 7b 0a 20  .iter.next() {. 
4b90: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e 65 20             None 
4ba0: 3d 3e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  => None,.       
4bb0: 20 20 20 20 20 53 6f 6d 65 28 63 68 29 20 3d 3e       Some(ch) =>
4bc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4bd0: 20 20 20 6c 65 74 20 69 6e 64 65 78 20 3d 20 73     let index = s
4be0: 65 6c 66 2e 66 72 6f 6e 74 5f 6f 66 66 73 65 74  elf.front_offset
4bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c00: 20 20 6c 65 74 20 6c 65 6e 20 3d 20 73 65 6c 66    let len = self
4c10: 2e 69 74 65 72 2e 69 74 65 72 2e 6c 65 6e 28 29  .iter.iter.len()
4c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c30: 20 20 73 65 6c 66 2e 66 72 6f 6e 74 5f 6f 66 66    self.front_off
4c40: 73 65 74 20 2b 3d 20 70 72 65 5f 6c 65 6e 20 2d  set += pre_len -
4c50: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   len;.          
4c60: 20 20 20 20 20 20 53 6f 6d 65 28 28 69 6e 64 65        Some((inde
4c70: 78 2c 20 63 68 29 29 0a 20 20 20 20 20 20 20 20  x, ch)).        
4c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4c90: 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c      }..    #[inl
4ca0: 69 6e 65 5d 0a 20 20 20 20 66 6e 20 63 6f 75 6e  ine].    fn coun
4cb0: 74 28 73 65 6c 66 29 20 2d 3e 20 75 73 69 7a 65  t(self) -> usize
4cc0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
4cd0: 69 74 65 72 2e 63 6f 75 6e 74 28 29 0a 20 20 20  iter.count().   
4ce0: 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65   }..    #[inline
4cf0: 5d 0a 20 20 20 20 66 6e 20 73 69 7a 65 5f 68 69  ].    fn size_hi
4d00: 6e 74 28 26 73 65 6c 66 29 20 2d 3e 20 28 75 73  nt(&self) -> (us
4d10: 69 7a 65 2c 20 4f 70 74 69 6f 6e 3c 75 73 69 7a  ize, Option<usiz
4d20: 65 3e 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65  e>) {.        se
4d30: 6c 66 2e 69 74 65 72 2e 73 69 7a 65 5f 68 69 6e  lf.iter.size_hin
4d40: 74 28 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  t().    }..    #
4d50: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20  [inline].    fn 
4d60: 6c 61 73 74 28 6d 75 74 20 73 65 6c 66 29 20 2d  last(mut self) -
4d70: 3e 20 4f 70 74 69 6f 6e 3c 28 75 73 69 7a 65 2c  > Option<(usize,
4d80: 20 63 68 61 72 29 3e 20 7b 0a 20 20 20 20 20 20   char)> {.      
4d90: 20 20 2f 2f 20 4e 6f 20 6e 65 65 64 20 74 6f 20    // No need to 
4da0: 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  go through the e
4db0: 6e 74 69 72 65 20 73 74 72 69 6e 67 2e 0a 20 20  ntire string..  
4dc0: 20 20 20 20 20 20 73 65 6c 66 2e 6e 65 78 74 5f        self.next_
4dd0: 62 61 63 6b 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a  back().    }.}..
4de0: 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
4df0: 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63   = "rust1", sinc
4e00: 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 69 6d  e = "1.0.0")].im
4e10: 70 6c 3c 27 61 3e 20 44 6f 75 62 6c 65 45 6e 64  pl<'a> DoubleEnd
4e20: 65 64 49 74 65 72 61 74 6f 72 20 66 6f 72 20 43  edIterator for C
4e30: 68 61 72 49 6e 64 69 63 65 73 3c 27 61 3e 20 7b  harIndices<'a> {
4e40: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
4e50: 20 20 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28     fn next_back(
4e60: 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70  &mut self) -> Op
4e70: 74 69 6f 6e 3c 28 75 73 69 7a 65 2c 20 63 68 61  tion<(usize, cha
4e80: 72 29 3e 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  r)> {.        ma
4e90: 74 63 68 20 73 65 6c 66 2e 69 74 65 72 2e 6e 65  tch self.iter.ne
4ea0: 78 74 5f 62 61 63 6b 28 29 20 7b 0a 20 20 20 20  xt_back() {.    
4eb0: 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20          None => 
4ec0: 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
4ed0: 20 20 53 6f 6d 65 28 63 68 29 20 3d 3e 20 7b 0a    Some(ch) => {.
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 6c 65 74 20 69 6e 64 65 78 20 3d 20 73 65 6c 66  let index = self
4f00: 2e 66 72 6f 6e 74 5f 6f 66 66 73 65 74 20 2b 20  .front_offset + 
4f10: 73 65 6c 66 2e 69 74 65 72 2e 69 74 65 72 2e 6c  self.iter.iter.l
4f20: 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en();.          
4f30: 20 20 20 20 20 20 53 6f 6d 65 28 28 69 6e 64 65        Some((inde
4f40: 78 2c 20 63 68 29 29 0a 20 20 20 20 20 20 20 20  x, ch)).        
4f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4f60: 20 20 20 20 7d 0a 7d 0a 0a 23 5b 75 6e 73 74 61      }.}..#[unsta
4f70: 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 66  ble(feature = "f
4f80: 75 73 65 64 22 2c 20 69 73 73 75 65 20 3d 20 22  used", issue = "
4f90: 33 35 36 30 32 22 29 5d 0a 69 6d 70 6c 3c 27 61  35602")].impl<'a
4fa0: 3e 20 46 75 73 65 64 49 74 65 72 61 74 6f 72 20  > FusedIterator 
4fb0: 66 6f 72 20 43 68 61 72 49 6e 64 69 63 65 73 3c  for CharIndices<
4fc0: 27 61 3e 20 7b 7d 0a 0a 69 6d 70 6c 3c 27 61 3e  'a> {}..impl<'a>
4fd0: 20 43 68 61 72 49 6e 64 69 63 65 73 3c 27 61 3e   CharIndices<'a>
4fe0: 20 7b 0a 20 20 20 20 2f 2f 2f 20 56 69 65 77 20   {.    /// View 
4ff0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
5000: 61 74 61 20 61 73 20 61 20 73 75 62 73 6c 69 63  ata as a subslic
5010: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
5020: 6c 20 64 61 74 61 2e 0a 20 20 20 20 2f 2f 2f 0a  l data..    ///.
5030: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 68 61 73      /// This has
5040: 20 74 68 65 20 73 61 6d 65 20 6c 69 66 65 74 69   the same lifeti
5050: 6d 65 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  me as the origin
5060: 61 6c 20 73 6c 69 63 65 2c 20 61 6e 64 20 73 6f  al slice, and so
5070: 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 69 74 65   the.    /// ite
5080: 72 61 74 6f 72 20 63 61 6e 20 63 6f 6e 74 69 6e  rator can contin
5090: 75 65 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ue to be used wh
50a0: 69 6c 65 20 74 68 69 73 20 65 78 69 73 74 73 2e  ile this exists.
50b0: 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65  .    #[stable(fe
50c0: 61 74 75 72 65 20 3d 20 22 69 74 65 72 5f 74 6f  ature = "iter_to
50d0: 5f 73 6c 69 63 65 22 2c 20 73 69 6e 63 65 20 3d  _slice", since =
50e0: 20 22 31 2e 34 2e 30 22 29 5d 0a 20 20 20 20 23   "1.4.0")].    #
50f0: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 70 75 62  [inline].    pub
5100: 20 66 6e 20 61 73 5f 73 74 72 28 26 73 65 6c 66   fn as_str(&self
5110: 29 20 2d 3e 20 26 27 61 20 73 74 72 20 7b 0a 20  ) -> &'a str {. 
5120: 20 20 20 20 20 20 20 73 65 6c 66 2e 69 74 65 72         self.iter
5130: 2e 61 73 5f 73 74 72 28 29 0a 20 20 20 20 7d 0a  .as_str().    }.
5140: 7d 0a 0a 2f 2f 2f 20 41 6e 20 69 74 65 72 61 74  }../// An iterat
5150: 6f 72 20 6f 76 65 72 20 74 68 65 20 62 79 74 65  or over the byte
5160: 73 20 6f 66 20 61 20 73 74 72 69 6e 67 20 73 6c  s of a string sl
5170: 69 63 65 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 69  ice..///./// Thi
5180: 73 20 73 74 72 75 63 74 20 69 73 20 63 72 65 61  s struct is crea
5190: 74 65 64 20 62 79 20 74 68 65 20 5b 60 62 79 74  ted by the [`byt
51a0: 65 73 60 5d 20 6d 65 74 68 6f 64 20 6f 6e 20 5b  es`] method on [
51b0: 60 73 74 72 60 5d 2e 0a 2f 2f 2f 20 53 65 65 20  `str`]../// See 
51c0: 69 74 73 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  its documentatio
51d0: 6e 20 66 6f 72 20 6d 6f 72 65 2e 0a 2f 2f 2f 0a  n for more..///.
51e0: 2f 2f 2f 20 5b 60 62 79 74 65 73 60 5d 3a 20 2e  /// [`bytes`]: .
51f0: 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69  ./../std/primiti
5200: 76 65 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68  ve.str.html#meth
5210: 6f 64 2e 62 79 74 65 73 0a 2f 2f 2f 20 5b 60 73  od.bytes./// [`s
5220: 74 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f  tr`]: ../../std/
5230: 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68 74  primitive.str.ht
5240: 6d 6c 0a 23 5b 73 74 61 62 6c 65 28 66 65 61 74  ml.#[stable(feat
5250: 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73  ure = "rust1", s
5260: 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d  ince = "1.0.0")]
5270: 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c  .#[derive(Clone,
5280: 20 44 65 62 75 67 29 5d 0a 70 75 62 20 73 74 72   Debug)].pub str
5290: 75 63 74 20 42 79 74 65 73 3c 27 61 3e 28 43 6c  uct Bytes<'a>(Cl
52a0: 6f 6e 65 64 3c 73 6c 69 63 65 3a 3a 49 74 65 72  oned<slice::Iter
52b0: 3c 27 61 2c 20 75 38 3e 3e 29 3b 0a 0a 23 5b 73  <'a, u8>>);..#[s
52c0: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
52d0: 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d  "rust1", since =
52e0: 20 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c 3c   "1.0.0")].impl<
52f0: 27 61 3e 20 49 74 65 72 61 74 6f 72 20 66 6f 72  'a> Iterator for
5300: 20 42 79 74 65 73 3c 27 61 3e 20 7b 0a 20 20 20   Bytes<'a> {.   
5310: 20 74 79 70 65 20 49 74 65 6d 20 3d 20 75 38 3b   type Item = u8;
5320: 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
5330: 20 20 20 20 66 6e 20 6e 65 78 74 28 26 6d 75 74      fn next(&mut
5340: 20 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e   self) -> Option
5350: 3c 75 38 3e 20 7b 0a 20 20 20 20 20 20 20 20 73  <u8> {.        s
5360: 65 6c 66 2e 30 2e 6e 65 78 74 28 29 0a 20 20 20  elf.0.next().   
5370: 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65   }..    #[inline
5380: 5d 0a 20 20 20 20 66 6e 20 73 69 7a 65 5f 68 69  ].    fn size_hi
5390: 6e 74 28 26 73 65 6c 66 29 20 2d 3e 20 28 75 73  nt(&self) -> (us
53a0: 69 7a 65 2c 20 4f 70 74 69 6f 6e 3c 75 73 69 7a  ize, Option<usiz
53b0: 65 3e 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65  e>) {.        se
53c0: 6c 66 2e 30 2e 73 69 7a 65 5f 68 69 6e 74 28 29  lf.0.size_hint()
53d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
53e0: 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 63 6f 75  line].    fn cou
53f0: 6e 74 28 73 65 6c 66 29 20 2d 3e 20 75 73 69 7a  nt(self) -> usiz
5400: 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  e {.        self
5410: 2e 30 2e 63 6f 75 6e 74 28 29 0a 20 20 20 20 7d  .0.count().    }
5420: 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
5430: 20 20 20 20 66 6e 20 6c 61 73 74 28 73 65 6c 66      fn last(self
5440: 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 53 65 6c 66  ) -> Option<Self
5450: 3a 3a 49 74 65 6d 3e 20 7b 0a 20 20 20 20 20 20  ::Item> {.      
5460: 20 20 73 65 6c 66 2e 30 2e 6c 61 73 74 28 29 0a    self.0.last().
5470: 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c      }..    #[inl
5480: 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 74 68 28  ine].    fn nth(
5490: 26 6d 75 74 20 73 65 6c 66 2c 20 6e 3a 20 75 73  &mut self, n: us
54a0: 69 7a 65 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 53  ize) -> Option<S
54b0: 65 6c 66 3a 3a 49 74 65 6d 3e 20 7b 0a 20 20 20  elf::Item> {.   
54c0: 20 20 20 20 20 73 65 6c 66 2e 30 2e 6e 74 68 28       self.0.nth(
54d0: 6e 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 73 74  n).    }.}..#[st
54e0: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
54f0: 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20  rust1", since = 
5500: 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c 3c 27  "1.0.0")].impl<'
5510: 61 3e 20 44 6f 75 62 6c 65 45 6e 64 65 64 49 74  a> DoubleEndedIt
5520: 65 72 61 74 6f 72 20 66 6f 72 20 42 79 74 65 73  erator for Bytes
5530: 3c 27 61 3e 20 7b 0a 20 20 20 20 23 5b 69 6e 6c  <'a> {.    #[inl
5540: 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 65 78 74  ine].    fn next
5550: 5f 62 61 63 6b 28 26 6d 75 74 20 73 65 6c 66 29  _back(&mut self)
5560: 20 2d 3e 20 4f 70 74 69 6f 6e 3c 75 38 3e 20 7b   -> Option<u8> {
5570: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 30 2e  .        self.0.
5580: 6e 65 78 74 5f 62 61 63 6b 28 29 0a 20 20 20 20  next_back().    
5590: 7d 0a 7d 0a 0a 23 5b 73 74 61 62 6c 65 28 66 65  }.}..#[stable(fe
55a0: 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c  ature = "rust1",
55b0: 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22   since = "1.0.0"
55c0: 29 5d 0a 69 6d 70 6c 3c 27 61 3e 20 45 78 61 63  )].impl<'a> Exac
55d0: 74 53 69 7a 65 49 74 65 72 61 74 6f 72 20 66 6f  tSizeIterator fo
55e0: 72 20 42 79 74 65 73 3c 27 61 3e 20 7b 0a 20 20  r Bytes<'a> {.  
55f0: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
5600: 66 6e 20 6c 65 6e 28 26 73 65 6c 66 29 20 2d 3e  fn len(&self) ->
5610: 20 75 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20   usize {.       
5620: 20 73 65 6c 66 2e 30 2e 6c 65 6e 28 29 0a 20 20   self.0.len().  
5630: 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e    }..    #[inlin
5640: 65 5d 0a 20 20 20 20 66 6e 20 69 73 5f 65 6d 70  e].    fn is_emp
5650: 74 79 28 26 73 65 6c 66 29 20 2d 3e 20 62 6f 6f  ty(&self) -> boo
5660: 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  l {.        self
5670: 2e 30 2e 69 73 5f 65 6d 70 74 79 28 29 0a 20 20  .0.is_empty().  
5680: 20 20 7d 0a 7d 0a 0a 23 5b 75 6e 73 74 61 62 6c    }.}..#[unstabl
5690: 65 28 66 65 61 74 75 72 65 20 3d 20 22 66 75 73  e(feature = "fus
56a0: 65 64 22 2c 20 69 73 73 75 65 20 3d 20 22 33 35  ed", issue = "35
56b0: 36 30 32 22 29 5d 0a 69 6d 70 6c 3c 27 61 3e 20  602")].impl<'a> 
56c0: 46 75 73 65 64 49 74 65 72 61 74 6f 72 20 66 6f  FusedIterator fo
56d0: 72 20 42 79 74 65 73 3c 27 61 3e 20 7b 7d 0a 0a  r Bytes<'a> {}..
56e0: 2f 2f 2f 20 54 68 69 73 20 6d 61 63 72 6f 20 67  /// This macro g
56f0: 65 6e 65 72 61 74 65 73 20 61 20 43 6c 6f 6e 65  enerates a Clone
5700: 20 69 6d 70 6c 20 66 6f 72 20 73 74 72 69 6e 67   impl for string
5710: 20 70 61 74 74 65 72 6e 20 41 50 49 0a 2f 2f 2f   pattern API.///
5720: 20 77 72 61 70 70 65 72 20 74 79 70 65 73 20 6f   wrapper types o
5730: 66 20 74 68 65 20 66 6f 72 6d 20 58 3c 27 61 2c  f the form X<'a,
5740: 20 50 3e 0a 6d 61 63 72 6f 5f 72 75 6c 65 73 21   P>.macro_rules!
5750: 20 64 65 72 69 76 65 5f 70 61 74 74 65 72 6e 5f   derive_pattern_
5760: 63 6c 6f 6e 65 20 7b 0a 20 20 20 20 28 63 6c 6f  clone {.    (clo
5770: 6e 65 20 24 74 3a 69 64 65 6e 74 20 77 69 74 68  ne $t:ident with
5780: 20 7c 24 73 3a 69 64 65 6e 74 7c 20 24 65 3a 65   |$s:ident| $e:e
5790: 78 70 72 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  xpr) => {.      
57a0: 20 20 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61    impl<'a, P: Pa
57b0: 74 74 65 72 6e 3c 27 61 3e 3e 20 43 6c 6f 6e 65  ttern<'a>> Clone
57c0: 20 66 6f 72 20 24 74 3c 27 61 2c 20 50 3e 0a 20   for $t<'a, P>. 
57d0: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
57e0: 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 43 6c   P::Searcher: Cl
57f0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  one.        {.  
5800: 20 20 20 20 20 20 20 20 20 20 66 6e 20 63 6c 6f            fn clo
5810: 6e 65 28 26 73 65 6c 66 29 20 2d 3e 20 53 65 6c  ne(&self) -> Sel
5820: 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
5830: 20 20 20 20 6c 65 74 20 24 73 20 3d 20 73 65 6c      let $s = sel
5840: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f;.             
5850: 20 20 20 24 65 0a 20 20 20 20 20 20 20 20 20 20     $e.          
5860: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5870: 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 54 68 69 73 20    }.}../// This 
5880: 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
5890: 74 77 6f 20 70 75 62 6c 69 63 20 69 74 65 72 61  two public itera
58a0: 74 6f 72 20 73 74 72 75 63 74 73 0a 2f 2f 2f 20  tor structs./// 
58b0: 77 72 61 70 70 69 6e 67 20 61 20 70 72 69 76 61  wrapping a priva
58c0: 74 65 20 69 6e 74 65 72 6e 61 6c 20 6f 6e 65 20  te internal one 
58d0: 74 68 61 74 20 6d 61 6b 65 73 20 75 73 65 20 6f  that makes use o
58e0: 66 20 74 68 65 20 60 50 61 74 74 65 72 6e 60 20  f the `Pattern` 
58f0: 41 50 49 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 46 6f 72  API..///./// For
5900: 20 61 6c 6c 20 70 61 74 74 65 72 6e 73 20 60 50   all patterns `P
5910: 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 60 20 74  : Pattern<'a>` t
5920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 65  he following ite
5930: 6d 73 20 77 69 6c 6c 20 62 65 0a 2f 2f 2f 20 67  ms will be./// g
5940: 65 6e 65 72 61 74 65 64 20 28 67 65 6e 65 72 69  enerated (generi
5950: 63 73 20 6f 6d 69 74 74 65 64 29 3a 0a 2f 2f 2f  cs omitted):.///
5960: 0a 2f 2f 2f 20 73 74 72 75 63 74 20 24 66 6f 72  ./// struct $for
5970: 77 61 72 64 5f 69 74 65 72 61 74 6f 72 28 24 69  ward_iterator($i
5980: 6e 74 65 72 6e 61 6c 5f 69 74 65 72 61 74 6f 72  nternal_iterator
5990: 29 3b 0a 2f 2f 2f 20 73 74 72 75 63 74 20 24 72  );./// struct $r
59a0: 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f 72 28  everse_iterator(
59b0: 24 69 6e 74 65 72 6e 61 6c 5f 69 74 65 72 61 74  $internal_iterat
59c0: 6f 72 29 3b 0a 2f 2f 2f 0a 2f 2f 2f 20 69 6d 70  or);.///./// imp
59d0: 6c 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 24  l Iterator for $
59e0: 66 6f 72 77 61 72 64 5f 69 74 65 72 61 74 6f 72  forward_iterator
59f0: 0a 2f 2f 2f 20 7b 20 2f 2a 20 69 6e 74 65 72 6e  ./// { /* intern
5a00: 61 6c 20 65 6e 64 73 20 75 70 20 63 61 6c 6c 69  al ends up calli
5a10: 6e 67 20 53 65 61 72 63 68 65 72 3a 3a 6e 65 78  ng Searcher::nex
5a20: 74 5f 6d 61 74 63 68 28 29 20 2a 2f 20 7d 0a 2f  t_match() */ }./
5a30: 2f 2f 0a 2f 2f 2f 20 69 6d 70 6c 20 44 6f 75 62  //./// impl Doub
5a40: 6c 65 45 6e 64 65 64 49 74 65 72 61 74 6f 72 20  leEndedIterator 
5a50: 66 6f 72 20 24 66 6f 72 77 61 72 64 5f 69 74 65  for $forward_ite
5a60: 72 61 74 6f 72 0a 2f 2f 2f 20 20 20 20 20 20 20  rator.///       
5a70: 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65  where P::Searche
5a80: 72 3a 20 44 6f 75 62 6c 65 45 6e 64 65 64 53 65  r: DoubleEndedSe
5a90: 61 72 63 68 65 72 0a 2f 2f 2f 20 7b 20 2f 2a 20  archer./// { /* 
5aa0: 69 6e 74 65 72 6e 61 6c 20 65 6e 64 73 20 75 70  internal ends up
5ab0: 20 63 61 6c 6c 69 6e 67 20 53 65 61 72 63 68 65   calling Searche
5ac0: 72 3a 3a 6e 65 78 74 5f 6d 61 74 63 68 5f 62 61  r::next_match_ba
5ad0: 63 6b 28 29 20 2a 2f 20 7d 0a 2f 2f 2f 0a 2f 2f  ck() */ }.///.//
5ae0: 2f 20 69 6d 70 6c 20 49 74 65 72 61 74 6f 72 20  / impl Iterator 
5af0: 66 6f 72 20 24 72 65 76 65 72 73 65 5f 69 74 65  for $reverse_ite
5b00: 72 61 74 6f 72 0a 2f 2f 2f 20 20 20 20 20 20 20  rator.///       
5b10: 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65  where P::Searche
5b20: 72 3a 20 52 65 76 65 72 73 65 53 65 61 72 63 68  r: ReverseSearch
5b30: 65 72 0a 2f 2f 2f 20 7b 20 2f 2a 20 69 6e 74 65  er./// { /* inte
5b40: 72 6e 61 6c 20 65 6e 64 73 20 75 70 20 63 61 6c  rnal ends up cal
5b50: 6c 69 6e 67 20 53 65 61 72 63 68 65 72 3a 3a 6e  ling Searcher::n
5b60: 65 78 74 5f 6d 61 74 63 68 5f 62 61 63 6b 28 29  ext_match_back()
5b70: 20 2a 2f 20 7d 0a 2f 2f 2f 0a 2f 2f 2f 20 69 6d   */ }.///./// im
5b80: 70 6c 20 44 6f 75 62 6c 65 45 6e 64 65 64 49 74  pl DoubleEndedIt
5b90: 65 72 61 74 6f 72 20 66 6f 72 20 24 72 65 76 65  erator for $reve
5ba0: 72 73 65 5f 69 74 65 72 61 74 6f 72 0a 2f 2f 2f  rse_iterator.///
5bb0: 20 20 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a         where P::
5bc0: 53 65 61 72 63 68 65 72 3a 20 44 6f 75 62 6c 65  Searcher: Double
5bd0: 45 6e 64 65 64 53 65 61 72 63 68 65 72 0a 2f 2f  EndedSearcher.//
5be0: 2f 20 7b 20 2f 2a 20 69 6e 74 65 72 6e 61 6c 20  / { /* internal 
5bf0: 65 6e 64 73 20 75 70 20 63 61 6c 6c 69 6e 67 20  ends up calling 
5c00: 53 65 61 72 63 68 65 72 3a 3a 6e 65 78 74 5f 6d  Searcher::next_m
5c10: 61 74 63 68 28 29 20 2a 2f 20 7d 0a 2f 2f 2f 0a  atch() */ }.///.
5c20: 2f 2f 2f 20 54 68 65 20 69 6e 74 65 72 6e 61 6c  /// The internal
5c30: 20 6f 6e 65 20 69 73 20 64 65 66 69 6e 65 64 20   one is defined 
5c40: 6f 75 74 73 69 64 65 20 74 68 65 20 6d 61 63 72  outside the macr
5c50: 6f 2c 20 61 6e 64 20 68 61 73 20 61 6c 6d 6f 73  o, and has almos
5c60: 74 20 74 68 65 20 73 61 6d 65 0a 2f 2f 2f 20 73  t the same./// s
5c70: 65 6d 61 6e 74 69 63 20 61 73 20 61 20 44 6f 75  emantic as a Dou
5c80: 62 6c 65 45 6e 64 65 64 49 74 65 72 61 74 6f 72  bleEndedIterator
5c90: 20 62 79 20 64 65 6c 65 67 61 74 69 6e 67 20 74   by delegating t
5ca0: 6f 20 60 70 61 74 74 65 72 6e 3a 3a 53 65 61 72  o `pattern::Sear
5cb0: 63 68 65 72 60 20 61 6e 64 0a 2f 2f 2f 20 60 70  cher` and./// `p
5cc0: 61 74 74 65 72 6e 3a 3a 52 65 76 65 72 73 65 53  attern::ReverseS
5cd0: 65 61 72 63 68 65 72 60 20 66 6f 72 20 62 6f 74  earcher` for bot
5ce0: 68 20 66 6f 72 77 61 72 64 20 61 6e 64 20 72 65  h forward and re
5cf0: 76 65 72 73 65 20 69 74 65 72 61 74 69 6f 6e 2e  verse iteration.
5d00: 0a 2f 2f 2f 0a 2f 2f 2f 20 22 41 6c 6d 6f 73 74  .///./// "Almost
5d10: 22 2c 20 62 65 63 61 75 73 65 20 61 20 60 53 65  ", because a `Se
5d20: 61 72 63 68 65 72 60 20 61 6e 64 20 61 20 60 52  archer` and a `R
5d30: 65 76 65 72 73 65 53 65 61 72 63 68 65 72 60 20  everseSearcher` 
5d40: 66 6f 72 20 61 20 67 69 76 65 6e 0a 2f 2f 2f 20  for a given./// 
5d50: 60 50 61 74 74 65 72 6e 60 20 6d 69 67 68 74 20  `Pattern` might 
5d60: 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  not return the s
5d70: 61 6d 65 20 65 6c 65 6d 65 6e 74 73 2c 20 73 6f  ame elements, so
5d80: 20 61 63 74 75 61 6c 6c 79 20 69 6d 70 6c 65 6d   actually implem
5d90: 65 6e 74 69 6e 67 0a 2f 2f 2f 20 60 44 6f 75 62  enting./// `Doub
5da0: 6c 65 45 6e 64 65 64 49 74 65 72 61 74 6f 72 60  leEndedIterator`
5db0: 20 66 6f 72 20 69 74 20 77 6f 75 6c 64 20 62 65   for it would be
5dc0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2f 2f 2f 20   incorrect../// 
5dd0: 28 53 65 65 20 74 68 65 20 64 6f 63 73 20 69 6e  (See the docs in
5de0: 20 60 73 74 72 3a 3a 70 61 74 74 65 72 6e 60 20   `str::pattern` 
5df0: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
5e00: 29 0a 2f 2f 2f 0a 2f 2f 2f 20 48 6f 77 65 76 65  ).///./// Howeve
5e10: 72 2c 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  r, the internal 
5e20: 73 74 72 75 63 74 20 73 74 69 6c 6c 20 72 65 70  struct still rep
5e30: 72 65 73 65 6e 74 73 20 61 20 73 69 6e 67 6c 65  resents a single
5e40: 20 65 6e 64 65 64 20 69 74 65 72 61 74 6f 72 20   ended iterator 
5e50: 66 72 6f 6d 0a 2f 2f 2f 20 65 69 74 68 65 72 20  from./// either 
5e60: 65 6e 64 2c 20 61 6e 64 20 64 65 70 65 6e 64 69  end, and dependi
5e70: 6e 67 20 6f 6e 20 70 61 74 74 65 72 6e 20 69 73  ng on pattern is
5e80: 20 61 6c 73 6f 20 61 20 76 61 6c 69 64 20 64 6f   also a valid do
5e90: 75 62 6c 65 20 65 6e 64 65 64 20 69 74 65 72 61  uble ended itera
5ea0: 74 6f 72 2c 0a 2f 2f 2f 20 73 6f 20 74 68 65 20  tor,./// so the 
5eb0: 74 77 6f 20 77 72 61 70 70 65 72 20 73 74 72 75  two wrapper stru
5ec0: 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74 20 60 49  cts implement `I
5ed0: 74 65 72 61 74 6f 72 60 0a 2f 2f 2f 20 61 6e 64  terator`./// and
5ee0: 20 60 44 6f 75 62 6c 65 45 6e 64 65 64 49 74 65   `DoubleEndedIte
5ef0: 72 61 74 6f 72 60 20 64 65 70 65 6e 64 69 6e 67  rator` depending
5f00: 20 6f 6e 20 74 68 65 20 63 6f 6e 63 72 65 74 65   on the concrete
5f10: 20 70 61 74 74 65 72 6e 20 74 79 70 65 2c 20 6c   pattern type, l
5f20: 65 61 64 69 6e 67 0a 2f 2f 2f 20 74 6f 20 74 68  eading./// to th
5f30: 65 20 63 6f 6d 70 6c 65 78 20 69 6d 70 6c 73 20  e complex impls 
5f40: 73 65 65 6e 20 61 62 6f 76 65 2e 0a 6d 61 63 72  seen above..macr
5f50: 6f 5f 72 75 6c 65 73 21 20 67 65 6e 65 72 61 74  o_rules! generat
5f60: 65 5f 70 61 74 74 65 72 6e 5f 69 74 65 72 61 74  e_pattern_iterat
5f70: 6f 72 73 20 7b 0a 20 20 20 20 7b 0a 20 20 20 20  ors {.    {.    
5f80: 20 20 20 20 2f 2f 20 46 6f 72 77 61 72 64 20 69      // Forward i
5f90: 74 65 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20  terator.        
5fa0: 66 6f 72 77 61 72 64 3a 0a 20 20 20 20 20 20 20  forward:.       
5fb0: 20 20 20 20 20 24 28 23 5b 24 66 6f 72 77 61 72       $(#[$forwar
5fc0: 64 5f 69 74 65 72 61 74 6f 72 5f 61 74 74 72 69  d_iterator_attri
5fd0: 62 75 74 65 3a 6d 65 74 61 5d 29 2a 0a 20 20 20  bute:meta])*.   
5fe0: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
5ff0: 24 66 6f 72 77 61 72 64 5f 69 74 65 72 61 74 6f  $forward_iterato
6000: 72 3a 69 64 65 6e 74 3b 0a 0a 20 20 20 20 20 20  r:ident;..      
6010: 20 20 2f 2f 20 52 65 76 65 72 73 65 20 69 74 65    // Reverse ite
6020: 72 61 74 6f 72 0a 20 20 20 20 20 20 20 20 72 65  rator.        re
6030: 76 65 72 73 65 3a 0a 20 20 20 20 20 20 20 20 20  verse:.         
6040: 20 20 20 24 28 23 5b 24 72 65 76 65 72 73 65 5f     $(#[$reverse_
6050: 69 74 65 72 61 74 6f 72 5f 61 74 74 72 69 62 75  iterator_attribu
6060: 74 65 3a 6d 65 74 61 5d 29 2a 0a 20 20 20 20 20  te:meta])*.     
6070: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 24 72         struct $r
6080: 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f 72 3a  everse_iterator:
6090: 69 64 65 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20  ident;..        
60a0: 2f 2f 20 53 74 61 62 69 6c 69 74 79 20 6f 66 20  // Stability of 
60b0: 61 6c 6c 20 67 65 6e 65 72 61 74 65 64 20 69 74  all generated it
60c0: 65 6d 73 0a 20 20 20 20 20 20 20 20 73 74 61 62  ems.        stab
60d0: 69 6c 69 74 79 3a 0a 20 20 20 20 20 20 20 20 20  ility:.         
60e0: 20 20 20 24 28 23 5b 24 63 6f 6d 6d 6f 6e 5f 73     $(#[$common_s
60f0: 74 61 62 69 6c 69 74 79 5f 61 74 74 72 69 62 75  tability_attribu
6100: 74 65 3a 6d 65 74 61 5d 29 2a 0a 0a 20 20 20 20  te:meta])*..    
6110: 20 20 20 20 2f 2f 20 49 6e 74 65 72 6e 61 6c 20      // Internal 
6120: 61 6c 6d 6f 73 74 2d 69 74 65 72 61 74 6f 72 20  almost-iterator 
6130: 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
6140: 6c 65 67 61 74 65 64 20 74 6f 0a 20 20 20 20 20  legated to.     
6150: 20 20 20 69 6e 74 65 72 6e 61 6c 3a 0a 20 20 20     internal:.   
6160: 20 20 20 20 20 20 20 20 20 24 69 6e 74 65 72 6e           $intern
6170: 61 6c 5f 69 74 65 72 61 74 6f 72 3a 69 64 65 6e  al_iterator:iden
6180: 74 20 79 69 65 6c 64 69 6e 67 20 28 24 69 74 65  t yielding ($ite
6190: 72 74 79 3a 74 79 29 3b 0a 0a 20 20 20 20 20 20  rty:ty);..      
61a0: 20 20 2f 2f 20 4b 69 6e 64 20 6f 66 20 64 65 6c    // Kind of del
61b0: 67 61 74 69 6f 6e 20 2d 20 65 69 74 68 65 72 20  gation - either 
61c0: 73 69 6e 67 6c 65 20 65 6e 64 65 64 20 6f 72 20  single ended or 
61d0: 64 6f 75 62 6c 65 20 65 6e 64 65 64 0a 20 20 20  double ended.   
61e0: 20 20 20 20 20 64 65 6c 65 67 61 74 65 20 24 28       delegate $(
61f0: 24 74 3a 74 74 29 2a 0a 20 20 20 20 7d 20 3d 3e  $t:tt)*.    } =>
6200: 20 7b 0a 20 20 20 20 20 20 20 20 24 28 23 5b 24   {.        $(#[$
6210: 66 6f 72 77 61 72 64 5f 69 74 65 72 61 74 6f 72  forward_iterator
6220: 5f 61 74 74 72 69 62 75 74 65 5d 29 2a 0a 20 20  _attribute])*.  
6230: 20 20 20 20 20 20 24 28 23 5b 24 63 6f 6d 6d 6f        $(#[$commo
6240: 6e 5f 73 74 61 62 69 6c 69 74 79 5f 61 74 74 72  n_stability_attr
6250: 69 62 75 74 65 5d 29 2a 0a 20 20 20 20 20 20 20  ibute])*.       
6260: 20 70 75 62 20 73 74 72 75 63 74 20 24 66 6f 72   pub struct $for
6270: 77 61 72 64 5f 69 74 65 72 61 74 6f 72 3c 27 61  ward_iterator<'a
6280: 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
6290: 3e 28 24 69 6e 74 65 72 6e 61 6c 5f 69 74 65 72  >($internal_iter
62a0: 61 74 6f 72 3c 27 61 2c 20 50 3e 29 3b 0a 0a 20  ator<'a, P>);.. 
62b0: 20 20 20 20 20 20 20 24 28 23 5b 24 63 6f 6d 6d         $(#[$comm
62c0: 6f 6e 5f 73 74 61 62 69 6c 69 74 79 5f 61 74 74  on_stability_att
62d0: 72 69 62 75 74 65 5d 29 2a 0a 20 20 20 20 20 20  ribute])*.      
62e0: 20 20 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61    impl<'a, P: Pa
62f0: 74 74 65 72 6e 3c 27 61 3e 3e 20 66 6d 74 3a 3a  ttern<'a>> fmt::
6300: 44 65 62 75 67 20 66 6f 72 20 24 66 6f 72 77 61  Debug for $forwa
6310: 72 64 5f 69 74 65 72 61 74 6f 72 3c 27 61 2c 20  rd_iterator<'a, 
6320: 50 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  P>.            w
6330: 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72  here P::Searcher
6340: 3a 20 66 6d 74 3a 3a 44 65 62 75 67 0a 20 20 20  : fmt::Debug.   
6350: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
6360: 20 20 20 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c     fn fmt(&self,
6370: 20 66 3a 20 26 6d 75 74 20 66 6d 74 3a 3a 46 6f   f: &mut fmt::Fo
6380: 72 6d 61 74 74 65 72 29 20 2d 3e 20 66 6d 74 3a  rmatter) -> fmt:
6390: 3a 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20  :Result {.      
63a0: 20 20 20 20 20 20 20 20 20 20 66 2e 64 65 62 75            f.debu
63b0: 67 5f 74 75 70 6c 65 28 73 74 72 69 6e 67 69 66  g_tuple(stringif
63c0: 79 21 28 24 66 6f 72 77 61 72 64 5f 69 74 65 72  y!($forward_iter
63d0: 61 74 6f 72 29 29 0a 20 20 20 20 20 20 20 20 20  ator)).         
63e0: 20 20 20 20 20 20 20 20 20 20 20 2e 66 69 65 6c             .fiel
63f0: 64 28 26 73 65 6c 66 2e 30 29 0a 20 20 20 20 20  d(&self.0).     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
6410: 66 69 6e 69 73 68 28 29 0a 20 20 20 20 20 20 20  finish().       
6420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6430: 0a 0a 20 20 20 20 20 20 20 20 24 28 23 5b 24 63  ..        $(#[$c
6440: 6f 6d 6d 6f 6e 5f 73 74 61 62 69 6c 69 74 79 5f  ommon_stability_
6450: 61 74 74 72 69 62 75 74 65 5d 29 2a 0a 20 20 20  attribute])*.   
6460: 20 20 20 20 20 69 6d 70 6c 3c 27 61 2c 20 50 3a       impl<'a, P:
6470: 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20 49 74   Pattern<'a>> It
6480: 65 72 61 74 6f 72 20 66 6f 72 20 24 66 6f 72 77  erator for $forw
6490: 61 72 64 5f 69 74 65 72 61 74 6f 72 3c 27 61 2c  ard_iterator<'a,
64a0: 20 50 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   P> {.          
64b0: 20 20 74 79 70 65 20 49 74 65 6d 20 3d 20 24 69    type Item = $i
64c0: 74 65 72 74 79 3b 0a 0a 20 20 20 20 20 20 20 20  terty;..        
64d0: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
64e0: 20 20 20 20 20 20 20 20 20 20 66 6e 20 6e 65 78            fn nex
64f0: 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20  t(&mut self) -> 
6500: 4f 70 74 69 6f 6e 3c 24 69 74 65 72 74 79 3e 20  Option<$iterty> 
6510: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6520: 20 20 73 65 6c 66 2e 30 2e 6e 65 78 74 28 29 0a    self.0.next().
6530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6540: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
6550: 20 24 28 23 5b 24 63 6f 6d 6d 6f 6e 5f 73 74 61   $(#[$common_sta
6560: 62 69 6c 69 74 79 5f 61 74 74 72 69 62 75 74 65  bility_attribute
6570: 5d 29 2a 0a 20 20 20 20 20 20 20 20 69 6d 70 6c  ])*.        impl
6580: 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c  <'a, P: Pattern<
6590: 27 61 3e 3e 20 43 6c 6f 6e 65 20 66 6f 72 20 24  'a>> Clone for $
65a0: 66 6f 72 77 61 72 64 5f 69 74 65 72 61 74 6f 72  forward_iterator
65b0: 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20 20  <'a, P>.        
65c0: 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65 61      where P::Sea
65d0: 72 63 68 65 72 3a 20 43 6c 6f 6e 65 0a 20 20 20  rcher: Clone.   
65e0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
65f0: 20 20 20 66 6e 20 63 6c 6f 6e 65 28 26 73 65 6c     fn clone(&sel
6600: 66 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20 20  f) -> Self {.   
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 6f               $fo
6620: 72 77 61 72 64 5f 69 74 65 72 61 74 6f 72 28 73  rward_iterator(s
6630: 65 6c 66 2e 30 2e 63 6c 6f 6e 65 28 29 29 0a 20  elf.0.clone()). 
6640: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6650: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
6660: 24 28 23 5b 24 72 65 76 65 72 73 65 5f 69 74 65  $(#[$reverse_ite
6670: 72 61 74 6f 72 5f 61 74 74 72 69 62 75 74 65 5d  rator_attribute]
6680: 29 2a 0a 20 20 20 20 20 20 20 20 24 28 23 5b 24  )*.        $(#[$
6690: 63 6f 6d 6d 6f 6e 5f 73 74 61 62 69 6c 69 74 79  common_stability
66a0: 5f 61 74 74 72 69 62 75 74 65 5d 29 2a 0a 20 20  _attribute])*.  
66b0: 20 20 20 20 20 20 70 75 62 20 73 74 72 75 63 74        pub struct
66c0: 20 24 72 65 76 65 72 73 65 5f 69 74 65 72 61 74   $reverse_iterat
66d0: 6f 72 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72  or<'a, P: Patter
66e0: 6e 3c 27 61 3e 3e 28 24 69 6e 74 65 72 6e 61 6c  n<'a>>($internal
66f0: 5f 69 74 65 72 61 74 6f 72 3c 27 61 2c 20 50 3e  _iterator<'a, P>
6700: 29 3b 0a 0a 20 20 20 20 20 20 20 20 24 28 23 5b  );..        $(#[
6710: 24 63 6f 6d 6d 6f 6e 5f 73 74 61 62 69 6c 69 74  $common_stabilit
6720: 79 5f 61 74 74 72 69 62 75 74 65 5d 29 2a 0a 20  y_attribute])*. 
6730: 20 20 20 20 20 20 20 69 6d 70 6c 3c 27 61 2c 20         impl<'a, 
6740: 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20  P: Pattern<'a>> 
6750: 66 6d 74 3a 3a 44 65 62 75 67 20 66 6f 72 20 24  fmt::Debug for $
6760: 72 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f 72  reverse_iterator
6770: 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20 20  <'a, P>.        
6780: 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65 61      where P::Sea
6790: 72 63 68 65 72 3a 20 66 6d 74 3a 3a 44 65 62 75  rcher: fmt::Debu
67a0: 67 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  g.        {.    
67b0: 20 20 20 20 20 20 20 20 66 6e 20 66 6d 74 28 26          fn fmt(&
67c0: 73 65 6c 66 2c 20 66 3a 20 26 6d 75 74 20 66 6d  self, f: &mut fm
67d0: 74 3a 3a 46 6f 72 6d 61 74 74 65 72 29 20 2d 3e  t::Formatter) ->
67e0: 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b 0a 20   fmt::Result {. 
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
6800: 2e 64 65 62 75 67 5f 74 75 70 6c 65 28 73 74 72  .debug_tuple(str
6810: 69 6e 67 69 66 79 21 28 24 72 65 76 65 72 73 65  ingify!($reverse
6820: 5f 69 74 65 72 61 74 6f 72 29 29 0a 20 20 20 20  _iterator)).    
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 2e 66 69 65 6c 64 28 26 73 65 6c 66 2e 30 29 0a  .field(&self.0).
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 2e 66 69 6e 69 73 68 28 29 0a 20 20      .finish().  
6870: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6880: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 24      }..        $
6890: 28 23 5b 24 63 6f 6d 6d 6f 6e 5f 73 74 61 62 69  (#[$common_stabi
68a0: 6c 69 74 79 5f 61 74 74 72 69 62 75 74 65 5d 29  lity_attribute])
68b0: 2a 0a 20 20 20 20 20 20 20 20 69 6d 70 6c 3c 27  *.        impl<'
68c0: 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
68d0: 3e 3e 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  >> Iterator for 
68e0: 24 72 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f  $reverse_iterato
68f0: 72 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20  r<'a, P>.       
6900: 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65       where P::Se
6910: 61 72 63 68 65 72 3a 20 52 65 76 65 72 73 65 53  archer: ReverseS
6920: 65 61 72 63 68 65 72 3c 27 61 3e 0a 20 20 20 20  earcher<'a>.    
6930: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
6940: 20 20 74 79 70 65 20 49 74 65 6d 20 3d 20 24 69    type Item = $i
6950: 74 65 72 74 79 3b 0a 0a 20 20 20 20 20 20 20 20  terty;..        
6960: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
6970: 20 20 20 20 20 20 20 20 20 20 66 6e 20 6e 65 78            fn nex
6980: 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20  t(&mut self) -> 
6990: 4f 70 74 69 6f 6e 3c 24 69 74 65 72 74 79 3e 20  Option<$iterty> 
69a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
69b0: 20 20 73 65 6c 66 2e 30 2e 6e 65 78 74 5f 62 61    self.0.next_ba
69c0: 63 6b 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  ck().           
69d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
69e0: 20 20 20 20 20 20 24 28 23 5b 24 63 6f 6d 6d 6f        $(#[$commo
69f0: 6e 5f 73 74 61 62 69 6c 69 74 79 5f 61 74 74 72  n_stability_attr
6a00: 69 62 75 74 65 5d 29 2a 0a 20 20 20 20 20 20 20  ibute])*.       
6a10: 20 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61 74   impl<'a, P: Pat
6a20: 74 65 72 6e 3c 27 61 3e 3e 20 43 6c 6f 6e 65 20  tern<'a>> Clone 
6a30: 66 6f 72 20 24 72 65 76 65 72 73 65 5f 69 74 65  for $reverse_ite
6a40: 72 61 74 6f 72 3c 27 61 2c 20 50 3e 0a 20 20 20  rator<'a, P>.   
6a50: 20 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50           where P
6a60: 3a 3a 53 65 61 72 63 68 65 72 3a 20 43 6c 6f 6e  ::Searcher: Clon
6a70: 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
6a80: 20 20 20 20 20 20 20 20 66 6e 20 63 6c 6f 6e 65          fn clone
6a90: 28 26 73 65 6c 66 29 20 2d 3e 20 53 65 6c 66 20  (&self) -> Self 
6aa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6ab0: 20 20 24 72 65 76 65 72 73 65 5f 69 74 65 72 61    $reverse_itera
6ac0: 74 6f 72 28 73 65 6c 66 2e 30 2e 63 6c 6f 6e 65  tor(self.0.clone
6ad0: 28 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()).            
6ae0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
6af0: 20 20 20 20 20 23 5b 75 6e 73 74 61 62 6c 65 28       #[unstable(
6b00: 66 65 61 74 75 72 65 20 3d 20 22 66 75 73 65 64  feature = "fused
6b10: 22 2c 20 69 73 73 75 65 20 3d 20 22 33 35 36 30  ", issue = "3560
6b20: 32 22 29 5d 0a 20 20 20 20 20 20 20 20 69 6d 70  2")].        imp
6b30: 6c 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e  l<'a, P: Pattern
6b40: 3c 27 61 3e 3e 20 46 75 73 65 64 49 74 65 72 61  <'a>> FusedItera
6b50: 74 6f 72 20 66 6f 72 20 24 66 6f 72 77 61 72 64  tor for $forward
6b60: 5f 69 74 65 72 61 74 6f 72 3c 27 61 2c 20 50 3e  _iterator<'a, P>
6b70: 20 7b 7d 0a 0a 20 20 20 20 20 20 20 20 23 5b 75   {}..        #[u
6b80: 6e 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  nstable(feature 
6b90: 3d 20 22 66 75 73 65 64 22 2c 20 69 73 73 75 65  = "fused", issue
6ba0: 20 3d 20 22 33 35 36 30 32 22 29 5d 0a 20 20 20   = "35602")].   
6bb0: 20 20 20 20 20 69 6d 70 6c 3c 27 61 2c 20 50 3a       impl<'a, P:
6bc0: 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20 46 75   Pattern<'a>> Fu
6bd0: 73 65 64 49 74 65 72 61 74 6f 72 20 66 6f 72 20  sedIterator for 
6be0: 24 72 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f  $reverse_iterato
6bf0: 72 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20  r<'a, P>.       
6c00: 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65       where P::Se
6c10: 61 72 63 68 65 72 3a 20 52 65 76 65 72 73 65 53  archer: ReverseS
6c20: 65 61 72 63 68 65 72 3c 27 61 3e 20 7b 7d 0a 0a  earcher<'a> {}..
6c30: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
6c40: 5f 70 61 74 74 65 72 6e 5f 69 74 65 72 61 74 6f  _pattern_iterato
6c50: 72 73 21 28 24 28 24 74 29 2a 20 77 69 74 68 20  rs!($($t)* with 
6c60: 24 28 23 5b 24 63 6f 6d 6d 6f 6e 5f 73 74 61 62  $(#[$common_stab
6c70: 69 6c 69 74 79 5f 61 74 74 72 69 62 75 74 65 5d  ility_attribute]
6c80: 29 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )*,.            
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 24 66 6f 72 77 61 72 64 5f 69 74 65      $forward_ite
6cc0: 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  rator,.         
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 24 72 65 76 65 72 73 65 5f         $reverse_
6d00: 69 74 65 72 61 74 6f 72 2c 20 24 69 74 65 72 74  iterator, $itert
6d10: 79 29 3b 0a 20 20 20 20 7d 3b 0a 20 20 20 20 7b  y);.    };.    {
6d20: 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
6d30: 65 6e 64 65 64 3b 20 77 69 74 68 20 24 28 23 5b  ended; with $(#[
6d40: 24 63 6f 6d 6d 6f 6e 5f 73 74 61 62 69 6c 69 74  $common_stabilit
6d50: 79 5f 61 74 74 72 69 62 75 74 65 3a 6d 65 74 61  y_attribute:meta
6d60: 5d 29 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ])*,.           
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 24 66 6f 72 77 61 72 64 5f 69 74 65 72 61 74 6f  $forward_iterato
6d90: 72 3a 69 64 65 6e 74 2c 0a 20 20 20 20 20 20 20  r:ident,.       
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 20 20 20 24 72 65 76 65 72 73 65 5f 69 74 65      $reverse_ite
6dc0: 72 61 74 6f 72 3a 69 64 65 6e 74 2c 20 24 69 74  rator:ident, $it
6dd0: 65 72 74 79 3a 74 79 0a 20 20 20 20 7d 20 3d 3e  erty:ty.    } =>
6de0: 20 7b 0a 20 20 20 20 20 20 20 20 24 28 23 5b 24   {.        $(#[$
6df0: 63 6f 6d 6d 6f 6e 5f 73 74 61 62 69 6c 69 74 79  common_stability
6e00: 5f 61 74 74 72 69 62 75 74 65 5d 29 2a 0a 20 20  _attribute])*.  
6e10: 20 20 20 20 20 20 69 6d 70 6c 3c 27 61 2c 20 50        impl<'a, P
6e20: 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20 44  : Pattern<'a>> D
6e30: 6f 75 62 6c 65 45 6e 64 65 64 49 74 65 72 61 74  oubleEndedIterat
6e40: 6f 72 20 66 6f 72 20 24 66 6f 72 77 61 72 64 5f  or for $forward_
6e50: 69 74 65 72 61 74 6f 72 3c 27 61 2c 20 50 3e 0a  iterator<'a, P>.
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
6e70: 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 44  e P::Searcher: D
6e80: 6f 75 62 6c 65 45 6e 64 65 64 53 65 61 72 63 68  oubleEndedSearch
6e90: 65 72 3c 27 61 3e 0a 20 20 20 20 20 20 20 20 7b  er<'a>.        {
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 5b 69  .            #[i
6eb0: 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 20  nline].         
6ec0: 20 20 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28     fn next_back(
6ed0: 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70  &mut self) -> Op
6ee0: 74 69 6f 6e 3c 24 69 74 65 72 74 79 3e 20 7b 0a  tion<$iterty> {.
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 73 65 6c 66 2e 30 2e 6e 65 78 74 5f 62 61 63 6b  self.0.next_back
6f10: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ().            }
6f20: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
6f30: 20 20 20 20 24 28 23 5b 24 63 6f 6d 6d 6f 6e 5f      $(#[$common_
6f40: 73 74 61 62 69 6c 69 74 79 5f 61 74 74 72 69 62  stability_attrib
6f50: 75 74 65 5d 29 2a 0a 20 20 20 20 20 20 20 20 69  ute])*.        i
6f60: 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61 74 74 65  mpl<'a, P: Patte
6f70: 72 6e 3c 27 61 3e 3e 20 44 6f 75 62 6c 65 45 6e  rn<'a>> DoubleEn
6f80: 64 65 64 49 74 65 72 61 74 6f 72 20 66 6f 72 20  dedIterator for 
6f90: 24 72 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f  $reverse_iterato
6fa0: 72 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20  r<'a, P>.       
6fb0: 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65       where P::Se
6fc0: 61 72 63 68 65 72 3a 20 44 6f 75 62 6c 65 45 6e  archer: DoubleEn
6fd0: 64 65 64 53 65 61 72 63 68 65 72 3c 27 61 3e 0a  dedSearcher<'a>.
6fe0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
6ff0: 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a        #[inline].
7000: 20 20 20 20 20 20 20 20 20 20 20 20 66 6e 20 6e              fn n
7010: 65 78 74 5f 62 61 63 6b 28 26 6d 75 74 20 73 65  ext_back(&mut se
7020: 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 24 69  lf) -> Option<$i
7030: 74 65 72 74 79 3e 20 7b 0a 20 20 20 20 20 20 20  terty> {.       
7040: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 30 2e           self.0.
7050: 6e 65 78 74 28 29 0a 20 20 20 20 20 20 20 20 20  next().         
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7070: 20 20 20 7d 3b 0a 20 20 20 20 7b 0a 20 20 20 20     };.    {.    
7080: 20 20 20 20 73 69 6e 67 6c 65 20 65 6e 64 65 64      single ended
7090: 3b 20 77 69 74 68 20 24 28 23 5b 24 63 6f 6d 6d  ; with $(#[$comm
70a0: 6f 6e 5f 73 74 61 62 69 6c 69 74 79 5f 61 74 74  on_stability_att
70b0: 72 69 62 75 74 65 3a 6d 65 74 61 5d 29 2a 2c 0a  ribute:meta])*,.
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 20 20 24 66 6f 72 77             $forw
70e0: 61 72 64 5f 69 74 65 72 61 74 6f 72 3a 69 64 65  ard_iterator:ide
70f0: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
7110: 72 65 76 65 72 73 65 5f 69 74 65 72 61 74 6f 72  reverse_iterator
7120: 3a 69 64 65 6e 74 2c 20 24 69 74 65 72 74 79 3a  :ident, $iterty:
7130: 74 79 0a 20 20 20 20 7d 20 3d 3e 20 7b 7d 0a 7d  ty.    } => {}.}
7140: 0a 0a 64 65 72 69 76 65 5f 70 61 74 74 65 72 6e  ..derive_pattern
7150: 5f 63 6c 6f 6e 65 21 7b 0a 20 20 20 20 63 6c 6f  _clone!{.    clo
7160: 6e 65 20 53 70 6c 69 74 49 6e 74 65 72 6e 61 6c  ne SplitInternal
7170: 0a 20 20 20 20 77 69 74 68 20 7c 73 7c 20 53 70  .    with |s| Sp
7180: 6c 69 74 49 6e 74 65 72 6e 61 6c 20 7b 20 6d 61  litInternal { ma
7190: 74 63 68 65 72 3a 20 73 2e 6d 61 74 63 68 65 72  tcher: s.matcher
71a0: 2e 63 6c 6f 6e 65 28 29 2c 20 2e 2e 2a 73 20 7d  .clone(), ..*s }
71b0: 0a 7d 0a 0a 73 74 72 75 63 74 20 53 70 6c 69 74  .}..struct Split
71c0: 49 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3a 20  Internal<'a, P: 
71d0: 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20 7b 0a 20  Pattern<'a>> {. 
71e0: 20 20 20 73 74 61 72 74 3a 20 75 73 69 7a 65 2c     start: usize,
71f0: 0a 20 20 20 20 65 6e 64 3a 20 75 73 69 7a 65 2c  .    end: usize,
7200: 0a 20 20 20 20 6d 61 74 63 68 65 72 3a 20 50 3a  .    matcher: P:
7210: 3a 53 65 61 72 63 68 65 72 2c 0a 20 20 20 20 61  :Searcher,.    a
7220: 6c 6c 6f 77 5f 74 72 61 69 6c 69 6e 67 5f 65 6d  llow_trailing_em
7230: 70 74 79 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 66  pty: bool,.    f
7240: 69 6e 69 73 68 65 64 3a 20 62 6f 6f 6c 2c 0a 7d  inished: bool,.}
7250: 0a 0a 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61  ..impl<'a, P: Pa
7260: 74 74 65 72 6e 3c 27 61 3e 3e 20 66 6d 74 3a 3a  ttern<'a>> fmt::
7270: 44 65 62 75 67 20 66 6f 72 20 53 70 6c 69 74 49  Debug for SplitI
7280: 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3e 20 77  nternal<'a, P> w
7290: 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72  here P::Searcher
72a0: 3a 20 66 6d 74 3a 3a 44 65 62 75 67 20 7b 0a 20  : fmt::Debug {. 
72b0: 20 20 20 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c     fn fmt(&self,
72c0: 20 66 3a 20 26 6d 75 74 20 66 6d 74 3a 3a 46 6f   f: &mut fmt::Fo
72d0: 72 6d 61 74 74 65 72 29 20 2d 3e 20 66 6d 74 3a  rmatter) -> fmt:
72e0: 3a 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 20 20  :Result {.      
72f0: 20 20 66 2e 64 65 62 75 67 5f 73 74 72 75 63 74    f.debug_struct
7300: 28 22 53 70 6c 69 74 49 6e 74 65 72 6e 61 6c 22  ("SplitInternal"
7310: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 66  ).            .f
7320: 69 65 6c 64 28 22 73 74 61 72 74 22 2c 20 26 73  ield("start", &s
7330: 65 6c 66 2e 73 74 61 72 74 29 0a 20 20 20 20 20  elf.start).     
7340: 20 20 20 20 20 20 20 2e 66 69 65 6c 64 28 22 65         .field("e
7350: 6e 64 22 2c 20 26 73 65 6c 66 2e 65 6e 64 29 0a  nd", &self.end).
7360: 20 20 20 20 20 20 20 20 20 20 20 20 2e 66 69 65              .fie
7370: 6c 64 28 22 6d 61 74 63 68 65 72 22 2c 20 26 73  ld("matcher", &s
7380: 65 6c 66 2e 6d 61 74 63 68 65 72 29 0a 20 20 20  elf.matcher).   
7390: 20 20 20 20 20 20 20 20 20 2e 66 69 65 6c 64 28           .field(
73a0: 22 61 6c 6c 6f 77 5f 74 72 61 69 6c 69 6e 67 5f  "allow_trailing_
73b0: 65 6d 70 74 79 22 2c 20 26 73 65 6c 66 2e 61 6c  empty", &self.al
73c0: 6c 6f 77 5f 74 72 61 69 6c 69 6e 67 5f 65 6d 70  low_trailing_emp
73d0: 74 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty).            
73e0: 2e 66 69 65 6c 64 28 22 66 69 6e 69 73 68 65 64  .field("finished
73f0: 22 2c 20 26 73 65 6c 66 2e 66 69 6e 69 73 68 65  ", &self.finishe
7400: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e  d).            .
7410: 66 69 6e 69 73 68 28 29 0a 20 20 20 20 7d 0a 7d  finish().    }.}
7420: 0a 0a 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61  ..impl<'a, P: Pa
7430: 74 74 65 72 6e 3c 27 61 3e 3e 20 53 70 6c 69 74  ttern<'a>> Split
7440: 49 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3e 20  Internal<'a, P> 
7450: 7b 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  {.    #[inline].
7460: 20 20 20 20 66 6e 20 67 65 74 5f 65 6e 64 28 26      fn get_end(&
7470: 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70 74  mut self) -> Opt
7480: 69 6f 6e 3c 26 27 61 20 73 74 72 3e 20 7b 0a 20  ion<&'a str> {. 
7490: 20 20 20 20 20 20 20 69 66 20 21 73 65 6c 66 2e         if !self.
74a0: 66 69 6e 69 73 68 65 64 20 26 26 20 28 73 65 6c  finished && (sel
74b0: 66 2e 61 6c 6c 6f 77 5f 74 72 61 69 6c 69 6e 67  f.allow_trailing
74c0: 5f 65 6d 70 74 79 20 7c 7c 20 73 65 6c 66 2e 65  _empty || self.e
74d0: 6e 64 20 2d 20 73 65 6c 66 2e 73 74 61 72 74 20  nd - self.start 
74e0: 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  > 0) {.         
74f0: 20 20 20 73 65 6c 66 2e 66 69 6e 69 73 68 65 64     self.finished
7500: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
7510: 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20 20       unsafe {.  
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
7530: 74 20 73 74 72 69 6e 67 20 3d 20 73 65 6c 66 2e  t string = self.
7540: 6d 61 74 63 68 65 72 2e 68 61 79 73 74 61 63 6b  matcher.haystack
7550: 28 29 2e 73 6c 69 63 65 5f 75 6e 63 68 65 63 6b  ().slice_uncheck
7560: 65 64 28 73 65 6c 66 2e 73 74 61 72 74 2c 20 73  ed(self.start, s
7570: 65 6c 66 2e 65 6e 64 29 3b 0a 20 20 20 20 20 20  elf.end);.      
7580: 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28 73            Some(s
7590: 74 72 69 6e 67 29 0a 20 20 20 20 20 20 20 20 20  tring).         
75a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
75b0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
75c0: 20 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 7d    None.        }
75d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
75e0: 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 65 78  line].    fn nex
75f0: 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20  t(&mut self) -> 
7600: 4f 70 74 69 6f 6e 3c 26 27 61 20 73 74 72 3e 20  Option<&'a str> 
7610: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 73 65 6c  {.        if sel
7620: 66 2e 66 69 6e 69 73 68 65 64 20 7b 20 72 65 74  f.finished { ret
7630: 75 72 6e 20 4e 6f 6e 65 20 7d 0a 0a 20 20 20 20  urn None }..    
7640: 20 20 20 20 6c 65 74 20 68 61 79 73 74 61 63 6b      let haystack
7650: 20 3d 20 73 65 6c 66 2e 6d 61 74 63 68 65 72 2e   = self.matcher.
7660: 68 61 79 73 74 61 63 6b 28 29 3b 0a 20 20 20 20  haystack();.    
7670: 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e 6d      match self.m
7680: 61 74 63 68 65 72 2e 6e 65 78 74 5f 6d 61 74 63  atcher.next_matc
7690: 68 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  h() {.          
76a0: 20 20 53 6f 6d 65 28 28 61 2c 20 62 29 29 20 3d    Some((a, b)) =
76b0: 3e 20 75 6e 73 61 66 65 20 7b 0a 20 20 20 20 20  > unsafe {.     
76c0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 65             let e
76d0: 6c 74 20 3d 20 68 61 79 73 74 61 63 6b 2e 73 6c  lt = haystack.sl
76e0: 69 63 65 5f 75 6e 63 68 65 63 6b 65 64 28 73 65  ice_unchecked(se
76f0: 6c 66 2e 73 74 61 72 74 2c 20 61 29 3b 0a 20 20  lf.start, a);.  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
7710: 6c 66 2e 73 74 61 72 74 20 3d 20 62 3b 0a 20 20  lf.start = b;.  
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f                So
7730: 6d 65 28 65 6c 74 29 0a 20 20 20 20 20 20 20 20  me(elt).        
7740: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20      },.         
7750: 20 20 20 4e 6f 6e 65 20 3d 3e 20 73 65 6c 66 2e     None => self.
7760: 67 65 74 5f 65 6e 64 28 29 2c 0a 20 20 20 20 20  get_end(),.     
7770: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
7780: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e  #[inline].    fn
7790: 20 6e 65 78 74 5f 62 61 63 6b 28 26 6d 75 74 20   next_back(&mut 
77a0: 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c  self) -> Option<
77b0: 26 27 61 20 73 74 72 3e 0a 20 20 20 20 20 20 20  &'a str>.       
77c0: 20 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68   where P::Search
77d0: 65 72 3a 20 52 65 76 65 72 73 65 53 65 61 72 63  er: ReverseSearc
77e0: 68 65 72 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20  her<'a>.    {.  
77f0: 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e 66 69        if self.fi
7800: 6e 69 73 68 65 64 20 7b 20 72 65 74 75 72 6e 20  nished { return 
7810: 4e 6f 6e 65 20 7d 0a 0a 20 20 20 20 20 20 20 20  None }..        
7820: 69 66 20 21 73 65 6c 66 2e 61 6c 6c 6f 77 5f 74  if !self.allow_t
7830: 72 61 69 6c 69 6e 67 5f 65 6d 70 74 79 20 7b 0a  railing_empty {.
7840: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
7850: 2e 61 6c 6c 6f 77 5f 74 72 61 69 6c 69 6e 67 5f  .allow_trailing_
7860: 65 6d 70 74 79 20 3d 20 74 72 75 65 3b 0a 20 20  empty = true;.  
7870: 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20            match 
7880: 73 65 6c 66 2e 6e 65 78 74 5f 62 61 63 6b 28 29  self.next_back()
7890: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
78a0: 20 20 20 53 6f 6d 65 28 65 6c 74 29 20 69 66 20     Some(elt) if 
78b0: 21 65 6c 74 2e 69 73 5f 65 6d 70 74 79 28 29 20  !elt.is_empty() 
78c0: 3d 3e 20 72 65 74 75 72 6e 20 53 6f 6d 65 28 65  => return Some(e
78d0: 6c 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lt),.           
78e0: 20 20 20 20 20 5f 20 3d 3e 20 69 66 20 73 65 6c       _ => if sel
78f0: 66 2e 66 69 6e 69 73 68 65 64 20 7b 20 72 65 74  f.finished { ret
7900: 75 72 6e 20 4e 6f 6e 65 20 7d 0a 20 20 20 20 20  urn None }.     
7910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7920: 20 7d 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20   }..        let 
7930: 68 61 79 73 74 61 63 6b 20 3d 20 73 65 6c 66 2e  haystack = self.
7940: 6d 61 74 63 68 65 72 2e 68 61 79 73 74 61 63 6b  matcher.haystack
7950: 28 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 74 63  ();.        matc
7960: 68 20 73 65 6c 66 2e 6d 61 74 63 68 65 72 2e 6e  h self.matcher.n
7970: 65 78 74 5f 6d 61 74 63 68 5f 62 61 63 6b 28 29  ext_match_back()
7980: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   {.            S
7990: 6f 6d 65 28 28 61 2c 20 62 29 29 20 3d 3e 20 75  ome((a, b)) => u
79a0: 6e 73 61 66 65 20 7b 0a 20 20 20 20 20 20 20 20  nsafe {.        
79b0: 20 20 20 20 20 20 20 20 6c 65 74 20 65 6c 74 20          let elt 
79c0: 3d 20 68 61 79 73 74 61 63 6b 2e 73 6c 69 63 65  = haystack.slice
79d0: 5f 75 6e 63 68 65 63 6b 65 64 28 62 2c 20 73 65  _unchecked(b, se
79e0: 6c 66 2e 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  lf.end);.       
79f0: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 65 6e           self.en
7a00: 64 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20  d = a;.         
7a10: 20 20 20 20 20 20 20 53 6f 6d 65 28 65 6c 74 29         Some(elt)
7a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  .            },.
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e 65              None
7a40: 20 3d 3e 20 75 6e 73 61 66 65 20 7b 0a 20 20 20   => unsafe {.   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
7a60: 66 2e 66 69 6e 69 73 68 65 64 20 3d 20 74 72 75  f.finished = tru
7a70: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
7a80: 20 20 20 53 6f 6d 65 28 68 61 79 73 74 61 63 6b     Some(haystack
7a90: 2e 73 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65 64  .slice_unchecked
7aa0: 28 73 65 6c 66 2e 73 74 61 72 74 2c 20 73 65 6c  (self.start, sel
7ab0: 66 2e 65 6e 64 29 29 0a 20 20 20 20 20 20 20 20  f.end)).        
7ac0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7d      },.        }
7ad0: 0a 20 20 20 20 7d 0a 7d 0a 0a 67 65 6e 65 72 61  .    }.}..genera
7ae0: 74 65 5f 70 61 74 74 65 72 6e 5f 69 74 65 72 61  te_pattern_itera
7af0: 74 6f 72 73 21 20 7b 0a 20 20 20 20 66 6f 72 77  tors! {.    forw
7b00: 61 72 64 3a 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ard:.        ///
7b10: 20 43 72 65 61 74 65 64 20 77 69 74 68 20 74 68   Created with th
7b20: 65 20 6d 65 74 68 6f 64 20 5b 60 73 70 6c 69 74  e method [`split
7b30: 60 5d 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a  `]..        ///.
7b40: 20 20 20 20 20 20 20 20 2f 2f 2f 20 5b 60 73 70          /// [`sp
7b50: 6c 69 74 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64  lit`]: ../../std
7b60: 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68  /primitive.str.h
7b70: 74 6d 6c 23 6d 65 74 68 6f 64 2e 73 70 6c 69 74  tml#method.split
7b80: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
7b90: 53 70 6c 69 74 3b 0a 20 20 20 20 72 65 76 65 72  Split;.    rever
7ba0: 73 65 3a 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  se:.        /// 
7bb0: 43 72 65 61 74 65 64 20 77 69 74 68 20 74 68 65  Created with the
7bc0: 20 6d 65 74 68 6f 64 20 5b 60 72 73 70 6c 69 74   method [`rsplit
7bd0: 60 5d 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a  `]..        ///.
7be0: 20 20 20 20 20 20 20 20 2f 2f 2f 20 5b 60 72 73          /// [`rs
7bf0: 70 6c 69 74 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74  plit`]: ../../st
7c00: 64 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e  d/primitive.str.
7c10: 68 74 6d 6c 23 6d 65 74 68 6f 64 2e 72 73 70 6c  html#method.rspl
7c20: 69 74 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  it.        struc
7c30: 74 20 52 53 70 6c 69 74 3b 0a 20 20 20 20 73 74  t RSplit;.    st
7c40: 61 62 69 6c 69 74 79 3a 0a 20 20 20 20 20 20 20  ability:.       
7c50: 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
7c60: 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e  e = "rust1", sin
7c70: 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 20  ce = "1.0.0")]. 
7c80: 20 20 20 69 6e 74 65 72 6e 61 6c 3a 0a 20 20 20     internal:.   
7c90: 20 20 20 20 20 53 70 6c 69 74 49 6e 74 65 72 6e       SplitIntern
7ca0: 61 6c 20 79 69 65 6c 64 69 6e 67 20 28 26 27 61  al yielding (&'a
7cb0: 20 73 74 72 29 3b 0a 20 20 20 20 64 65 6c 65 67   str);.    deleg
7cc0: 61 74 65 20 64 6f 75 62 6c 65 20 65 6e 64 65 64  ate double ended
7cd0: 3b 0a 7d 0a 0a 67 65 6e 65 72 61 74 65 5f 70 61  ;.}..generate_pa
7ce0: 74 74 65 72 6e 5f 69 74 65 72 61 74 6f 72 73 21  ttern_iterators!
7cf0: 20 7b 0a 20 20 20 20 66 6f 72 77 61 72 64 3a 0a   {.    forward:.
7d00: 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 72 65 61          /// Crea
7d10: 74 65 64 20 77 69 74 68 20 74 68 65 20 6d 65 74  ted with the met
7d20: 68 6f 64 20 5b 60 73 70 6c 69 74 5f 74 65 72 6d  hod [`split_term
7d30: 69 6e 61 74 6f 72 60 5d 2e 0a 20 20 20 20 20 20  inator`]..      
7d40: 20 20 2f 2f 2f 0a 20 20 20 20 20 20 20 20 2f 2f    ///.        //
7d50: 2f 20 5b 60 73 70 6c 69 74 5f 74 65 72 6d 69 6e  / [`split_termin
7d60: 61 74 6f 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74  ator`]: ../../st
7d70: 64 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e  d/primitive.str.
7d80: 68 74 6d 6c 23 6d 65 74 68 6f 64 2e 73 70 6c 69  html#method.spli
7d90: 74 5f 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 20  t_terminator.   
7da0: 20 20 20 20 20 73 74 72 75 63 74 20 53 70 6c 69       struct Spli
7db0: 74 54 65 72 6d 69 6e 61 74 6f 72 3b 0a 20 20 20  tTerminator;.   
7dc0: 20 72 65 76 65 72 73 65 3a 0a 20 20 20 20 20 20   reverse:.      
7dd0: 20 20 2f 2f 2f 20 43 72 65 61 74 65 64 20 77 69    /// Created wi
7de0: 74 68 20 74 68 65 20 6d 65 74 68 6f 64 20 5b 60  th the method [`
7df0: 72 73 70 6c 69 74 5f 74 65 72 6d 69 6e 61 74 6f  rsplit_terminato
7e00: 72 60 5d 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f  r`]..        ///
7e10: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 5b 60 72  .        /// [`r
7e20: 73 70 6c 69 74 5f 74 65 72 6d 69 6e 61 74 6f 72  split_terminator
7e30: 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70 72  `]: ../../std/pr
7e40: 69 6d 69 74 69 76 65 2e 73 74 72 2e 68 74 6d 6c  imitive.str.html
7e50: 23 6d 65 74 68 6f 64 2e 72 73 70 6c 69 74 5f 74  #method.rsplit_t
7e60: 65 72 6d 69 6e 61 74 6f 72 0a 20 20 20 20 20 20  erminator.      
7e70: 20 20 73 74 72 75 63 74 20 52 53 70 6c 69 74 54    struct RSplitT
7e80: 65 72 6d 69 6e 61 74 6f 72 3b 0a 20 20 20 20 73  erminator;.    s
7e90: 74 61 62 69 6c 69 74 79 3a 0a 20 20 20 20 20 20  tability:.      
7ea0: 20 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75    #[stable(featu
7eb0: 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69  re = "rust1", si
7ec0: 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a  nce = "1.0.0")].
7ed0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 3a 0a 20 20      internal:.  
7ee0: 20 20 20 20 20 20 53 70 6c 69 74 49 6e 74 65 72        SplitInter
7ef0: 6e 61 6c 20 79 69 65 6c 64 69 6e 67 20 28 26 27  nal yielding (&'
7f00: 61 20 73 74 72 29 3b 0a 20 20 20 20 64 65 6c 65  a str);.    dele
7f10: 67 61 74 65 20 64 6f 75 62 6c 65 20 65 6e 64 65  gate double ende
7f20: 64 3b 0a 7d 0a 0a 64 65 72 69 76 65 5f 70 61 74  d;.}..derive_pat
7f30: 74 65 72 6e 5f 63 6c 6f 6e 65 21 7b 0a 20 20 20  tern_clone!{.   
7f40: 20 63 6c 6f 6e 65 20 53 70 6c 69 74 4e 49 6e 74   clone SplitNInt
7f50: 65 72 6e 61 6c 0a 20 20 20 20 77 69 74 68 20 7c  ernal.    with |
7f60: 73 7c 20 53 70 6c 69 74 4e 49 6e 74 65 72 6e 61  s| SplitNInterna
7f70: 6c 20 7b 20 69 74 65 72 3a 20 73 2e 69 74 65 72  l { iter: s.iter
7f80: 2e 63 6c 6f 6e 65 28 29 2c 20 2e 2e 2a 73 20 7d  .clone(), ..*s }
7f90: 0a 7d 0a 0a 73 74 72 75 63 74 20 53 70 6c 69 74  .}..struct Split
7fa0: 4e 49 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3a  NInternal<'a, P:
7fb0: 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 20 7b 0a   Pattern<'a>> {.
7fc0: 20 20 20 20 69 74 65 72 3a 20 53 70 6c 69 74 49      iter: SplitI
7fd0: 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3e 2c 0a  nternal<'a, P>,.
7fe0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d 62      /// The numb
7ff0: 65 72 20 6f 66 20 73 70 6c 69 74 73 20 72 65 6d  er of splits rem
8000: 61 69 6e 69 6e 67 0a 20 20 20 20 63 6f 75 6e 74  aining.    count
8010: 3a 20 75 73 69 7a 65 2c 0a 7d 0a 0a 69 6d 70 6c  : usize,.}..impl
8020: 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c  <'a, P: Pattern<
8030: 27 61 3e 3e 20 66 6d 74 3a 3a 44 65 62 75 67 20  'a>> fmt::Debug 
8040: 66 6f 72 20 53 70 6c 69 74 4e 49 6e 74 65 72 6e  for SplitNIntern
8050: 61 6c 3c 27 61 2c 20 50 3e 20 77 68 65 72 65 20  al<'a, P> where 
8060: 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 66 6d 74  P::Searcher: fmt
8070: 3a 3a 44 65 62 75 67 20 7b 0a 20 20 20 20 66 6e  ::Debug {.    fn
8080: 20 66 6d 74 28 26 73 65 6c 66 2c 20 66 3a 20 26   fmt(&self, f: &
8090: 6d 75 74 20 66 6d 74 3a 3a 46 6f 72 6d 61 74 74  mut fmt::Formatt
80a0: 65 72 29 20 2d 3e 20 66 6d 74 3a 3a 52 65 73 75  er) -> fmt::Resu
80b0: 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 66 2e 64  lt {.        f.d
80c0: 65 62 75 67 5f 73 74 72 75 63 74 28 22 53 70 6c  ebug_struct("Spl
80d0: 69 74 4e 49 6e 74 65 72 6e 61 6c 22 29 0a 20 20  itNInternal").  
80e0: 20 20 20 20 20 20 20 20 20 20 2e 66 69 65 6c 64            .field
80f0: 28 22 69 74 65 72 22 2c 20 26 73 65 6c 66 2e 69  ("iter", &self.i
8100: 74 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ter).           
8110: 20 2e 66 69 65 6c 64 28 22 63 6f 75 6e 74 22 2c   .field("count",
8120: 20 26 73 65 6c 66 2e 63 6f 75 6e 74 29 0a 20 20   &self.count).  
8130: 20 20 20 20 20 20 20 20 20 20 2e 66 69 6e 69 73            .finis
8140: 68 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70  h().    }.}..imp
8150: 6c 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e  l<'a, P: Pattern
8160: 3c 27 61 3e 3e 20 53 70 6c 69 74 4e 49 6e 74 65  <'a>> SplitNInte
8170: 72 6e 61 6c 3c 27 61 2c 20 50 3e 20 7b 0a 20 20  rnal<'a, P> {.  
8180: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
8190: 66 6e 20 6e 65 78 74 28 26 6d 75 74 20 73 65 6c  fn next(&mut sel
81a0: 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 27 61  f) -> Option<&'a
81b0: 20 73 74 72 3e 20 7b 0a 20 20 20 20 20 20 20 20   str> {.        
81c0: 6d 61 74 63 68 20 73 65 6c 66 2e 63 6f 75 6e 74  match self.count
81d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 30   {.            0
81e0: 20 3d 3e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20   => None,.      
81f0: 20 20 20 20 20 20 31 20 3d 3e 20 7b 20 73 65 6c        1 => { sel
8200: 66 2e 63 6f 75 6e 74 20 3d 20 30 3b 20 73 65 6c  f.count = 0; sel
8210: 66 2e 69 74 65 72 2e 67 65 74 5f 65 6e 64 28 29  f.iter.get_end()
8220: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f   }.            _
8230: 20 3d 3e 20 7b 20 73 65 6c 66 2e 63 6f 75 6e 74   => { self.count
8240: 20 2d 3d 20 31 3b 20 73 65 6c 66 2e 69 74 65 72   -= 1; self.iter
8250: 2e 6e 65 78 74 28 29 20 7d 0a 20 20 20 20 20 20  .next() }.      
8260: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23    }.    }..    #
8270: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20  [inline].    fn 
8280: 6e 65 78 74 5f 62 61 63 6b 28 26 6d 75 74 20 73  next_back(&mut s
8290: 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26  elf) -> Option<&
82a0: 27 61 20 73 74 72 3e 0a 20 20 20 20 20 20 20 20  'a str>.        
82b0: 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65  where P::Searche
82c0: 72 3a 20 52 65 76 65 72 73 65 53 65 61 72 63 68  r: ReverseSearch
82d0: 65 72 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20 20  er<'a>.    {.   
82e0: 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c 66 2e       match self.
82f0: 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 20 20  count {.        
8300: 20 20 20 20 30 20 3d 3e 20 4e 6f 6e 65 2c 0a 20      0 => None,. 
8310: 20 20 20 20 20 20 20 20 20 20 20 31 20 3d 3e 20             1 => 
8320: 7b 20 73 65 6c 66 2e 63 6f 75 6e 74 20 3d 20 30  { self.count = 0
8330: 3b 20 73 65 6c 66 2e 69 74 65 72 2e 67 65 74 5f  ; self.iter.get_
8340: 65 6e 64 28 29 20 7d 0a 20 20 20 20 20 20 20 20  end() }.        
8350: 20 20 20 20 5f 20 3d 3e 20 7b 20 73 65 6c 66 2e      _ => { self.
8360: 63 6f 75 6e 74 20 2d 3d 20 31 3b 20 73 65 6c 66  count -= 1; self
8370: 2e 69 74 65 72 2e 6e 65 78 74 5f 62 61 63 6b 28  .iter.next_back(
8380: 29 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ) }.        }.  
8390: 20 20 7d 0a 7d 0a 0a 67 65 6e 65 72 61 74 65 5f    }.}..generate_
83a0: 70 61 74 74 65 72 6e 5f 69 74 65 72 61 74 6f 72  pattern_iterator
83b0: 73 21 20 7b 0a 20 20 20 20 66 6f 72 77 61 72 64  s! {.    forward
83c0: 3a 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 43 72  :.        /// Cr
83d0: 65 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6d  eated with the m
83e0: 65 74 68 6f 64 20 5b 60 73 70 6c 69 74 6e 60 5d  ethod [`splitn`]
83f0: 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a 20 20  ..        ///.  
8400: 20 20 20 20 20 20 2f 2f 2f 20 5b 60 73 70 6c 69        /// [`spli
8410: 74 6e 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f  tn`]: ../../std/
8420: 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68 74  primitive.str.ht
8430: 6d 6c 23 6d 65 74 68 6f 64 2e 73 70 6c 69 74 6e  ml#method.splitn
8440: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
8450: 53 70 6c 69 74 4e 3b 0a 20 20 20 20 72 65 76 65  SplitN;.    reve
8460: 72 73 65 3a 0a 20 20 20 20 20 20 20 20 2f 2f 2f  rse:.        ///
8470: 20 43 72 65 61 74 65 64 20 77 69 74 68 20 74 68   Created with th
8480: 65 20 6d 65 74 68 6f 64 20 5b 60 72 73 70 6c 69  e method [`rspli
8490: 74 6e 60 5d 2e 0a 20 20 20 20 20 20 20 20 2f 2f  tn`]..        //
84a0: 2f 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20 5b 60  /.        /// [`
84b0: 72 73 70 6c 69 74 6e 60 5d 3a 20 2e 2e 2f 2e 2e  rsplitn`]: ../..
84c0: 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65 2e 73  /std/primitive.s
84d0: 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f 64 2e 72  tr.html#method.r
84e0: 73 70 6c 69 74 6e 0a 20 20 20 20 20 20 20 20 73  splitn.        s
84f0: 74 72 75 63 74 20 52 53 70 6c 69 74 4e 3b 0a 20  truct RSplitN;. 
8500: 20 20 20 73 74 61 62 69 6c 69 74 79 3a 0a 20 20     stability:.  
8510: 20 20 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66        #[stable(f
8520: 65 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22  eature = "rust1"
8530: 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30  , since = "1.0.0
8540: 22 29 5d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ")].    internal
8550: 3a 0a 20 20 20 20 20 20 20 20 53 70 6c 69 74 4e  :.        SplitN
8560: 49 6e 74 65 72 6e 61 6c 20 79 69 65 6c 64 69 6e  Internal yieldin
8570: 67 20 28 26 27 61 20 73 74 72 29 3b 0a 20 20 20  g (&'a str);.   
8580: 20 64 65 6c 65 67 61 74 65 20 73 69 6e 67 6c 65   delegate single
8590: 20 65 6e 64 65 64 3b 0a 7d 0a 0a 64 65 72 69 76   ended;.}..deriv
85a0: 65 5f 70 61 74 74 65 72 6e 5f 63 6c 6f 6e 65 21  e_pattern_clone!
85b0: 7b 0a 20 20 20 20 63 6c 6f 6e 65 20 4d 61 74 63  {.    clone Matc
85c0: 68 49 6e 64 69 63 65 73 49 6e 74 65 72 6e 61 6c  hIndicesInternal
85d0: 0a 20 20 20 20 77 69 74 68 20 7c 73 7c 20 4d 61  .    with |s| Ma
85e0: 74 63 68 49 6e 64 69 63 65 73 49 6e 74 65 72 6e  tchIndicesIntern
85f0: 61 6c 28 73 2e 30 2e 63 6c 6f 6e 65 28 29 29 0a  al(s.0.clone()).
8600: 7d 0a 0a 73 74 72 75 63 74 20 4d 61 74 63 68 49  }..struct MatchI
8610: 6e 64 69 63 65 73 49 6e 74 65 72 6e 61 6c 3c 27  ndicesInternal<'
8620: 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
8630: 3e 3e 28 50 3a 3a 53 65 61 72 63 68 65 72 29 3b  >>(P::Searcher);
8640: 0a 0a 69 6d 70 6c 3c 27 61 2c 20 50 3a 20 50 61  ..impl<'a, P: Pa
8650: 74 74 65 72 6e 3c 27 61 3e 3e 20 66 6d 74 3a 3a  ttern<'a>> fmt::
8660: 44 65 62 75 67 20 66 6f 72 20 4d 61 74 63 68 49  Debug for MatchI
8670: 6e 64 69 63 65 73 49 6e 74 65 72 6e 61 6c 3c 27  ndicesInternal<'
8680: 61 2c 20 50 3e 20 77 68 65 72 65 20 50 3a 3a 53  a, P> where P::S
8690: 65 61 72 63 68 65 72 3a 20 66 6d 74 3a 3a 44 65  earcher: fmt::De
86a0: 62 75 67 20 7b 0a 20 20 20 20 66 6e 20 66 6d 74  bug {.    fn fmt
86b0: 28 26 73 65 6c 66 2c 20 66 3a 20 26 6d 75 74 20  (&self, f: &mut 
86c0: 66 6d 74 3a 3a 46 6f 72 6d 61 74 74 65 72 29 20  fmt::Formatter) 
86d0: 2d 3e 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b  -> fmt::Result {
86e0: 0a 20 20 20 20 20 20 20 20 66 2e 64 65 62 75 67  .        f.debug
86f0: 5f 74 75 70 6c 65 28 22 4d 61 74 63 68 49 6e 64  _tuple("MatchInd
8700: 69 63 65 73 49 6e 74 65 72 6e 61 6c 22 29 0a 20  icesInternal"). 
8710: 20 20 20 20 20 20 20 20 20 20 20 2e 66 69 65 6c             .fiel
8720: 64 28 26 73 65 6c 66 2e 30 29 0a 20 20 20 20 20  d(&self.0).     
8730: 20 20 20 20 20 20 20 2e 66 69 6e 69 73 68 28 29         .finish()
8740: 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
8750: 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
8760: 3e 3e 20 4d 61 74 63 68 49 6e 64 69 63 65 73 49  >> MatchIndicesI
8770: 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3e 20 7b  nternal<'a, P> {
8780: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
8790: 20 20 20 66 6e 20 6e 65 78 74 28 26 6d 75 74 20     fn next(&mut 
87a0: 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c  self) -> Option<
87b0: 28 75 73 69 7a 65 2c 20 26 27 61 20 73 74 72 29  (usize, &'a str)
87c0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  > {.        self
87d0: 2e 30 2e 6e 65 78 74 5f 6d 61 74 63 68 28 29 2e  .0.next_match().
87e0: 6d 61 70 28 7c 28 73 74 61 72 74 2c 20 65 6e 64  map(|(start, end
87f0: 29 7c 20 75 6e 73 61 66 65 20 7b 0a 20 20 20 20  )| unsafe {.    
8800: 20 20 20 20 20 20 20 20 28 73 74 61 72 74 2c 20          (start, 
8810: 73 65 6c 66 2e 30 2e 68 61 79 73 74 61 63 6b 28  self.0.haystack(
8820: 29 2e 73 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65  ).slice_unchecke
8830: 64 28 73 74 61 72 74 2c 20 65 6e 64 29 29 0a 20  d(start, end)). 
8840: 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 0a         }).    }.
8850: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
8860: 20 20 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28     fn next_back(
8870: 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70  &mut self) -> Op
8880: 74 69 6f 6e 3c 28 75 73 69 7a 65 2c 20 26 27 61  tion<(usize, &'a
8890: 20 73 74 72 29 3e 0a 20 20 20 20 20 20 20 20 77   str)>.        w
88a0: 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72  here P::Searcher
88b0: 3a 20 52 65 76 65 72 73 65 53 65 61 72 63 68 65  : ReverseSearche
88c0: 72 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20 20 20  r<'a>.    {.    
88d0: 20 20 20 20 73 65 6c 66 2e 30 2e 6e 65 78 74 5f      self.0.next_
88e0: 6d 61 74 63 68 5f 62 61 63 6b 28 29 2e 6d 61 70  match_back().map
88f0: 28 7c 28 73 74 61 72 74 2c 20 65 6e 64 29 7c 20  (|(start, end)| 
8900: 75 6e 73 61 66 65 20 7b 0a 20 20 20 20 20 20 20  unsafe {.       
8910: 20 20 20 20 20 28 73 74 61 72 74 2c 20 73 65 6c       (start, sel
8920: 66 2e 30 2e 68 61 79 73 74 61 63 6b 28 29 2e 73  f.0.haystack().s
8930: 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65 64 28 73  lice_unchecked(s
8940: 74 61 72 74 2c 20 65 6e 64 29 29 0a 20 20 20 20  tart, end)).    
8950: 20 20 20 20 7d 29 0a 20 20 20 20 7d 0a 7d 0a 0a      }).    }.}..
8960: 67 65 6e 65 72 61 74 65 5f 70 61 74 74 65 72 6e  generate_pattern
8970: 5f 69 74 65 72 61 74 6f 72 73 21 20 7b 0a 20 20  _iterators! {.  
8980: 20 20 66 6f 72 77 61 72 64 3a 0a 20 20 20 20 20    forward:.     
8990: 20 20 20 2f 2f 2f 20 43 72 65 61 74 65 64 20 77     /// Created w
89a0: 69 74 68 20 74 68 65 20 6d 65 74 68 6f 64 20 5b  ith the method [
89b0: 60 6d 61 74 63 68 5f 69 6e 64 69 63 65 73 60 5d  `match_indices`]
89c0: 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a 20 20  ..        ///.  
89d0: 20 20 20 20 20 20 2f 2f 2f 20 5b 60 6d 61 74 63        /// [`matc
89e0: 68 5f 69 6e 64 69 63 65 73 60 5d 3a 20 2e 2e 2f  h_indices`]: ../
89f0: 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65  ../std/primitive
8a00: 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f 64  .str.html#method
8a10: 2e 6d 61 74 63 68 5f 69 6e 64 69 63 65 73 0a 20  .match_indices. 
8a20: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4d 61         struct Ma
8a30: 74 63 68 49 6e 64 69 63 65 73 3b 0a 20 20 20 20  tchIndices;.    
8a40: 72 65 76 65 72 73 65 3a 0a 20 20 20 20 20 20 20  reverse:.       
8a50: 20 2f 2f 2f 20 43 72 65 61 74 65 64 20 77 69 74   /// Created wit
8a60: 68 20 74 68 65 20 6d 65 74 68 6f 64 20 5b 60 72  h the method [`r
8a70: 6d 61 74 63 68 5f 69 6e 64 69 63 65 73 60 5d 2e  match_indices`].
8a80: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a 20 20 20  .        ///.   
8a90: 20 20 20 20 20 2f 2f 2f 20 5b 60 72 6d 61 74 63       /// [`rmatc
8aa0: 68 5f 69 6e 64 69 63 65 73 60 5d 3a 20 2e 2e 2f  h_indices`]: ../
8ab0: 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69 76 65  ../std/primitive
8ac0: 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f 64  .str.html#method
8ad0: 2e 72 6d 61 74 63 68 5f 69 6e 64 69 63 65 73 0a  .rmatch_indices.
8ae0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 52          struct R
8af0: 4d 61 74 63 68 49 6e 64 69 63 65 73 3b 0a 20 20  MatchIndices;.  
8b00: 20 20 73 74 61 62 69 6c 69 74 79 3a 0a 20 20 20    stability:.   
8b10: 20 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65       #[stable(fe
8b20: 61 74 75 72 65 20 3d 20 22 73 74 72 5f 6d 61 74  ature = "str_mat
8b30: 63 68 5f 69 6e 64 69 63 65 73 22 2c 20 73 69 6e  ch_indices", sin
8b40: 63 65 20 3d 20 22 31 2e 35 2e 30 22 29 5d 0a 20  ce = "1.5.0")]. 
8b50: 20 20 20 69 6e 74 65 72 6e 61 6c 3a 0a 20 20 20     internal:.   
8b60: 20 20 20 20 20 4d 61 74 63 68 49 6e 64 69 63 65       MatchIndice
8b70: 73 49 6e 74 65 72 6e 61 6c 20 79 69 65 6c 64 69  sInternal yieldi
8b80: 6e 67 20 28 28 75 73 69 7a 65 2c 20 26 27 61 20  ng ((usize, &'a 
8b90: 73 74 72 29 29 3b 0a 20 20 20 20 64 65 6c 65 67  str));.    deleg
8ba0: 61 74 65 20 64 6f 75 62 6c 65 20 65 6e 64 65 64  ate double ended
8bb0: 3b 0a 7d 0a 0a 64 65 72 69 76 65 5f 70 61 74 74  ;.}..derive_patt
8bc0: 65 72 6e 5f 63 6c 6f 6e 65 21 7b 0a 20 20 20 20  ern_clone!{.    
8bd0: 63 6c 6f 6e 65 20 4d 61 74 63 68 65 73 49 6e 74  clone MatchesInt
8be0: 65 72 6e 61 6c 0a 20 20 20 20 77 69 74 68 20 7c  ernal.    with |
8bf0: 73 7c 20 4d 61 74 63 68 65 73 49 6e 74 65 72 6e  s| MatchesIntern
8c00: 61 6c 28 73 2e 30 2e 63 6c 6f 6e 65 28 29 29 0a  al(s.0.clone()).
8c10: 7d 0a 0a 73 74 72 75 63 74 20 4d 61 74 63 68 65  }..struct Matche
8c20: 73 49 6e 74 65 72 6e 61 6c 3c 27 61 2c 20 50 3a  sInternal<'a, P:
8c30: 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 50 3a   Pattern<'a>>(P:
8c40: 3a 53 65 61 72 63 68 65 72 29 3b 0a 0a 69 6d 70  :Searcher);..imp
8c50: 6c 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e  l<'a, P: Pattern
8c60: 3c 27 61 3e 3e 20 66 6d 74 3a 3a 44 65 62 75 67  <'a>> fmt::Debug
8c70: 20 66 6f 72 20 4d 61 74 63 68 65 73 49 6e 74 65   for MatchesInte
8c80: 72 6e 61 6c 3c 27 61 2c 20 50 3e 20 77 68 65 72  rnal<'a, P> wher
8c90: 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 66  e P::Searcher: f
8ca0: 6d 74 3a 3a 44 65 62 75 67 20 7b 0a 20 20 20 20  mt::Debug {.    
8cb0: 66 6e 20 66 6d 74 28 26 73 65 6c 66 2c 20 66 3a  fn fmt(&self, f:
8cc0: 20 26 6d 75 74 20 66 6d 74 3a 3a 46 6f 72 6d 61   &mut fmt::Forma
8cd0: 74 74 65 72 29 20 2d 3e 20 66 6d 74 3a 3a 52 65  tter) -> fmt::Re
8ce0: 73 75 6c 74 20 7b 0a 20 20 20 20 20 20 20 20 66  sult {.        f
8cf0: 2e 64 65 62 75 67 5f 74 75 70 6c 65 28 22 4d 61  .debug_tuple("Ma
8d00: 74 63 68 65 73 49 6e 74 65 72 6e 61 6c 22 29 0a  tchesInternal").
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 2e 66 69 65              .fie
8d20: 6c 64 28 26 73 65 6c 66 2e 30 29 0a 20 20 20 20  ld(&self.0).    
8d30: 20 20 20 20 20 20 20 20 2e 66 69 6e 69 73 68 28          .finish(
8d40: 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c  ).    }.}..impl<
8d50: 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27  'a, P: Pattern<'
8d60: 61 3e 3e 20 4d 61 74 63 68 65 73 49 6e 74 65 72  a>> MatchesInter
8d70: 6e 61 6c 3c 27 61 2c 20 50 3e 20 7b 0a 20 20 20  nal<'a, P> {.   
8d80: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66   #[inline].    f
8d90: 6e 20 6e 65 78 74 28 26 6d 75 74 20 73 65 6c 66  n next(&mut self
8da0: 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 27 61 20  ) -> Option<&'a 
8db0: 73 74 72 3e 20 7b 0a 20 20 20 20 20 20 20 20 73  str> {.        s
8dc0: 65 6c 66 2e 30 2e 6e 65 78 74 5f 6d 61 74 63 68  elf.0.next_match
8dd0: 28 29 2e 6d 61 70 28 7c 28 61 2c 20 62 29 7c 20  ().map(|(a, b)| 
8de0: 75 6e 73 61 66 65 20 7b 0a 20 20 20 20 20 20 20  unsafe {.       
8df0: 20 20 20 20 20 2f 2f 20 49 6e 64 69 63 65 73 20       // Indices 
8e00: 61 72 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20  are known to be 
8e10: 6f 6e 20 75 74 66 38 20 62 6f 75 6e 64 61 72 69  on utf8 boundari
8e20: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  es.            s
8e30: 65 6c 66 2e 30 2e 68 61 79 73 74 61 63 6b 28 29  elf.0.haystack()
8e40: 2e 73 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65 64  .slice_unchecked
8e50: 28 61 2c 20 62 29 0a 20 20 20 20 20 20 20 20 7d  (a, b).        }
8e60: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69  ).    }..    #[i
8e70: 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 65  nline].    fn ne
8e80: 78 74 5f 62 61 63 6b 28 26 6d 75 74 20 73 65 6c  xt_back(&mut sel
8e90: 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 27 61  f) -> Option<&'a
8ea0: 20 73 74 72 3e 0a 20 20 20 20 20 20 20 20 77 68   str>.        wh
8eb0: 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a  ere P::Searcher:
8ec0: 20 52 65 76 65 72 73 65 53 65 61 72 63 68 65 72   ReverseSearcher
8ed0: 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20  <'a>.    {.     
8ee0: 20 20 20 73 65 6c 66 2e 30 2e 6e 65 78 74 5f 6d     self.0.next_m
8ef0: 61 74 63 68 5f 62 61 63 6b 28 29 2e 6d 61 70 28  atch_back().map(
8f00: 7c 28 61 2c 20 62 29 7c 20 75 6e 73 61 66 65 20  |(a, b)| unsafe 
8f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
8f20: 20 49 6e 64 69 63 65 73 20 61 72 65 20 6b 6e 6f   Indices are kno
8f30: 77 6e 20 74 6f 20 62 65 20 6f 6e 20 75 74 66 38  wn to be on utf8
8f40: 20 62 6f 75 6e 64 61 72 69 65 73 0a 20 20 20 20   boundaries.    
8f50: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 30 2e 68          self.0.h
8f60: 61 79 73 74 61 63 6b 28 29 2e 73 6c 69 63 65 5f  aystack().slice_
8f70: 75 6e 63 68 65 63 6b 65 64 28 61 2c 20 62 29 0a  unchecked(a, b).
8f80: 20 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d          }).    }
8f90: 0a 7d 0a 0a 67 65 6e 65 72 61 74 65 5f 70 61 74  .}..generate_pat
8fa0: 74 65 72 6e 5f 69 74 65 72 61 74 6f 72 73 21 20  tern_iterators! 
8fb0: 7b 0a 20 20 20 20 66 6f 72 77 61 72 64 3a 0a 20  {.    forward:. 
8fc0: 20 20 20 20 20 20 20 2f 2f 2f 20 43 72 65 61 74         /// Creat
8fd0: 65 64 20 77 69 74 68 20 74 68 65 20 6d 65 74 68  ed with the meth
8fe0: 6f 64 20 5b 60 6d 61 74 63 68 65 73 60 5d 2e 0a  od [`matches`]..
8ff0: 20 20 20 20 20 20 20 20 2f 2f 2f 0a 20 20 20 20          ///.    
9000: 20 20 20 20 2f 2f 2f 20 5b 60 6d 61 74 63 68 65      /// [`matche
9010: 73 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70  s`]: ../../std/p
9020: 72 69 6d 69 74 69 76 65 2e 73 74 72 2e 68 74 6d  rimitive.str.htm
9030: 6c 23 6d 65 74 68 6f 64 2e 6d 61 74 63 68 65 73  l#method.matches
9040: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
9050: 4d 61 74 63 68 65 73 3b 0a 20 20 20 20 72 65 76  Matches;.    rev
9060: 65 72 73 65 3a 0a 20 20 20 20 20 20 20 20 2f 2f  erse:.        //
9070: 2f 20 43 72 65 61 74 65 64 20 77 69 74 68 20 74  / Created with t
9080: 68 65 20 6d 65 74 68 6f 64 20 5b 60 72 6d 61 74  he method [`rmat
9090: 63 68 65 73 60 5d 2e 0a 20 20 20 20 20 20 20 20  ches`]..        
90a0: 2f 2f 2f 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  ///.        /// 
90b0: 5b 60 72 6d 61 74 63 68 65 73 60 5d 3a 20 2e 2e  [`rmatches`]: ..
90c0: 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69 76  /../std/primitiv
90d0: 65 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68 6f  e.str.html#metho
90e0: 64 2e 72 6d 61 74 63 68 65 73 0a 20 20 20 20 20  d.rmatches.     
90f0: 20 20 20 73 74 72 75 63 74 20 52 4d 61 74 63 68     struct RMatch
9100: 65 73 3b 0a 20 20 20 20 73 74 61 62 69 6c 69 74  es;.    stabilit
9110: 79 3a 0a 20 20 20 20 20 20 20 20 23 5b 73 74 61  y:.        #[sta
9120: 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 73  ble(feature = "s
9130: 74 72 5f 6d 61 74 63 68 65 73 22 2c 20 73 69 6e  tr_matches", sin
9140: 63 65 20 3d 20 22 31 2e 32 2e 30 22 29 5d 0a 20  ce = "1.2.0")]. 
9150: 20 20 20 69 6e 74 65 72 6e 61 6c 3a 0a 20 20 20     internal:.   
9160: 20 20 20 20 20 4d 61 74 63 68 65 73 49 6e 74 65       MatchesInte
9170: 72 6e 61 6c 20 79 69 65 6c 64 69 6e 67 20 28 26  rnal yielding (&
9180: 27 61 20 73 74 72 29 3b 0a 20 20 20 20 64 65 6c  'a str);.    del
9190: 65 67 61 74 65 20 64 6f 75 62 6c 65 20 65 6e 64  egate double end
91a0: 65 64 3b 0a 7d 0a 0a 2f 2f 2f 20 41 6e 20 69 74  ed;.}../// An it
91b0: 65 72 61 74 6f 72 20 6f 76 65 72 20 74 68 65 20  erator over the 
91c0: 6c 69 6e 65 73 20 6f 66 20 61 20 73 74 72 69 6e  lines of a strin
91d0: 67 2c 20 61 73 20 73 74 72 69 6e 67 20 73 6c 69  g, as string sli
91e0: 63 65 73 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 54 68 69  ces..///./// Thi
91f0: 73 20 73 74 72 75 63 74 20 69 73 20 63 72 65 61  s struct is crea
9200: 74 65 64 20 77 69 74 68 20 74 68 65 20 5b 60 6c  ted with the [`l
9210: 69 6e 65 73 60 5d 20 6d 65 74 68 6f 64 20 6f 6e  ines`] method on
9220: 20 5b 60 73 74 72 60 5d 2e 0a 2f 2f 2f 20 53 65   [`str`]../// Se
9230: 65 20 69 74 73 20 64 6f 63 75 6d 65 6e 74 61 74  e its documentat
9240: 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 2e 0a 2f 2f  ion for more..//
9250: 2f 0a 2f 2f 2f 20 5b 60 6c 69 6e 65 73 60 5d 3a  /./// [`lines`]:
9260: 20 2e 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d 69   ../../std/primi
9270: 74 69 76 65 2e 73 74 72 2e 68 74 6d 6c 23 6d 65  tive.str.html#me
9280: 74 68 6f 64 2e 6c 69 6e 65 73 0a 2f 2f 2f 20 5b  thod.lines./// [
9290: 60 73 74 72 60 5d 3a 20 2e 2e 2f 2e 2e 2f 73 74  `str`]: ../../st
92a0: 64 2f 70 72 69 6d 69 74 69 76 65 2e 73 74 72 2e  d/primitive.str.
92b0: 68 74 6d 6c 0a 23 5b 73 74 61 62 6c 65 28 66 65  html.#[stable(fe
92c0: 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c  ature = "rust1",
92d0: 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22   since = "1.0.0"
92e0: 29 5d 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  )].#[derive(Clon
92f0: 65 2c 20 44 65 62 75 67 29 5d 0a 70 75 62 20 73  e, Debug)].pub s
9300: 74 72 75 63 74 20 4c 69 6e 65 73 3c 27 61 3e 28  truct Lines<'a>(
9310: 4d 61 70 3c 53 70 6c 69 74 54 65 72 6d 69 6e 61  Map<SplitTermina
9320: 74 6f 72 3c 27 61 2c 20 63 68 61 72 3e 2c 20 4c  tor<'a, char>, L
9330: 69 6e 65 73 41 6e 79 4d 61 70 3e 29 3b 0a 0a 23  inesAnyMap>);..#
9340: 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
9350: 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65  = "rust1", since
9360: 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70   = "1.0.0")].imp
9370: 6c 3c 27 61 3e 20 49 74 65 72 61 74 6f 72 20 66  l<'a> Iterator f
9380: 6f 72 20 4c 69 6e 65 73 3c 27 61 3e 20 7b 0a 20  or Lines<'a> {. 
9390: 20 20 20 74 79 70 65 20 49 74 65 6d 20 3d 20 26     type Item = &
93a0: 27 61 20 73 74 72 3b 0a 0a 20 20 20 20 23 5b 69  'a str;..    #[i
93b0: 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6e 65  nline].    fn ne
93c0: 78 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e  xt(&mut self) ->
93d0: 20 4f 70 74 69 6f 6e 3c 26 27 61 20 73 74 72 3e   Option<&'a str>
93e0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
93f0: 30 2e 6e 65 78 74 28 29 0a 20 20 20 20 7d 0a 0a  0.next().    }..
9400: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
9410: 20 20 66 6e 20 73 69 7a 65 5f 68 69 6e 74 28 26    fn size_hint(&
9420: 73 65 6c 66 29 20 2d 3e 20 28 75 73 69 7a 65 2c  self) -> (usize,
9430: 20 4f 70 74 69 6f 6e 3c 75 73 69 7a 65 3e 29 20   Option<usize>) 
9440: 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 30  {.        self.0
9450: 2e 73 69 7a 65 5f 68 69 6e 74 28 29 0a 20 20 20  .size_hint().   
9460: 20 7d 0a 7d 0a 0a 23 5b 73 74 61 62 6c 65 28 66   }.}..#[stable(f
9470: 65 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22  eature = "rust1"
9480: 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30  , since = "1.0.0
9490: 22 29 5d 0a 69 6d 70 6c 3c 27 61 3e 20 44 6f 75  ")].impl<'a> Dou
94a0: 62 6c 65 45 6e 64 65 64 49 74 65 72 61 74 6f 72  bleEndedIterator
94b0: 20 66 6f 72 20 4c 69 6e 65 73 3c 27 61 3e 20 7b   for Lines<'a> {
94c0: 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
94d0: 20 20 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28     fn next_back(
94e0: 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70  &mut self) -> Op
94f0: 74 69 6f 6e 3c 26 27 61 20 73 74 72 3e 20 7b 0a  tion<&'a str> {.
9500: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 30 2e 6e          self.0.n
9510: 65 78 74 5f 62 61 63 6b 28 29 0a 20 20 20 20 7d  ext_back().    }
9520: 0a 7d 0a 0a 23 5b 75 6e 73 74 61 62 6c 65 28 66  .}..#[unstable(f
9530: 65 61 74 75 72 65 20 3d 20 22 66 75 73 65 64 22  eature = "fused"
9540: 2c 20 69 73 73 75 65 20 3d 20 22 33 35 36 30 32  , issue = "35602
9550: 22 29 5d 0a 69 6d 70 6c 3c 27 61 3e 20 46 75 73  ")].impl<'a> Fus
9560: 65 64 49 74 65 72 61 74 6f 72 20 66 6f 72 20 4c  edIterator for L
9570: 69 6e 65 73 3c 27 61 3e 20 7b 7d 0a 0a 2f 2f 2f  ines<'a> {}..///
9580: 20 43 72 65 61 74 65 64 20 77 69 74 68 20 74 68   Created with th
9590: 65 20 6d 65 74 68 6f 64 20 5b 60 6c 69 6e 65 73  e method [`lines
95a0: 5f 61 6e 79 60 5d 2e 0a 2f 2f 2f 0a 2f 2f 2f 20  _any`]..///./// 
95b0: 5b 60 6c 69 6e 65 73 5f 61 6e 79 60 5d 3a 20 2e  [`lines_any`]: .
95c0: 2e 2f 2e 2e 2f 73 74 64 2f 70 72 69 6d 69 74 69  ./../std/primiti
95d0: 76 65 2e 73 74 72 2e 68 74 6d 6c 23 6d 65 74 68  ve.str.html#meth
95e0: 6f 64 2e 6c 69 6e 65 73 5f 61 6e 79 0a 23 5b 73  od.lines_any.#[s
95f0: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
9600: 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d  "rust1", since =
9610: 20 22 31 2e 30 2e 30 22 29 5d 0a 23 5b 72 75 73   "1.0.0")].#[rus
9620: 74 63 5f 64 65 70 72 65 63 61 74 65 64 28 73 69  tc_deprecated(si
9630: 6e 63 65 20 3d 20 22 31 2e 34 2e 30 22 2c 20 72  nce = "1.4.0", r
9640: 65 61 73 6f 6e 20 3d 20 22 75 73 65 20 6c 69 6e  eason = "use lin
9650: 65 73 28 29 2f 4c 69 6e 65 73 20 69 6e 73 74 65  es()/Lines inste
9660: 61 64 20 6e 6f 77 22 29 5d 0a 23 5b 64 65 72 69  ad now")].#[deri
9670: 76 65 28 43 6c 6f 6e 65 2c 20 44 65 62 75 67 29  ve(Clone, Debug)
9680: 5d 0a 23 5b 61 6c 6c 6f 77 28 64 65 70 72 65 63  ].#[allow(deprec
9690: 61 74 65 64 29 5d 0a 70 75 62 20 73 74 72 75 63  ated)].pub struc
96a0: 74 20 4c 69 6e 65 73 41 6e 79 3c 27 61 3e 28 4c  t LinesAny<'a>(L
96b0: 69 6e 65 73 3c 27 61 3e 29 3b 0a 0a 2f 2f 2f 20  ines<'a>);../// 
96c0: 41 20 6e 61 6d 65 61 62 6c 65 2c 20 63 6c 6f 6e  A nameable, clon
96d0: 65 61 62 6c 65 20 66 6e 20 74 79 70 65 0a 23 5b  eable fn type.#[
96e0: 64 65 72 69 76 65 28 43 6c 6f 6e 65 29 5d 0a 73  derive(Clone)].s
96f0: 74 72 75 63 74 20 4c 69 6e 65 73 41 6e 79 4d 61  truct LinesAnyMa
9700: 70 3b 0a 0a 69 6d 70 6c 3c 27 61 3e 20 46 6e 3c  p;..impl<'a> Fn<
9710: 28 26 27 61 20 73 74 72 2c 29 3e 20 66 6f 72 20  (&'a str,)> for 
9720: 4c 69 6e 65 73 41 6e 79 4d 61 70 20 7b 0a 20 20  LinesAnyMap {.  
9730: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
9740: 65 78 74 65 72 6e 20 22 72 75 73 74 2d 63 61 6c  extern "rust-cal
9750: 6c 22 20 66 6e 20 63 61 6c 6c 28 26 73 65 6c 66  l" fn call(&self
9760: 2c 20 28 6c 69 6e 65 2c 29 3a 20 28 26 27 61 20  , (line,): (&'a 
9770: 73 74 72 2c 29 29 20 2d 3e 20 26 27 61 20 73 74  str,)) -> &'a st
9780: 72 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  r {.        let 
9790: 6c 20 3d 20 6c 69 6e 65 2e 6c 65 6e 28 29 3b 0a  l = line.len();.
97a0: 20 20 20 20 20 20 20 20 69 66 20 6c 20 3e 20 30          if l > 0
97b0: 20 26 26 20 6c 69 6e 65 2e 61 73 5f 62 79 74 65   && line.as_byte
97c0: 73 28 29 5b 6c 20 2d 20 31 5d 20 3d 3d 20 62 27  s()[l - 1] == b'
97d0: 5c 72 27 20 7b 20 26 6c 69 6e 65 5b 30 20 2e 2e  \r' { &line[0 ..
97e0: 20 6c 20 2d 20 31 5d 20 7d 0a 20 20 20 20 20 20   l - 1] }.      
97f0: 20 20 65 6c 73 65 20 7b 20 6c 69 6e 65 20 7d 0a    else { line }.
9800: 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 61      }.}..impl<'a
9810: 3e 20 46 6e 4d 75 74 3c 28 26 27 61 20 73 74 72  > FnMut<(&'a str
9820: 2c 29 3e 20 66 6f 72 20 4c 69 6e 65 73 41 6e 79  ,)> for LinesAny
9830: 4d 61 70 20 7b 0a 20 20 20 20 23 5b 69 6e 6c 69  Map {.    #[inli
9840: 6e 65 5d 0a 20 20 20 20 65 78 74 65 72 6e 20 22  ne].    extern "
9850: 72 75 73 74 2d 63 61 6c 6c 22 20 66 6e 20 63 61  rust-call" fn ca
9860: 6c 6c 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66  ll_mut(&mut self
9870: 2c 20 28 6c 69 6e 65 2c 29 3a 20 28 26 27 61 20  , (line,): (&'a 
9880: 73 74 72 2c 29 29 20 2d 3e 20 26 27 61 20 73 74  str,)) -> &'a st
9890: 72 20 7b 0a 20 20 20 20 20 20 20 20 46 6e 3a 3a  r {.        Fn::
98a0: 63 61 6c 6c 28 26 2a 73 65 6c 66 2c 20 28 6c 69  call(&*self, (li
98b0: 6e 65 2c 29 29 0a 20 20 20 20 7d 0a 7d 0a 0a 69  ne,)).    }.}..i
98c0: 6d 70 6c 3c 27 61 3e 20 46 6e 4f 6e 63 65 3c 28  mpl<'a> FnOnce<(
98d0: 26 27 61 20 73 74 72 2c 29 3e 20 66 6f 72 20 4c  &'a str,)> for L
98e0: 69 6e 65 73 41 6e 79 4d 61 70 20 7b 0a 20 20 20  inesAnyMap {.   
98f0: 20 74 79 70 65 20 4f 75 74 70 75 74 20 3d 20 26   type Output = &
9900: 27 61 20 73 74 72 3b 0a 0a 20 20 20 20 23 5b 69  'a str;..    #[i
9910: 6e 6c 69 6e 65 5d 0a 20 20 20 20 65 78 74 65 72  nline].    exter
9920: 6e 20 22 72 75 73 74 2d 63 61 6c 6c 22 20 66 6e  n "rust-call" fn
9930: 20 63 61 6c 6c 5f 6f 6e 63 65 28 73 65 6c 66 2c   call_once(self,
9940: 20 28 6c 69 6e 65 2c 29 3a 20 28 26 27 61 20 73   (line,): (&'a s
9950: 74 72 2c 29 29 20 2d 3e 20 26 27 61 20 73 74 72  tr,)) -> &'a str
9960: 20 7b 0a 20 20 20 20 20 20 20 20 46 6e 3a 3a 63   {.        Fn::c
9970: 61 6c 6c 28 26 73 65 6c 66 2c 20 28 6c 69 6e 65  all(&self, (line
9980: 2c 29 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 73  ,)).    }.}..#[s
9990: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
99a0: 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d  "rust1", since =
99b0: 20 22 31 2e 30 2e 30 22 29 5d 0a 23 5b 61 6c 6c   "1.0.0")].#[all
99c0: 6f 77 28 64 65 70 72 65 63 61 74 65 64 29 5d 0a  ow(deprecated)].
99d0: 69 6d 70 6c 3c 27 61 3e 20 49 74 65 72 61 74 6f  impl<'a> Iterato
99e0: 72 20 66 6f 72 20 4c 69 6e 65 73 41 6e 79 3c 27  r for LinesAny<'
99f0: 61 3e 20 7b 0a 20 20 20 20 74 79 70 65 20 49 74  a> {.    type It
9a00: 65 6d 20 3d 20 26 27 61 20 73 74 72 3b 0a 0a 20  em = &'a str;.. 
9a10: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
9a20: 20 66 6e 20 6e 65 78 74 28 26 6d 75 74 20 73 65   fn next(&mut se
9a30: 6c 66 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 27  lf) -> Option<&'
9a40: 61 20 73 74 72 3e 20 7b 0a 20 20 20 20 20 20 20  a str> {.       
9a50: 20 73 65 6c 66 2e 30 2e 6e 65 78 74 28 29 0a 20   self.0.next(). 
9a60: 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69     }..    #[inli
9a70: 6e 65 5d 0a 20 20 20 20 66 6e 20 73 69 7a 65 5f  ne].    fn size_
9a80: 68 69 6e 74 28 26 73 65 6c 66 29 20 2d 3e 20 28  hint(&self) -> (
9a90: 75 73 69 7a 65 2c 20 4f 70 74 69 6f 6e 3c 75 73  usize, Option<us
9aa0: 69 7a 65 3e 29 20 7b 0a 20 20 20 20 20 20 20 20  ize>) {.        
9ab0: 73 65 6c 66 2e 30 2e 73 69 7a 65 5f 68 69 6e 74  self.0.size_hint
9ac0: 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 73 74  ().    }.}..#[st
9ad0: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
9ae0: 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20  rust1", since = 
9af0: 22 31 2e 30 2e 30 22 29 5d 0a 23 5b 61 6c 6c 6f  "1.0.0")].#[allo
9b00: 77 28 64 65 70 72 65 63 61 74 65 64 29 5d 0a 69  w(deprecated)].i
9b10: 6d 70 6c 3c 27 61 3e 20 44 6f 75 62 6c 65 45 6e  mpl<'a> DoubleEn
9b20: 64 65 64 49 74 65 72 61 74 6f 72 20 66 6f 72 20  dedIterator for 
9b30: 4c 69 6e 65 73 41 6e 79 3c 27 61 3e 20 7b 0a 20  LinesAny<'a> {. 
9b40: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
9b50: 20 66 6e 20 6e 65 78 74 5f 62 61 63 6b 28 26 6d   fn next_back(&m
9b60: 75 74 20 73 65 6c 66 29 20 2d 3e 20 4f 70 74 69  ut self) -> Opti
9b70: 6f 6e 3c 26 27 61 20 73 74 72 3e 20 7b 0a 20 20  on<&'a str> {.  
9b80: 20 20 20 20 20 20 73 65 6c 66 2e 30 2e 6e 65 78        self.0.nex
9b90: 74 5f 62 61 63 6b 28 29 0a 20 20 20 20 7d 0a 7d  t_back().    }.}
9ba0: 0a 0a 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61  ..#[unstable(fea
9bb0: 74 75 72 65 20 3d 20 22 66 75 73 65 64 22 2c 20  ture = "fused", 
9bc0: 69 73 73 75 65 20 3d 20 22 33 35 36 30 32 22 29  issue = "35602")
9bd0: 5d 0a 23 5b 61 6c 6c 6f 77 28 64 65 70 72 65 63  ].#[allow(deprec
9be0: 61 74 65 64 29 5d 0a 69 6d 70 6c 3c 27 61 3e 20  ated)].impl<'a> 
9bf0: 46 75 73 65 64 49 74 65 72 61 74 6f 72 20 66 6f  FusedIterator fo
9c00: 72 20 4c 69 6e 65 73 41 6e 79 3c 27 61 3e 20 7b  r LinesAny<'a> {
9c10: 7d 0a 0a 2f 2a 0a 53 65 63 74 69 6f 6e 3a 20 43  }../*.Section: C
9c20: 6f 6d 70 61 72 69 6e 67 20 73 74 72 69 6e 67 73  omparing strings
9c30: 0a 2a 2f 0a 0a 2f 2f 2f 20 42 79 74 65 77 69 73  .*/../// Bytewis
9c40: 65 20 73 6c 69 63 65 20 65 71 75 61 6c 69 74 79  e slice equality
9c50: 0a 2f 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73 20  ./// NOTE: This 
9c60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 28 61 62 29  function is (ab)
9c70: 75 73 65 64 20 69 6e 20 72 75 73 74 63 3a 3a 6d  used in rustc::m
9c80: 69 64 64 6c 65 3a 3a 74 72 61 6e 73 3a 3a 5f 6d  iddle::trans::_m
9c90: 61 74 63 68 0a 2f 2f 2f 20 74 6f 20 63 6f 6d 70  atch./// to comp
9ca0: 61 72 65 20 26 5b 75 38 5d 20 62 79 74 65 20 73  are &[u8] byte s
9cb0: 6c 69 63 65 73 20 74 68 61 74 20 61 72 65 20 6e  lices that are n
9cc0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 76  ot necessarily v
9cd0: 61 6c 69 64 20 55 54 46 2d 38 2e 0a 23 5b 6c 61  alid UTF-8..#[la
9ce0: 6e 67 20 3d 20 22 73 74 72 5f 65 71 22 5d 0a 23  ng = "str_eq"].#
9cf0: 5b 69 6e 6c 69 6e 65 5d 0a 66 6e 20 65 71 5f 73  [inline].fn eq_s
9d00: 6c 69 63 65 28 61 3a 20 26 73 74 72 2c 20 62 3a  lice(a: &str, b:
9d10: 20 26 73 74 72 29 20 2d 3e 20 62 6f 6f 6c 20 7b   &str) -> bool {
9d20: 0a 20 20 20 20 61 2e 61 73 5f 62 79 74 65 73 28  .    a.as_bytes(
9d30: 29 20 3d 3d 20 62 2e 61 73 5f 62 79 74 65 73 28  ) == b.as_bytes(
9d40: 29 0a 7d 0a 0a 2f 2a 0a 53 65 63 74 69 6f 6e 3a  ).}../*.Section:
9d50: 20 55 54 46 2d 38 20 76 61 6c 69 64 61 74 69 6f   UTF-8 validatio
9d60: 6e 0a 2a 2f 0a 0a 2f 2f 20 75 73 65 20 74 72 75  n.*/..// use tru
9d70: 6e 63 61 74 69 6f 6e 20 74 6f 20 66 69 74 20 75  ncation to fit u
9d80: 36 34 20 69 6e 74 6f 20 75 73 69 7a 65 0a 63 6f  64 into usize.co
9d90: 6e 73 74 20 4e 4f 4e 41 53 43 49 49 5f 4d 41 53  nst NONASCII_MAS
9da0: 4b 3a 20 75 73 69 7a 65 20 3d 20 30 78 38 30 38  K: usize = 0x808
9db0: 30 38 30 38 30 5f 38 30 38 30 38 30 38 30 75 36  08080_80808080u6
9dc0: 34 20 61 73 20 75 73 69 7a 65 3b 0a 0a 2f 2f 2f  4 as usize;..///
9dd0: 20 52 65 74 75 72 6e 73 20 60 74 72 75 65 60 20   Returns `true` 
9de0: 69 66 20 61 6e 79 20 62 79 74 65 20 69 6e 20 74  if any byte in t
9df0: 68 65 20 77 6f 72 64 20 60 78 60 20 69 73 20 6e  he word `x` is n
9e00: 6f 6e 61 73 63 69 69 20 28 3e 3d 20 31 32 38 29  onascii (>= 128)
9e10: 2e 0a 23 5b 69 6e 6c 69 6e 65 5d 0a 66 6e 20 63  ..#[inline].fn c
9e20: 6f 6e 74 61 69 6e 73 5f 6e 6f 6e 61 73 63 69 69  ontains_nonascii
9e30: 28 78 3a 20 75 73 69 7a 65 29 20 2d 3e 20 62 6f  (x: usize) -> bo
9e40: 6f 6c 20 7b 0a 20 20 20 20 28 78 20 26 20 4e 4f  ol {.    (x & NO
9e50: 4e 41 53 43 49 49 5f 4d 41 53 4b 29 20 21 3d 20  NASCII_MASK) != 
9e60: 30 0a 7d 0a 0a 2f 2f 2f 20 57 61 6c 6b 73 20 74  0.}../// Walks t
9e70: 68 72 6f 75 67 68 20 60 69 74 65 72 60 20 63 68  hrough `iter` ch
9e80: 65 63 6b 69 6e 67 20 74 68 61 74 20 69 74 27 73  ecking that it's
9e90: 20 61 20 76 61 6c 69 64 20 55 54 46 2d 38 20 73   a valid UTF-8 s
9ea0: 65 71 75 65 6e 63 65 2c 0a 2f 2f 2f 20 72 65 74  equence,./// ret
9eb0: 75 72 6e 69 6e 67 20 60 74 72 75 65 60 20 69 6e  urning `true` in
9ec0: 20 74 68 61 74 20 63 61 73 65 2c 20 6f 72 2c 20   that case, or, 
9ed0: 69 66 20 69 74 20 69 73 20 69 6e 76 61 6c 69 64  if it is invalid
9ee0: 2c 20 60 66 61 6c 73 65 60 20 77 69 74 68 0a 2f  , `false` with./
9ef0: 2f 2f 20 60 69 74 65 72 60 20 72 65 73 65 74 20  // `iter` reset 
9f00: 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
9f10: 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
9f20: 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
9f30: 65 0a 2f 2f 2f 20 69 6e 76 61 6c 69 64 20 73 65  e./// invalid se
9f40: 71 75 65 6e 63 65 2e 0a 23 5b 69 6e 6c 69 6e 65  quence..#[inline
9f50: 28 61 6c 77 61 79 73 29 5d 0a 66 6e 20 72 75 6e  (always)].fn run
9f60: 5f 75 74 66 38 5f 76 61 6c 69 64 61 74 69 6f 6e  _utf8_validation
9f70: 28 76 3a 20 26 5b 75 38 5d 29 20 2d 3e 20 52 65  (v: &[u8]) -> Re
9f80: 73 75 6c 74 3c 28 29 2c 20 55 74 66 38 45 72 72  sult<(), Utf8Err
9f90: 6f 72 3e 20 7b 0a 20 20 20 20 6c 65 74 20 6d 75  or> {.    let mu
9fa0: 74 20 69 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  t index = 0;.   
9fb0: 20 6c 65 74 20 6c 65 6e 20 3d 20 76 2e 6c 65 6e   let len = v.len
9fc0: 28 29 3b 0a 0a 20 20 20 20 6c 65 74 20 75 73 69  ();..    let usi
9fd0: 7a 65 5f 62 79 74 65 73 20 3d 20 6d 65 6d 3a 3a  ze_bytes = mem::
9fe0: 73 69 7a 65 5f 6f 66 3a 3a 3c 75 73 69 7a 65 3e  size_of::<usize>
9ff0: 28 29 3b 0a 20 20 20 20 6c 65 74 20 61 73 63 69  ();.    let asci
a000: 69 5f 62 6c 6f 63 6b 5f 73 69 7a 65 20 3d 20 32  i_block_size = 2
a010: 20 2a 20 75 73 69 7a 65 5f 62 79 74 65 73 3b 0a   * usize_bytes;.
a020: 20 20 20 20 6c 65 74 20 62 6c 6f 63 6b 73 5f 65      let blocks_e
a030: 6e 64 20 3d 20 69 66 20 6c 65 6e 20 3e 3d 20 61  nd = if len >= a
a040: 73 63 69 69 5f 62 6c 6f 63 6b 5f 73 69 7a 65 20  scii_block_size 
a050: 7b 20 6c 65 6e 20 2d 20 61 73 63 69 69 5f 62 6c  { len - ascii_bl
a060: 6f 63 6b 5f 73 69 7a 65 20 2b 20 31 20 7d 20 65  ock_size + 1 } e
a070: 6c 73 65 20 7b 20 30 20 7d 3b 0a 0a 20 20 20 20  lse { 0 };..    
a080: 77 68 69 6c 65 20 69 6e 64 65 78 20 3c 20 6c 65  while index < le
a090: 6e 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  n {.        let 
a0a0: 6f 6c 64 5f 6f 66 66 73 65 74 20 3d 20 69 6e 64  old_offset = ind
a0b0: 65 78 3b 0a 20 20 20 20 20 20 20 20 6d 61 63 72  ex;.        macr
a0c0: 6f 5f 72 75 6c 65 73 21 20 65 72 72 20 7b 0a 20  o_rules! err {. 
a0d0: 20 20 20 20 20 20 20 20 20 20 20 28 24 65 72 72             ($err
a0e0: 6f 72 5f 6c 65 6e 3a 20 65 78 70 72 29 20 3d 3e  or_len: expr) =>
a0f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a100: 20 20 20 72 65 74 75 72 6e 20 45 72 72 28 55 74     return Err(Ut
a110: 66 38 45 72 72 6f 72 20 7b 0a 20 20 20 20 20 20  f8Error {.      
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
a130: 6c 69 64 5f 75 70 5f 74 6f 3a 20 6f 6c 64 5f 6f  lid_up_to: old_o
a140: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  ffset,.         
a150: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
a160: 5f 6c 65 6e 3a 20 24 65 72 72 6f 72 5f 6c 65 6e  _len: $error_len
a170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a180: 20 20 7d 29 0a 20 20 20 20 20 20 20 20 20 20 20    }).           
a190: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
a1a0: 20 20 20 20 20 20 6d 61 63 72 6f 5f 72 75 6c 65        macro_rule
a1b0: 73 21 20 6e 65 78 74 20 7b 20 28 29 20 3d 3e 20  s! next { () => 
a1c0: 7b 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {{.            i
a1d0: 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20  ndex += 1;.     
a1e0: 20 20 20 20 20 20 20 2f 2f 20 77 65 20 6e 65 65         // we nee
a1f0: 64 65 64 20 64 61 74 61 2c 20 62 75 74 20 74 68  ded data, but th
a200: 65 72 65 20 77 61 73 20 6e 6f 6e 65 3a 20 65 72  ere was none: er
a210: 72 6f 72 21 0a 20 20 20 20 20 20 20 20 20 20 20  ror!.           
a220: 20 69 66 20 69 6e 64 65 78 20 3e 3d 20 6c 65 6e   if index >= len
a230: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a240: 20 20 20 65 72 72 21 28 4e 6f 6e 65 29 0a 20 20     err!(None).  
a250: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a260: 20 20 20 20 20 20 20 20 76 5b 69 6e 64 65 78 5d          v[index]
a270: 0a 20 20 20 20 20 20 20 20 7d 7d 7d 0a 0a 20 20  .        }}}..  
a280: 20 20 20 20 20 20 6c 65 74 20 66 69 72 73 74 20        let first 
a290: 3d 20 76 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20  = v[index];.    
a2a0: 20 20 20 20 69 66 20 66 69 72 73 74 20 3e 3d 20      if first >= 
a2b0: 31 32 38 20 7b 0a 20 20 20 20 20 20 20 20 20 20  128 {.          
a2c0: 20 20 6c 65 74 20 77 20 3d 20 55 54 46 38 5f 43    let w = UTF8_C
a2d0: 48 41 52 5f 57 49 44 54 48 5b 66 69 72 73 74 20  HAR_WIDTH[first 
a2e0: 61 73 20 75 73 69 7a 65 5d 3b 0a 20 20 20 20 20  as usize];.     
a2f0: 20 20 20 20 20 20 20 2f 2f 20 32 2d 62 79 74 65         // 2-byte
a300: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 66 6f 72   encoding is for
a310: 20 63 6f 64 65 70 6f 69 6e 74 73 20 20 5c 75 7b   codepoints  \u{
a320: 30 30 38 30 7d 20 74 6f 20 20 5c 75 7b 30 37 66  0080} to  \u{07f
a330: 66 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  f}.            /
a340: 2f 20 20 20 20 20 20 20 20 66 69 72 73 74 20 20  /        first  
a350: 43 32 20 38 30 20 20 20 20 20 20 20 20 6c 61 73  C2 80        las
a360: 74 20 44 46 20 42 46 0a 20 20 20 20 20 20 20 20  t DF BF.        
a370: 20 20 20 20 2f 2f 20 33 2d 62 79 74 65 20 65 6e      // 3-byte en
a380: 63 6f 64 69 6e 67 20 69 73 20 66 6f 72 20 63 6f  coding is for co
a390: 64 65 70 6f 69 6e 74 73 20 20 5c 75 7b 30 38 30  depoints  \u{080
a3a0: 30 7d 20 74 6f 20 20 5c 75 7b 66 66 66 66 7d 0a  0} to  \u{ffff}.
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
a3c0: 20 20 20 20 20 20 66 69 72 73 74 20 20 45 30 20        first  E0 
a3d0: 41 30 20 38 30 20 20 20 20 20 6c 61 73 74 20 45  A0 80     last E
a3e0: 46 20 42 46 20 42 46 0a 20 20 20 20 20 20 20 20  F BF BF.        
a3f0: 20 20 20 20 2f 2f 20 20 20 65 78 63 6c 75 64 69      //   excludi
a400: 6e 67 20 73 75 72 72 6f 67 61 74 65 73 20 63 6f  ng surrogates co
a410: 64 65 70 6f 69 6e 74 73 20 20 5c 75 7b 64 38 30  depoints  \u{d80
a420: 30 7d 20 74 6f 20 20 5c 75 7b 64 66 66 66 7d 0a  0} to  \u{dfff}.
a430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 44 20               ED 
a450: 41 30 20 38 30 20 74 6f 20 20 20 20 20 20 20 45  A0 80 to       E
a460: 44 20 42 46 20 42 46 0a 20 20 20 20 20 20 20 20  D BF BF.        
a470: 20 20 20 20 2f 2f 20 34 2d 62 79 74 65 20 65 6e      // 4-byte en
a480: 63 6f 64 69 6e 67 20 69 73 20 66 6f 72 20 63 6f  coding is for co
a490: 64 65 70 6f 69 6e 74 73 20 5c 75 7b 31 30 30 30  depoints \u{1000
a4a0: 7d 30 20 74 6f 20 5c 75 7b 31 30 66 66 7d 66 66  }0 to \u{10ff}ff
a4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
a4c0: 20 20 20 20 20 20 20 66 69 72 73 74 20 20 46 30         first  F0
a4d0: 20 39 30 20 38 30 20 38 30 20 20 6c 61 73 74 20   90 80 80  last 
a4e0: 46 34 20 38 46 20 42 46 20 42 46 0a 20 20 20 20  F4 8F BF BF.    
a4f0: 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20          //.     
a500: 20 20 20 20 20 20 20 2f 2f 20 55 73 65 20 74 68         // Use th
a510: 65 20 55 54 46 2d 38 20 73 79 6e 74 61 78 20 66  e UTF-8 syntax f
a520: 72 6f 6d 20 74 68 65 20 52 46 43 0a 20 20 20 20  rom the RFC.    
a530: 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20          //.     
a540: 20 20 20 20 20 20 20 2f 2f 20 68 74 74 70 73 3a         // https:
a550: 2f 2f 74 6f 6f 6c 73 2e 69 65 74 66 2e 6f 72 67  //tools.ietf.org
a560: 2f 68 74 6d 6c 2f 72 66 63 33 36 32 39 0a 20 20  /html/rfc3629.  
a570: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 55 54 46            // UTF
a580: 38 2d 31 20 20 20 20 20 20 3d 20 25 78 30 30 2d  8-1      = %x00-
a590: 37 46 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  7F.            /
a5a0: 2f 20 55 54 46 38 2d 32 20 20 20 20 20 20 3d 20  / UTF8-2      = 
a5b0: 25 78 43 32 2d 44 46 20 55 54 46 38 2d 74 61 69  %xC2-DF UTF8-tai
a5c0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  l.            //
a5d0: 20 55 54 46 38 2d 33 20 20 20 20 20 20 3d 20 25   UTF8-3      = %
a5e0: 78 45 30 20 25 78 41 30 2d 42 46 20 55 54 46 38  xE0 %xA0-BF UTF8
a5f0: 2d 74 61 69 6c 20 2f 20 25 78 45 31 2d 45 43 20  -tail / %xE1-EC 
a600: 32 28 20 55 54 46 38 2d 74 61 69 6c 20 29 20 2f  2( UTF8-tail ) /
a610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 78                %x
a630: 45 44 20 25 78 38 30 2d 39 46 20 55 54 46 38 2d  ED %x80-9F UTF8-
a640: 74 61 69 6c 20 2f 20 25 78 45 45 2d 45 46 20 32  tail / %xEE-EF 2
a650: 28 20 55 54 46 38 2d 74 61 69 6c 20 29 0a 20 20  ( UTF8-tail ).  
a660: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 55 54 46            // UTF
a670: 38 2d 34 20 20 20 20 20 20 3d 20 25 78 46 30 20  8-4      = %xF0 
a680: 25 78 39 30 2d 42 46 20 32 28 20 55 54 46 38 2d  %x90-BF 2( UTF8-
a690: 74 61 69 6c 20 29 20 2f 20 25 78 46 31 2d 46 33  tail ) / %xF1-F3
a6a0: 20 33 28 20 55 54 46 38 2d 74 61 69 6c 20 29 20   3( UTF8-tail ) 
a6b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  /.            //
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
a6d0: 78 46 34 20 25 78 38 30 2d 38 46 20 32 28 20 55  xF4 %x80-8F 2( U
a6e0: 54 46 38 2d 74 61 69 6c 20 29 0a 20 20 20 20 20  TF8-tail ).     
a6f0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 77 20 7b         match w {
a700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a710: 20 32 20 3d 3e 20 69 66 20 6e 65 78 74 21 28 29   2 => if next!()
a720: 20 26 20 21 43 4f 4e 54 5f 4d 41 53 4b 20 21 3d   & !CONT_MASK !=
a730: 20 54 41 47 5f 43 4f 4e 54 5f 55 38 20 7b 0a 20   TAG_CONT_U8 {. 
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 65 72 72 21 28 53 6f 6d 65 28 31 29 29     err!(Some(1))
a760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a770: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
a780: 20 20 20 20 33 20 3d 3e 20 7b 0a 20 20 20 20 20      3 => {.     
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
a7a0: 61 74 63 68 20 28 66 69 72 73 74 2c 20 6e 65 78  atch (first, nex
a7b0: 74 21 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  t!()) {.        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 28 30 78 45 30 20 20 20 20 20 20 20 20 20 2c 20  (0xE0         , 
a7e0: 30 78 41 30 20 2e 2e 2e 20 30 78 42 46 29 20 7c  0xA0 ... 0xBF) |
a7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a800: 20 20 20 20 20 20 20 20 20 28 30 78 45 31 20 2e           (0xE1 .
a810: 2e 2e 20 30 78 45 43 2c 20 30 78 38 30 20 2e 2e  .. 0xEC, 0x80 ..
a820: 2e 20 30 78 42 46 29 20 7c 0a 20 20 20 20 20 20  . 0xBF) |.      
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 28 30 78 45 44 20 20 20 20 20 20 20 20 20    (0xED         
a850: 2c 20 30 78 38 30 20 2e 2e 2e 20 30 78 39 46 29  , 0x80 ... 0x9F)
a860: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
a870: 20 20 20 20 20 20 20 20 20 20 20 28 30 78 45 45             (0xEE
a880: 20 2e 2e 2e 20 30 78 45 46 2c 20 30 78 38 30 20   ... 0xEF, 0x80 
a890: 2e 2e 2e 20 30 78 42 46 29 20 3d 3e 20 7b 7d 0a  ... 0xBF) => {}.
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 65 72 72          _ => err
a8c0: 21 28 53 6f 6d 65 28 31 29 29 0a 20 20 20 20 20  !(Some(1)).     
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a8f0: 20 20 20 20 20 69 66 20 6e 65 78 74 21 28 29 20       if next!() 
a900: 26 20 21 43 4f 4e 54 5f 4d 41 53 4b 20 21 3d 20  & !CONT_MASK != 
a910: 54 41 47 5f 43 4f 4e 54 5f 55 38 20 7b 0a 20 20  TAG_CONT_U8 {.  
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 65 72 72 21 28 53 6f 6d 65 28        err!(Some(
a940: 32 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  2)).            
a950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a960: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a970: 20 20 20 20 20 20 20 20 20 20 20 20 34 20 3d 3e              4 =>
a980: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a990: 20 20 20 20 20 20 20 6d 61 74 63 68 20 28 66 69         match (fi
a9a0: 72 73 74 2c 20 6e 65 78 74 21 28 29 29 20 7b 0a  rst, next!()) {.
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 28 30 78 46 30 20 20 20          (0xF0   
a9d0: 20 20 20 20 20 20 2c 20 30 78 39 30 20 2e 2e 2e        , 0x90 ...
a9e0: 20 30 78 42 46 29 20 7c 0a 20 20 20 20 20 20 20   0xBF) |.       
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 28 30 78 46 31 20 2e 2e 2e 20 30 78 46 33 2c   (0xF1 ... 0xF3,
aa10: 20 30 78 38 30 20 2e 2e 2e 20 30 78 42 46 29 20   0x80 ... 0xBF) 
aa20: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
aa30: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 34 20            (0xF4 
aa40: 20 20 20 20 20 20 20 20 2c 20 30 78 38 30 20 2e          , 0x80 .
aa50: 2e 2e 20 30 78 38 46 29 20 3d 3e 20 7b 7d 0a 20  .. 0x8F) => {}. 
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 20 20 20 20 5f 20 3d 3e 20 65 72 72 21         _ => err!
aa80: 28 53 6f 6d 65 28 31 29 29 0a 20 20 20 20 20 20  (Some(1)).      
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 69 66 20 6e 65 78 74 21 28 29 20 26      if next!() &
aac0: 20 21 43 4f 4e 54 5f 4d 41 53 4b 20 21 3d 20 54   !CONT_MASK != T
aad0: 41 47 5f 43 4f 4e 54 5f 55 38 20 7b 0a 20 20 20  AG_CONT_U8 {.   
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 20 20 65 72 72 21 28 53 6f 6d 65 28 32       err!(Some(2
ab00: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
ab10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
ab30: 6e 65 78 74 21 28 29 20 26 20 21 43 4f 4e 54 5f  next!() & !CONT_
ab40: 4d 41 53 4b 20 21 3d 20 54 41 47 5f 43 4f 4e 54  MASK != TAG_CONT
ab50: 5f 55 38 20 7b 0a 20 20 20 20 20 20 20 20 20 20  _U8 {.          
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
ab70: 72 21 28 53 6f 6d 65 28 33 29 29 0a 20 20 20 20  r!(Some(3)).    
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
aba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
abb0: 20 20 20 20 5f 20 3d 3e 20 65 72 72 21 28 53 6f      _ => err!(So
abc0: 6d 65 28 31 29 29 0a 20 20 20 20 20 20 20 20 20  me(1)).         
abd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
abe0: 20 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20   index += 1;.   
abf0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
ac00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 41 73 63            // Asc
ac10: 69 69 20 63 61 73 65 2c 20 74 72 79 20 74 6f 20  ii case, try to 
ac20: 73 6b 69 70 20 66 6f 72 77 61 72 64 20 71 75 69  skip forward qui
ac30: 63 6b 6c 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ckly..          
ac40: 20 20 2f 2f 20 57 68 65 6e 20 74 68 65 20 70 6f    // When the po
ac50: 69 6e 74 65 72 20 69 73 20 61 6c 69 67 6e 65 64  inter is aligned
ac60: 2c 20 72 65 61 64 20 32 20 77 6f 72 64 73 20 6f  , read 2 words o
ac70: 66 20 64 61 74 61 20 70 65 72 20 69 74 65 72 61  f data per itera
ac80: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
ac90: 20 2f 2f 20 75 6e 74 69 6c 20 77 65 20 66 69 6e   // until we fin
aca0: 64 20 61 20 77 6f 72 64 20 63 6f 6e 74 61 69 6e  d a word contain
acb0: 69 6e 67 20 61 20 6e 6f 6e 2d 61 73 63 69 69 20  ing a non-ascii 
acc0: 62 79 74 65 2e 0a 20 20 20 20 20 20 20 20 20 20  byte..          
acd0: 20 20 6c 65 74 20 70 74 72 20 3d 20 76 2e 61 73    let ptr = v.as
ace0: 5f 70 74 72 28 29 3b 0a 20 20 20 20 20 20 20 20  _ptr();.        
acf0: 20 20 20 20 6c 65 74 20 61 6c 69 67 6e 20 3d 20      let align = 
ad00: 28 70 74 72 20 61 73 20 75 73 69 7a 65 20 2b 20  (ptr as usize + 
ad10: 69 6e 64 65 78 29 20 26 20 28 75 73 69 7a 65 5f  index) & (usize_
ad20: 62 79 74 65 73 20 2d 20 31 29 3b 0a 20 20 20 20  bytes - 1);.    
ad30: 20 20 20 20 20 20 20 20 69 66 20 61 6c 69 67 6e          if align
ad40: 20 3d 3d 20 30 20 7b 0a 20 20 20 20 20 20 20 20   == 0 {.        
ad50: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 69 6e          while in
ad60: 64 65 78 20 3c 20 62 6c 6f 63 6b 73 5f 65 6e 64  dex < blocks_end
ad70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
ad80: 20 20 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a         unsafe {.
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 20 20 20 20 20 20 6c 65 74 20 62 6c 6f 63          let bloc
adb0: 6b 20 3d 20 70 74 72 2e 6f 66 66 73 65 74 28 69  k = ptr.offset(i
adc0: 6e 64 65 78 20 61 73 20 69 73 69 7a 65 29 20 61  ndex as isize) a
add0: 73 20 2a 63 6f 6e 73 74 20 75 73 69 7a 65 3b 0a  s *const usize;.
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 20 20 20 2f 2f 20 62 72 65 61 6b          // break
ae00: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6e   if there is a n
ae10: 6f 6e 61 73 63 69 69 20 62 79 74 65 0a 20 20 20  onascii byte.   
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 6c 65 74 20 7a 75 20 3d 20 63 6f       let zu = co
ae40: 6e 74 61 69 6e 73 5f 6e 6f 6e 61 73 63 69 69 28  ntains_nonascii(
ae50: 2a 62 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  *block);.       
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 6c 65 74 20 7a 76 20 3d 20 63 6f 6e 74 61 69   let zv = contai
ae80: 6e 73 5f 6e 6f 6e 61 73 63 69 69 28 2a 62 6c 6f  ns_nonascii(*blo
ae90: 63 6b 2e 6f 66 66 73 65 74 28 31 29 29 3b 0a 20  ck.offset(1));. 
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 69 66 20 7a 75 20 7c 20 7a         if zu | z
aec0: 76 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v {.            
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
af00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
af20: 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 78             index
af30: 20 2b 3d 20 61 73 63 69 69 5f 62 6c 6f 63 6b 5f   += ascii_block_
af40: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  size;.          
af50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af60: 20 20 20 20 20 20 20 20 2f 2f 20 73 74 65 70 20          // step 
af70: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 20 77  from the point w
af80: 68 65 72 65 20 74 68 65 20 77 6f 72 64 77 69 73  here the wordwis
af90: 65 20 6c 6f 6f 70 20 73 74 6f 70 70 65 64 0a 20  e loop stopped. 
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
afb0: 68 69 6c 65 20 69 6e 64 65 78 20 3c 20 6c 65 6e  hile index < len
afc0: 20 26 26 20 76 5b 69 6e 64 65 78 5d 20 3c 20 31   && v[index] < 1
afd0: 32 38 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  28 {.           
afe0: 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 2b           index +
aff0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
b000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b010: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
b020: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
b030: 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  x += 1;.        
b040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
b050: 20 20 20 20 7d 0a 0a 20 20 20 20 4f 6b 28 28 29      }..    Ok(()
b060: 29 0a 7d 0a 0a 2f 2f 20 68 74 74 70 73 3a 2f 2f  ).}..// https://
b070: 74 6f 6f 6c 73 2e 69 65 74 66 2e 6f 72 67 2f 68  tools.ietf.org/h
b080: 74 6d 6c 2f 72 66 63 33 36 32 39 0a 73 74 61 74  tml/rfc3629.stat
b090: 69 63 20 55 54 46 38 5f 43 48 41 52 5f 57 49 44  ic UTF8_CHAR_WID
b0a0: 54 48 3a 20 5b 75 38 3b 20 32 35 36 5d 20 3d 20  TH: [u8; 256] = 
b0b0: 5b 0a 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  [.1,1,1,1,1,1,1,
b0c0: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  1,1,1,1,1,1,1,1,
b0d0: 31 2c 0a 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  1,.1,1,1,1,1,1,1
b0e0: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  ,1,1,1,1,1,1,1,1
b0f0: 2c 31 2c 20 2f 2f 20 30 78 31 46 0a 31 2c 31 2c  ,1, // 0x1F.1,1,
b100: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  1,1,1,1,1,1,1,1,
b110: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 0a 31 2c 31  1,1,1,1,1,1,.1,1
b120: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  ,1,1,1,1,1,1,1,1
b130: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 20 2f 2f  ,1,1,1,1,1,1, //
b140: 20 30 78 33 46 0a 31 2c 31 2c 31 2c 31 2c 31 2c   0x3F.1,1,1,1,1,
b150: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  1,1,1,1,1,1,1,1,
b160: 31 2c 31 2c 31 2c 0a 31 2c 31 2c 31 2c 31 2c 31  1,1,1,.1,1,1,1,1
b170: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  ,1,1,1,1,1,1,1,1
b180: 2c 31 2c 31 2c 31 2c 20 2f 2f 20 30 78 35 46 0a  ,1,1,1, // 0x5F.
b190: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  1,1,1,1,1,1,1,1,
b1a0: 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c  1,1,1,1,1,1,1,1,
b1b0: 0a 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  .1,1,1,1,1,1,1,1
b1c0: 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31 2c 31  ,1,1,1,1,1,1,1,1
b1d0: 2c 20 2f 2f 20 30 78 37 46 0a 30 2c 30 2c 30 2c  , // 0x7F.0,0,0,
b1e0: 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c  0,0,0,0,0,0,0,0,
b1f0: 30 2c 30 2c 30 2c 30 2c 30 2c 0a 30 2c 30 2c 30  0,0,0,0,0,.0,0,0
b200: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  ,0,0,0,0,0,0,0,0
b210: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 20 2f 2f 20 30  ,0,0,0,0,0, // 0
b220: 78 39 46 0a 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c  x9F.0,0,0,0,0,0,
b230: 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c  0,0,0,0,0,0,0,0,
b240: 30 2c 30 2c 0a 30 2c 30 2c 30 2c 30 2c 30 2c 30  0,0,.0,0,0,0,0,0
b250: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  ,0,0,0,0,0,0,0,0
b260: 2c 30 2c 30 2c 20 2f 2f 20 30 78 42 46 0a 30 2c  ,0,0, // 0xBF.0,
b270: 30 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c  0,2,2,2,2,2,2,2,
b280: 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 0a 32  2,2,2,2,2,2,2,.2
b290: 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32  ,2,2,2,2,2,2,2,2
b2a0: 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 32 2c 20  ,2,2,2,2,2,2,2, 
b2b0: 2f 2f 20 30 78 44 46 0a 33 2c 33 2c 33 2c 33 2c  // 0xDF.3,3,3,3,
b2c0: 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c 33 2c  3,3,3,3,3,3,3,3,
b2d0: 33 2c 33 2c 33 2c 33 2c 20 2f 2f 20 30 78 45 46  3,3,3,3, // 0xEF
b2e0: 0a 34 2c 34 2c 34 2c 34 2c 34 2c 30 2c 30 2c 30  .4,4,4,4,4,0,0,0
b2f0: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  ,0,0,0,0,0,0,0,0
b300: 2c 20 2f 2f 20 30 78 46 46 0a 5d 3b 0a 0a 2f 2f  , // 0xFF.];..//
b310: 2f 20 47 69 76 65 6e 20 61 20 66 69 72 73 74 20  / Given a first 
b320: 62 79 74 65 2c 20 64 65 74 65 72 6d 69 6e 65 73  byte, determines
b330: 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
b340: 61 72 65 20 69 6e 20 74 68 69 73 20 55 54 46 2d  are in this UTF-
b350: 38 20 63 68 61 72 61 63 74 65 72 2e 0a 23 5b 75  8 character..#[u
b360: 6e 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  nstable(feature 
b370: 3d 20 22 73 74 72 5f 69 6e 74 65 72 6e 61 6c 73  = "str_internals
b380: 22 2c 20 69 73 73 75 65 20 3d 20 22 30 22 29 5d  ", issue = "0")]
b390: 0a 23 5b 69 6e 6c 69 6e 65 5d 0a 70 75 62 20 66  .#[inline].pub f
b3a0: 6e 20 75 74 66 38 5f 63 68 61 72 5f 77 69 64 74  n utf8_char_widt
b3b0: 68 28 62 3a 20 75 38 29 20 2d 3e 20 75 73 69 7a  h(b: u8) -> usiz
b3c0: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 55  e {.    return U
b3d0: 54 46 38 5f 43 48 41 52 5f 57 49 44 54 48 5b 62  TF8_CHAR_WIDTH[b
b3e0: 20 61 73 20 75 73 69 7a 65 5d 20 61 73 20 75 73   as usize] as us
b3f0: 69 7a 65 3b 0a 7d 0a 0a 2f 2f 2f 20 4d 61 73 6b  ize;.}../// Mask
b400: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 62 69   of the value bi
b410: 74 73 20 6f 66 20 61 20 63 6f 6e 74 69 6e 75 61  ts of a continua
b420: 74 69 6f 6e 20 62 79 74 65 2e 0a 63 6f 6e 73 74  tion byte..const
b430: 20 43 4f 4e 54 5f 4d 41 53 4b 3a 20 75 38 20 3d   CONT_MASK: u8 =
b440: 20 30 62 30 30 31 31 5f 31 31 31 31 3b 0a 2f 2f   0b0011_1111;.//
b450: 2f 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 74  / Value of the t
b460: 61 67 20 62 69 74 73 20 28 74 61 67 20 6d 61 73  ag bits (tag mas
b470: 6b 20 69 73 20 21 43 4f 4e 54 5f 4d 41 53 4b 29  k is !CONT_MASK)
b480: 20 6f 66 20 61 20 63 6f 6e 74 69 6e 75 61 74 69   of a continuati
b490: 6f 6e 20 62 79 74 65 2e 0a 63 6f 6e 73 74 20 54  on byte..const T
b4a0: 41 47 5f 43 4f 4e 54 5f 55 38 3a 20 75 38 20 3d  AG_CONT_U8: u8 =
b4b0: 20 30 62 31 30 30 30 5f 30 30 30 30 3b 0a 0a 2f   0b1000_0000;../
b4c0: 2a 0a 53 65 63 74 69 6f 6e 3a 20 54 72 61 69 74  *.Section: Trait
b4d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
b4e0: 0a 2a 2f 0a 0a 6d 6f 64 20 74 72 61 69 74 73 20  .*/..mod traits 
b4f0: 7b 0a 20 20 20 20 75 73 65 20 63 6d 70 3a 3a 4f  {.    use cmp::O
b500: 72 64 65 72 69 6e 67 3b 0a 20 20 20 20 75 73 65  rdering;.    use
b510: 20 6f 70 73 3b 0a 20 20 20 20 75 73 65 20 73 6c   ops;.    use sl
b520: 69 63 65 3a 3a 7b 73 65 6c 66 2c 20 53 6c 69 63  ice::{self, Slic
b530: 65 49 6e 64 65 78 7d 3b 0a 20 20 20 20 75 73 65  eIndex};.    use
b540: 20 73 74 72 3a 3a 65 71 5f 73 6c 69 63 65 3b 0a   str::eq_slice;.
b550: 0a 20 20 20 20 2f 2f 2f 20 49 6d 70 6c 65 6d 65  .    /// Impleme
b560: 6e 74 73 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  nts ordering of 
b570: 73 74 72 69 6e 67 73 2e 0a 20 20 20 20 2f 2f 2f  strings..    ///
b580: 0a 20 20 20 20 2f 2f 2f 20 53 74 72 69 6e 67 73  .    /// Strings
b590: 20 61 72 65 20 6f 72 64 65 72 65 64 20 20 6c 65   are ordered  le
b5a0: 78 69 63 6f 67 72 61 70 68 69 63 61 6c 6c 79 20  xicographically 
b5b0: 62 79 20 74 68 65 69 72 20 62 79 74 65 20 76 61  by their byte va
b5c0: 6c 75 65 73 2e 20 20 54 68 69 73 20 6f 72 64 65  lues.  This orde
b5d0: 72 73 20 55 6e 69 63 6f 64 65 20 63 6f 64 65 0a  rs Unicode code.
b5e0: 20 20 20 20 2f 2f 2f 20 70 6f 69 6e 74 73 20 62      /// points b
b5f0: 61 73 65 64 20 6f 6e 20 74 68 65 69 72 20 70 6f  ased on their po
b600: 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 63  sitions in the c
b610: 6f 64 65 20 63 68 61 72 74 73 2e 20 20 54 68 69  ode charts.  Thi
b620: 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  s is not necessa
b630: 72 69 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  rily the same as
b640: 0a 20 20 20 20 2f 2f 2f 20 22 61 6c 70 68 61 62  .    /// "alphab
b650: 65 74 69 63 61 6c 22 20 6f 72 64 65 72 2c 20 77  etical" order, w
b660: 68 69 63 68 20 76 61 72 69 65 73 20 62 79 20 6c  hich varies by l
b670: 61 6e 67 75 61 67 65 20 61 6e 64 20 6c 6f 63 61  anguage and loca
b680: 6c 65 2e 20 20 53 6f 72 74 69 6e 67 20 73 74 72  le.  Sorting str
b690: 69 6e 67 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ings according t
b6a0: 6f 0a 20 20 20 20 2f 2f 2f 20 63 75 6c 74 75 72  o.    /// cultur
b6b0: 61 6c 6c 79 2d 61 63 63 65 70 74 65 64 20 73 74  ally-accepted st
b6c0: 61 6e 64 61 72 64 73 20 72 65 71 75 69 72 65 73  andards requires
b6d0: 20 6c 6f 63 61 6c 65 2d 73 70 65 63 69 66 69 63   locale-specific
b6e0: 20 64 61 74 61 20 74 68 61 74 20 69 73 20 6f 75   data that is ou
b6f0: 74 73 69 64 65 20 74 68 65 20 73 63 6f 70 65 20  tside the scope 
b700: 6f 66 0a 20 20 20 20 2f 2f 2f 20 74 68 65 20 60  of.    /// the `
b710: 73 74 72 60 20 74 79 70 65 2e 0a 20 20 20 20 23  str` type..    #
b720: 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
b730: 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65  = "rust1", since
b740: 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 20 20 20   = "1.0.0")].   
b750: 20 69 6d 70 6c 20 4f 72 64 20 66 6f 72 20 73 74   impl Ord for st
b760: 72 20 7b 0a 20 20 20 20 20 20 20 20 23 5b 69 6e  r {.        #[in
b770: 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e  line].        fn
b780: 20 63 6d 70 28 26 73 65 6c 66 2c 20 6f 74 68 65   cmp(&self, othe
b790: 72 3a 20 26 73 74 72 29 20 2d 3e 20 4f 72 64 65  r: &str) -> Orde
b7a0: 72 69 6e 67 20 7b 0a 20 20 20 20 20 20 20 20 20  ring {.         
b7b0: 20 20 20 73 65 6c 66 2e 61 73 5f 62 79 74 65 73     self.as_bytes
b7c0: 28 29 2e 63 6d 70 28 6f 74 68 65 72 2e 61 73 5f  ().cmp(other.as_
b7d0: 62 79 74 65 73 28 29 29 0a 20 20 20 20 20 20 20  bytes()).       
b7e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b   }.    }..    #[
b7f0: 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
b800: 20 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20   "rust1", since 
b810: 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 20 20 20 20  = "1.0.0")].    
b820: 69 6d 70 6c 20 50 61 72 74 69 61 6c 45 71 20 66  impl PartialEq f
b830: 6f 72 20 73 74 72 20 7b 0a 20 20 20 20 20 20 20  or str {.       
b840: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
b850: 20 20 20 66 6e 20 65 71 28 26 73 65 6c 66 2c 20     fn eq(&self, 
b860: 6f 74 68 65 72 3a 20 26 73 74 72 29 20 2d 3e 20  other: &str) -> 
b870: 62 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 20  bool {.         
b880: 20 20 20 65 71 5f 73 6c 69 63 65 28 73 65 6c 66     eq_slice(self
b890: 2c 20 6f 74 68 65 72 29 0a 20 20 20 20 20 20 20  , other).       
b8a0: 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e 6c   }.        #[inl
b8b0: 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e 20  ine].        fn 
b8c0: 6e 65 28 26 73 65 6c 66 2c 20 6f 74 68 65 72 3a  ne(&self, other:
b8d0: 20 26 73 74 72 29 20 2d 3e 20 62 6f 6f 6c 20 7b   &str) -> bool {
b8e0: 20 21 28 2a 73 65 6c 66 29 2e 65 71 28 6f 74 68   !(*self).eq(oth
b8f0: 65 72 29 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  er) }.    }..   
b900: 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
b910: 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e  e = "rust1", sin
b920: 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 20  ce = "1.0.0")]. 
b930: 20 20 20 69 6d 70 6c 20 45 71 20 66 6f 72 20 73     impl Eq for s
b940: 74 72 20 7b 7d 0a 0a 20 20 20 20 2f 2f 2f 20 49  tr {}..    /// I
b950: 6d 70 6c 65 6d 65 6e 74 73 20 63 6f 6d 70 61 72  mplements compar
b960: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 20  ison operations 
b970: 6f 6e 20 73 74 72 69 6e 67 73 2e 0a 20 20 20 20  on strings..    
b980: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 53 74 72 69  ///.    /// Stri
b990: 6e 67 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64  ngs are compared
b9a0: 20 6c 65 78 69 63 6f 67 72 61 70 68 69 63 61 6c   lexicographical
b9b0: 6c 79 20 62 79 20 74 68 65 69 72 20 62 79 74 65  ly by their byte
b9c0: 20 76 61 6c 75 65 73 2e 20 20 54 68 69 73 20 63   values.  This c
b9d0: 6f 6d 70 61 72 65 73 20 55 6e 69 63 6f 64 65 20  ompares Unicode 
b9e0: 63 6f 64 65 0a 20 20 20 20 2f 2f 2f 20 70 6f 69  code.    /// poi
b9f0: 6e 74 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nts based on the
ba00: 69 72 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20  ir positions in 
ba10: 74 68 65 20 63 6f 64 65 20 63 68 61 72 74 73 2e  the code charts.
ba20: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65    This is not ne
ba30: 63 65 73 73 61 72 69 6c 79 20 74 68 65 20 73 61  cessarily the sa
ba40: 6d 65 20 61 73 0a 20 20 20 20 2f 2f 2f 20 22 61  me as.    /// "a
ba50: 6c 70 68 61 62 65 74 69 63 61 6c 22 20 6f 72 64  lphabetical" ord
ba60: 65 72 2c 20 77 68 69 63 68 20 76 61 72 69 65 73  er, which varies
ba70: 20 62 79 20 6c 61 6e 67 75 61 67 65 20 61 6e 64   by language and
ba80: 20 6c 6f 63 61 6c 65 2e 20 20 43 6f 6d 70 61 72   locale.  Compar
ba90: 69 6e 67 20 73 74 72 69 6e 67 73 20 61 63 63 6f  ing strings acco
baa0: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2f 2f 2f  rding to.    ///
bab0: 20 63 75 6c 74 75 72 61 6c 6c 79 2d 61 63 63 65   culturally-acce
bac0: 70 74 65 64 20 73 74 61 6e 64 61 72 64 73 20 72  pted standards r
bad0: 65 71 75 69 72 65 73 20 6c 6f 63 61 6c 65 2d 73  equires locale-s
bae0: 70 65 63 69 66 69 63 20 64 61 74 61 20 74 68 61  pecific data tha
baf0: 74 20 69 73 20 6f 75 74 73 69 64 65 20 74 68 65  t is outside the
bb00: 20 73 63 6f 70 65 20 6f 66 0a 20 20 20 20 2f 2f   scope of.    //
bb10: 2f 20 74 68 65 20 60 73 74 72 60 20 74 79 70 65  / the `str` type
bb20: 2e 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66  ..    #[stable(f
bb30: 65 61 74 75 72 65 20 3d 20 22 72 75 73 74 31 22  eature = "rust1"
bb40: 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30  , since = "1.0.0
bb50: 22 29 5d 0a 20 20 20 20 69 6d 70 6c 20 50 61 72  ")].    impl Par
bb60: 74 69 61 6c 4f 72 64 20 66 6f 72 20 73 74 72 20  tialOrd for str 
bb70: 7b 0a 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69  {.        #[inli
bb80: 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 70  ne].        fn p
bb90: 61 72 74 69 61 6c 5f 63 6d 70 28 26 73 65 6c 66  artial_cmp(&self
bba0: 2c 20 6f 74 68 65 72 3a 20 26 73 74 72 29 20 2d  , other: &str) -
bbb0: 3e 20 4f 70 74 69 6f 6e 3c 4f 72 64 65 72 69 6e  > Option<Orderin
bbc0: 67 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g> {.           
bbd0: 20 53 6f 6d 65 28 73 65 6c 66 2e 63 6d 70 28 6f   Some(self.cmp(o
bbe0: 74 68 65 72 29 29 0a 20 20 20 20 20 20 20 20 7d  ther)).        }
bbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
bc00: 49 6d 70 6c 65 6d 65 6e 74 73 20 73 75 62 73 74  Implements subst
bc10: 72 69 6e 67 20 73 6c 69 63 69 6e 67 20 77 69 74  ring slicing wit
bc20: 68 20 73 79 6e 74 61 78 20 60 26 73 65 6c 66 5b  h syntax `&self[
bc30: 62 65 67 69 6e 20 2e 2e 20 65 6e 64 5d 60 2e 0a  begin .. end]`..
bc40: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
bc50: 52 65 74 75 72 6e 73 20 61 20 73 6c 69 63 65 20  Returns a slice 
bc60: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
bc70: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 62 79 74  ing from the byt
bc80: 65 20 72 61 6e 67 65 0a 20 20 20 20 2f 2f 2f 20  e range.    /// 
bc90: 5b 60 62 65 67 69 6e 60 2e 2e 60 65 6e 64 60 29  [`begin`..`end`)
bca0: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
bcb0: 2f 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  / This operation
bcc0: 20 69 73 20 60 4f 28 31 29 60 2e 0a 20 20 20 20   is `O(1)`..    
bcd0: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 23 20 50 61  ///.    /// # Pa
bce0: 6e 69 63 73 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  nics.    ///.   
bcf0: 20 2f 2f 2f 20 50 61 6e 69 63 73 20 69 66 20 60   /// Panics if `
bd00: 62 65 67 69 6e 60 20 6f 72 20 60 65 6e 64 60 20  begin` or `end` 
bd10: 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74  does not point t
bd20: 6f 20 74 68 65 20 73 74 61 72 74 69 6e 67 0a 20  o the starting. 
bd30: 20 20 20 2f 2f 2f 20 62 79 74 65 20 6f 66 66 73     /// byte offs
bd40: 65 74 20 6f 66 20 61 20 63 68 61 72 61 63 74 65  et of a characte
bd50: 72 20 28 61 73 20 64 65 66 69 6e 65 64 20 62 79  r (as defined by
bd60: 20 60 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61   `is_char_bounda
bd70: 72 79 60 29 2e 0a 20 20 20 20 2f 2f 2f 20 52 65  ry`)..    /// Re
bd80: 71 75 69 72 65 73 20 74 68 61 74 20 60 62 65 67  quires that `beg
bd90: 69 6e 20 3c 3d 20 65 6e 64 60 20 61 6e 64 20 60  in <= end` and `
bda0: 65 6e 64 20 3c 3d 20 6c 65 6e 60 20 77 68 65 72  end <= len` wher
bdb0: 65 20 60 6c 65 6e 60 20 69 73 20 74 68 65 0a 20  e `len` is the. 
bdc0: 20 20 20 2f 2f 2f 20 6c 65 6e 67 74 68 20 6f 66     /// length of
bdd0: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 20 20   the string..   
bde0: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 23 20 45   ///.    /// # E
bdf0: 78 61 6d 70 6c 65 73 0a 20 20 20 20 2f 2f 2f 0a  xamples.    ///.
be00: 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20 20 20 20      /// ```.    
be10: 2f 2f 2f 20 6c 65 74 20 73 20 3d 20 22 4c c3 b6  /// let s = "L..
be20: 77 65 20 e8 80 81 e8 99 8e 20 4c c3 a9 6f 70 61  we ...... L..opa
be30: 72 64 22 3b 0a 20 20 20 20 2f 2f 2f 20 61 73 73  rd";.    /// ass
be40: 65 72 74 5f 65 71 21 28 26 73 5b 30 20 2e 2e 20  ert_eq!(&s[0 .. 
be50: 31 5d 2c 20 22 4c 22 29 3b 0a 20 20 20 20 2f 2f  1], "L");.    //
be60: 2f 0a 20 20 20 20 2f 2f 2f 20 61 73 73 65 72 74  /.    /// assert
be70: 5f 65 71 21 28 26 73 5b 31 20 2e 2e 20 39 5d 2c  _eq!(&s[1 .. 9],
be80: 20 22 c3 b6 77 65 20 e8 80 81 22 29 3b 0a 20 20   "..we ...");.  
be90: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 2f 2f    ///.    /// //
bea0: 20 74 68 65 73 65 20 77 69 6c 6c 20 70 61 6e 69   these will pani
beb0: 63 3a 0a 20 20 20 20 2f 2f 2f 20 2f 2f 20 62 79  c:.    /// // by
bec0: 74 65 20 32 20 6c 69 65 73 20 77 69 74 68 69 6e  te 2 lies within
bed0: 20 60 c3 b6 60 3a 0a 20 20 20 20 2f 2f 2f 20 2f   `..`:.    /// /
bee0: 2f 20 26 73 5b 32 20 2e 2e 33 5d 3b 0a 20 20 20  / &s[2 ..3];.   
bef0: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 2f 2f 20   ///.    /// // 
bf00: 62 79 74 65 20 38 20 6c 69 65 73 20 77 69 74 68  byte 8 lies with
bf10: 69 6e 20 60 e8 80 81 60 0a 20 20 20 20 2f 2f 2f  in `...`.    ///
bf20: 20 2f 2f 20 26 73 5b 31 20 2e 2e 20 38 5d 3b 0a   // &s[1 .. 8];.
bf30: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
bf40: 2f 2f 20 62 79 74 65 20 31 30 30 20 69 73 20 6f  // byte 100 is o
bf50: 75 74 73 69 64 65 20 74 68 65 20 73 74 72 69 6e  utside the strin
bf60: 67 0a 20 20 20 20 2f 2f 2f 20 2f 2f 20 26 73 5b  g.    /// // &s[
bf70: 33 20 2e 2e 20 31 30 30 5d 3b 0a 20 20 20 20 2f  3 .. 100];.    /
bf80: 2f 2f 20 60 60 60 0a 20 20 20 20 23 5b 73 74 61  // ```.    #[sta
bf90: 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 72  ble(feature = "r
bfa0: 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22  ust1", since = "
bfb0: 31 2e 30 2e 30 22 29 5d 0a 20 20 20 20 69 6d 70  1.0.0")].    imp
bfc0: 6c 20 6f 70 73 3a 3a 49 6e 64 65 78 3c 6f 70 73  l ops::Index<ops
bfd0: 3a 3a 52 61 6e 67 65 3c 75 73 69 7a 65 3e 3e 20  ::Range<usize>> 
bfe0: 66 6f 72 20 73 74 72 20 7b 0a 20 20 20 20 20 20  for str {.      
bff0: 20 20 74 79 70 65 20 4f 75 74 70 75 74 20 3d 20    type Output = 
c000: 73 74 72 3b 0a 20 20 20 20 20 20 20 20 23 5b 69  str;.        #[i
c010: 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66  nline].        f
c020: 6e 20 69 6e 64 65 78 28 26 73 65 6c 66 2c 20 69  n index(&self, i
c030: 6e 64 65 78 3a 20 6f 70 73 3a 3a 52 61 6e 67 65  ndex: ops::Range
c040: 3c 75 73 69 7a 65 3e 29 20 2d 3e 20 26 73 74 72  <usize>) -> &str
c050: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
c060: 6e 64 65 78 2e 69 6e 64 65 78 28 73 65 6c 66 29  ndex.index(self)
c070: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
c080: 0a 0a 20 20 20 20 2f 2f 2f 20 49 6d 70 6c 65 6d  ..    /// Implem
c090: 65 6e 74 73 20 6d 75 74 61 62 6c 65 20 73 75 62  ents mutable sub
c0a0: 73 74 72 69 6e 67 20 73 6c 69 63 69 6e 67 20 77  string slicing w
c0b0: 69 74 68 20 73 79 6e 74 61 78 0a 20 20 20 20 2f  ith syntax.    /
c0c0: 2f 2f 20 60 26 6d 75 74 20 73 65 6c 66 5b 62 65  // `&mut self[be
c0d0: 67 69 6e 20 2e 2e 20 65 6e 64 5d 60 2e 0a 20 20  gin .. end]`..  
c0e0: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 52 65    ///.    /// Re
c0f0: 74 75 72 6e 73 20 61 20 6d 75 74 61 62 6c 65 20  turns a mutable 
c100: 73 6c 69 63 65 20 6f 66 20 74 68 65 20 67 69 76  slice of the giv
c110: 65 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74  en string from t
c120: 68 65 20 62 79 74 65 20 72 61 6e 67 65 0a 20 20  he byte range.  
c130: 20 20 2f 2f 2f 20 5b 60 62 65 67 69 6e 60 2e 2e    /// [`begin`..
c140: 60 65 6e 64 60 29 2e 0a 20 20 20 20 2f 2f 2f 0a  `end`)..    ///.
c150: 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 6f 70 65      /// This ope
c160: 72 61 74 69 6f 6e 20 69 73 20 60 4f 28 31 29 60  ration is `O(1)`
c170: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
c180: 2f 20 23 20 50 61 6e 69 63 73 0a 20 20 20 20 2f  / # Panics.    /
c190: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 50 61 6e 69 63  //.    /// Panic
c1a0: 73 20 69 66 20 60 62 65 67 69 6e 60 20 6f 72 20  s if `begin` or 
c1b0: 60 65 6e 64 60 20 64 6f 65 73 20 6e 6f 74 20 70  `end` does not p
c1c0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72  oint to the star
c1d0: 74 69 6e 67 0a 20 20 20 20 2f 2f 2f 20 62 79 74  ting.    /// byt
c1e0: 65 20 6f 66 66 73 65 74 20 6f 66 20 61 20 63 68  e offset of a ch
c1f0: 61 72 61 63 74 65 72 20 28 61 73 20 64 65 66 69  aracter (as defi
c200: 6e 65 64 20 62 79 20 60 69 73 5f 63 68 61 72 5f  ned by `is_char_
c210: 62 6f 75 6e 64 61 72 79 60 29 2e 0a 20 20 20 20  boundary`)..    
c220: 2f 2f 2f 20 52 65 71 75 69 72 65 73 20 74 68 61  /// Requires tha
c230: 74 20 60 62 65 67 69 6e 20 3c 3d 20 65 6e 64 60  t `begin <= end`
c240: 20 61 6e 64 20 60 65 6e 64 20 3c 3d 20 6c 65 6e   and `end <= len
c250: 60 20 77 68 65 72 65 20 60 6c 65 6e 60 20 69 73  ` where `len` is
c260: 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 6c 65 6e   the.    /// len
c270: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
c280: 67 2e 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28  g..    #[stable(
c290: 66 65 61 74 75 72 65 20 3d 20 22 64 65 72 65 66  feature = "deref
c2a0: 6d 75 74 5f 66 6f 72 5f 73 74 72 69 6e 67 22 2c  mut_for_string",
c2b0: 20 73 69 6e 63 65 20 3d 20 22 31 2e 32 2e 30 22   since = "1.2.0"
c2c0: 29 5d 0a 20 20 20 20 69 6d 70 6c 20 6f 70 73 3a  )].    impl ops:
c2d0: 3a 49 6e 64 65 78 4d 75 74 3c 6f 70 73 3a 3a 52  :IndexMut<ops::R
c2e0: 61 6e 67 65 3c 75 73 69 7a 65 3e 3e 20 66 6f 72  ange<usize>> for
c2f0: 20 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 23   str {.        #
c300: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20  [inline].       
c310: 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74 28 26 6d   fn index_mut(&m
c320: 75 74 20 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20  ut self, index: 
c330: 6f 70 73 3a 3a 52 61 6e 67 65 3c 75 73 69 7a 65  ops::Range<usize
c340: 3e 29 20 2d 3e 20 26 6d 75 74 20 73 74 72 20 7b  >) -> &mut str {
c350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64  .            ind
c360: 65 78 2e 69 6e 64 65 78 5f 6d 75 74 28 73 65 6c  ex.index_mut(sel
c370: 66 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  f).        }.   
c380: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 49 6d 70 6c   }..    /// Impl
c390: 65 6d 65 6e 74 73 20 73 75 62 73 74 72 69 6e 67  ements substring
c3a0: 20 73 6c 69 63 69 6e 67 20 77 69 74 68 20 73 79   slicing with sy
c3b0: 6e 74 61 78 20 60 26 73 65 6c 66 5b 2e 2e 20 65  ntax `&self[.. e
c3c0: 6e 64 5d 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20  nd]`..    ///.  
c3d0: 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 61 20    /// Returns a 
c3e0: 73 6c 69 63 65 20 6f 66 20 74 68 65 20 73 74 72  slice of the str
c3f0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 62 65 67  ing from the beg
c400: 69 6e 6e 69 6e 67 20 74 6f 20 62 79 74 65 20 6f  inning to byte o
c410: 66 66 73 65 74 0a 20 20 20 20 2f 2f 2f 20 60 65  ffset.    /// `e
c420: 6e 64 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  nd`..    ///.   
c430: 20 2f 2f 2f 20 45 71 75 69 76 61 6c 65 6e 74 20   /// Equivalent 
c440: 74 6f 20 60 26 73 65 6c 66 5b 30 20 2e 2e 20 65  to `&self[0 .. e
c450: 6e 64 5d 60 2e 0a 20 20 20 20 23 5b 73 74 61 62  nd]`..    #[stab
c460: 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 72 75  le(feature = "ru
c470: 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  st1", since = "1
c480: 2e 30 2e 30 22 29 5d 0a 20 20 20 20 69 6d 70 6c  .0.0")].    impl
c490: 20 6f 70 73 3a 3a 49 6e 64 65 78 3c 6f 70 73 3a   ops::Index<ops:
c4a0: 3a 52 61 6e 67 65 54 6f 3c 75 73 69 7a 65 3e 3e  :RangeTo<usize>>
c4b0: 20 66 6f 72 20 73 74 72 20 7b 0a 20 20 20 20 20   for str {.     
c4c0: 20 20 20 74 79 70 65 20 4f 75 74 70 75 74 20 3d     type Output =
c4d0: 20 73 74 72 3b 0a 0a 20 20 20 20 20 20 20 20 23   str;..        #
c4e0: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20  [inline].       
c4f0: 20 66 6e 20 69 6e 64 65 78 28 26 73 65 6c 66 2c   fn index(&self,
c500: 20 69 6e 64 65 78 3a 20 6f 70 73 3a 3a 52 61 6e   index: ops::Ran
c510: 67 65 54 6f 3c 75 73 69 7a 65 3e 29 20 2d 3e 20  geTo<usize>) -> 
c520: 26 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 20  &str {.         
c530: 20 20 20 2f 2f 20 69 73 5f 63 68 61 72 5f 62 6f     // is_char_bo
c540: 75 6e 64 61 72 79 20 63 68 65 63 6b 73 20 74 68  undary checks th
c550: 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
c560: 69 6e 20 5b 30 2c 20 2e 6c 65 6e 28 29 5d 0a 20  in [0, .len()]. 
c570: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 65             if se
c580: 6c 66 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64  lf.is_char_bound
c590: 61 72 79 28 69 6e 64 65 78 2e 65 6e 64 29 20 7b  ary(index.end) {
c5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5b0: 20 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e 73   unsafe { self.s
c5c0: 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65 64 28 30  lice_unchecked(0
c5d0: 2c 20 69 6e 64 65 78 2e 65 6e 64 29 20 7d 0a 20  , index.end) }. 
c5e0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
c5f0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
c600: 20 20 20 20 73 75 70 65 72 3a 3a 73 6c 69 63 65      super::slice
c610: 5f 65 72 72 6f 72 5f 66 61 69 6c 28 73 65 6c 66  _error_fail(self
c620: 2c 20 30 2c 20 69 6e 64 65 78 2e 65 6e 64 29 0a  , 0, index.end).
c630: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c650: 20 20 20 2f 2f 2f 20 49 6d 70 6c 65 6d 65 6e 74     /// Implement
c660: 73 20 6d 75 74 61 62 6c 65 20 73 75 62 73 74 72  s mutable substr
c670: 69 6e 67 20 73 6c 69 63 69 6e 67 20 77 69 74 68  ing slicing with
c680: 20 73 79 6e 74 61 78 20 60 26 6d 75 74 20 73 65   syntax `&mut se
c690: 6c 66 5b 2e 2e 20 65 6e 64 5d 60 2e 0a 20 20 20  lf[.. end]`..   
c6a0: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 52 65 74   ///.    /// Ret
c6b0: 75 72 6e 73 20 61 20 6d 75 74 61 62 6c 65 20 73  urns a mutable s
c6c0: 6c 69 63 65 20 6f 66 20 74 68 65 20 73 74 72 69  lice of the stri
c6d0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ng from the begi
c6e0: 6e 6e 69 6e 67 20 74 6f 20 62 79 74 65 20 6f 66  nning to byte of
c6f0: 66 73 65 74 0a 20 20 20 20 2f 2f 2f 20 60 65 6e  fset.    /// `en
c700: 64 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  d`..    ///.    
c710: 2f 2f 2f 20 45 71 75 69 76 61 6c 65 6e 74 20 74  /// Equivalent t
c720: 6f 20 60 26 6d 75 74 20 73 65 6c 66 5b 30 20 2e  o `&mut self[0 .
c730: 2e 20 65 6e 64 5d 60 2e 0a 20 20 20 20 23 5b 73  . end]`..    #[s
c740: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
c750: 22 64 65 72 65 66 6d 75 74 5f 66 6f 72 5f 73 74  "derefmut_for_st
c760: 72 69 6e 67 22 2c 20 73 69 6e 63 65 20 3d 20 22  ring", since = "
c770: 31 2e 32 2e 30 22 29 5d 0a 20 20 20 20 69 6d 70  1.2.0")].    imp
c780: 6c 20 6f 70 73 3a 3a 49 6e 64 65 78 4d 75 74 3c  l ops::IndexMut<
c790: 6f 70 73 3a 3a 52 61 6e 67 65 54 6f 3c 75 73 69  ops::RangeTo<usi
c7a0: 7a 65 3e 3e 20 66 6f 72 20 73 74 72 20 7b 0a 20  ze>> for str {. 
c7b0: 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d         #[inline]
c7c0: 0a 20 20 20 20 20 20 20 20 66 6e 20 69 6e 64 65  .        fn inde
c7d0: 78 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66 2c  x_mut(&mut self,
c7e0: 20 69 6e 64 65 78 3a 20 6f 70 73 3a 3a 52 61 6e   index: ops::Ran
c7f0: 67 65 54 6f 3c 75 73 69 7a 65 3e 29 20 2d 3e 20  geTo<usize>) -> 
c800: 26 6d 75 74 20 73 74 72 20 7b 0a 20 20 20 20 20  &mut str {.     
c810: 20 20 20 20 20 20 20 2f 2f 20 69 73 5f 63 68 61         // is_cha
c820: 72 5f 62 6f 75 6e 64 61 72 79 20 63 68 65 63 6b  r_boundary check
c830: 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
c840: 20 69 73 20 69 6e 20 5b 30 2c 20 2e 6c 65 6e 28   is in [0, .len(
c850: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  )].            i
c860: 66 20 73 65 6c 66 2e 69 73 5f 63 68 61 72 5f 62  f self.is_char_b
c870: 6f 75 6e 64 61 72 79 28 69 6e 64 65 78 2e 65 6e  oundary(index.en
c880: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
c890: 20 20 20 20 20 75 6e 73 61 66 65 20 7b 20 73 65       unsafe { se
c8a0: 6c 66 2e 73 6c 69 63 65 5f 6d 75 74 5f 75 6e 63  lf.slice_mut_unc
c8b0: 68 65 63 6b 65 64 28 30 2c 20 69 6e 64 65 78 2e  hecked(0, index.
c8c0: 65 6e 64 29 20 7d 0a 20 20 20 20 20 20 20 20 20  end) }.         
c8d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65              supe
c8f0: 72 3a 3a 73 6c 69 63 65 5f 65 72 72 6f 72 5f 66  r::slice_error_f
c900: 61 69 6c 28 73 65 6c 66 2c 20 30 2c 20 69 6e 64  ail(self, 0, ind
c910: 65 78 2e 65 6e 64 29 0a 20 20 20 20 20 20 20 20  ex.end).        
c920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c930: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 49      }..    /// I
c940: 6d 70 6c 65 6d 65 6e 74 73 20 73 75 62 73 74 72  mplements substr
c950: 69 6e 67 20 73 6c 69 63 69 6e 67 20 77 69 74 68  ing slicing with
c960: 20 73 79 6e 74 61 78 20 60 26 73 65 6c 66 5b 62   syntax `&self[b
c970: 65 67 69 6e 20 2e 2e 5d 60 2e 0a 20 20 20 20 2f  egin ..]`..    /
c980: 2f 2f 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72  //.    /// Retur
c990: 6e 73 20 61 20 73 6c 69 63 65 20 6f 66 20 74 68  ns a slice of th
c9a0: 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 79  e string from by
c9b0: 74 65 20 6f 66 66 73 65 74 20 60 62 65 67 69 6e  te offset `begin
c9c0: 60 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65  `.    /// to the
c9d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72 69   end of the stri
c9e0: 6e 67 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20  ng..    ///.    
c9f0: 2f 2f 2f 20 45 71 75 69 76 61 6c 65 6e 74 20 74  /// Equivalent t
ca00: 6f 20 60 26 73 65 6c 66 5b 62 65 67 69 6e 20 2e  o `&self[begin .
ca10: 2e 20 6c 65 6e 5d 60 2e 0a 20 20 20 20 23 5b 73  . len]`..    #[s
ca20: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
ca30: 22 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d  "rust1", since =
ca40: 20 22 31 2e 30 2e 30 22 29 5d 0a 20 20 20 20 69   "1.0.0")].    i
ca50: 6d 70 6c 20 6f 70 73 3a 3a 49 6e 64 65 78 3c 6f  mpl ops::Index<o
ca60: 70 73 3a 3a 52 61 6e 67 65 46 72 6f 6d 3c 75 73  ps::RangeFrom<us
ca70: 69 7a 65 3e 3e 20 66 6f 72 20 73 74 72 20 7b 0a  ize>> for str {.
ca80: 20 20 20 20 20 20 20 20 74 79 70 65 20 4f 75 74          type Out
ca90: 70 75 74 20 3d 20 73 74 72 3b 0a 0a 20 20 20 20  put = str;..    
caa0: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
cab0: 20 20 20 20 20 20 66 6e 20 69 6e 64 65 78 28 26        fn index(&
cac0: 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20 6f 70 73  self, index: ops
cad0: 3a 3a 52 61 6e 67 65 46 72 6f 6d 3c 75 73 69 7a  ::RangeFrom<usiz
cae0: 65 3e 29 20 2d 3e 20 26 73 74 72 20 7b 0a 20 20  e>) -> &str {.  
caf0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 73 5f            // is_
cb00: 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 20 63 68  char_boundary ch
cb10: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 69 6e  ecks that the in
cb20: 64 65 78 20 69 73 20 69 6e 20 5b 30 2c 20 2e 6c  dex is in [0, .l
cb30: 65 6e 28 29 5d 0a 20 20 20 20 20 20 20 20 20 20  en()].          
cb40: 20 20 69 66 20 73 65 6c 66 2e 69 73 5f 63 68 61    if self.is_cha
cb50: 72 5f 62 6f 75 6e 64 61 72 79 28 69 6e 64 65 78  r_boundary(index
cb60: 2e 73 74 61 72 74 29 20 7b 0a 20 20 20 20 20 20  .start) {.      
cb70: 20 20 20 20 20 20 20 20 20 20 75 6e 73 61 66 65            unsafe
cb80: 20 7b 20 73 65 6c 66 2e 73 6c 69 63 65 5f 75 6e   { self.slice_un
cb90: 63 68 65 63 6b 65 64 28 69 6e 64 65 78 2e 73 74  checked(index.st
cba0: 61 72 74 2c 20 73 65 6c 66 2e 6c 65 6e 28 29 29  art, self.len())
cbb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
cbc0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
cbd0: 20 20 20 20 20 20 20 20 73 75 70 65 72 3a 3a 73          super::s
cbe0: 6c 69 63 65 5f 65 72 72 6f 72 5f 66 61 69 6c 28  lice_error_fail(
cbf0: 73 65 6c 66 2c 20 69 6e 64 65 78 2e 73 74 61 72  self, index.star
cc00: 74 2c 20 73 65 6c 66 2e 6c 65 6e 28 29 29 0a 20  t, self.len()). 
cc10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
cc20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
cc30: 20 20 2f 2f 2f 20 49 6d 70 6c 65 6d 65 6e 74 73    /// Implements
cc40: 20 6d 75 74 61 62 6c 65 20 73 75 62 73 74 72 69   mutable substri
cc50: 6e 67 20 73 6c 69 63 69 6e 67 20 77 69 74 68 20  ng slicing with 
cc60: 73 79 6e 74 61 78 20 60 26 6d 75 74 20 73 65 6c  syntax `&mut sel
cc70: 66 5b 62 65 67 69 6e 20 2e 2e 5d 60 2e 0a 20 20  f[begin ..]`..  
cc80: 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 52 65    ///.    /// Re
cc90: 74 75 72 6e 73 20 61 20 6d 75 74 61 62 6c 65 20  turns a mutable 
cca0: 73 6c 69 63 65 20 6f 66 20 74 68 65 20 73 74 72  slice of the str
ccb0: 69 6e 67 20 66 72 6f 6d 20 62 79 74 65 20 6f 66  ing from byte of
ccc0: 66 73 65 74 20 60 62 65 67 69 6e 60 0a 20 20 20  fset `begin`.   
ccd0: 20 2f 2f 2f 20 74 6f 20 74 68 65 20 65 6e 64 20   /// to the end 
cce0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20  of the string.. 
ccf0: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 45     ///.    /// E
cd00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 60 26 6d  quivalent to `&m
cd10: 75 74 20 73 65 6c 66 5b 62 65 67 69 6e 20 2e 2e  ut self[begin ..
cd20: 20 6c 65 6e 5d 60 2e 0a 20 20 20 20 23 5b 73 74   len]`..    #[st
cd30: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
cd40: 64 65 72 65 66 6d 75 74 5f 66 6f 72 5f 73 74 72  derefmut_for_str
cd50: 69 6e 67 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  ing", since = "1
cd60: 2e 32 2e 30 22 29 5d 0a 20 20 20 20 69 6d 70 6c  .2.0")].    impl
cd70: 20 6f 70 73 3a 3a 49 6e 64 65 78 4d 75 74 3c 6f   ops::IndexMut<o
cd80: 70 73 3a 3a 52 61 6e 67 65 46 72 6f 6d 3c 75 73  ps::RangeFrom<us
cd90: 69 7a 65 3e 3e 20 66 6f 72 20 73 74 72 20 7b 0a  ize>> for str {.
cda0: 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65          #[inline
cdb0: 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 69 6e 64  ].        fn ind
cdc0: 65 78 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66  ex_mut(&mut self
cdd0: 2c 20 69 6e 64 65 78 3a 20 6f 70 73 3a 3a 52 61  , index: ops::Ra
cde0: 6e 67 65 46 72 6f 6d 3c 75 73 69 7a 65 3e 29 20  ngeFrom<usize>) 
cdf0: 2d 3e 20 26 6d 75 74 20 73 74 72 20 7b 0a 20 20  -> &mut str {.  
ce00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 73 5f            // is_
ce10: 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 20 63 68  char_boundary ch
ce20: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 69 6e  ecks that the in
ce30: 64 65 78 20 69 73 20 69 6e 20 5b 30 2c 20 2e 6c  dex is in [0, .l
ce40: 65 6e 28 29 5d 0a 20 20 20 20 20 20 20 20 20 20  en()].          
ce50: 20 20 69 66 20 73 65 6c 66 2e 69 73 5f 63 68 61    if self.is_cha
ce60: 72 5f 62 6f 75 6e 64 61 72 79 28 69 6e 64 65 78  r_boundary(index
ce70: 2e 73 74 61 72 74 29 20 7b 0a 20 20 20 20 20 20  .start) {.      
ce80: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 65            let le
ce90: 6e 20 3d 20 73 65 6c 66 2e 6c 65 6e 28 29 3b 0a  n = self.len();.
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e 73 6c  unsafe { self.sl
cec0: 69 63 65 5f 6d 75 74 5f 75 6e 63 68 65 63 6b 65  ice_mut_unchecke
ced0: 64 28 69 6e 64 65 78 2e 73 74 61 72 74 2c 20 6c  d(index.start, l
cee0: 65 6e 29 20 7d 0a 20 20 20 20 20 20 20 20 20 20  en) }.          
cef0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
cf00: 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72             super
cf10: 3a 3a 73 6c 69 63 65 5f 65 72 72 6f 72 5f 66 61  ::slice_error_fa
cf20: 69 6c 28 73 65 6c 66 2c 20 69 6e 64 65 78 2e 73  il(self, index.s
cf30: 74 61 72 74 2c 20 73 65 6c 66 2e 6c 65 6e 28 29  tart, self.len()
cf40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ).            }.
cf50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
cf60: 0a 20 20 20 20 2f 2f 2f 20 49 6d 70 6c 65 6d 65  .    /// Impleme
cf70: 6e 74 73 20 73 75 62 73 74 72 69 6e 67 20 73 6c  nts substring sl
cf80: 69 63 69 6e 67 20 77 69 74 68 20 73 79 6e 74 61  icing with synta
cf90: 78 20 60 26 73 65 6c 66 5b 2e 2e 5d 60 2e 0a 20  x `&self[..]`.. 
cfa0: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 52     ///.    /// R
cfb0: 65 74 75 72 6e 73 20 61 20 73 6c 69 63 65 20 6f  eturns a slice o
cfc0: 66 20 74 68 65 20 77 68 6f 6c 65 20 73 74 72 69  f the whole stri
cfd0: 6e 67 2e 20 54 68 69 73 20 6f 70 65 72 61 74 69  ng. This operati
cfe0: 6f 6e 20 63 61 6e 0a 20 20 20 20 2f 2f 2f 20 6e  on can.    /// n
cff0: 65 76 65 72 20 70 61 6e 69 63 2e 0a 20 20 20 20  ever panic..    
d000: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 45 71 75 69  ///.    /// Equi
d010: 76 61 6c 65 6e 74 20 74 6f 20 60 26 73 65 6c 66  valent to `&self
d020: 5b 30 20 2e 2e 20 6c 65 6e 5d 60 2e 0a 20 20 20  [0 .. len]`..   
d030: 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
d040: 65 20 3d 20 22 72 75 73 74 31 22 2c 20 73 69 6e  e = "rust1", sin
d050: 63 65 20 3d 20 22 31 2e 30 2e 30 22 29 5d 0a 20  ce = "1.0.0")]. 
d060: 20 20 20 69 6d 70 6c 20 6f 70 73 3a 3a 49 6e 64     impl ops::Ind
d070: 65 78 3c 6f 70 73 3a 3a 52 61 6e 67 65 46 75 6c  ex<ops::RangeFul
d080: 6c 3e 20 66 6f 72 20 73 74 72 20 7b 0a 20 20 20  l> for str {.   
d090: 20 20 20 20 20 74 79 70 65 20 4f 75 74 70 75 74       type Output
d0a0: 20 3d 20 73 74 72 3b 0a 0a 20 20 20 20 20 20 20   = str;..       
d0b0: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
d0c0: 20 20 20 66 6e 20 69 6e 64 65 78 28 26 73 65 6c     fn index(&sel
d0d0: 66 2c 20 5f 69 6e 64 65 78 3a 20 6f 70 73 3a 3a  f, _index: ops::
d0e0: 52 61 6e 67 65 46 75 6c 6c 29 20 2d 3e 20 26 73  RangeFull) -> &s
d0f0: 74 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  tr {.           
d100: 20 73 65 6c 66 0a 20 20 20 20 20 20 20 20 7d 0a   self.        }.
d110: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 49      }..    /// I
d120: 6d 70 6c 65 6d 65 6e 74 73 20 6d 75 74 61 62 6c  mplements mutabl
d130: 65 20 73 75 62 73 74 72 69 6e 67 20 73 6c 69 63  e substring slic
d140: 69 6e 67 20 77 69 74 68 20 73 79 6e 74 61 78 20  ing with syntax 
d150: 60 26 6d 75 74 20 73 65 6c 66 5b 2e 2e 5d 60 2e  `&mut self[..]`.
d160: 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f  .    ///.    ///
d170: 20 52 65 74 75 72 6e 73 20 61 20 6d 75 74 61 62   Returns a mutab
d180: 6c 65 20 73 6c 69 63 65 20 6f 66 20 74 68 65 20  le slice of the 
d190: 77 68 6f 6c 65 20 73 74 72 69 6e 67 2e 20 54 68  whole string. Th
d1a0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e  is operation can
d1b0: 0a 20 20 20 20 2f 2f 2f 20 6e 65 76 65 72 20 70  .    /// never p
d1c0: 61 6e 69 63 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20  anic..    ///.  
d1d0: 20 20 2f 2f 2f 20 45 71 75 69 76 61 6c 65 6e 74    /// Equivalent
d1e0: 20 74 6f 20 60 26 6d 75 74 20 73 65 6c 66 5b 30   to `&mut self[0
d1f0: 20 2e 2e 20 6c 65 6e 5d 60 2e 0a 20 20 20 20 23   .. len]`..    #
d200: 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
d210: 3d 20 22 64 65 72 65 66 6d 75 74 5f 66 6f 72 5f  = "derefmut_for_
d220: 73 74 72 69 6e 67 22 2c 20 73 69 6e 63 65 20 3d  string", since =
d230: 20 22 31 2e 32 2e 30 22 29 5d 0a 20 20 20 20 69   "1.2.0")].    i
d240: 6d 70 6c 20 6f 70 73 3a 3a 49 6e 64 65 78 4d 75  mpl ops::IndexMu
d250: 74 3c 6f 70 73 3a 3a 52 61 6e 67 65 46 75 6c 6c  t<ops::RangeFull
d260: 3e 20 66 6f 72 20 73 74 72 20 7b 0a 20 20 20 20  > for str {.    
d270: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
d280: 20 20 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d        fn index_m
d290: 75 74 28 26 6d 75 74 20 73 65 6c 66 2c 20 5f 69  ut(&mut self, _i
d2a0: 6e 64 65 78 3a 20 6f 70 73 3a 3a 52 61 6e 67 65  ndex: ops::Range
d2b0: 46 75 6c 6c 29 20 2d 3e 20 26 6d 75 74 20 73 74  Full) -> &mut st
d2c0: 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r {.            
d2d0: 73 65 6c 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  self.        }. 
d2e0: 20 20 20 7d 0a 0a 20 20 20 20 23 5b 75 6e 73 74     }..    #[unst
d2f0: 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
d300: 69 6e 63 6c 75 73 69 76 65 5f 72 61 6e 67 65 22  inclusive_range"
d310: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d320: 20 72 65 61 73 6f 6e 20 3d 20 22 72 65 63 65 6e   reason = "recen
d330: 74 6c 79 20 61 64 64 65 64 2c 20 66 6f 6c 6c 6f  tly added, follo
d340: 77 73 20 52 46 43 22 2c 0a 20 20 20 20 20 20 20  ws RFC",.       
d350: 20 20 20 20 20 20 20 20 69 73 73 75 65 20 3d 20          issue = 
d360: 22 32 38 32 33 37 22 29 5d 0a 20 20 20 20 69 6d  "28237")].    im
d370: 70 6c 20 6f 70 73 3a 3a 49 6e 64 65 78 3c 6f 70  pl ops::Index<op
d380: 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75 73 69 76  s::RangeInclusiv
d390: 65 3c 75 73 69 7a 65 3e 3e 20 66 6f 72 20 73 74  e<usize>> for st
d3a0: 72 20 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65  r {.        type
d3b0: 20 4f 75 74 70 75 74 20 3d 20 73 74 72 3b 0a 0a   Output = str;..
d3c0: 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65          #[inline
d3d0: 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 69 6e 64  ].        fn ind
d3e0: 65 78 28 26 73 65 6c 66 2c 20 69 6e 64 65 78 3a  ex(&self, index:
d3f0: 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75   ops::RangeInclu
d400: 73 69 76 65 3c 75 73 69 7a 65 3e 29 20 2d 3e 20  sive<usize>) -> 
d410: 26 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 20  &str {.         
d420: 20 20 20 6d 61 74 63 68 20 69 6e 64 65 78 20 7b     match index {
d430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d440: 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75   ops::RangeInclu
d450: 73 69 76 65 3a 3a 45 6d 70 74 79 20 7b 20 2e 2e  sive::Empty { ..
d460: 20 7d 20 3d 3e 20 22 22 2c 0a 20 20 20 20 20 20   } => "",.      
d470: 20 20 20 20 20 20 20 20 20 20 6f 70 73 3a 3a 52            ops::R
d480: 61 6e 67 65 49 6e 63 6c 75 73 69 76 65 3a 3a 4e  angeInclusive::N
d490: 6f 6e 45 6d 70 74 79 20 7b 20 65 6e 64 2c 20 2e  onEmpty { end, .
d4a0: 2e 20 7d 20 69 66 20 65 6e 64 20 3d 3d 20 75 73  . } if end == us
d4b0: 69 7a 65 3a 3a 6d 61 78 5f 76 61 6c 75 65 28 29  ize::max_value()
d4c0: 20 3d 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20   =>.            
d4d0: 20 20 20 20 20 20 20 20 70 61 6e 69 63 21 28 22          panic!("
d4e0: 61 74 74 65 6d 70 74 65 64 20 74 6f 20 69 6e 64  attempted to ind
d4f0: 65 78 20 73 6c 69 63 65 20 75 70 20 74 6f 20 6d  ex slice up to m
d500: 61 78 69 6d 75 6d 20 75 73 69 7a 65 22 29 2c 0a  aximum usize"),.
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75 73  ops::RangeInclus
d530: 69 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79 20 7b 20  ive::NonEmpty { 
d540: 73 74 61 72 74 2c 20 65 6e 64 20 7d 20 3d 3e 0a  start, end } =>.
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 73 65 6c 66 2e 69 6e 64 65 78 28 73      self.index(s
d570: 74 61 72 74 20 2e 2e 20 65 6e 64 2b 31 29 0a 20  tart .. end+1). 
d580: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d5a0: 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74   #[unstable(feat
d5b0: 75 72 65 20 3d 20 22 69 6e 63 6c 75 73 69 76 65  ure = "inclusive
d5c0: 5f 72 61 6e 67 65 22 2c 0a 20 20 20 20 20 20 20  _range",.       
d5d0: 20 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 3d          reason =
d5e0: 20 22 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64   "recently added
d5f0: 2c 20 66 6f 6c 6c 6f 77 73 20 52 46 43 22 2c 0a  , follows RFC",.
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d610: 73 73 75 65 20 3d 20 22 32 38 32 33 37 22 29 5d  ssue = "28237")]
d620: 0a 20 20 20 20 69 6d 70 6c 20 6f 70 73 3a 3a 49  .    impl ops::I
d630: 6e 64 65 78 3c 6f 70 73 3a 3a 52 61 6e 67 65 54  ndex<ops::RangeT
d640: 6f 49 6e 63 6c 75 73 69 76 65 3c 75 73 69 7a 65  oInclusive<usize
d650: 3e 3e 20 66 6f 72 20 73 74 72 20 7b 0a 20 20 20  >> for str {.   
d660: 20 20 20 20 20 74 79 70 65 20 4f 75 74 70 75 74       type Output
d670: 20 3d 20 73 74 72 3b 0a 0a 20 20 20 20 20 20 20   = str;..       
d680: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
d690: 20 20 20 66 6e 20 69 6e 64 65 78 28 26 73 65 6c     fn index(&sel
d6a0: 66 2c 20 69 6e 64 65 78 3a 20 6f 70 73 3a 3a 52  f, index: ops::R
d6b0: 61 6e 67 65 54 6f 49 6e 63 6c 75 73 69 76 65 3c  angeToInclusive<
d6c0: 75 73 69 7a 65 3e 29 20 2d 3e 20 26 73 74 72 20  usize>) -> &str 
d6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
d6e0: 6c 66 2e 69 6e 64 65 78 28 30 2e 2e 2e 69 6e 64  lf.index(0...ind
d6f0: 65 78 2e 65 6e 64 29 0a 20 20 20 20 20 20 20 20  ex.end).        
d700: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 75  }.    }..    #[u
d710: 6e 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  nstable(feature 
d720: 3d 20 22 69 6e 63 6c 75 73 69 76 65 5f 72 61 6e  = "inclusive_ran
d730: 67 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge",.           
d740: 20 20 20 20 72 65 61 73 6f 6e 20 3d 20 22 72 65      reason = "re
d750: 63 65 6e 74 6c 79 20 61 64 64 65 64 2c 20 66 6f  cently added, fo
d760: 6c 6c 6f 77 73 20 52 46 43 22 2c 0a 20 20 20 20  llows RFC",.    
d770: 20 20 20 20 20 20 20 20 20 20 20 69 73 73 75 65             issue
d780: 20 3d 20 22 32 38 32 33 37 22 29 5d 0a 20 20 20   = "28237")].   
d790: 20 69 6d 70 6c 20 6f 70 73 3a 3a 49 6e 64 65 78   impl ops::Index
d7a0: 4d 75 74 3c 6f 70 73 3a 3a 52 61 6e 67 65 49 6e  Mut<ops::RangeIn
d7b0: 63 6c 75 73 69 76 65 3c 75 73 69 7a 65 3e 3e 20  clusive<usize>> 
d7c0: 66 6f 72 20 73 74 72 20 7b 0a 20 20 20 20 20 20  for str {.      
d7d0: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
d7e0: 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74      fn index_mut
d7f0: 28 26 6d 75 74 20 73 65 6c 66 2c 20 69 6e 64 65  (&mut self, inde
d800: 78 3a 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63  x: ops::RangeInc
d810: 6c 75 73 69 76 65 3c 75 73 69 7a 65 3e 29 20 2d  lusive<usize>) -
d820: 3e 20 26 6d 75 74 20 73 74 72 20 7b 0a 20 20 20  > &mut str {.   
d830: 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 69           match i
d840: 6e 64 65 78 20 7b 0a 20 20 20 20 20 20 20 20 20  ndex {.         
d850: 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e 67         ops::Rang
d860: 65 49 6e 63 6c 75 73 69 76 65 3a 3a 45 6d 70 74  eInclusive::Empt
d870: 79 20 7b 20 2e 2e 20 7d 20 3d 3e 20 26 6d 75 74  y { .. } => &mut
d880: 20 73 65 6c 66 5b 30 2e 2e 30 5d 2c 20 2f 2f 20   self[0..0], // 
d890: 60 26 6d 75 74 20 22 22 60 20 64 6f 65 73 6e 27  `&mut ""` doesn'
d8a0: 74 20 77 6f 72 6b 0a 20 20 20 20 20 20 20 20 20  t work.         
d8b0: 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e 67         ops::Rang
d8c0: 65 49 6e 63 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45  eInclusive::NonE
d8d0: 6d 70 74 79 20 7b 20 65 6e 64 2c 20 2e 2e 20 7d  mpty { end, .. }
d8e0: 20 69 66 20 65 6e 64 20 3d 3d 20 75 73 69 7a 65   if end == usize
d8f0: 3a 3a 6d 61 78 5f 76 61 6c 75 65 28 29 20 3d 3e  ::max_value() =>
d900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d910: 20 20 20 20 20 70 61 6e 69 63 21 28 22 61 74 74       panic!("att
d920: 65 6d 70 74 65 64 20 74 6f 20 69 6e 64 65 78 20  empted to index 
d930: 73 74 72 20 75 70 20 74 6f 20 6d 61 78 69 6d 75  str up to maximu
d940: 6d 20 75 73 69 7a 65 22 29 2c 0a 20 20 20 20 20  m usize"),.     
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
d960: 70 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75 73 69  ps::RangeInclusi
d970: 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79 20 7b 20 73  ve::NonEmpty { s
d980: 74 61 72 74 2c 20 65 6e 64 20 7d 20 3d 3e 0a 20  tart, end } =>. 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 20 20 73 65 6c 66 2e 69 6e 64 65         self.inde
d9b0: 78 5f 6d 75 74 28 73 74 61 72 74 20 2e 2e 20 65  x_mut(start .. e
d9c0: 6e 64 2b 31 29 0a 20 20 20 20 20 20 20 20 20 20  nd+1).          
d9d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
d9e0: 20 20 7d 0a 20 20 20 20 23 5b 75 6e 73 74 61 62    }.    #[unstab
d9f0: 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 69 6e  le(feature = "in
da00: 63 6c 75 73 69 76 65 5f 72 61 6e 67 65 22 2c 0a  clusive_range",.
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
da20: 65 61 73 6f 6e 20 3d 20 22 72 65 63 65 6e 74 6c  eason = "recentl
da30: 79 20 61 64 64 65 64 2c 20 66 6f 6c 6c 6f 77 73  y added, follows
da40: 20 52 46 43 22 2c 0a 20 20 20 20 20 20 20 20 20   RFC",.         
da50: 20 20 20 20 20 20 69 73 73 75 65 20 3d 20 22 32        issue = "2
da60: 38 32 33 37 22 29 5d 0a 20 20 20 20 69 6d 70 6c  8237")].    impl
da70: 20 6f 70 73 3a 3a 49 6e 64 65 78 4d 75 74 3c 6f   ops::IndexMut<o
da80: 70 73 3a 3a 52 61 6e 67 65 54 6f 49 6e 63 6c 75  ps::RangeToInclu
da90: 73 69 76 65 3c 75 73 69 7a 65 3e 3e 20 66 6f 72  sive<usize>> for
daa0: 20 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 23   str {.        #
dab0: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20  [inline].       
dac0: 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74 28 26 6d   fn index_mut(&m
dad0: 75 74 20 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20  ut self, index: 
dae0: 6f 70 73 3a 3a 52 61 6e 67 65 54 6f 49 6e 63 6c  ops::RangeToIncl
daf0: 75 73 69 76 65 3c 75 73 69 7a 65 3e 29 20 2d 3e  usive<usize>) ->
db00: 20 26 6d 75 74 20 73 74 72 20 7b 0a 20 20 20 20   &mut str {.    
db10: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 69 6e 64          self.ind
db20: 65 78 5f 6d 75 74 28 30 2e 2e 2e 69 6e 64 65 78  ex_mut(0...index
db30: 2e 65 6e 64 29 0a 20 20 20 20 20 20 20 20 7d 0a  .end).        }.
db40: 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 75 6e 73      }..    #[uns
db50: 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
db60: 22 73 74 72 5f 63 68 65 63 6b 65 64 5f 73 6c 69  "str_checked_sli
db70: 63 69 6e 67 22 2c 20 69 73 73 75 65 20 3d 20 22  cing", issue = "
db80: 33 39 39 33 32 22 29 5d 0a 20 20 20 20 69 6d 70  39932")].    imp
db90: 6c 20 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72  l SliceIndex<str
dba0: 3e 20 66 6f 72 20 6f 70 73 3a 3a 52 61 6e 67 65  > for ops::Range
dbb0: 46 75 6c 6c 20 7b 0a 20 20 20 20 20 20 20 20 74  Full {.        t
dbc0: 79 70 65 20 4f 75 74 70 75 74 20 3d 20 73 74 72  ype Output = str
dbd0: 3b 0a 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69  ;.        #[inli
dbe0: 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 67  ne].        fn g
dbf0: 65 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20  et(self, slice: 
dc00: 26 73 74 72 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c  &str) -> Option<
dc10: 26 53 65 6c 66 3a 3a 4f 75 74 70 75 74 3e 20 7b  &Self::Output> {
dc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d  .            Som
dc30: 65 28 73 6c 69 63 65 29 0a 20 20 20 20 20 20 20  e(slice).       
dc40: 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e 6c   }.        #[inl
dc50: 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e 20  ine].        fn 
dc60: 67 65 74 5f 6d 75 74 28 73 65 6c 66 2c 20 73 6c  get_mut(self, sl
dc70: 69 63 65 3a 20 26 6d 75 74 20 73 74 72 29 20 2d  ice: &mut str) -
dc80: 3e 20 4f 70 74 69 6f 6e 3c 26 6d 75 74 20 53 65  > Option<&mut Se
dc90: 6c 66 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20 20  lf::Output> {.  
dca0: 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28 73            Some(s
dcb0: 6c 69 63 65 29 0a 20 20 20 20 20 20 20 20 7d 0a  lice).        }.
dcc0: 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65          #[inline
dcd0: 5d 0a 20 20 20 20 20 20 20 20 75 6e 73 61 66 65  ].        unsafe
dce0: 20 66 6e 20 67 65 74 5f 75 6e 63 68 65 63 6b 65   fn get_unchecke
dcf0: 64 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26  d(self, slice: &
dd00: 73 74 72 29 20 2d 3e 20 26 53 65 6c 66 3a 3a 4f  str) -> &Self::O
dd10: 75 74 70 75 74 20 7b 0a 20 20 20 20 20 20 20 20  utput {.        
dd20: 20 20 20 20 73 6c 69 63 65 0a 20 20 20 20 20 20      slice.      
dd30: 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e    }.        #[in
dd40: 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 75 6e  line].        un
dd50: 73 61 66 65 20 66 6e 20 67 65 74 5f 75 6e 63 68  safe fn get_unch
dd60: 65 63 6b 65 64 5f 6d 75 74 28 73 65 6c 66 2c 20  ecked_mut(self, 
dd70: 73 6c 69 63 65 3a 20 26 6d 75 74 20 73 74 72 29  slice: &mut str)
dd80: 20 2d 3e 20 26 6d 75 74 20 53 65 6c 66 3a 3a 4f   -> &mut Self::O
dd90: 75 74 70 75 74 20 7b 0a 20 20 20 20 20 20 20 20  utput {.        
dda0: 20 20 20 20 73 6c 69 63 65 0a 20 20 20 20 20 20      slice.      
ddb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e    }.        #[in
ddc0: 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e  line].        fn
ddd0: 20 69 6e 64 65 78 28 73 65 6c 66 2c 20 73 6c 69   index(self, sli
dde0: 63 65 3a 20 26 73 74 72 29 20 2d 3e 20 26 53 65  ce: &str) -> &Se
ddf0: 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20  lf::Output {.   
de00: 20 20 20 20 20 20 20 20 20 73 6c 69 63 65 0a 20           slice. 
de10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de20: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
de30: 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74 28     fn index_mut(
de40: 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75  self, slice: &mu
de50: 74 20 73 74 72 29 20 2d 3e 20 26 6d 75 74 20 53  t str) -> &mut S
de60: 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20  elf::Output {.  
de70: 20 20 20 20 20 20 20 20 20 20 73 6c 69 63 65 0a            slice.
de80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
de90: 0a 20 20 20 20 23 5b 75 6e 73 74 61 62 6c 65 28  .    #[unstable(
dea0: 66 65 61 74 75 72 65 20 3d 20 22 73 74 72 5f 63  feature = "str_c
deb0: 68 65 63 6b 65 64 5f 73 6c 69 63 69 6e 67 22 2c  hecked_slicing",
dec0: 20 69 73 73 75 65 20 3d 20 22 33 39 39 33 32 22   issue = "39932"
ded0: 29 5d 0a 20 20 20 20 69 6d 70 6c 20 53 6c 69 63  )].    impl Slic
dee0: 65 49 6e 64 65 78 3c 73 74 72 3e 20 66 6f 72 20  eIndex<str> for 
def0: 6f 70 73 3a 3a 52 61 6e 67 65 3c 75 73 69 7a 65  ops::Range<usize
df00: 3e 20 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65  > {.        type
df10: 20 4f 75 74 70 75 74 20 3d 20 73 74 72 3b 0a 20   Output = str;. 
df20: 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d         #[inline]
df30: 0a 20 20 20 20 20 20 20 20 66 6e 20 67 65 74 28  .        fn get(
df40: 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74  self, slice: &st
df50: 72 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 53 65  r) -> Option<&Se
df60: 6c 66 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20 20  lf::Output> {.  
df70: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 65 6c            if sel
df80: 66 2e 73 74 61 72 74 20 3c 3d 20 73 65 6c 66 2e  f.start <= self.
df90: 65 6e 64 20 26 26 0a 20 20 20 20 20 20 20 20 20  end &&.         
dfa0: 20 20 20 20 20 20 73 6c 69 63 65 2e 69 73 5f 63        slice.is_c
dfb0: 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c  har_boundary(sel
dfc0: 66 2e 73 74 61 72 74 29 20 26 26 0a 20 20 20 20  f.start) &&.    
dfd0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 69 63 65             slice
dfe0: 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72  .is_char_boundar
dff0: 79 28 73 65 6c 66 2e 65 6e 64 29 20 7b 0a 20 20  y(self.end) {.  
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f                So
e010: 6d 65 28 75 6e 73 61 66 65 20 7b 20 73 65 6c 66  me(unsafe { self
e020: 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73  .get_unchecked(s
e030: 6c 69 63 65 29 20 7d 29 0a 20 20 20 20 20 20 20  lice) }).       
e040: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
e060: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ne.            }
e070: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e080: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
e090: 20 20 20 20 20 66 6e 20 67 65 74 5f 6d 75 74 28       fn get_mut(
e0a0: 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75  self, slice: &mu
e0b0: 74 20 73 74 72 29 20 2d 3e 20 4f 70 74 69 6f 6e  t str) -> Option
e0c0: 3c 26 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70  <&mut Self::Outp
e0d0: 75 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ut> {.          
e0e0: 20 20 69 66 20 73 65 6c 66 2e 73 74 61 72 74 20    if self.start 
e0f0: 3c 3d 20 73 65 6c 66 2e 65 6e 64 20 26 26 0a 20  <= self.end &&. 
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
e110: 69 63 65 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e  ice.is_char_boun
e120: 64 61 72 79 28 73 65 6c 66 2e 73 74 61 72 74 29  dary(self.start)
e130: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
e140: 20 20 20 73 6c 69 63 65 2e 69 73 5f 63 68 61 72     slice.is_char
e150: 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c 66 2e 65  _boundary(self.e
e160: 6e 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nd) {.          
e170: 20 20 20 20 20 20 53 6f 6d 65 28 75 6e 73 61 66        Some(unsaf
e180: 65 20 7b 20 73 65 6c 66 2e 67 65 74 5f 75 6e 63  e { self.get_unc
e190: 68 65 63 6b 65 64 5f 6d 75 74 28 73 6c 69 63 65  hecked_mut(slice
e1a0: 29 20 7d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ) }).           
e1b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e1c0: 20 20 20 20 20 20 20 20 20 20 4e 6f 6e 65 0a 20            None. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e1e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 23       }.        #
e1f0: 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20  [inline].       
e200: 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74 5f 75   unsafe fn get_u
e210: 6e 63 68 65 63 6b 65 64 28 73 65 6c 66 2c 20 73  nchecked(self, s
e220: 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e 20 26  lice: &str) -> &
e230: 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20  Self::Output {. 
e240: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 70             let p
e250: 74 72 20 3d 20 73 6c 69 63 65 2e 61 73 5f 70 74  tr = slice.as_pt
e260: 72 28 29 2e 6f 66 66 73 65 74 28 73 65 6c 66 2e  r().offset(self.
e270: 73 74 61 72 74 20 61 73 20 69 73 69 7a 65 29 3b  start as isize);
e280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
e290: 20 6c 65 6e 20 3d 20 73 65 6c 66 2e 65 6e 64 20   len = self.end 
e2a0: 2d 20 73 65 6c 66 2e 73 74 61 72 74 3b 0a 20 20  - self.start;.  
e2b0: 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72 3a            super:
e2c0: 3a 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68 65  :from_utf8_unche
e2d0: 63 6b 65 64 28 73 6c 69 63 65 3a 3a 66 72 6f 6d  cked(slice::from
e2e0: 5f 72 61 77 5f 70 61 72 74 73 28 70 74 72 2c 20  _raw_parts(ptr, 
e2f0: 6c 65 6e 29 29 0a 20 20 20 20 20 20 20 20 7d 0a  len)).        }.
e300: 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65          #[inline
e310: 5d 0a 20 20 20 20 20 20 20 20 75 6e 73 61 66 65  ].        unsafe
e320: 20 66 6e 20 67 65 74 5f 75 6e 63 68 65 63 6b 65   fn get_unchecke
e330: 64 5f 6d 75 74 28 73 65 6c 66 2c 20 73 6c 69 63  d_mut(self, slic
e340: 65 3a 20 26 6d 75 74 20 73 74 72 29 20 2d 3e 20  e: &mut str) -> 
e350: 26 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75  &mut Self::Outpu
e360: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
e370: 6c 65 74 20 70 74 72 20 3d 20 73 6c 69 63 65 2e  let ptr = slice.
e380: 61 73 5f 70 74 72 28 29 2e 6f 66 66 73 65 74 28  as_ptr().offset(
e390: 73 65 6c 66 2e 73 74 61 72 74 20 61 73 20 69 73  self.start as is
e3a0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
e3b0: 20 20 6c 65 74 20 6c 65 6e 20 3d 20 73 65 6c 66    let len = self
e3c0: 2e 65 6e 64 20 2d 20 73 65 6c 66 2e 73 74 61 72  .end - self.star
e3d0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  t;.            s
e3e0: 75 70 65 72 3a 3a 66 72 6f 6d 5f 75 74 66 38 5f  uper::from_utf8_
e3f0: 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74 28 73 6c  unchecked_mut(sl
e400: 69 63 65 3a 3a 66 72 6f 6d 5f 72 61 77 5f 70 61  ice::from_raw_pa
e410: 72 74 73 5f 6d 75 74 28 70 74 72 20 61 73 20 2a  rts_mut(ptr as *
e420: 6d 75 74 20 75 38 2c 20 6c 65 6e 29 29 0a 20 20  mut u8, len)).  
e430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e440: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20  #[inline].      
e450: 20 20 66 6e 20 69 6e 64 65 78 28 73 65 6c 66 2c    fn index(self,
e460: 20 73 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e   slice: &str) ->
e470: 20 26 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b   &Self::Output {
e480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
e490: 20 28 73 74 61 72 74 2c 20 65 6e 64 29 20 3d 20   (start, end) = 
e4a0: 28 73 65 6c 66 2e 73 74 61 72 74 2c 20 73 65 6c  (self.start, sel
e4b0: 66 2e 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  f.end);.        
e4c0: 20 20 20 20 73 65 6c 66 2e 67 65 74 28 73 6c 69      self.get(sli
e4d0: 63 65 29 2e 75 6e 77 72 61 70 5f 6f 72 5f 65 6c  ce).unwrap_or_el
e4e0: 73 65 28 7c 7c 20 73 75 70 65 72 3a 3a 73 6c 69  se(|| super::sli
e4f0: 63 65 5f 65 72 72 6f 72 5f 66 61 69 6c 28 73 6c  ce_error_fail(sl
e500: 69 63 65 2c 20 73 74 61 72 74 2c 20 65 6e 64 29  ice, start, end)
e510: 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ).        }.    
e520: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
e530: 20 20 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d        fn index_m
e540: 75 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20  ut(self, slice: 
e550: 26 6d 75 74 20 73 74 72 29 20 2d 3e 20 26 6d 75  &mut str) -> &mu
e560: 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b  t Self::Output {
e570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
e580: 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72 79  is_char_boundary
e590: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
e5a0: 20 69 6e 64 65 78 20 69 73 20 69 6e 20 5b 30 2c   index is in [0,
e5b0: 20 2e 6c 65 6e 28 29 5d 0a 20 20 20 20 20 20 20   .len()].       
e5c0: 20 20 20 20 20 2f 2f 20 63 61 6e 6f 74 20 72 65       // canot re
e5d0: 75 73 65 20 60 67 65 74 60 20 61 73 20 61 62 6f  use `get` as abo
e5e0: 76 65 2c 20 62 65 63 61 75 73 65 20 6f 66 20 4e  ve, because of N
e5f0: 4c 4c 20 74 72 6f 75 62 6c 65 0a 20 20 20 20 20  LL trouble.     
e600: 20 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e 73         if self.s
e610: 74 61 72 74 20 3c 3d 20 73 65 6c 66 2e 65 6e 64  tart <= self.end
e620: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
e630: 20 20 20 73 6c 69 63 65 2e 69 73 5f 63 68 61 72     slice.is_char
e640: 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c 66 2e 73  _boundary(self.s
e650: 74 61 72 74 29 20 26 26 0a 20 20 20 20 20 20 20  tart) &&.       
e660: 20 20 20 20 20 20 20 20 73 6c 69 63 65 2e 69 73          slice.is
e670: 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 73  _char_boundary(s
e680: 65 6c 66 2e 65 6e 64 29 20 7b 0a 20 20 20 20 20  elf.end) {.     
e690: 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 61 66             unsaf
e6a0: 65 20 7b 20 73 65 6c 66 2e 67 65 74 5f 75 6e 63  e { self.get_unc
e6b0: 68 65 63 6b 65 64 5f 6d 75 74 28 73 6c 69 63 65  hecked_mut(slice
e6c0: 29 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) }.            
e6d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
e6e0: 20 20 20 20 20 20 20 20 20 73 75 70 65 72 3a 3a           super::
e6f0: 73 6c 69 63 65 5f 65 72 72 6f 72 5f 66 61 69 6c  slice_error_fail
e700: 28 73 6c 69 63 65 2c 20 73 65 6c 66 2e 73 74 61  (slice, self.sta
e710: 72 74 2c 20 73 65 6c 66 2e 65 6e 64 29 0a 20 20  rt, self.end).  
e720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e740: 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74   #[unstable(feat
e750: 75 72 65 20 3d 20 22 73 74 72 5f 63 68 65 63 6b  ure = "str_check
e760: 65 64 5f 73 6c 69 63 69 6e 67 22 2c 20 69 73 73  ed_slicing", iss
e770: 75 65 20 3d 20 22 33 39 39 33 32 22 29 5d 0a 20  ue = "39932")]. 
e780: 20 20 20 69 6d 70 6c 20 53 6c 69 63 65 49 6e 64     impl SliceInd
e790: 65 78 3c 73 74 72 3e 20 66 6f 72 20 6f 70 73 3a  ex<str> for ops:
e7a0: 3a 52 61 6e 67 65 54 6f 3c 75 73 69 7a 65 3e 20  :RangeTo<usize> 
e7b0: 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65 20 4f  {.        type O
e7c0: 75 74 70 75 74 20 3d 20 73 74 72 3b 0a 20 20 20  utput = str;.   
e7d0: 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20       #[inline]. 
e7e0: 20 20 20 20 20 20 20 66 6e 20 67 65 74 28 73 65         fn get(se
e7f0: 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74 72 29  lf, slice: &str)
e800: 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 53 65 6c 66   -> Option<&Self
e810: 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20 20 20 20  ::Output> {.    
e820: 20 20 20 20 20 20 20 20 69 66 20 73 6c 69 63 65          if slice
e830: 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72  .is_char_boundar
e840: 79 28 73 65 6c 66 2e 65 6e 64 29 20 7b 0a 20 20  y(self.end) {.  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f                So
e860: 6d 65 28 75 6e 73 61 66 65 20 7b 20 73 65 6c 66  me(unsafe { self
e870: 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73  .get_unchecked(s
e880: 6c 69 63 65 29 20 7d 29 0a 20 20 20 20 20 20 20  lice) }).       
e890: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
e8b0: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ne.            }
e8c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e8d0: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
e8e0: 20 20 20 20 20 66 6e 20 67 65 74 5f 6d 75 74 28       fn get_mut(
e8f0: 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75  self, slice: &mu
e900: 74 20 73 74 72 29 20 2d 3e 20 4f 70 74 69 6f 6e  t str) -> Option
e910: 3c 26 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70  <&mut Self::Outp
e920: 75 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ut> {.          
e930: 20 20 69 66 20 73 6c 69 63 65 2e 69 73 5f 63 68    if slice.is_ch
e940: 61 72 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c 66  ar_boundary(self
e950: 2e 65 6e 64 29 20 7b 0a 20 20 20 20 20 20 20 20  .end) {.        
e960: 20 20 20 20 20 20 20 20 53 6f 6d 65 28 75 6e 73          Some(uns
e970: 61 66 65 20 7b 20 73 65 6c 66 2e 67 65 74 5f 75  afe { self.get_u
e980: 6e 63 68 65 63 6b 65 64 5f 6d 75 74 28 73 6c 69  nchecked_mut(sli
e990: 63 65 29 20 7d 29 0a 20 20 20 20 20 20 20 20 20  ce) }).         
e9a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e 65              None
e9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
e9d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e9e0: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
e9f0: 20 20 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74     unsafe fn get
ea00: 5f 75 6e 63 68 65 63 6b 65 64 28 73 65 6c 66 2c  _unchecked(self,
ea10: 20 73 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e   slice: &str) ->
ea20: 20 26 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b   &Self::Output {
ea30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
ea40: 20 70 74 72 20 3d 20 73 6c 69 63 65 2e 61 73 5f   ptr = slice.as_
ea50: 70 74 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ptr();.         
ea60: 20 20 20 73 75 70 65 72 3a 3a 66 72 6f 6d 5f 75     super::from_u
ea70: 74 66 38 5f 75 6e 63 68 65 63 6b 65 64 28 73 6c  tf8_unchecked(sl
ea80: 69 63 65 3a 3a 66 72 6f 6d 5f 72 61 77 5f 70 61  ice::from_raw_pa
ea90: 72 74 73 28 70 74 72 2c 20 73 65 6c 66 2e 65 6e  rts(ptr, self.en
eaa0: 64 29 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d)).        }.  
eab0: 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a        #[inline].
eac0: 20 20 20 20 20 20 20 20 75 6e 73 61 66 65 20 66          unsafe f
ead0: 6e 20 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f  n get_unchecked_
eae0: 6d 75 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a  mut(self, slice:
eaf0: 20 26 6d 75 74 20 73 74 72 29 20 2d 3e 20 26 6d   &mut str) -> &m
eb00: 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20  ut Self::Output 
eb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
eb20: 74 20 70 74 72 20 3d 20 73 6c 69 63 65 2e 61 73  t ptr = slice.as
eb30: 5f 70 74 72 28 29 3b 0a 20 20 20 20 20 20 20 20  _ptr();.        
eb40: 20 20 20 20 73 75 70 65 72 3a 3a 66 72 6f 6d 5f      super::from_
eb50: 75 74 66 38 5f 75 6e 63 68 65 63 6b 65 64 5f 6d  utf8_unchecked_m
eb60: 75 74 28 73 6c 69 63 65 3a 3a 66 72 6f 6d 5f 72  ut(slice::from_r
eb70: 61 77 5f 70 61 72 74 73 5f 6d 75 74 28 70 74 72  aw_parts_mut(ptr
eb80: 20 61 73 20 2a 6d 75 74 20 75 38 2c 20 73 65 6c   as *mut u8, sel
eb90: 66 2e 65 6e 64 29 29 0a 20 20 20 20 20 20 20 20  f.end)).        
eba0: 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69  }.        #[inli
ebb0: 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 69  ne].        fn i
ebc0: 6e 64 65 78 28 73 65 6c 66 2c 20 73 6c 69 63 65  ndex(self, slice
ebd0: 3a 20 26 73 74 72 29 20 2d 3e 20 26 53 65 6c 66  : &str) -> &Self
ebe0: 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20 20 20  ::Output {.     
ebf0: 20 20 20 20 20 20 20 6c 65 74 20 65 6e 64 20 3d         let end =
ec00: 20 73 65 6c 66 2e 65 6e 64 3b 0a 20 20 20 20 20   self.end;.     
ec10: 20 20 20 20 20 20 20 73 65 6c 66 2e 67 65 74 28         self.get(
ec20: 73 6c 69 63 65 29 2e 75 6e 77 72 61 70 5f 6f 72  slice).unwrap_or
ec30: 5f 65 6c 73 65 28 7c 7c 20 73 75 70 65 72 3a 3a  _else(|| super::
ec40: 73 6c 69 63 65 5f 65 72 72 6f 72 5f 66 61 69 6c  slice_error_fail
ec50: 28 73 6c 69 63 65 2c 20 30 2c 20 65 6e 64 29 29  (slice, 0, end))
ec60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ec70: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
ec80: 20 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d 75       fn index_mu
ec90: 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26  t(self, slice: &
eca0: 6d 75 74 20 73 74 72 29 20 2d 3e 20 26 6d 75 74  mut str) -> &mut
ecb0: 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a   Self::Output {.
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
ecd0: 6c 69 63 65 2e 69 73 5f 63 68 61 72 5f 62 6f 75  lice.is_char_bou
ece0: 6e 64 61 72 79 28 73 65 6c 66 2e 65 6e 64 29 20  ndary(self.end) 
ecf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ed00: 20 20 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e    unsafe { self.
ed10: 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75  get_unchecked_mu
ed20: 74 28 73 6c 69 63 65 29 20 7d 0a 20 20 20 20 20  t(slice) }.     
ed30: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 73 75 70 65 72 3a 3a 73 6c 69 63 65 5f 65 72 72  super::slice_err
ed60: 6f 72 5f 66 61 69 6c 28 73 6c 69 63 65 2c 20 30  or_fail(slice, 0
ed70: 2c 20 73 65 6c 66 2e 65 6e 64 29 0a 20 20 20 20  , self.end).    
ed80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ed90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23    }.    }..    #
eda0: 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74 75 72  [unstable(featur
edb0: 65 20 3d 20 22 73 74 72 5f 63 68 65 63 6b 65 64  e = "str_checked
edc0: 5f 73 6c 69 63 69 6e 67 22 2c 20 69 73 73 75 65  _slicing", issue
edd0: 20 3d 20 22 33 39 39 33 32 22 29 5d 0a 20 20 20   = "39932")].   
ede0: 20 69 6d 70 6c 20 53 6c 69 63 65 49 6e 64 65 78   impl SliceIndex
edf0: 3c 73 74 72 3e 20 66 6f 72 20 6f 70 73 3a 3a 52  <str> for ops::R
ee00: 61 6e 67 65 46 72 6f 6d 3c 75 73 69 7a 65 3e 20  angeFrom<usize> 
ee10: 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65 20 4f  {.        type O
ee20: 75 74 70 75 74 20 3d 20 73 74 72 3b 0a 20 20 20  utput = str;.   
ee30: 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20       #[inline]. 
ee40: 20 20 20 20 20 20 20 66 6e 20 67 65 74 28 73 65         fn get(se
ee50: 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74 72 29  lf, slice: &str)
ee60: 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 53 65 6c 66   -> Option<&Self
ee70: 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20 20 20 20  ::Output> {.    
ee80: 20 20 20 20 20 20 20 20 69 66 20 73 6c 69 63 65          if slice
ee90: 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72  .is_char_boundar
eea0: 79 28 73 65 6c 66 2e 73 74 61 72 74 29 20 7b 0a  y(self.start) {.
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 53 6f 6d 65 28 75 6e 73 61 66 65 20 7b 20 73 65  Some(unsafe { se
eed0: 6c 66 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65 64  lf.get_unchecked
eee0: 28 73 6c 69 63 65 29 20 7d 29 0a 20 20 20 20 20  (slice) }).     
eef0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20  None.           
ef20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
ef30: 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20       #[inline]. 
ef40: 20 20 20 20 20 20 20 66 6e 20 67 65 74 5f 6d 75         fn get_mu
ef50: 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26  t(self, slice: &
ef60: 6d 75 74 20 73 74 72 29 20 2d 3e 20 4f 70 74 69  mut str) -> Opti
ef70: 6f 6e 3c 26 6d 75 74 20 53 65 6c 66 3a 3a 4f 75  on<&mut Self::Ou
ef80: 74 70 75 74 3e 20 7b 0a 20 20 20 20 20 20 20 20  tput> {.        
ef90: 20 20 20 20 69 66 20 73 6c 69 63 65 2e 69 73 5f      if slice.is_
efa0: 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 73 65  char_boundary(se
efb0: 6c 66 2e 73 74 61 72 74 29 20 7b 0a 20 20 20 20  lf.start) {.    
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65              Some
efd0: 28 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e 67  (unsafe { self.g
efe0: 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74  et_unchecked_mut
eff0: 28 73 6c 69 63 65 29 20 7d 29 0a 20 20 20 20 20  (slice) }).     
f000: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20  None.           
f030: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
f040: 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20       #[inline]. 
f050: 20 20 20 20 20 20 20 75 6e 73 61 66 65 20 66 6e         unsafe fn
f060: 20 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73   get_unchecked(s
f070: 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74 72  elf, slice: &str
f080: 29 20 2d 3e 20 26 53 65 6c 66 3a 3a 4f 75 74 70  ) -> &Self::Outp
f090: 75 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ut {.           
f0a0: 20 6c 65 74 20 70 74 72 20 3d 20 73 6c 69 63 65   let ptr = slice
f0b0: 2e 61 73 5f 70 74 72 28 29 2e 6f 66 66 73 65 74  .as_ptr().offset
f0c0: 28 73 65 6c 66 2e 73 74 61 72 74 20 61 73 20 69  (self.start as i
f0d0: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  size);.         
f0e0: 20 20 20 6c 65 74 20 6c 65 6e 20 3d 20 73 6c 69     let len = sli
f0f0: 63 65 2e 6c 65 6e 28 29 20 2d 20 73 65 6c 66 2e  ce.len() - self.
f100: 73 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  start;.         
f110: 20 20 20 73 75 70 65 72 3a 3a 66 72 6f 6d 5f 75     super::from_u
f120: 74 66 38 5f 75 6e 63 68 65 63 6b 65 64 28 73 6c  tf8_unchecked(sl
f130: 69 63 65 3a 3a 66 72 6f 6d 5f 72 61 77 5f 70 61  ice::from_raw_pa
f140: 72 74 73 28 70 74 72 2c 20 6c 65 6e 29 29 0a 20  rts(ptr, len)). 
f150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f160: 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20   #[inline].     
f170: 20 20 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74     unsafe fn get
f180: 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74 28 73  _unchecked_mut(s
f190: 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75 74  elf, slice: &mut
f1a0: 20 73 74 72 29 20 2d 3e 20 26 6d 75 74 20 53 65   str) -> &mut Se
f1b0: 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20  lf::Output {.   
f1c0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 74 72           let ptr
f1d0: 20 3d 20 73 6c 69 63 65 2e 61 73 5f 70 74 72 28   = slice.as_ptr(
f1e0: 29 2e 6f 66 66 73 65 74 28 73 65 6c 66 2e 73 74  ).offset(self.st
f1f0: 61 72 74 20 61 73 20 69 73 69 7a 65 29 3b 0a 20  art as isize);. 
f200: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c             let l
f210: 65 6e 20 3d 20 73 6c 69 63 65 2e 6c 65 6e 28 29  en = slice.len()
f220: 20 2d 20 73 65 6c 66 2e 73 74 61 72 74 3b 0a 20   - self.start;. 
f230: 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72             super
f240: 3a 3a 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68  ::from_utf8_unch
f250: 65 63 6b 65 64 5f 6d 75 74 28 73 6c 69 63 65 3a  ecked_mut(slice:
f260: 3a 66 72 6f 6d 5f 72 61 77 5f 70 61 72 74 73 5f  :from_raw_parts_
f270: 6d 75 74 28 70 74 72 20 61 73 20 2a 6d 75 74 20  mut(ptr as *mut 
f280: 75 38 2c 20 6c 65 6e 29 29 0a 20 20 20 20 20 20  u8, len)).      
f290: 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e    }.        #[in
f2a0: 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e  line].        fn
f2b0: 20 69 6e 64 65 78 28 73 65 6c 66 2c 20 73 6c 69   index(self, sli
f2c0: 63 65 3a 20 26 73 74 72 29 20 2d 3e 20 26 53 65  ce: &str) -> &Se
f2d0: 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20  lf::Output {.   
f2e0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 28 73 74           let (st
f2f0: 61 72 74 2c 20 65 6e 64 29 20 3d 20 28 73 65 6c  art, end) = (sel
f300: 66 2e 73 74 61 72 74 2c 20 73 6c 69 63 65 2e 6c  f.start, slice.l
f310: 65 6e 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  en());.         
f320: 20 20 20 73 65 6c 66 2e 67 65 74 28 73 6c 69 63     self.get(slic
f330: 65 29 2e 75 6e 77 72 61 70 5f 6f 72 5f 65 6c 73  e).unwrap_or_els
f340: 65 28 7c 7c 20 73 75 70 65 72 3a 3a 73 6c 69 63  e(|| super::slic
f350: 65 5f 65 72 72 6f 72 5f 66 61 69 6c 28 73 6c 69  e_error_fail(sli
f360: 63 65 2c 20 73 74 61 72 74 2c 20 65 6e 64 29 29  ce, start, end))
f370: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f380: 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
f390: 20 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d 75       fn index_mu
f3a0: 74 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26  t(self, slice: &
f3b0: 6d 75 74 20 73 74 72 29 20 2d 3e 20 26 6d 75 74  mut str) -> &mut
f3c0: 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a   Self::Output {.
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
f3e0: 6c 69 63 65 2e 69 73 5f 63 68 61 72 5f 62 6f 75  lice.is_char_bou
f3f0: 6e 64 61 72 79 28 73 65 6c 66 2e 73 74 61 72 74  ndary(self.start
f400: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
f410: 20 20 20 20 75 6e 73 61 66 65 20 7b 20 73 65 6c      unsafe { sel
f420: 66 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f  f.get_unchecked_
f430: 6d 75 74 28 73 6c 69 63 65 29 20 7d 0a 20 20 20  mut(slice) }.   
f440: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
f450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
f460: 20 20 73 75 70 65 72 3a 3a 73 6c 69 63 65 5f 65    super::slice_e
f470: 72 72 6f 72 5f 66 61 69 6c 28 73 6c 69 63 65 2c  rror_fail(slice,
f480: 20 73 65 6c 66 2e 73 74 61 72 74 2c 20 73 6c 69   self.start, sli
f490: 63 65 2e 6c 65 6e 28 29 29 0a 20 20 20 20 20 20  ce.len()).      
f4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f4b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 75  }.    }..    #[u
f4c0: 6e 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  nstable(feature 
f4d0: 3d 20 22 73 74 72 5f 63 68 65 63 6b 65 64 5f 73  = "str_checked_s
f4e0: 6c 69 63 69 6e 67 22 2c 20 69 73 73 75 65 20 3d  licing", issue =
f4f0: 20 22 33 39 39 33 32 22 29 5d 0a 20 20 20 20 69   "39932")].    i
f500: 6d 70 6c 20 53 6c 69 63 65 49 6e 64 65 78 3c 73  mpl SliceIndex<s
f510: 74 72 3e 20 66 6f 72 20 6f 70 73 3a 3a 52 61 6e  tr> for ops::Ran
f520: 67 65 49 6e 63 6c 75 73 69 76 65 3c 75 73 69 7a  geInclusive<usiz
f530: 65 3e 20 7b 0a 20 20 20 20 20 20 20 20 74 79 70  e> {.        typ
f540: 65 20 4f 75 74 70 75 74 20 3d 20 73 74 72 3b 0a  e Output = str;.
f550: 20 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65          #[inline
f560: 5d 0a 20 20 20 20 20 20 20 20 66 6e 20 67 65 74  ].        fn get
f570: 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73  (self, slice: &s
f580: 74 72 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 53  tr) -> Option<&S
f590: 65 6c 66 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20  elf::Output> {. 
f5a0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68             match
f5b0: 20 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20   self {.        
f5c0: 20 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e          ops::Ran
f5d0: 67 65 49 6e 63 6c 75 73 69 76 65 3a 3a 45 6d 70  geInclusive::Emp
f5e0: 74 79 20 7b 20 2e 2e 20 7d 20 3d 3e 20 30 2e 2e  ty { .. } => 0..
f5f0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f600: 20 20 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63     ops::RangeInc
f610: 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79  lusive::NonEmpty
f620: 20 7b 20 73 74 61 72 74 2c 20 65 6e 64 20 7d 20   { start, end } 
f630: 3d 3e 20 73 74 61 72 74 2e 2e 65 6e 64 2b 31 2c  => start..end+1,
f640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2e 67  .            }.g
f650: 65 74 28 73 6c 69 63 65 29 0a 20 20 20 20 20 20  et(slice).      
f660: 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69 6e    }.        #[in
f670: 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 66 6e  line].        fn
f680: 20 67 65 74 5f 6d 75 74 28 73 65 6c 66 2c 20 73   get_mut(self, s
f690: 6c 69 63 65 3a 20 26 6d 75 74 20 73 74 72 29 20  lice: &mut str) 
f6a0: 2d 3e 20 4f 70 74 69 6f 6e 3c 26 6d 75 74 20 53  -> Option<&mut S
f6b0: 65 6c 66 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a 20  elf::Output> {. 
f6c0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68             match
f6d0: 20 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20   self {.        
f6e0: 20 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e          ops::Ran
f6f0: 67 65 49 6e 63 6c 75 73 69 76 65 3a 3a 45 6d 70  geInclusive::Emp
f700: 74 79 20 7b 20 2e 2e 20 7d 20 3d 3e 20 30 2e 2e  ty { .. } => 0..
f710: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f720: 20 20 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63     ops::RangeInc
f730: 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79  lusive::NonEmpty
f740: 20 7b 20 73 74 61 72 74 2c 20 65 6e 64 20 7d 20   { start, end } 
f750: 3d 3e 20 73 74 61 72 74 2e 2e 65 6e 64 2b 31 2c  => start..end+1,
f760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2e 67  .            }.g
f770: 65 74 5f 6d 75 74 28 73 6c 69 63 65 29 0a 20 20  et_mut(slice).  
f780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f790: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20  #[inline].      
f7a0: 20 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74 5f    unsafe fn get_
f7b0: 75 6e 63 68 65 63 6b 65 64 28 73 65 6c 66 2c 20  unchecked(self, 
f7c0: 73 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e 20  slice: &str) -> 
f7d0: 26 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a  &Self::Output {.
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
f7f0: 68 20 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  h self {.       
f800: 20 20 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61           ops::Ra
f810: 6e 67 65 49 6e 63 6c 75 73 69 76 65 3a 3a 45 6d  ngeInclusive::Em
f820: 70 74 79 20 7b 20 2e 2e 20 7d 20 3d 3e 20 30 2e  pty { .. } => 0.
f830: 2e 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .0,.            
f840: 20 20 20 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e      ops::RangeIn
f850: 63 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45 6d 70 74  clusive::NonEmpt
f860: 79 20 7b 20 73 74 61 72 74 2c 20 65 6e 64 20 7d  y { start, end }
f870: 20 3d 3e 20 73 74 61 72 74 2e 2e 65 6e 64 2b 31   => start..end+1
f880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2e  ,.            }.
f890: 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73 6c  get_unchecked(sl
f8a0: 69 63 65 29 0a 20 20 20 20 20 20 20 20 7d 0a 20  ice).        }. 
f8b0: 20 20 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d         #[inline]
f8c0: 0a 20 20 20 20 20 20 20 20 75 6e 73 61 66 65 20  .        unsafe 
f8d0: 66 6e 20 67 65 74 5f 75 6e 63 68 65 63 6b 65 64  fn get_unchecked
f8e0: 5f 6d 75 74 28 73 65 6c 66 2c 20 73 6c 69 63 65  _mut(self, slice
f8f0: 3a 20 26 6d 75 74 20 73 74 72 29 20 2d 3e 20 26  : &mut str) -> &
f900: 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75 74  mut Self::Output
f910: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
f920: 61 74 63 68 20 73 65 6c 66 20 7b 0a 20 20 20 20  atch self {.    
f930: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 73 3a              ops:
f940: 3a 52 61 6e 67 65 49 6e 63 6c 75 73 69 76 65 3a  :RangeInclusive:
f950: 3a 45 6d 70 74 79 20 7b 20 2e 2e 20 7d 20 3d 3e  :Empty { .. } =>
f960: 20 30 2e 2e 30 2c 0a 20 20 20 20 20 20 20 20 20   0..0,.         
f970: 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e 67         ops::Rang
f980: 65 49 6e 63 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45  eInclusive::NonE
f990: 6d 70 74 79 20 7b 20 73 74 61 72 74 2c 20 65 6e  mpty { start, en
f9a0: 64 20 7d 20 3d 3e 20 73 74 61 72 74 2e 2e 65 6e  d } => start..en
f9b0: 64 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d+1,.           
f9c0: 20 7d 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65 64   }.get_unchecked
f9d0: 5f 6d 75 74 28 73 6c 69 63 65 29 0a 20 20 20 20  _mut(slice).    
f9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b      }.        #[
f9f0: 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20  inline].        
fa00: 66 6e 20 69 6e 64 65 78 28 73 65 6c 66 2c 20 73  fn index(self, s
fa10: 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e 20 26  lice: &str) -> &
fa20: 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20  Self::Output {. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68             match
fa40: 20 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20   self {.        
fa50: 20 20 20 20 20 20 20 20 6f 70 73 3a 3a 52 61 6e          ops::Ran
fa60: 67 65 49 6e 63 6c 75 73 69 76 65 3a 3a 45 6d 70  geInclusive::Emp
fa70: 74 79 20 7b 20 2e 2e 20 7d 20 3d 3e 20 30 2e 2e  ty { .. } => 0..
fa80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
fa90: 20 20 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e 63     ops::RangeInc
faa0: 6c 75 73 69 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79  lusive::NonEmpty
fab0: 20 7b 20 73 74 61 72 74 2c 20 65 6e 64 20 7d 20   { start, end } 
fac0: 3d 3e 20 73 74 61 72 74 2e 2e 65 6e 64 2b 31 2c  => start..end+1,
fad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2e 69  .            }.i
fae0: 6e 64 65 78 28 73 6c 69 63 65 29 0a 20 20 20 20  ndex(slice).    
faf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b      }.        #[
fb00: 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20  inline].        
fb10: 66 6e 20 69 6e 64 65 78 5f 6d 75 74 28 73 65 6c  fn index_mut(sel
fb20: 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75 74 20 73  f, slice: &mut s
fb30: 74 72 29 20 2d 3e 20 26 6d 75 74 20 53 65 6c 66  tr) -> &mut Self
fb40: 3a 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20 20 20  ::Output {.     
fb50: 20 20 20 20 20 20 20 6d 61 74 63 68 20 73 65 6c         match sel
fb60: 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
fb70: 20 20 20 20 6f 70 73 3a 3a 52 61 6e 67 65 49 6e      ops::RangeIn
fb80: 63 6c 75 73 69 76 65 3a 3a 45 6d 70 74 79 20 7b  clusive::Empty {
fb90: 20 2e 2e 20 7d 20 3d 3e 20 30 2e 2e 30 2c 0a 20   .. } => 0..0,. 
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
fbb0: 70 73 3a 3a 52 61 6e 67 65 49 6e 63 6c 75 73 69  ps::RangeInclusi
fbc0: 76 65 3a 3a 4e 6f 6e 45 6d 70 74 79 20 7b 20 73  ve::NonEmpty { s
fbd0: 74 61 72 74 2c 20 65 6e 64 20 7d 20 3d 3e 20 73  tart, end } => s
fbe0: 74 61 72 74 2e 2e 65 6e 64 2b 31 2c 0a 20 20 20  tart..end+1,.   
fbf0: 20 20 20 20 20 20 20 20 20 7d 2e 69 6e 64 65 78           }.index
fc00: 5f 6d 75 74 28 73 6c 69 63 65 29 0a 20 20 20 20  _mut(slice).    
fc10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 0a 20      }.    }.... 
fc20: 20 20 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65     #[unstable(fe
fc30: 61 74 75 72 65 20 3d 20 22 73 74 72 5f 63 68 65  ature = "str_che
fc40: 63 6b 65 64 5f 73 6c 69 63 69 6e 67 22 2c 20 69  cked_slicing", i
fc50: 73 73 75 65 20 3d 20 22 33 39 39 33 32 22 29 5d  ssue = "39932")]
fc60: 0a 20 20 20 20 69 6d 70 6c 20 53 6c 69 63 65 49  .    impl SliceI
fc70: 6e 64 65 78 3c 73 74 72 3e 20 66 6f 72 20 6f 70  ndex<str> for op
fc80: 73 3a 3a 52 61 6e 67 65 54 6f 49 6e 63 6c 75 73  s::RangeToInclus
fc90: 69 76 65 3c 75 73 69 7a 65 3e 20 7b 0a 20 20 20  ive<usize> {.   
fca0: 20 20 20 20 20 74 79 70 65 20 4f 75 74 70 75 74       type Output
fcb0: 20 3d 20 73 74 72 3b 0a 20 20 20 20 20 20 20 20   = str;.        
fcc0: 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20  #[inline].      
fcd0: 20 20 66 6e 20 67 65 74 28 73 65 6c 66 2c 20 73    fn get(self, s
fce0: 6c 69 63 65 3a 20 26 73 74 72 29 20 2d 3e 20 4f  lice: &str) -> O
fcf0: 70 74 69 6f 6e 3c 26 53 65 6c 66 3a 3a 4f 75 74  ption<&Self::Out
fd00: 70 75 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  put> {.         
fd10: 20 20 20 69 66 20 73 6c 69 63 65 2e 69 73 5f 63     if slice.is_c
fd20: 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c  har_boundary(sel
fd30: 66 2e 65 6e 64 20 2b 20 31 29 20 7b 0a 20 20 20  f.end + 1) {.   
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d               Som
fd50: 65 28 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e  e(unsafe { self.
fd60: 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73 6c  get_unchecked(sl
fd70: 69 63 65 29 20 7d 29 0a 20 20 20 20 20 20 20 20  ice) }).        
fd80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e               Non
fda0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  e.            }.
fdb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fdc0: 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
fdd0: 20 20 20 20 66 6e 20 67 65 74 5f 6d 75 74 28 73      fn get_mut(s
fde0: 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d 75 74  elf, slice: &mut
fdf0: 20 73 74 72 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c   str) -> Option<
fe00: 26 6d 75 74 20 53 65 6c 66 3a 3a 4f 75 74 70 75  &mut Self::Outpu
fe10: 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t> {.           
fe20: 20 69 66 20 73 6c 69 63 65 2e 69 73 5f 63 68 61   if slice.is_cha
fe30: 72 5f 62 6f 75 6e 64 61 72 79 28 73 65 6c 66 2e  r_boundary(self.
fe40: 65 6e 64 20 2b 20 31 29 20 7b 0a 20 20 20 20 20  end + 1) {.     
fe50: 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28             Some(
fe60: 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e 67 65  unsafe { self.ge
fe70: 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74 28  t_unchecked_mut(
fe80: 73 6c 69 63 65 29 20 7d 29 0a 20 20 20 20 20 20  slice) }).      
fe90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
feb0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
fec0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
fed0: 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
fee0: 20 20 20 20 20 20 75 6e 73 61 66 65 20 66 6e 20        unsafe fn 
fef0: 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 28 73 65  get_unchecked(se
ff00: 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74 72 29  lf, slice: &str)
ff10: 20 2d 3e 20 26 53 65 6c 66 3a 3a 4f 75 74 70 75   -> &Self::Outpu
ff20: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t {.            
ff30: 6c 65 74 20 70 74 72 20 3d 20 73 6c 69 63 65 2e  let ptr = slice.
ff40: 61 73 5f 70 74 72 28 29 3b 0a 20 20 20 20 20 20  as_ptr();.      
ff50: 20 20 20 20 20 20 73 75 70 65 72 3a 3a 66 72 6f        super::fro
ff60: 6d 5f 75 74 66 38 5f 75 6e 63 68 65 63 6b 65 64  m_utf8_unchecked
ff70: 28 73 6c 69 63 65 3a 3a 66 72 6f 6d 5f 72 61 77  (slice::from_raw
ff80: 5f 70 61 72 74 73 28 70 74 72 2c 20 73 65 6c 66  _parts(ptr, self
ff90: 2e 65 6e 64 20 2b 20 31 29 29 0a 20 20 20 20 20  .end + 1)).     
ffa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 23 5b 69     }.        #[i
ffb0: 6e 6c 69 6e 65 5d 0a 20 20 20 20 20 20 20 20 75  nline].        u
ffc0: 6e 73 61 66 65 20 66 6e 20 67 65 74 5f 75 6e 63  nsafe fn get_unc
ffd0: 68 65 63 6b 65 64 5f 6d 75 74 28 73 65 6c 66 2c  hecked_mut(self,
ffe0: 20 73 6c 69 63 65 3a 20 26 6d 75 74 20 73 74 72   slice: &mut str
fff0: 29 20 2d 3e 20 26 6d 75 74 20 53 65 6c 66 3a 3a  ) -> &mut Self::
10000 4f 75 74 70 75 74 20 7b 0a 20 20 20 20 20 20 20  Output {.       
10010 20 20 20 20 20 6c 65 74 20 70 74 72 20 3d 20 73       let ptr = s
10020 6c 69 63 65 2e 61 73 5f 70 74 72 28 29 3b 0a 20  lice.as_ptr();. 
10030 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72             super
10040 3a 3a 66 72 6f 6d 5f 75 74 66 38 5f 75 6e 63 68  ::from_utf8_unch
10050 65 63 6b 65 64 5f 6d 75 74 28 73 6c 69 63 65 3a  ecked_mut(slice:
10060 3a 66 72 6f 6d 5f 72 61 77 5f 70 61 72 74 73 5f  :from_raw_parts_
10070 6d 75 74 28 70 74 72 20 61 73 20 2a 6d 75 74 20  mut(ptr as *mut 
10080 75 38 2c 20 73 65 6c 66 2e 65 6e 64 20 2b 20 31  u8, self.end + 1
10090 29 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  )).        }.   
100a0 20 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20       #[inline]. 
100b0 20 20 20 20 20 20 20 66 6e 20 69 6e 64 65 78 28         fn index(
100c0 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 73 74  self, slice: &st
100d0 72 29 20 2d 3e 20 26 53 65 6c 66 3a 3a 4f 75 74  r) -> &Self::Out
100e0 70 75 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20  put {.          
100f0 20 20 6c 65 74 20 65 6e 64 20 3d 20 73 65 6c 66    let end = self
10100 2e 65 6e 64 20 2b 20 31 3b 0a 20 20 20 20 20 20  .end + 1;.      
10110 20 20 20 20 20 20 73 65 6c 66 2e 67 65 74 28 73        self.get(s
10120 6c 69 63 65 29 2e 75 6e 77 72 61 70 5f 6f 72 5f  lice).unwrap_or_
10130 65 6c 73 65 28 7c 7c 20 73 75 70 65 72 3a 3a 73  else(|| super::s
10140 6c 69 63 65 5f 65 72 72 6f 72 5f 66 61 69 6c 28  lice_error_fail(
10150 73 6c 69 63 65 2c 20 30 2c 20 65 6e 64 29 29 0a  slice, 0, end)).
10160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10170 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
10180 20 20 20 20 66 6e 20 69 6e 64 65 78 5f 6d 75 74      fn index_mut
10190 28 73 65 6c 66 2c 20 73 6c 69 63 65 3a 20 26 6d  (self, slice: &m
101a0 75 74 20 73 74 72 29 20 2d 3e 20 26 6d 75 74 20  ut str) -> &mut 
101b0 53 65 6c 66 3a 3a 4f 75 74 70 75 74 20 7b 0a 20  Self::Output {. 
101c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 6c             if sl
101d0 69 63 65 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e  ice.is_char_boun
101e0 64 61 72 79 28 73 65 6c 66 2e 65 6e 64 29 20 7b  dary(self.end) {
101f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10200 20 75 6e 73 61 66 65 20 7b 20 73 65 6c 66 2e 67   unsafe { self.g
10210 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74  et_unchecked_mut
10220 28 73 6c 69 63 65 29 20 7d 0a 20 20 20 20 20 20  (slice) }.      
10230 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10250 75 70 65 72 3a 3a 73 6c 69 63 65 5f 65 72 72 6f  uper::slice_erro
10260 72 5f 66 61 69 6c 28 73 6c 69 63 65 2c 20 30 2c  r_fail(slice, 0,
10270 20 73 65 6c 66 2e 65 6e 64 20 2b 20 31 29 0a 20   self.end + 1). 
10280 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 7d 0a       }.    }..}.
102a0 0a 0a 2f 2f 2f 20 4d 65 74 68 6f 64 73 20 66 6f  ../// Methods fo
102b0 72 20 73 74 72 69 6e 67 20 73 6c 69 63 65 73 0a  r string slices.
102c0 23 5b 61 6c 6c 6f 77 28 6d 69 73 73 69 6e 67 5f  #[allow(missing_
102d0 64 6f 63 73 29 5d 0a 23 5b 64 6f 63 28 68 69 64  docs)].#[doc(hid
102e0 64 65 6e 29 5d 0a 23 5b 75 6e 73 74 61 62 6c 65  den)].#[unstable
102f0 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f 72 65  (feature = "core
10300 5f 73 74 72 5f 65 78 74 22 2c 0a 20 20 20 20 20  _str_ext",.     
10310 20 20 20 20 20 20 72 65 61 73 6f 6e 20 3d 20 22        reason = "
10320 73 74 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65  stable interface
10330 20 70 72 6f 76 69 64 65 64 20 62 79 20 60 69 6d   provided by `im
10340 70 6c 20 73 74 72 60 20 69 6e 20 6c 61 74 65 72  pl str` in later
10350 20 63 72 61 74 65 73 22 2c 0a 20 20 20 20 20 20   crates",.      
10360 20 20 20 20 20 69 73 73 75 65 20 3d 20 22 33 32       issue = "32
10370 31 31 30 22 29 5d 0a 70 75 62 20 74 72 61 69 74  110")].pub trait
10380 20 53 74 72 45 78 74 20 7b 0a 20 20 20 20 2f 2f   StrExt {.    //
10390 20 4e 42 20 74 68 65 72 65 20 61 72 65 20 6e 6f   NB there are no
103a0 20 64 6f 63 73 20 68 65 72 65 20 61 72 65 20 74   docs here are t
103b0 68 65 79 27 72 65 20 61 6c 6c 20 6c 6f 63 61 74  hey're all locat
103c0 65 64 20 6f 6e 20 74 68 65 20 53 74 72 45 78 74  ed on the StrExt
103d0 20 74 72 61 69 74 20 69 6e 0a 20 20 20 20 2f 2f   trait in.    //
103e0 20 6c 69 62 63 6f 6c 6c 65 63 74 69 6f 6e 73 2c   libcollections,
103f0 20 6e 6f 74 20 68 65 72 65 2e 0a 0a 20 20 20 20   not here...    
10400 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
10410 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65   = "core", since
10420 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20   = "1.6.0")].   
10430 20 66 6e 20 63 6f 6e 74 61 69 6e 73 3c 27 61 2c   fn contains<'a,
10440 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e   P: Pattern<'a>>
10450 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20  (&'a self, pat: 
10460 50 29 20 2d 3e 20 62 6f 6f 6c 3b 0a 20 20 20 20  P) -> bool;.    
10470 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
10480 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65   = "core", since
10490 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20   = "1.6.0")].   
104a0 20 66 6e 20 63 68 61 72 73 28 26 73 65 6c 66 29   fn chars(&self)
104b0 20 2d 3e 20 43 68 61 72 73 3b 0a 20 20 20 20 23   -> Chars;.    #
104c0 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
104d0 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20  = "core", since 
104e0 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20  = "1.6.0")].    
104f0 66 6e 20 62 79 74 65 73 28 26 73 65 6c 66 29 20  fn bytes(&self) 
10500 2d 3e 20 42 79 74 65 73 3b 0a 20 20 20 20 23 5b  -> Bytes;.    #[
10510 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
10520 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d   "core", since =
10530 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66   "1.6.0")].    f
10540 6e 20 63 68 61 72 5f 69 6e 64 69 63 65 73 28 26  n char_indices(&
10550 73 65 6c 66 29 20 2d 3e 20 43 68 61 72 49 6e 64  self) -> CharInd
10560 69 63 65 73 3b 0a 20 20 20 20 23 5b 73 74 61 62  ices;.    #[stab
10570 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f  le(feature = "co
10580 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e  re", since = "1.
10590 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 73 70  6.0")].    fn sp
105a0 6c 69 74 3c 27 61 2c 20 50 3a 20 50 61 74 74 65  lit<'a, P: Patte
105b0 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66  rn<'a>>(&'a self
105c0 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 53 70 6c  , pat: P) -> Spl
105d0 69 74 3c 27 61 2c 20 50 3e 3b 0a 20 20 20 20 23  it<'a, P>;.    #
105e0 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
105f0 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20  = "core", since 
10600 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20  = "1.6.0")].    
10610 66 6e 20 72 73 70 6c 69 74 3c 27 61 2c 20 50 3a  fn rsplit<'a, P:
10620 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27   Pattern<'a>>(&'
10630 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20  a self, pat: P) 
10640 2d 3e 20 52 53 70 6c 69 74 3c 27 61 2c 20 50 3e  -> RSplit<'a, P>
10650 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50  .        where P
10660 3a 3a 53 65 61 72 63 68 65 72 3a 20 52 65 76 65  ::Searcher: Reve
10670 72 73 65 53 65 61 72 63 68 65 72 3c 27 61 3e 3b  rseSearcher<'a>;
10680 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65  .    #[stable(fe
10690 61 74 75 72 65 20 3d 20 22 63 6f 72 65 22 2c 20  ature = "core", 
106a0 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22 29  since = "1.6.0")
106b0 5d 0a 20 20 20 20 66 6e 20 73 70 6c 69 74 6e 3c  ].    fn splitn<
106c0 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27  'a, P: Pattern<'
106d0 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 63 6f  a>>(&'a self, co
106e0 75 6e 74 3a 20 75 73 69 7a 65 2c 20 70 61 74 3a  unt: usize, pat:
106f0 20 50 29 20 2d 3e 20 53 70 6c 69 74 4e 3c 27 61   P) -> SplitN<'a
10700 2c 20 50 3e 3b 0a 20 20 20 20 23 5b 73 74 61 62  , P>;.    #[stab
10710 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f  le(feature = "co
10720 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e  re", since = "1.
10730 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 72 73  6.0")].    fn rs
10740 70 6c 69 74 6e 3c 27 61 2c 20 50 3a 20 50 61 74  plitn<'a, P: Pat
10750 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65  tern<'a>>(&'a se
10760 6c 66 2c 20 63 6f 75 6e 74 3a 20 75 73 69 7a 65  lf, count: usize
10770 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 52 53 70  , pat: P) -> RSp
10780 6c 69 74 4e 3c 27 61 2c 20 50 3e 0a 20 20 20 20  litN<'a, P>.    
10790 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65 61      where P::Sea
107a0 72 63 68 65 72 3a 20 52 65 76 65 72 73 65 53 65  rcher: ReverseSe
107b0 61 72 63 68 65 72 3c 27 61 3e 3b 0a 20 20 20 20  archer<'a>;.    
107c0 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
107d0 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65   = "core", since
107e0 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20   = "1.6.0")].   
107f0 20 66 6e 20 73 70 6c 69 74 5f 74 65 72 6d 69 6e   fn split_termin
10800 61 74 6f 72 3c 27 61 2c 20 50 3a 20 50 61 74 74  ator<'a, P: Patt
10810 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c  ern<'a>>(&'a sel
10820 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 53 70  f, pat: P) -> Sp
10830 6c 69 74 54 65 72 6d 69 6e 61 74 6f 72 3c 27 61  litTerminator<'a
10840 2c 20 50 3e 3b 0a 20 20 20 20 23 5b 73 74 61 62  , P>;.    #[stab
10850 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f  le(feature = "co
10860 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e  re", since = "1.
10870 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 72 73  6.0")].    fn rs
10880 70 6c 69 74 5f 74 65 72 6d 69 6e 61 74 6f 72 3c  plit_terminator<
10890 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27  'a, P: Pattern<'
108a0 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61  a>>(&'a self, pa
108b0 74 3a 20 50 29 20 2d 3e 20 52 53 70 6c 69 74 54  t: P) -> RSplitT
108c0 65 72 6d 69 6e 61 74 6f 72 3c 27 61 2c 20 50 3e  erminator<'a, P>
108d0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50  .        where P
108e0 3a 3a 53 65 61 72 63 68 65 72 3a 20 52 65 76 65  ::Searcher: Reve
108f0 72 73 65 53 65 61 72 63 68 65 72 3c 27 61 3e 3b  rseSearcher<'a>;
10900 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65  .    #[stable(fe
10910 61 74 75 72 65 20 3d 20 22 63 6f 72 65 22 2c 20  ature = "core", 
10920 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22 29  since = "1.6.0")
10930 5d 0a 20 20 20 20 66 6e 20 6d 61 74 63 68 65 73  ].    fn matches
10940 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c  <'a, P: Pattern<
10950 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70  'a>>(&'a self, p
10960 61 74 3a 20 50 29 20 2d 3e 20 4d 61 74 63 68 65  at: P) -> Matche
10970 73 3c 27 61 2c 20 50 3e 3b 0a 20 20 20 20 23 5b  s<'a, P>;.    #[
10980 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
10990 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d   "core", since =
109a0 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66   "1.6.0")].    f
109b0 6e 20 72 6d 61 74 63 68 65 73 3c 27 61 2c 20 50  n rmatches<'a, P
109c0 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26  : Pattern<'a>>(&
109d0 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29  'a self, pat: P)
109e0 20 2d 3e 20 52 4d 61 74 63 68 65 73 3c 27 61 2c   -> RMatches<'a,
109f0 20 50 3e 0a 20 20 20 20 20 20 20 20 77 68 65 72   P>.        wher
10a00 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 52  e P::Searcher: R
10a10 65 76 65 72 73 65 53 65 61 72 63 68 65 72 3c 27  everseSearcher<'
10a20 61 3e 3b 0a 20 20 20 20 23 5b 73 74 61 62 6c 65  a>;.    #[stable
10a30 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f 72 65  (feature = "core
10a40 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e  ", since = "1.6.
10a50 30 22 29 5d 0a 20 20 20 20 66 6e 20 6d 61 74 63  0")].    fn matc
10a60 68 5f 69 6e 64 69 63 65 73 3c 27 61 2c 20 50 3a  h_indices<'a, P:
10a70 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27   Pattern<'a>>(&'
10a80 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20  a self, pat: P) 
10a90 2d 3e 20 4d 61 74 63 68 49 6e 64 69 63 65 73 3c  -> MatchIndices<
10aa0 27 61 2c 20 50 3e 3b 0a 20 20 20 20 23 5b 73 74  'a, P>;.    #[st
10ab0 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
10ac0 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22  core", since = "
10ad0 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20  1.6.0")].    fn 
10ae0 72 6d 61 74 63 68 5f 69 6e 64 69 63 65 73 3c 27  rmatch_indices<'
10af0 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
10b00 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74  >>(&'a self, pat
10b10 3a 20 50 29 20 2d 3e 20 52 4d 61 74 63 68 49 6e  : P) -> RMatchIn
10b20 64 69 63 65 73 3c 27 61 2c 20 50 3e 0a 20 20 20  dices<'a, P>.   
10b30 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65       where P::Se
10b40 61 72 63 68 65 72 3a 20 52 65 76 65 72 73 65 53  archer: ReverseS
10b50 65 61 72 63 68 65 72 3c 27 61 3e 3b 0a 20 20 20  earcher<'a>;.   
10b60 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
10b70 65 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63  e = "core", sinc
10b80 65 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20  e = "1.6.0")].  
10b90 20 20 66 6e 20 6c 69 6e 65 73 28 26 73 65 6c 66    fn lines(&self
10ba0 29 20 2d 3e 20 4c 69 6e 65 73 3b 0a 20 20 20 20  ) -> Lines;.    
10bb0 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
10bc0 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65   = "core", since
10bd0 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20   = "1.6.0")].   
10be0 20 23 5b 72 75 73 74 63 5f 64 65 70 72 65 63 61   #[rustc_depreca
10bf0 74 65 64 28 73 69 6e 63 65 20 3d 20 22 31 2e 36  ted(since = "1.6
10c00 2e 30 22 2c 20 72 65 61 73 6f 6e 20 3d 20 22 75  .0", reason = "u
10c10 73 65 20 6c 69 6e 65 73 28 29 20 69 6e 73 74 65  se lines() inste
10c20 61 64 20 6e 6f 77 22 29 5d 0a 20 20 20 20 23 5b  ad now")].    #[
10c30 61 6c 6c 6f 77 28 64 65 70 72 65 63 61 74 65 64  allow(deprecated
10c40 29 5d 0a 20 20 20 20 66 6e 20 6c 69 6e 65 73 5f  )].    fn lines_
10c50 61 6e 79 28 26 73 65 6c 66 29 20 2d 3e 20 4c 69  any(&self) -> Li
10c60 6e 65 73 41 6e 79 3b 0a 20 20 20 20 23 5b 75 6e  nesAny;.    #[un
10c70 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
10c80 20 22 73 74 72 5f 63 68 65 63 6b 65 64 5f 73 6c   "str_checked_sl
10c90 69 63 69 6e 67 22 2c 20 69 73 73 75 65 20 3d 20  icing", issue = 
10ca0 22 33 39 39 33 32 22 29 5d 0a 20 20 20 20 66 6e  "39932")].    fn
10cb0 20 67 65 74 3c 49 3a 20 53 6c 69 63 65 49 6e 64   get<I: SliceInd
10cc0 65 78 3c 73 74 72 3e 3e 28 26 73 65 6c 66 2c 20  ex<str>>(&self, 
10cd0 69 3a 20 49 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c  i: I) -> Option<
10ce0 26 49 3a 3a 4f 75 74 70 75 74 3e 3b 0a 20 20 20  &I::Output>;.   
10cf0 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74   #[unstable(feat
10d00 75 72 65 20 3d 20 22 73 74 72 5f 63 68 65 63 6b  ure = "str_check
10d10 65 64 5f 73 6c 69 63 69 6e 67 22 2c 20 69 73 73  ed_slicing", iss
10d20 75 65 20 3d 20 22 33 39 39 33 32 22 29 5d 0a 20  ue = "39932")]. 
10d30 20 20 20 66 6e 20 67 65 74 5f 6d 75 74 3c 49 3a     fn get_mut<I:
10d40 20 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72 3e   SliceIndex<str>
10d50 3e 28 26 6d 75 74 20 73 65 6c 66 2c 20 69 3a 20  >(&mut self, i: 
10d60 49 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 6d 75  I) -> Option<&mu
10d70 74 20 49 3a 3a 4f 75 74 70 75 74 3e 3b 0a 20 20  t I::Output>;.  
10d80 20 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61    #[unstable(fea
10d90 74 75 72 65 20 3d 20 22 73 74 72 5f 63 68 65 63  ture = "str_chec
10da0 6b 65 64 5f 73 6c 69 63 69 6e 67 22 2c 20 69 73  ked_slicing", is
10db0 73 75 65 20 3d 20 22 33 39 39 33 32 22 29 5d 0a  sue = "39932")].
10dc0 20 20 20 20 75 6e 73 61 66 65 20 66 6e 20 67 65      unsafe fn ge
10dd0 74 5f 75 6e 63 68 65 63 6b 65 64 3c 49 3a 20 53  t_unchecked<I: S
10de0 6c 69 63 65 49 6e 64 65 78 3c 73 74 72 3e 3e 28  liceIndex<str>>(
10df0 26 73 65 6c 66 2c 20 69 3a 20 49 29 20 2d 3e 20  &self, i: I) -> 
10e00 26 49 3a 3a 4f 75 74 70 75 74 3b 0a 20 20 20 20  &I::Output;.    
10e10 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61 74 75  #[unstable(featu
10e20 72 65 20 3d 20 22 73 74 72 5f 63 68 65 63 6b 65  re = "str_checke
10e30 64 5f 73 6c 69 63 69 6e 67 22 2c 20 69 73 73 75  d_slicing", issu
10e40 65 20 3d 20 22 33 39 39 33 32 22 29 5d 0a 20 20  e = "39932")].  
10e50 20 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74 5f    unsafe fn get_
10e60 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74 3c 49 3a  unchecked_mut<I:
10e70 20 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72 3e   SliceIndex<str>
10e80 3e 28 26 6d 75 74 20 73 65 6c 66 2c 20 69 3a 20  >(&mut self, i: 
10e90 49 29 20 2d 3e 20 26 6d 75 74 20 49 3a 3a 4f 75  I) -> &mut I::Ou
10ea0 74 70 75 74 3b 0a 20 20 20 20 23 5b 73 74 61 62  tput;.    #[stab
10eb0 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f  le(feature = "co
10ec0 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e  re", since = "1.
10ed0 36 2e 30 22 29 5d 0a 20 20 20 20 75 6e 73 61 66  6.0")].    unsaf
10ee0 65 20 66 6e 20 73 6c 69 63 65 5f 75 6e 63 68 65  e fn slice_unche
10ef0 63 6b 65 64 28 26 73 65 6c 66 2c 20 62 65 67 69  cked(&self, begi
10f00 6e 3a 20 75 73 69 7a 65 2c 20 65 6e 64 3a 20 75  n: usize, end: u
10f10 73 69 7a 65 29 20 2d 3e 20 26 73 74 72 3b 0a 20  size) -> &str;. 
10f20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74     #[stable(feat
10f30 75 72 65 20 3d 20 22 63 6f 72 65 22 2c 20 73 69  ure = "core", si
10f40 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a  nce = "1.6.0")].
10f50 20 20 20 20 75 6e 73 61 66 65 20 66 6e 20 73 6c      unsafe fn sl
10f60 69 63 65 5f 6d 75 74 5f 75 6e 63 68 65 63 6b 65  ice_mut_unchecke
10f70 64 28 26 6d 75 74 20 73 65 6c 66 2c 20 62 65 67  d(&mut self, beg
10f80 69 6e 3a 20 75 73 69 7a 65 2c 20 65 6e 64 3a 20  in: usize, end: 
10f90 75 73 69 7a 65 29 20 2d 3e 20 26 6d 75 74 20 73  usize) -> &mut s
10fa0 74 72 3b 0a 20 20 20 20 23 5b 73 74 61 62 6c 65  tr;.    #[stable
10fb0 28 66 65 61 74 75 72 65 20 3d 20 22 63 6f 72 65  (feature = "core
10fc0 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e  ", since = "1.6.
10fd0 30 22 29 5d 0a 20 20 20 20 66 6e 20 73 74 61 72  0")].    fn star
10fe0 74 73 5f 77 69 74 68 3c 27 61 2c 20 50 3a 20 50  ts_with<'a, P: P
10ff0 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20  attern<'a>>(&'a 
11000 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e  self, pat: P) ->
11010 20 62 6f 6f 6c 3b 0a 20 20 20 20 23 5b 73 74 61   bool;.    #[sta
11020 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63  ble(feature = "c
11030 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  ore", since = "1
11040 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 65  .6.0")].    fn e
11050 6e 64 73 5f 77 69 74 68 3c 27 61 2c 20 50 3a 20  nds_with<'a, P: 
11060 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61  Pattern<'a>>(&'a
11070 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d   self, pat: P) -
11080 3e 20 62 6f 6f 6c 0a 20 20 20 20 20 20 20 20 77  > bool.        w
11090 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72  here P::Searcher
110a0 3a 20 52 65 76 65 72 73 65 53 65 61 72 63 68 65  : ReverseSearche
110b0 72 3c 27 61 3e 3b 0a 20 20 20 20 23 5b 73 74 61  r<'a>;.    #[sta
110c0 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63  ble(feature = "c
110d0 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  ore", since = "1
110e0 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 74  .6.0")].    fn t
110f0 72 69 6d 5f 6d 61 74 63 68 65 73 3c 27 61 2c 20  rim_matches<'a, 
11100 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28  P: Pattern<'a>>(
11110 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50  &'a self, pat: P
11120 29 20 2d 3e 20 26 27 61 20 73 74 72 0a 20 20 20  ) -> &'a str.   
11130 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a 53 65       where P::Se
11140 61 72 63 68 65 72 3a 20 44 6f 75 62 6c 65 45 6e  archer: DoubleEn
11150 64 65 64 53 65 61 72 63 68 65 72 3c 27 61 3e 3b  dedSearcher<'a>;
11160 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65  .    #[stable(fe
11170 61 74 75 72 65 20 3d 20 22 63 6f 72 65 22 2c 20  ature = "core", 
11180 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22 29  since = "1.6.0")
11190 5d 0a 20 20 20 20 66 6e 20 74 72 69 6d 5f 6c 65  ].    fn trim_le
111a0 66 74 5f 6d 61 74 63 68 65 73 3c 27 61 2c 20 50  ft_matches<'a, P
111b0 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26  : Pattern<'a>>(&
111c0 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29  'a self, pat: P)
111d0 20 2d 3e 20 26 27 61 20 73 74 72 3b 0a 20 20 20   -> &'a str;.   
111e0 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
111f0 65 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63  e = "core", sinc
11200 65 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20  e = "1.6.0")].  
11210 20 20 66 6e 20 74 72 69 6d 5f 72 69 67 68 74 5f    fn trim_right_
11220 6d 61 74 63 68 65 73 3c 27 61 2c 20 50 3a 20 50  matches<'a, P: P
11230 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20  attern<'a>>(&'a 
11240 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e  self, pat: P) ->
11250 20 26 27 61 20 73 74 72 0a 20 20 20 20 20 20 20   &'a str.       
11260 20 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68   where P::Search
11270 65 72 3a 20 52 65 76 65 72 73 65 53 65 61 72 63  er: ReverseSearc
11280 68 65 72 3c 27 61 3e 3b 0a 20 20 20 20 23 5b 73  her<'a>;.    #[s
11290 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
112a0 22 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72  "is_char_boundar
112b0 79 22 2c 20 73 69 6e 63 65 20 3d 20 22 31 2e 39  y", since = "1.9
112c0 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 69 73 5f  .0")].    fn is_
112d0 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 26 73  char_boundary(&s
112e0 65 6c 66 2c 20 69 6e 64 65 78 3a 20 75 73 69 7a  elf, index: usiz
112f0 65 29 20 2d 3e 20 62 6f 6f 6c 3b 0a 20 20 20 20  e) -> bool;.    
11300 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65  #[stable(feature
11310 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65   = "core", since
11320 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20   = "1.6.0")].   
11330 20 66 6e 20 61 73 5f 62 79 74 65 73 28 26 73 65   fn as_bytes(&se
11340 6c 66 29 20 2d 3e 20 26 5b 75 38 5d 3b 0a 20 20  lf) -> &[u8];.  
11350 20 20 23 5b 75 6e 73 74 61 62 6c 65 28 66 65 61    #[unstable(fea
11360 74 75 72 65 20 3d 20 22 73 74 72 5f 6d 75 74 5f  ture = "str_mut_
11370 65 78 74 72 61 73 22 2c 20 69 73 73 75 65 20 3d  extras", issue =
11380 20 22 30 22 29 5d 0a 20 20 20 20 75 6e 73 61 66   "0")].    unsaf
11390 65 20 66 6e 20 61 73 5f 62 79 74 65 73 5f 6d 75  e fn as_bytes_mu
113a0 74 28 26 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20  t(&mut self) -> 
113b0 26 6d 75 74 20 5b 75 38 5d 3b 0a 20 20 20 20 23  &mut [u8];.    #
113c0 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
113d0 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20  = "core", since 
113e0 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20  = "1.6.0")].    
113f0 66 6e 20 66 69 6e 64 3c 27 61 2c 20 50 3a 20 50  fn find<'a, P: P
11400 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20  attern<'a>>(&'a 
11410 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e  self, pat: P) ->
11420 20 4f 70 74 69 6f 6e 3c 75 73 69 7a 65 3e 3b 0a   Option<usize>;.
11430 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66 65 61      #[stable(fea
11440 74 75 72 65 20 3d 20 22 63 6f 72 65 22 2c 20 73  ture = "core", s
11450 69 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22 29 5d  ince = "1.6.0")]
11460 0a 20 20 20 20 66 6e 20 72 66 69 6e 64 3c 27 61  .    fn rfind<'a
11470 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
11480 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a  >(&'a self, pat:
11490 20 50 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 75 73   P) -> Option<us
114a0 69 7a 65 3e 0a 20 20 20 20 20 20 20 20 77 68 65  ize>.        whe
114b0 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20  re P::Searcher: 
114c0 52 65 76 65 72 73 65 53 65 61 72 63 68 65 72 3c  ReverseSearcher<
114d0 27 61 3e 3b 0a 20 20 20 20 66 6e 20 66 69 6e 64  'a>;.    fn find
114e0 5f 73 74 72 3c 27 61 2c 20 50 3a 20 50 61 74 74  _str<'a, P: Patt
114f0 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c  ern<'a>>(&'a sel
11500 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 4f 70  f, pat: P) -> Op
11510 74 69 6f 6e 3c 75 73 69 7a 65 3e 3b 0a 20 20 20  tion<usize>;.   
11520 20 23 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72   #[stable(featur
11530 65 20 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63  e = "core", sinc
11540 65 20 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20  e = "1.6.0")].  
11550 20 20 66 6e 20 73 70 6c 69 74 5f 61 74 28 26 73    fn split_at(&s
11560 65 6c 66 2c 20 6d 69 64 3a 20 75 73 69 7a 65 29  elf, mid: usize)
11570 20 2d 3e 20 28 26 73 74 72 2c 20 26 73 74 72 29   -> (&str, &str)
11580 3b 0a 20 20 20 20 23 5b 73 74 61 62 6c 65 28 66  ;.    #[stable(f
11590 65 61 74 75 72 65 20 3d 20 22 63 6f 72 65 22 2c  eature = "core",
115a0 20 73 69 6e 63 65 20 3d 20 22 31 2e 36 2e 30 22   since = "1.6.0"
115b0 29 5d 0a 20 20 20 20 66 6e 20 73 70 6c 69 74 5f  )].    fn split_
115c0 61 74 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66  at_mut(&mut self
115d0 2c 20 6d 69 64 3a 20 75 73 69 7a 65 29 20 2d 3e  , mid: usize) ->
115e0 20 28 26 6d 75 74 20 73 74 72 2c 20 26 6d 75 74   (&mut str, &mut
115f0 20 73 74 72 29 3b 0a 20 20 20 20 23 5b 73 74 61   str);.    #[sta
11600 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22 63  ble(feature = "c
11610 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22 31  ore", since = "1
11620 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20 61  .6.0")].    fn a
11630 73 5f 70 74 72 28 26 73 65 6c 66 29 20 2d 3e 20  s_ptr(&self) -> 
11640 2a 63 6f 6e 73 74 20 75 38 3b 0a 20 20 20 20 23  *const u8;.    #
11650 5b 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20  [stable(feature 
11660 3d 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20  = "core", since 
11670 3d 20 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20  = "1.6.0")].    
11680 66 6e 20 6c 65 6e 28 26 73 65 6c 66 29 20 2d 3e  fn len(&self) ->
11690 20 75 73 69 7a 65 3b 0a 20 20 20 20 23 5b 73 74   usize;.    #[st
116a0 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
116b0 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20 22  core", since = "
116c0 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e 20  1.6.0")].    fn 
116d0 69 73 5f 65 6d 70 74 79 28 26 73 65 6c 66 29 20  is_empty(&self) 
116e0 2d 3e 20 62 6f 6f 6c 3b 0a 20 20 20 20 23 5b 73  -> bool;.    #[s
116f0 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20  table(feature = 
11700 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d 20  "core", since = 
11710 22 31 2e 36 2e 30 22 29 5d 0a 20 20 20 20 66 6e  "1.6.0")].    fn
11720 20 70 61 72 73 65 3c 27 61 2c 20 54 3a 20 54 72   parse<'a, T: Tr
11730 79 46 72 6f 6d 3c 26 27 61 20 73 74 72 3e 3e 28  yFrom<&'a str>>(
11740 26 27 61 20 73 65 6c 66 29 20 2d 3e 20 52 65 73  &'a self) -> Res
11750 75 6c 74 3c 54 2c 20 54 3a 3a 45 72 72 6f 72 3e  ult<T, T::Error>
11760 3b 0a 7d 0a 0a 2f 2f 20 74 72 75 6e 63 61 74 65  ;.}..// truncate
11770 20 60 26 73 74 72 60 20 74 6f 20 6c 65 6e 67 74   `&str` to lengt
11780 68 20 61 74 20 6d 6f 73 74 20 65 71 75 61 6c 20  h at most equal 
11790 74 6f 20 60 6d 61 78 60 0a 2f 2f 20 72 65 74 75  to `max`.// retu
117a0 72 6e 20 60 74 72 75 65 60 20 69 66 20 69 74 20  rn `true` if it 
117b0 77 65 72 65 20 74 72 75 6e 63 61 74 65 64 2c 20  were truncated, 
117c0 61 6e 64 20 74 68 65 20 6e 65 77 20 73 74 72 2e  and the new str.
117d0 0a 66 6e 20 74 72 75 6e 63 61 74 65 5f 74 6f 5f  .fn truncate_to_
117e0 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 73 3a  char_boundary(s:
117f0 20 26 73 74 72 2c 20 6d 75 74 20 6d 61 78 3a 20   &str, mut max: 
11800 75 73 69 7a 65 29 20 2d 3e 20 28 62 6f 6f 6c 2c  usize) -> (bool,
11810 20 26 73 74 72 29 20 7b 0a 20 20 20 20 69 66 20   &str) {.    if 
11820 6d 61 78 20 3e 3d 20 73 2e 6c 65 6e 28 29 20 7b  max >= s.len() {
11830 0a 20 20 20 20 20 20 20 20 28 66 61 6c 73 65 2c  .        (false,
11840 20 73 29 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   s).    } else {
11850 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 21  .        while !
11860 73 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61  s.is_char_bounda
11870 72 79 28 6d 61 78 29 20 7b 0a 20 20 20 20 20 20  ry(max) {.      
11880 20 20 20 20 20 20 6d 61 78 20 2d 3d 20 31 3b 0a        max -= 1;.
11890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
118a0 20 20 28 74 72 75 65 2c 20 26 73 5b 2e 2e 6d 61    (true, &s[..ma
118b0 78 5d 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 69  x]).    }.}..#[i
118c0 6e 6c 69 6e 65 28 6e 65 76 65 72 29 5d 0a 23 5b  nline(never)].#[
118d0 63 6f 6c 64 5d 0a 66 6e 20 73 6c 69 63 65 5f 65  cold].fn slice_e
118e0 72 72 6f 72 5f 66 61 69 6c 28 73 3a 20 26 73 74  rror_fail(s: &st
118f0 72 2c 20 62 65 67 69 6e 3a 20 75 73 69 7a 65 2c  r, begin: usize,
11900 20 65 6e 64 3a 20 75 73 69 7a 65 29 20 2d 3e 20   end: usize) -> 
11910 21 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 4d 41  ! {.    const MA
11920 58 5f 44 49 53 50 4c 41 59 5f 4c 45 4e 47 54 48  X_DISPLAY_LENGTH
11930 3a 20 75 73 69 7a 65 20 3d 20 32 35 36 3b 0a 20  : usize = 256;. 
11940 20 20 20 6c 65 74 20 28 74 72 75 6e 63 61 74 65     let (truncate
11950 64 2c 20 73 5f 74 72 75 6e 63 29 20 3d 20 74 72  d, s_trunc) = tr
11960 75 6e 63 61 74 65 5f 74 6f 5f 63 68 61 72 5f 62  uncate_to_char_b
11970 6f 75 6e 64 61 72 79 28 73 2c 20 4d 41 58 5f 44  oundary(s, MAX_D
11980 49 53 50 4c 41 59 5f 4c 45 4e 47 54 48 29 3b 0a  ISPLAY_LENGTH);.
11990 20 20 20 20 6c 65 74 20 65 6c 6c 69 70 73 69 73      let ellipsis
119a0 20 3d 20 69 66 20 74 72 75 6e 63 61 74 65 64 20   = if truncated 
119b0 7b 20 22 5b 2e 2e 2e 5d 22 20 7d 20 65 6c 73 65  { "[...]" } else
119c0 20 7b 20 22 22 20 7d 3b 0a 0a 20 20 20 20 2f 2f   { "" };..    //
119d0 20 31 2e 20 6f 75 74 20 6f 66 20 62 6f 75 6e 64   1. out of bound
119e0 73 0a 20 20 20 20 69 66 20 62 65 67 69 6e 20 3e  s.    if begin >
119f0 20 73 2e 6c 65 6e 28 29 20 7c 7c 20 65 6e 64 20   s.len() || end 
11a00 3e 20 73 2e 6c 65 6e 28 29 20 7b 0a 20 20 20 20  > s.len() {.    
11a10 20 20 20 20 6c 65 74 20 6f 6f 62 5f 69 6e 64 65      let oob_inde
11a20 78 20 3d 20 69 66 20 62 65 67 69 6e 20 3e 20 73  x = if begin > s
11a30 2e 6c 65 6e 28 29 20 7b 20 62 65 67 69 6e 20 7d  .len() { begin }
11a40 20 65 6c 73 65 20 7b 20 65 6e 64 20 7d 3b 0a 20   else { end };. 
11a50 20 20 20 20 20 20 20 70 61 6e 69 63 21 28 22 62         panic!("b
11a60 79 74 65 20 69 6e 64 65 78 20 7b 7d 20 69 73 20  yte index {} is 
11a70 6f 75 74 20 6f 66 20 62 6f 75 6e 64 73 20 6f 66  out of bounds of
11a80 20 60 7b 7d 60 7b 7d 22 2c 20 6f 6f 62 5f 69 6e   `{}`{}", oob_in
11a90 64 65 78 2c 20 73 5f 74 72 75 6e 63 2c 20 65 6c  dex, s_trunc, el
11aa0 6c 69 70 73 69 73 29 3b 0a 20 20 20 20 7d 0a 0a  lipsis);.    }..
11ab0 20 20 20 20 2f 2f 20 32 2e 20 62 65 67 69 6e 20      // 2. begin 
11ac0 3c 3d 20 65 6e 64 0a 20 20 20 20 61 73 73 65 72  <= end.    asser
11ad0 74 21 28 62 65 67 69 6e 20 3c 3d 20 65 6e 64 2c  t!(begin <= end,
11ae0 20 22 62 65 67 69 6e 20 3c 3d 20 65 6e 64 20 28   "begin <= end (
11af0 7b 7d 20 3c 3d 20 7b 7d 29 20 77 68 65 6e 20 73  {} <= {}) when s
11b00 6c 69 63 69 6e 67 20 60 7b 7d 60 7b 7d 22 2c 0a  licing `{}`{}",.
11b10 20 20 20 20 20 20 20 20 20 20 20 20 62 65 67 69              begi
11b20 6e 2c 20 65 6e 64 2c 20 73 5f 74 72 75 6e 63 2c  n, end, s_trunc,
11b30 20 65 6c 6c 69 70 73 69 73 29 3b 0a 0a 20 20 20   ellipsis);..   
11b40 20 2f 2f 20 33 2e 20 63 68 61 72 61 63 74 65 72   // 3. character
11b50 20 62 6f 75 6e 64 61 72 79 0a 20 20 20 20 6c 65   boundary.    le
11b60 74 20 69 6e 64 65 78 20 3d 20 69 66 20 21 73 2e  t index = if !s.
11b70 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72 79  is_char_boundary
11b80 28 62 65 67 69 6e 29 20 7b 20 62 65 67 69 6e 20  (begin) { begin 
11b90 7d 20 65 6c 73 65 20 7b 20 65 6e 64 20 7d 3b 0a  } else { end };.
11ba0 20 20 20 20 2f 2f 20 66 69 6e 64 20 74 68 65 20      // find the 
11bb0 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 6c 65  character.    le
11bc0 74 20 6d 75 74 20 63 68 61 72 5f 73 74 61 72 74  t mut char_start
11bd0 20 3d 20 69 6e 64 65 78 3b 0a 20 20 20 20 77 68   = index;.    wh
11be0 69 6c 65 20 21 73 2e 69 73 5f 63 68 61 72 5f 62  ile !s.is_char_b
11bf0 6f 75 6e 64 61 72 79 28 63 68 61 72 5f 73 74 61  oundary(char_sta
11c00 72 74 29 20 7b 0a 20 20 20 20 20 20 20 20 63 68  rt) {.        ch
11c10 61 72 5f 73 74 61 72 74 20 2d 3d 20 31 3b 0a 20  ar_start -= 1;. 
11c20 20 20 20 7d 0a 20 20 20 20 2f 2f 20 60 63 68 61     }.    // `cha
11c30 72 5f 73 74 61 72 74 60 20 6d 75 73 74 20 62 65  r_start` must be
11c40 20 6c 65 73 73 20 74 68 61 6e 20 6c 65 6e 20 61   less than len a
11c50 6e 64 20 61 20 63 68 61 72 20 62 6f 75 6e 64 61  nd a char bounda
11c60 72 79 0a 20 20 20 20 6c 65 74 20 63 68 20 3d 20  ry.    let ch = 
11c70 73 5b 63 68 61 72 5f 73 74 61 72 74 2e 2e 5d 2e  s[char_start..].
11c80 63 68 61 72 73 28 29 2e 6e 65 78 74 28 29 2e 75  chars().next().u
11c90 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 6c 65 74  nwrap();.    let
11ca0 20 63 68 61 72 5f 72 61 6e 67 65 20 3d 20 63 68   char_range = ch
11cb0 61 72 5f 73 74 61 72 74 20 2e 2e 20 63 68 61 72  ar_start .. char
11cc0 5f 73 74 61 72 74 20 2b 20 63 68 2e 6c 65 6e 5f  _start + ch.len_
11cd0 75 74 66 38 28 29 3b 0a 20 20 20 20 70 61 6e 69  utf8();.    pani
11ce0 63 21 28 22 62 79 74 65 20 69 6e 64 65 78 20 7b  c!("byte index {
11cf0 7d 20 69 73 20 6e 6f 74 20 61 20 63 68 61 72 20  } is not a char 
11d00 62 6f 75 6e 64 61 72 79 3b 20 69 74 20 69 73 20  boundary; it is 
11d10 69 6e 73 69 64 65 20 7b 3a 3f 7d 20 28 62 79 74  inside {:?} (byt
11d20 65 73 20 7b 3a 3f 7d 29 20 6f 66 20 60 7b 7d 60  es {:?}) of `{}`
11d30 7b 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  {}",.           
11d40 69 6e 64 65 78 2c 20 63 68 2c 20 63 68 61 72 5f  index, ch, char_
11d50 72 61 6e 67 65 2c 20 73 5f 74 72 75 6e 63 2c 20  range, s_trunc, 
11d60 65 6c 6c 69 70 73 69 73 29 3b 0a 7d 0a 0a 23 5b  ellipsis);.}..#[
11d70 73 74 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d  stable(feature =
11d80 20 22 63 6f 72 65 22 2c 20 73 69 6e 63 65 20 3d   "core", since =
11d90 20 22 31 2e 36 2e 30 22 29 5d 0a 69 6d 70 6c 20   "1.6.0")].impl 
11da0 53 74 72 45 78 74 20 66 6f 72 20 73 74 72 20 7b  StrExt for str {
11db0 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
11dc0 20 20 20 66 6e 20 63 6f 6e 74 61 69 6e 73 3c 27     fn contains<'
11dd0 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
11de0 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74  >>(&'a self, pat
11df0 3a 20 50 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20  : P) -> bool {. 
11e00 20 20 20 20 20 20 20 70 61 74 2e 69 73 5f 63 6f         pat.is_co
11e10 6e 74 61 69 6e 65 64 5f 69 6e 28 73 65 6c 66 29  ntained_in(self)
11e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
11e30 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 63 68 61  line].    fn cha
11e40 72 73 28 26 73 65 6c 66 29 20 2d 3e 20 43 68 61  rs(&self) -> Cha
11e50 72 73 20 7b 0a 20 20 20 20 20 20 20 20 43 68 61  rs {.        Cha
11e60 72 73 7b 69 74 65 72 3a 20 73 65 6c 66 2e 61 73  rs{iter: self.as
11e70 5f 62 79 74 65 73 28 29 2e 69 74 65 72 28 29 7d  _bytes().iter()}
11e80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
11e90 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 62 79 74  line].    fn byt
11ea0 65 73 28 26 73 65 6c 66 29 20 2d 3e 20 42 79 74  es(&self) -> Byt
11eb0 65 73 20 7b 0a 20 20 20 20 20 20 20 20 42 79 74  es {.        Byt
11ec0 65 73 28 73 65 6c 66 2e 61 73 5f 62 79 74 65 73  es(self.as_bytes
11ed0 28 29 2e 69 74 65 72 28 29 2e 63 6c 6f 6e 65 64  ().iter().cloned
11ee0 28 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ()).    }..    #
11ef0 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20  [inline].    fn 
11f00 63 68 61 72 5f 69 6e 64 69 63 65 73 28 26 73 65  char_indices(&se
11f10 6c 66 29 20 2d 3e 20 43 68 61 72 49 6e 64 69 63  lf) -> CharIndic
11f20 65 73 20 7b 0a 20 20 20 20 20 20 20 20 43 68 61  es {.        Cha
11f30 72 49 6e 64 69 63 65 73 20 7b 20 66 72 6f 6e 74  rIndices { front
11f40 5f 6f 66 66 73 65 74 3a 20 30 2c 20 69 74 65 72  _offset: 0, iter
11f50 3a 20 73 65 6c 66 2e 63 68 61 72 73 28 29 20 7d  : self.chars() }
11f60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
11f70 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 73 70 6c  line].    fn spl
11f80 69 74 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72  it<'a, P: Patter
11f90 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c  n<'a>>(&'a self,
11fa0 20 70 61 74 3a 20 50 29 20 2d 3e 20 53 70 6c 69   pat: P) -> Spli
11fb0 74 3c 27 61 2c 20 50 3e 20 7b 0a 20 20 20 20 20  t<'a, P> {.     
11fc0 20 20 20 53 70 6c 69 74 28 53 70 6c 69 74 49 6e     Split(SplitIn
11fd0 74 65 72 6e 61 6c 20 7b 0a 20 20 20 20 20 20 20  ternal {.       
11fe0 20 20 20 20 20 73 74 61 72 74 3a 20 30 2c 0a 20       start: 0,. 
11ff0 20 20 20 20 20 20 20 20 20 20 20 65 6e 64 3a 20             end: 
12000 73 65 6c 66 2e 6c 65 6e 28 29 2c 0a 20 20 20 20  self.len(),.    
12010 20 20 20 20 20 20 20 20 6d 61 74 63 68 65 72 3a          matcher:
12020 20 70 61 74 2e 69 6e 74 6f 5f 73 65 61 72 63 68   pat.into_search
12030 65 72 28 73 65 6c 66 29 2c 0a 20 20 20 20 20 20  er(self),.      
12040 20 20 20 20 20 20 61 6c 6c 6f 77 5f 74 72 61 69        allow_trai
12050 6c 69 6e 67 5f 65 6d 70 74 79 3a 20 74 72 75 65  ling_empty: true
12060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ,.            fi
12070 6e 69 73 68 65 64 3a 20 66 61 6c 73 65 2c 0a 20  nished: false,. 
12080 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 7d 0a         }).    }.
12090 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20  .    #[inline]. 
120a0 20 20 20 66 6e 20 72 73 70 6c 69 74 3c 27 61 2c     fn rsplit<'a,
120b0 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e   P: Pattern<'a>>
120c0 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20  (&'a self, pat: 
120d0 50 29 20 2d 3e 20 52 53 70 6c 69 74 3c 27 61 2c  P) -> RSplit<'a,
120e0 20 50 3e 0a 20 20 20 20 20 20 20 20 77 68 65 72   P>.        wher
120f0 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 52  e P::Searcher: R
12100 65 76 65 72 73 65 53 65 61 72 63 68 65 72 3c 27  everseSearcher<'
12110 61 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20  a>.    {.       
12120 20 52 53 70 6c 69 74 28 73 65 6c 66 2e 73 70 6c   RSplit(self.spl
12130 69 74 28 70 61 74 29 2e 30 29 0a 20 20 20 20 7d  it(pat).0).    }
12140 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
12150 20 20 20 20 66 6e 20 73 70 6c 69 74 6e 3c 27 61      fn splitn<'a
12160 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
12170 3e 28 26 27 61 20 73 65 6c 66 2c 20 63 6f 75 6e  >(&'a self, coun
12180 74 3a 20 75 73 69 7a 65 2c 20 70 61 74 3a 20 50  t: usize, pat: P
12190 29 20 2d 3e 20 53 70 6c 69 74 4e 3c 27 61 2c 20  ) -> SplitN<'a, 
121a0 50 3e 20 7b 0a 20 20 20 20 20 20 20 20 53 70 6c  P> {.        Spl
121b0 69 74 4e 28 53 70 6c 69 74 4e 49 6e 74 65 72 6e  itN(SplitNIntern
121c0 61 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  al {.           
121d0 20 69 74 65 72 3a 20 73 65 6c 66 2e 73 70 6c 69   iter: self.spli
121e0 74 28 70 61 74 29 2e 30 2c 0a 20 20 20 20 20 20  t(pat).0,.      
121f0 20 20 20 20 20 20 63 6f 75 6e 74 3a 20 63 6f 75        count: cou
12200 6e 74 2c 0a 20 20 20 20 20 20 20 20 7d 29 0a 20  nt,.        }). 
12210 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69     }..    #[inli
12220 6e 65 5d 0a 20 20 20 20 66 6e 20 72 73 70 6c 69  ne].    fn rspli
12230 74 6e 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72  tn<'a, P: Patter
12240 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c  n<'a>>(&'a self,
12250 20 63 6f 75 6e 74 3a 20 75 73 69 7a 65 2c 20 70   count: usize, p
12260 61 74 3a 20 50 29 20 2d 3e 20 52 53 70 6c 69 74  at: P) -> RSplit
12270 4e 3c 27 61 2c 20 50 3e 0a 20 20 20 20 20 20 20  N<'a, P>.       
12280 20 77 68 65 72 65 20 50 3a 3a 53 65 61 72 63 68   where P::Search
12290 65 72 3a 20 52 65 76 65 72 73 65 53 65 61 72 63  er: ReverseSearc
122a0 68 65 72 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20  her<'a>.    {.  
122b0 20 20 20 20 20 20 52 53 70 6c 69 74 4e 28 73 65        RSplitN(se
122c0 6c 66 2e 73 70 6c 69 74 6e 28 63 6f 75 6e 74 2c  lf.splitn(count,
122d0 20 70 61 74 29 2e 30 29 0a 20 20 20 20 7d 0a 0a   pat).0).    }..
122e0 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20      #[inline].  
122f0 20 20 66 6e 20 73 70 6c 69 74 5f 74 65 72 6d 69    fn split_termi
12300 6e 61 74 6f 72 3c 27 61 2c 20 50 3a 20 50 61 74  nator<'a, P: Pat
12310 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65  tern<'a>>(&'a se
12320 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 53  lf, pat: P) -> S
12330 70 6c 69 74 54 65 72 6d 69 6e 61 74 6f 72 3c 27  plitTerminator<'
12340 61 2c 20 50 3e 20 7b 0a 20 20 20 20 20 20 20 20  a, P> {.        
12350 53 70 6c 69 74 54 65 72 6d 69 6e 61 74 6f 72 28  SplitTerminator(
12360 53 70 6c 69 74 49 6e 74 65 72 6e 61 6c 20 7b 0a  SplitInternal {.
12370 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f              allo
12380 77 5f 74 72 61 69 6c 69 6e 67 5f 65 6d 70 74 79  w_trailing_empty
12390 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  : false,.       
123a0 20 20 20 20 20 2e 2e 73 65 6c 66 2e 73 70 6c 69       ..self.spli
123b0 74 28 70 61 74 29 2e 30 0a 20 20 20 20 20 20 20  t(pat).0.       
123c0 20 7d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23   }).    }..    #
123d0 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20  [inline].    fn 
123e0 72 73 70 6c 69 74 5f 74 65 72 6d 69 6e 61 74 6f  rsplit_terminato
123f0 72 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e  r<'a, P: Pattern
12400 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20  <'a>>(&'a self, 
12410 70 61 74 3a 20 50 29 20 2d 3e 20 52 53 70 6c 69  pat: P) -> RSpli
12420 74 54 65 72 6d 69 6e 61 74 6f 72 3c 27 61 2c 20  tTerminator<'a, 
12430 50 3e 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  P>.        where
12440 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20 52 65   P::Searcher: Re
12450 76 65 72 73 65 53 65 61 72 63 68 65 72 3c 27 61  verseSearcher<'a
12460 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20  >.    {.        
12470 52 53 70 6c 69 74 54 65 72 6d 69 6e 61 74 6f 72  RSplitTerminator
12480 28 73 65 6c 66 2e 73 70 6c 69 74 5f 74 65 72 6d  (self.split_term
12490 69 6e 61 74 6f 72 28 70 61 74 29 2e 30 29 0a 20  inator(pat).0). 
124a0 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69     }..    #[inli
124b0 6e 65 5d 0a 20 20 20 20 66 6e 20 6d 61 74 63 68  ne].    fn match
124c0 65 73 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72  es<'a, P: Patter
124d0 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c  n<'a>>(&'a self,
124e0 20 70 61 74 3a 20 50 29 20 2d 3e 20 4d 61 74 63   pat: P) -> Matc
124f0 68 65 73 3c 27 61 2c 20 50 3e 20 7b 0a 20 20 20  hes<'a, P> {.   
12500 20 20 20 20 20 4d 61 74 63 68 65 73 28 4d 61 74       Matches(Mat
12510 63 68 65 73 49 6e 74 65 72 6e 61 6c 28 70 61 74  chesInternal(pat
12520 2e 69 6e 74 6f 5f 73 65 61 72 63 68 65 72 28 73  .into_searcher(s
12530 65 6c 66 29 29 29 0a 20 20 20 20 7d 0a 0a 20 20  elf))).    }..  
12540 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20    #[inline].    
12550 66 6e 20 72 6d 61 74 63 68 65 73 3c 27 61 2c 20  fn rmatches<'a, 
12560 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28  P: Pattern<'a>>(
12570 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50  &'a self, pat: P
12580 29 20 2d 3e 20 52 4d 61 74 63 68 65 73 3c 27 61  ) -> RMatches<'a
12590 2c 20 50 3e 0a 20 20 20 20 20 20 20 20 77 68 65  , P>.        whe
125a0 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a 20  re P::Searcher: 
125b0 52 65 76 65 72 73 65 53 65 61 72 63 68 65 72 3c  ReverseSearcher<
125c0 27 61 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  'a>.    {.      
125d0 20 20 52 4d 61 74 63 68 65 73 28 73 65 6c 66 2e    RMatches(self.
125e0 6d 61 74 63 68 65 73 28 70 61 74 29 2e 30 29 0a  matches(pat).0).
125f0 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c      }..    #[inl
12600 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6d 61 74 63  ine].    fn matc
12610 68 5f 69 6e 64 69 63 65 73 3c 27 61 2c 20 50 3a  h_indices<'a, P:
12620 20 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27   Pattern<'a>>(&'
12630 61 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20  a self, pat: P) 
12640 2d 3e 20 4d 61 74 63 68 49 6e 64 69 63 65 73 3c  -> MatchIndices<
12650 27 61 2c 20 50 3e 20 7b 0a 20 20 20 20 20 20 20  'a, P> {.       
12660 20 4d 61 74 63 68 49 6e 64 69 63 65 73 28 4d 61   MatchIndices(Ma
12670 74 63 68 49 6e 64 69 63 65 73 49 6e 74 65 72 6e  tchIndicesIntern
12680 61 6c 28 70 61 74 2e 69 6e 74 6f 5f 73 65 61 72  al(pat.into_sear
12690 63 68 65 72 28 73 65 6c 66 29 29 29 0a 20 20 20  cher(self))).   
126a0 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65   }..    #[inline
126b0 5d 0a 20 20 20 20 66 6e 20 72 6d 61 74 63 68 5f  ].    fn rmatch_
126c0 69 6e 64 69 63 65 73 3c 27 61 2c 20 50 3a 20 50  indices<'a, P: P
126d0 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61 20  attern<'a>>(&'a 
126e0 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d 3e  self, pat: P) ->
126f0 20 52 4d 61 74 63 68 49 6e 64 69 63 65 73 3c 27   RMatchIndices<'
12700 61 2c 20 50 3e 0a 20 20 20 20 20 20 20 20 77 68  a, P>.        wh
12710 65 72 65 20 50 3a 3a 53 65 61 72 63 68 65 72 3a  ere P::Searcher:
12720 20 52 65 76 65 72 73 65 53 65 61 72 63 68 65 72   ReverseSearcher
12730 3c 27 61 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20  <'a>.    {.     
12740 20 20 20 52 4d 61 74 63 68 49 6e 64 69 63 65 73     RMatchIndices
12750 28 73 65 6c 66 2e 6d 61 74 63 68 5f 69 6e 64 69  (self.match_indi
12760 63 65 73 28 70 61 74 29 2e 30 29 0a 20 20 20 20  ces(pat).0).    
12770 7d 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  }.    #[inline].
12780 20 20 20 20 66 6e 20 6c 69 6e 65 73 28 26 73 65      fn lines(&se
12790 6c 66 29 20 2d 3e 20 4c 69 6e 65 73 20 7b 0a 20  lf) -> Lines {. 
127a0 20 20 20 20 20 20 20 4c 69 6e 65 73 28 73 65 6c         Lines(sel
127b0 66 2e 73 70 6c 69 74 5f 74 65 72 6d 69 6e 61 74  f.split_terminat
127c0 6f 72 28 27 5c 6e 27 29 2e 6d 61 70 28 4c 69 6e  or('\n').map(Lin
127d0 65 73 41 6e 79 4d 61 70 29 29 0a 20 20 20 20 7d  esAnyMap)).    }
127e0 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
127f0 20 20 20 20 23 5b 61 6c 6c 6f 77 28 64 65 70 72      #[allow(depr
12800 65 63 61 74 65 64 29 5d 0a 20 20 20 20 66 6e 20  ecated)].    fn 
12810 6c 69 6e 65 73 5f 61 6e 79 28 26 73 65 6c 66 29  lines_any(&self)
12820 20 2d 3e 20 4c 69 6e 65 73 41 6e 79 20 7b 0a 20   -> LinesAny {. 
12830 20 20 20 20 20 20 20 4c 69 6e 65 73 41 6e 79 28         LinesAny(
12840 73 65 6c 66 2e 6c 69 6e 65 73 28 29 29 0a 20 20  self.lines()).  
12850 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e    }..    #[inlin
12860 65 5d 0a 20 20 20 20 66 6e 20 67 65 74 3c 49 3a  e].    fn get<I:
12870 20 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72 3e   SliceIndex<str>
12880 3e 28 26 73 65 6c 66 2c 20 69 3a 20 49 29 20 2d  >(&self, i: I) -
12890 3e 20 4f 70 74 69 6f 6e 3c 26 49 3a 3a 4f 75 74  > Option<&I::Out
128a0 70 75 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 69  put> {.        i
128b0 2e 67 65 74 28 73 65 6c 66 29 0a 20 20 20 20 7d  .get(self).    }
128c0 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a  ..    #[inline].
128d0 20 20 20 20 66 6e 20 67 65 74 5f 6d 75 74 3c 49      fn get_mut<I
128e0 3a 20 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72  : SliceIndex<str
128f0 3e 3e 28 26 6d 75 74 20 73 65 6c 66 2c 20 69 3a  >>(&mut self, i:
12900 20 49 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 26 6d   I) -> Option<&m
12910 75 74 20 49 3a 3a 4f 75 74 70 75 74 3e 20 7b 0a  ut I::Output> {.
12920 20 20 20 20 20 20 20 20 69 2e 67 65 74 5f 6d 75          i.get_mu
12930 74 28 73 65 6c 66 29 0a 20 20 20 20 7d 0a 0a 20  t(self).    }.. 
12940 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
12950 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74 5f 75   unsafe fn get_u
12960 6e 63 68 65 63 6b 65 64 3c 49 3a 20 53 6c 69 63  nchecked<I: Slic
12970 65 49 6e 64 65 78 3c 73 74 72 3e 3e 28 26 73 65  eIndex<str>>(&se
12980 6c 66 2c 20 69 3a 20 49 29 20 2d 3e 20 26 49 3a  lf, i: I) -> &I:
12990 3a 4f 75 74 70 75 74 20 7b 0a 20 20 20 20 20 20  :Output {.      
129a0 20 20 69 2e 67 65 74 5f 75 6e 63 68 65 63 6b 65    i.get_unchecke
129b0 64 28 73 65 6c 66 29 0a 20 20 20 20 7d 0a 0a 20  d(self).    }.. 
129c0 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
129d0 20 75 6e 73 61 66 65 20 66 6e 20 67 65 74 5f 75   unsafe fn get_u
129e0 6e 63 68 65 63 6b 65 64 5f 6d 75 74 3c 49 3a 20  nchecked_mut<I: 
129f0 53 6c 69 63 65 49 6e 64 65 78 3c 73 74 72 3e 3e  SliceIndex<str>>
12a00 28 26 6d 75 74 20 73 65 6c 66 2c 20 69 3a 20 49  (&mut self, i: I
12a10 29 20 2d 3e 20 26 6d 75 74 20 49 3a 3a 4f 75 74  ) -> &mut I::Out
12a20 70 75 74 20 7b 0a 20 20 20 20 20 20 20 20 69 2e  put {.        i.
12a30 67 65 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75  get_unchecked_mu
12a40 74 28 73 65 6c 66 29 0a 20 20 20 20 7d 0a 0a 20  t(self).    }.. 
12a50 20 20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20     #[inline].   
12a60 20 75 6e 73 61 66 65 20 66 6e 20 73 6c 69 63 65   unsafe fn slice
12a70 5f 75 6e 63 68 65 63 6b 65 64 28 26 73 65 6c 66  _unchecked(&self
12a80 2c 20 62 65 67 69 6e 3a 20 75 73 69 7a 65 2c 20  , begin: usize, 
12a90 65 6e 64 3a 20 75 73 69 7a 65 29 20 2d 3e 20 26  end: usize) -> &
12aa0 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 28 62  str {.        (b
12ab0 65 67 69 6e 2e 2e 65 6e 64 29 2e 67 65 74 5f 75  egin..end).get_u
12ac0 6e 63 68 65 63 6b 65 64 28 73 65 6c 66 29 0a 20  nchecked(self). 
12ad0 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69     }..    #[inli
12ae0 6e 65 5d 0a 20 20 20 20 75 6e 73 61 66 65 20 66  ne].    unsafe f
12af0 6e 20 73 6c 69 63 65 5f 6d 75 74 5f 75 6e 63 68  n slice_mut_unch
12b00 65 63 6b 65 64 28 26 6d 75 74 20 73 65 6c 66 2c  ecked(&mut self,
12b10 20 62 65 67 69 6e 3a 20 75 73 69 7a 65 2c 20 65   begin: usize, e
12b20 6e 64 3a 20 75 73 69 7a 65 29 20 2d 3e 20 26 6d  nd: usize) -> &m
12b30 75 74 20 73 74 72 20 7b 0a 20 20 20 20 20 20 20  ut str {.       
12b40 20 28 62 65 67 69 6e 2e 2e 65 6e 64 29 2e 67 65   (begin..end).ge
12b50 74 5f 75 6e 63 68 65 63 6b 65 64 5f 6d 75 74 28  t_unchecked_mut(
12b60 73 65 6c 66 29 0a 20 20 20 20 7d 0a 0a 20 20 20  self).    }..   
12b70 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66   #[inline].    f
12b80 6e 20 73 74 61 72 74 73 5f 77 69 74 68 3c 27 61  n starts_with<'a
12b90 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
12ba0 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a  >(&'a self, pat:
12bb0 20 50 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20   P) -> bool {.  
12bc0 20 20 20 20 20 20 70 61 74 2e 69 73 5f 70 72 65        pat.is_pre
12bd0 66 69 78 5f 6f 66 28 73 65 6c 66 29 0a 20 20 20  fix_of(self).   
12be0 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e 65   }..    #[inline
12bf0 5d 0a 20 20 20 20 66 6e 20 65 6e 64 73 5f 77 69  ].    fn ends_wi
12c00 74 68 3c 27 61 2c 20 50 3a 20 50 61 74 74 65 72  th<'a, P: Patter
12c10 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c  n<'a>>(&'a self,
12c20 20 70 61 74 3a 20 50 29 20 2d 3e 20 62 6f 6f 6c   pat: P) -> bool
12c30 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50  .        where P
12c40 3a 3a 53 65 61 72 63 68 65 72 3a 20 52 65 76 65  ::Searcher: Reve
12c50 72 73 65 53 65 61 72 63 68 65 72 3c 27 61 3e 0a  rseSearcher<'a>.
12c60 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 61      {.        pa
12c70 74 2e 69 73 5f 73 75 66 66 69 78 5f 6f 66 28 73  t.is_suffix_of(s
12c80 65 6c 66 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  elf).    }..    
12c90 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e  #[inline].    fn
12ca0 20 74 72 69 6d 5f 6d 61 74 63 68 65 73 3c 27 61   trim_matches<'a
12cb0 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
12cc0 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a  >(&'a self, pat:
12cd0 20 50 29 20 2d 3e 20 26 27 61 20 73 74 72 0a 20   P) -> &'a str. 
12ce0 20 20 20 20 20 20 20 77 68 65 72 65 20 50 3a 3a         where P::
12cf0 53 65 61 72 63 68 65 72 3a 20 44 6f 75 62 6c 65  Searcher: Double
12d00 45 6e 64 65 64 53 65 61 72 63 68 65 72 3c 27 61  EndedSearcher<'a
12d10 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20  >.    {.        
12d20 6c 65 74 20 6d 75 74 20 69 20 3d 20 30 3b 0a 20  let mut i = 0;. 
12d30 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6a         let mut j
12d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6c 65   = 0;.        le
12d50 74 20 6d 75 74 20 6d 61 74 63 68 65 72 20 3d 20  t mut matcher = 
12d60 70 61 74 2e 69 6e 74 6f 5f 73 65 61 72 63 68 65  pat.into_searche
12d70 72 28 73 65 6c 66 29 3b 0a 20 20 20 20 20 20 20  r(self);.       
12d80 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 28 61 2c   if let Some((a,
12d90 20 62 29 29 20 3d 20 6d 61 74 63 68 65 72 2e 6e   b)) = matcher.n
12da0 65 78 74 5f 72 65 6a 65 63 74 28 29 20 7b 0a 20  ext_reject() {. 
12db0 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61             i = a
12dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20  ;.            j 
12dd0 3d 20 62 3b 20 2f 2f 20 52 65 6d 65 6d 62 65 72  = b; // Remember
12de0 20 65 61 72 6c 69 65 73 74 20 6b 6e 6f 77 6e 20   earliest known 
12df0 6d 61 74 63 68 2c 20 63 6f 72 72 65 63 74 20 69  match, correct i
12e00 74 20 62 65 6c 6f 77 20 69 66 0a 20 20 20 20 20  t below if.     
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
12e20 20 6c 61 73 74 20 6d 61 74 63 68 20 69 73 20 64   last match is d
12e30 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 20  ifferent.       
12e40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 6c 65   }.        if le
12e50 74 20 53 6f 6d 65 28 28 5f 2c 20 62 29 29 20 3d  t Some((_, b)) =
12e60 20 6d 61 74 63 68 65 72 2e 6e 65 78 74 5f 72 65   matcher.next_re
12e70 6a 65 63 74 5f 62 61 63 6b 28 29 20 7b 0a 20 20  ject_back() {.  
12e80 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 62 3b            j = b;
12e90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ea0 20 20 20 75 6e 73 61 66 65 20 7b 0a 20 20 20 20     unsafe {.    
12eb0 20 20 20 20 20 20 20 20 2f 2f 20 53 65 61 72 63          // Searc
12ec0 68 65 72 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  her is known to 
12ed0 72 65 74 75 72 6e 20 76 61 6c 69 64 20 69 6e 64  return valid ind
12ee0 69 63 65 73 0a 20 20 20 20 20 20 20 20 20 20 20  ices.           
12ef0 20 73 65 6c 66 2e 73 6c 69 63 65 5f 75 6e 63 68   self.slice_unch
12f00 65 63 6b 65 64 28 69 2c 20 6a 29 0a 20 20 20 20  ecked(i, j).    
12f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12f20 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66   #[inline].    f
12f30 6e 20 74 72 69 6d 5f 6c 65 66 74 5f 6d 61 74 63  n trim_left_matc
12f40 68 65 73 3c 27 61 2c 20 50 3a 20 50 61 74 74 65  hes<'a, P: Patte
12f50 72 6e 3c 27 61 3e 3e 28 26 27 61 20 73 65 6c 66  rn<'a>>(&'a self
12f60 2c 20 70 61 74 3a 20 50 29 20 2d 3e 20 26 27 61  , pat: P) -> &'a
12f70 20 73 74 72 20 7b 0a 20 20 20 20 20 20 20 20 6c   str {.        l
12f80 65 74 20 6d 75 74 20 69 20 3d 20 73 65 6c 66 2e  et mut i = self.
12f90 6c 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  len();.        l
12fa0 65 74 20 6d 75 74 20 6d 61 74 63 68 65 72 20 3d  et mut matcher =
12fb0 20 70 61 74 2e 69 6e 74 6f 5f 73 65 61 72 63 68   pat.into_search
12fc0 65 72 28 73 65 6c 66 29 3b 0a 20 20 20 20 20 20  er(self);.      
12fd0 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 28 61    if let Some((a
12fe0 2c 20 5f 29 29 20 3d 20 6d 61 74 63 68 65 72 2e  , _)) = matcher.
12ff0 6e 65 78 74 5f 72 65 6a 65 63 74 28 29 20 7b 0a  next_reject() {.
13000 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
13010 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
13020 20 20 20 20 20 75 6e 73 61 66 65 20 7b 0a 20 20       unsafe {.  
13030 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53 65 61            // Sea
13040 72 63 68 65 72 20 69 73 20 6b 6e 6f 77 6e 20 74  rcher is known t
13050 6f 20 72 65 74 75 72 6e 20 76 61 6c 69 64 20 69  o return valid i
13060 6e 64 69 63 65 73 0a 20 20 20 20 20 20 20 20 20  ndices.         
13070 20 20 20 73 65 6c 66 2e 73 6c 69 63 65 5f 75 6e     self.slice_un
13080 63 68 65 63 6b 65 64 28 69 2c 20 73 65 6c 66 2e  checked(i, self.
13090 6c 65 6e 28 29 29 0a 20 20 20 20 20 20 20 20 7d  len()).        }
130a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
130b0 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 74 72 69  line].    fn tri
130c0 6d 5f 72 69 67 68 74 5f 6d 61 74 63 68 65 73 3c  m_right_matches<
130d0 27 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27  'a, P: Pattern<'
130e0 61 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61  a>>(&'a self, pa
130f0 74 3a 20 50 29 20 2d 3e 20 26 27 61 20 73 74 72  t: P) -> &'a str
13100 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50  .        where P
13110 3a 3a 53 65 61 72 63 68 65 72 3a 20 52 65 76 65  ::Searcher: Reve
13120 72 73 65 53 65 61 72 63 68 65 72 3c 27 61 3e 0a  rseSearcher<'a>.
13130 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 65      {.        le
13140 74 20 6d 75 74 20 6a 20 3d 20 30 3b 0a 20 20 20  t mut j = 0;.   
13150 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6d 61 74       let mut mat
13160 63 68 65 72 20 3d 20 70 61 74 2e 69 6e 74 6f 5f  cher = pat.into_
13170 73 65 61 72 63 68 65 72 28 73 65 6c 66 29 3b 0a  searcher(self);.
13180 20 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 53          if let S
13190 6f 6d 65 28 28 5f 2c 20 62 29 29 20 3d 20 6d 61  ome((_, b)) = ma
131a0 74 63 68 65 72 2e 6e 65 78 74 5f 72 65 6a 65 63  tcher.next_rejec
131b0 74 5f 62 61 63 6b 28 29 20 7b 0a 20 20 20 20 20  t_back() {.     
131c0 20 20 20 20 20 20 20 6a 20 3d 20 62 3b 0a 20 20         j = b;.  
131d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
131e0 75 6e 73 61 66 65 20 7b 0a 20 20 20 20 20 20 20  unsafe {.       
131f0 20 20 20 20 20 2f 2f 20 53 65 61 72 63 68 65 72       // Searcher
13200 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 72 65 74   is known to ret
13210 75 72 6e 20 76 61 6c 69 64 20 69 6e 64 69 63 65  urn valid indice
13220 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  s.            se
13230 6c 66 2e 73 6c 69 63 65 5f 75 6e 63 68 65 63 6b  lf.slice_uncheck
13240 65 64 28 30 2c 20 6a 29 0a 20 20 20 20 20 20 20  ed(0, j).       
13250 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b   }.    }..    #[
13260 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 69  inline].    fn i
13270 73 5f 63 68 61 72 5f 62 6f 75 6e 64 61 72 79 28  s_char_boundary(
13280 26 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20 75 73  &self, index: us
13290 69 7a 65 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20  ize) -> bool {. 
132a0 20 20 20 20 20 20 20 2f 2f 20 30 20 61 6e 64 20         // 0 and 
132b0 6c 65 6e 20 61 72 65 20 61 6c 77 61 79 73 20 6f  len are always o
132c0 6b 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 65  k..        // Te
132d0 73 74 20 66 6f 72 20 30 20 65 78 70 6c 69 63 69  st for 0 explici
132e0 74 6c 79 20 73 6f 20 74 68 61 74 20 69 74 20 63  tly so that it c
132f0 61 6e 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  an optimize out 
13300 74 68 65 20 63 68 65 63 6b 0a 20 20 20 20 20 20  the check.      
13310 20 20 2f 2f 20 65 61 73 69 6c 79 20 61 6e 64 20    // easily and 
13320 73 6b 69 70 20 72 65 61 64 69 6e 67 20 73 74 72  skip reading str
13330 69 6e 67 20 64 61 74 61 20 66 6f 72 20 74 68 61  ing data for tha
13340 74 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  t case..        
13350 69 66 20 69 6e 64 65 78 20 3d 3d 20 30 20 7c 7c  if index == 0 ||
13360 20 69 6e 64 65 78 20 3d 3d 20 73 65 6c 66 2e 6c   index == self.l
13370 65 6e 28 29 20 7b 20 72 65 74 75 72 6e 20 74 72  en() { return tr
13380 75 65 3b 20 7d 0a 20 20 20 20 20 20 20 20 6d 61  ue; }.        ma
13390 74 63 68 20 73 65 6c 66 2e 61 73 5f 62 79 74 65  tch self.as_byte
133a0 73 28 29 2e 67 65 74 28 69 6e 64 65 78 29 20 7b  s().get(index) {
133b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 6e  .            Non
133c0 65 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20  e => false,.    
133d0 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20          // This 
133e0 69 73 20 62 69 74 20 6d 61 67 69 63 20 65 71 75  is bit magic equ
133f0 69 76 61 6c 65 6e 74 20 74 6f 3a 20 62 20 3c 20  ivalent to: b < 
13400 31 32 38 20 7c 7c 20 62 20 3e 3d 20 31 39 32 0a  128 || b >= 192.
13410 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65              Some
13420 28 26 62 29 20 3d 3e 20 28 62 20 61 73 20 69 38  (&b) => (b as i8
13430 29 20 3e 3d 20 2d 30 78 34 30 2c 0a 20 20 20 20  ) >= -0x40,.    
13440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13450 20 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66   #[inline].    f
13460 6e 20 61 73 5f 62 79 74 65 73 28 26 73 65 6c 66  n as_bytes(&self
13470 29 20 2d 3e 20 26 5b 75 38 5d 20 7b 0a 20 20 20  ) -> &[u8] {.   
13480 20 20 20 20 20 75 6e 73 61 66 65 20 7b 20 6d 65       unsafe { me
13490 6d 3a 3a 74 72 61 6e 73 6d 75 74 65 28 73 65 6c  m::transmute(sel
134a0 66 29 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  f) }.    }..    
134b0 23 5b 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 75 6e  #[inline].    un
134c0 73 61 66 65 20 66 6e 20 61 73 5f 62 79 74 65 73  safe fn as_bytes
134d0 5f 6d 75 74 28 26 6d 75 74 20 73 65 6c 66 29 20  _mut(&mut self) 
134e0 2d 3e 20 26 6d 75 74 20 5b 75 38 5d 20 7b 0a 20  -> &mut [u8] {. 
134f0 20 20 20 20 20 20 20 6d 65 6d 3a 3a 74 72 61 6e         mem::tran
13500 73 6d 75 74 65 28 73 65 6c 66 29 0a 20 20 20 20  smute(self).    
13510 7d 0a 0a 20 20 20 20 66 6e 20 66 69 6e 64 3c 27  }..    fn find<'
13520 61 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61  a, P: Pattern<'a
13530 3e 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74  >>(&'a self, pat
13540 3a 20 50 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 75  : P) -> Option<u
13550 73 69 7a 65 3e 20 7b 0a 20 20 20 20 20 20 20 20  size> {.        
13560 70 61 74 2e 69 6e 74 6f 5f 73 65 61 72 63 68 65  pat.into_searche
13570 72 28 73 65 6c 66 29 2e 6e 65 78 74 5f 6d 61 74  r(self).next_mat
13580 63 68 28 29 2e 6d 61 70 28 7c 28 69 2c 20 5f 29  ch().map(|(i, _)
13590 7c 20 69 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  | i).    }..    
135a0 66 6e 20 72 66 69 6e 64 3c 27 61 2c 20 50 3a 20  fn rfind<'a, P: 
135b0 50 61 74 74 65 72 6e 3c 27 61 3e 3e 28 26 27 61  Pattern<'a>>(&'a
135c0 20 73 65 6c 66 2c 20 70 61 74 3a 20 50 29 20 2d   self, pat: P) -
135d0 3e 20 4f 70 74 69 6f 6e 3c 75 73 69 7a 65 3e 0a  > Option<usize>.
135e0 20 20 20 20 20 20 20 20 77 68 65 72 65 20 50 3a          where P:
135f0 3a 53 65 61 72 63 68 65 72 3a 20 52 65 76 65 72  :Searcher: Rever
13600 73 65 53 65 61 72 63 68 65 72 3c 27 61 3e 0a 20  seSearcher<'a>. 
13610 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 61 74     {.        pat
13620 2e 69 6e 74 6f 5f 73 65 61 72 63 68 65 72 28 73  .into_searcher(s
13630 65 6c 66 29 2e 6e 65 78 74 5f 6d 61 74 63 68 5f  elf).next_match_
13640 62 61 63 6b 28 29 2e 6d 61 70 28 7c 28 69 2c 20  back().map(|(i, 
13650 5f 29 7c 20 69 29 0a 20 20 20 20 7d 0a 0a 20 20  _)| i).    }..  
13660 20 20 66 6e 20 66 69 6e 64 5f 73 74 72 3c 27 61    fn find_str<'a
13670 2c 20 50 3a 20 50 61 74 74 65 72 6e 3c 27 61 3e  , P: Pattern<'a>
13680 3e 28 26 27 61 20 73 65 6c 66 2c 20 70 61 74 3a  >(&'a self, pat:
13690 20 50 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 75 73   P) -> Option<us
136a0 69 7a 65 3e 20 7b 0a 20 20 20 20 20 20 20 20 73  ize> {.        s
136b0 65 6c 66 2e 66 69 6e 64 28 70 61 74 29 0a 20 20  elf.find(pat).  
136c0 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c 69 6e    }..    #[inlin
136d0 65 5d 0a 20 20 20 20 66 6e 20 73 70 6c 69 74 5f  e].    fn split_
136e0 61 74 28 26 73 65 6c 66 2c 20 6d 69 64 3a 20 75  at(&self, mid: u
136f0 73 69 7a 65 29 20 2d 3e 20 28 26 73 74 72 2c 20  size) -> (&str, 
13700 26 73 74 72 29 20 7b 0a 20 20 20 20 20 20 20 20  &str) {.        
13710 2f 2f 20 69 73 5f 63 68 61 72 5f 62 6f 75 6e 64  // is_char_bound
13720 61 72 79 20 63 68 65 63 6b 73 20 74 68 61 74 20  ary checks that 
13730 74 68 65 20 69 6e 64 65 78 20 69 73 20 69 6e 20  the index is in 
13740 5b 30 2c 20 2e 6c 65 6e 28 29 5d 0a 20 20 20 20  [0, .len()].    
13750 20 20 20 20 69 66 20 73 65 6c 66 2e 69 73 5f 63      if self.is_c
13760 68 61 72 5f 62 6f 75 6e 64 61 72 79 28 6d 69 64  har_boundary(mid
13770 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
13780 75 6e 73 61 66 65 20 7b 0a 20 20 20 20 20 20 20  unsafe {.       
13790 20 20 20 20 20 20 20 20 20 28 73 65 6c 66 2e 73           (self.s
137a0 6c 69 63 65 5f 75 6e 63 68 65 63 6b 65 64 28 30  lice_unchecked(0
137b0 2c 20 6d 69 64 29 2c 0a 20 20 20 20 20 20 20 20  , mid),.        
137c0 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 73 6c           self.sl
137d0 69 63 65 5f 75 6e 63 68 65 63 6b 65 64 28 6d 69  ice_unchecked(mi
137e0 64 2c 20 73 65 6c 66 2e 6c 65 6e 28 29 29 29 0a  d, self.len())).
137f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
13800 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
13810 20 20 20 20 20 20 20 20 20 20 20 73 6c 69 63 65             slice
13820 5f 65 72 72 6f 72 5f 66 61 69 6c 28 73 65 6c 66  _error_fail(self
13830 2c 20 30 2c 20 6d 69 64 29 0a 20 20 20 20 20 20  , 0, mid).      
13840 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
13850 6e 20 73 70 6c 69 74 5f 61 74 5f 6d 75 74 28 26  n split_at_mut(&
13860 6d 75 74 20 73 65 6c 66 2c 20 6d 69 64 3a 20 75  mut self, mid: u
13870 73 69 7a 65 29 20 2d 3e 20 28 26 6d 75 74 20 73  size) -> (&mut s
13880 74 72 2c 20 26 6d 75 74 20 73 74 72 29 20 7b 0a  tr, &mut str) {.
13890 20 20 20 20 20 20 20 20 2f 2f 20 69 73 5f 63 68          // is_ch
138a0 61 72 5f 62 6f 75 6e 64 61 72 79 20 63 68 65 63  ar_boundary chec
138b0 6b 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ks that the inde
138c0 78 20 69 73 20 69 6e 20 5b 30 2c 20 2e 6c 65 6e  x is in [0, .len
138d0 28 29 5d 0a 20 20 20 20 20 20 20 20 69 66 20 73  ()].        if s
138e0 65 6c 66 2e 69 73 5f 63 68 61 72 5f 62 6f 75 6e  elf.is_char_boun
138f0 64 61 72 79 28 6d 69 64 29 20 7b 0a 20 20 20 20  dary(mid) {.    
13900 20 20 20 20 20 20 20 20 6c 65 74 20 6c 65 6e 20          let len 
13910 3d 20 73 65 6c 66 2e 6c 65 6e 28 29 3b 0a 20 20  = self.len();.  
13920 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 74            let pt
13930 72 20 3d 20 73 65 6c 66 2e 61 73 5f 70 74 72 28  r = self.as_ptr(
13940 29 20 61 73 20 2a 6d 75 74 20 75 38 3b 0a 20 20  ) as *mut u8;.  
13950 20 20 20 20 20 20 20 20 20 20 75 6e 73 61 66 65            unsafe
13960 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
13970 20 20 20 28 66 72 6f 6d 5f 72 61 77 5f 70 61 72     (from_raw_par
13980 74 73 5f 6d 75 74 28 70 74 72 2c 20 6d 69 64 29  ts_mut(ptr, mid)
13990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
139a0 20 20 20 66 72 6f 6d 5f 72 61 77 5f 70 61 72 74     from_raw_part
139b0 73 5f 6d 75 74 28 70 74 72 2e 6f 66 66 73 65 74  s_mut(ptr.offset
139c0 28 6d 69 64 20 61 73 20 69 73 69 7a 65 29 2c 20  (mid as isize), 
139d0 6c 65 6e 20 2d 20 6d 69 64 29 29 0a 20 20 20 20  len - mid)).    
139e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
139f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
13a00 20 20 20 20 20 20 20 73 6c 69 63 65 5f 65 72 72         slice_err
13a10 6f 72 5f 66 61 69 6c 28 73 65 6c 66 2c 20 30 2c  or_fail(self, 0,
13a20 20 6d 69 64 29 0a 20 20 20 20 20 20 20 20 7d 0a   mid).        }.
13a30 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e 6c      }..    #[inl
13a40 69 6e 65 5d 0a 20 20 20 20 66 6e 20 61 73 5f 70  ine].    fn as_p
13a50 74 72 28 26 73 65 6c 66 29 20 2d 3e 20 2a 63 6f  tr(&self) -> *co
13a60 6e 73 74 20 75 38 20 7b 0a 20 20 20 20 20 20 20  nst u8 {.       
13a70 20 73 65 6c 66 20 61 73 20 2a 63 6f 6e 73 74 20   self as *const 
13a80 73 74 72 20 61 73 20 2a 63 6f 6e 73 74 20 75 38  str as *const u8
13a90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
13aa0 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 6c 65 6e  line].    fn len
13ab0 28 26 73 65 6c 66 29 20 2d 3e 20 75 73 69 7a 65  (&self) -> usize
13ac0 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
13ad0 61 73 5f 62 79 74 65 73 28 29 2e 6c 65 6e 28 29  as_bytes().len()
13ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 5b 69 6e  .    }..    #[in
13af0 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 69 73 5f  line].    fn is_
13b00 65 6d 70 74 79 28 26 73 65 6c 66 29 20 2d 3e 20  empty(&self) -> 
13b10 62 6f 6f 6c 20 7b 20 73 65 6c 66 2e 6c 65 6e 28  bool { self.len(
13b20 29 20 3d 3d 20 30 20 7d 0a 0a 20 20 20 20 23 5b  ) == 0 }..    #[
13b30 69 6e 6c 69 6e 65 5d 0a 20 20 20 20 66 6e 20 70  inline].    fn p
13b40 61 72 73 65 3c 27 61 2c 20 54 3e 28 26 27 61 20  arse<'a, T>(&'a 
13b50 73 65 6c 66 29 20 2d 3e 20 52 65 73 75 6c 74 3c  self) -> Result<
13b60 54 2c 20 54 3a 3a 45 72 72 6f 72 3e 20 77 68 65  T, T::Error> whe
13b70 72 65 20 54 3a 20 54 72 79 46 72 6f 6d 3c 26 27  re T: TryFrom<&'
13b80 61 20 73 74 72 3e 20 7b 0a 20 20 20 20 20 20 20  a str> {.       
13b90 20 54 3a 3a 74 72 79 5f 66 72 6f 6d 28 73 65 6c   T::try_from(sel
13ba0 66 29 0a 20 20 20 20 7d 0a 7d 0a 0a 23 5b 73 74  f).    }.}..#[st
13bb0 61 62 6c 65 28 66 65 61 74 75 72 65 20 3d 20 22  able(feature = "
13bc0 72 75 73 74 31 22 2c 20 73 69 6e 63 65 20 3d 20  rust1", since = 
13bd0 22 31 2e 30 2e 30 22 29 5d 0a 69 6d 70 6c 20 41  "1.0.0")].impl A
13be0 73 52 65 66 3c 5b 75 38 5d 3e 20 66 6f 72 20 73  sRef<[u8]> for s
13bf0 74 72 20 7b 0a 20 20 20 20 23 5b 69 6e 6c 69 6e  tr {.    #[inlin
13c00 65 5d 0a 20 20 20 20 66 6e 20 61 73 5f 72 65 66  e].    fn as_ref
13c10 28 26 73 65 6c 66 29 20 2d 3e 20 26 5b 75 38 5d  (&self) -> &[u8]
13c20 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
13c30 61 73 5f 62 79 74 65 73 28 29 0a 20 20 20 20 7d  as_bytes().    }
13c40 0a 7d 0a 0a 23 5b 73 74 61 62 6c 65 28 66 65 61  .}..#[stable(fea
13c50 74 75 72 65 20 3d 20 22 72 75 73 74 31 22 2c 20  ture = "rust1", 
13c60 73 69 6e 63 65 20 3d 20 22 31 2e 30 2e 30 22 29  since = "1.0.0")
13c70 5d 0a 69 6d 70 6c 3c 27 61 3e 20 44 65 66 61 75  ].impl<'a> Defau
13c80 6c 74 20 66 6f 72 20 26 27 61 20 73 74 72 20 7b  lt for &'a str {
13c90 0a 20 20 20 20 2f 2f 2f 20 43 72 65 61 74 65 73  .    /// Creates
13ca0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 0a 20 20   an empty str.  
13cb0 20 20 66 6e 20 64 65 66 61 75 6c 74 28 29 20 2d    fn default() -
13cc0 3e 20 26 27 61 20 73 74 72 20 7b 20 22 22 20 7d  > &'a str { "" }
13cd0 0a 7d 0a                                         .}.