Rollup merge of #127748 - scottmcm:option_len, r=joboet · patricklam/verify-rust-std@d1d9893 (original) (raw)

`@@ -770,6 +770,13 @@ impl Option {

`

770

770

`}

`

771

771

`}

`

772

772

``

``

773

`+

#[inline]

`

``

774

`+

const fn len(&self) -> usize {

`

``

775

`+

// Using the intrinsic avoids emitting a branch to get the 0 or 1.

`

``

776

`+

let discriminant: isize = crate::intrinsics::discriminant_value(self);

`

``

777

`+

discriminant as usize

`

``

778

`+

}

`

``

779

+

773

780

`` /// Returns a slice of the contained value, if any. If this is None, an

``

774

781

`/// empty slice is returned. This can be useful to have a single type of

`

775

782

`` /// iterator over an Option or slice.

``

`@@ -812,7 +819,7 @@ impl Option {

`

812

819

`unsafe {

`

813

820

` slice::from_raw_parts(

`

814

821

`(self as *const Self).byte_add(core::mem::offset_of!(Self, Some.0)).cast(),

`

815

``

`-

self.is_some() as usize,

`

``

822

`+

self.len(),

`

816

823

`)

`

817

824

`}

`

818

825

`}

`

`@@ -869,7 +876,7 @@ impl Option {

`

869

876

`unsafe {

`

870

877

` slice::from_raw_parts_mut(

`

871

878

`(self as *mut Self).byte_add(core::mem::offset_of!(Self, Some.0)).cast(),

`

872

``

`-

self.is_some() as usize,

`

``

879

`+

self.len(),

`

873

880

`)

`

874

881

`}

`

875

882

`}

`

`@@ -2242,10 +2249,8 @@ impl Iterator for Item {

`

2242

2249

``

2243

2250

`#[inline]

`

2244

2251

`fn size_hint(&self) -> (usize, Option) {

`

2245

``

`-

match self.opt {

`

2246

``

`-

Some(_) => (1, Some(1)),

`

2247

``

`-

None => (0, Some(0)),

`

2248

``

`-

}

`

``

2252

`+

let len = self.len();

`

``

2253

`+

(len, Some(len))

`

2249

2254

`}

`

2250

2255

`}

`

2251

2256

``

`@@ -2256,7 +2261,12 @@ impl DoubleEndedIterator for Item {

`

2256

2261

`}

`

2257

2262

`}

`

2258

2263

``

2259

``

`-

impl ExactSizeIterator for Item {}

`

``

2264

`+

impl ExactSizeIterator for Item {

`

``

2265

`+

#[inline]

`

``

2266

`+

fn len(&self) -> usize {

`

``

2267

`+

self.opt.len()

`

``

2268

`+

}

`

``

2269

`+

}

`

2260

2270

`impl FusedIterator for Item {}

`

2261

2271

`unsafe impl TrustedLen for Item {}

`

2262

2272

``