Auto merge of #110303 - nbdd0121:master, r=Mark-Simulacrum · rust-lang/rust@9529a5d (original) (raw)

1

1

`` //! Indexing implementations for [T].

``

2

2

``

3

``

`-

use crate::intrinsics::assert_unsafe_precondition;

`

4

3

`use crate::intrinsics::const_eval_select;

`

5

4

`use crate::intrinsics::unchecked_sub;

`

6

5

`use crate::ops;

`

``

6

`+

use crate::panic::debug_assert_nounwind;

`

7

7

`use crate::ptr;

`

8

8

``

9

9

`#[stable(feature = "rust1", since = "1.0.0")]

`

`@@ -225,31 +225,25 @@ unsafe impl SliceIndex<[T]> for usize {

`

225

225

``

226

226

`#[inline]

`

227

227

`unsafe fn get_unchecked(self, slice: *const [T]) -> *const T {

`

228

``

`-

let this = self;

`

``

228

`+

debug_assert_nounwind!(

`

``

229

`+

self < slice.len(),

`

``

230

`+

"slice::get_unchecked requires that the index is within the slice",

`

``

231

`+

);

`

229

232

`` // SAFETY: the caller guarantees that slice is not dangling, so it

``

230

233

`` // cannot be longer than isize::MAX. They also guarantee that

``

231

234

`` // self is in bounds of slice so self cannot overflow an isize,

``

232

235

`` // so the call to add is safe.

``

233

``

`-

unsafe {

`

234

``

`-

assert_unsafe_precondition!(

`

235

``

`-

"slice::get_unchecked requires that the index is within the slice",

`

236

``

`-

[T](this: usize, slice: *const [T]) => this < slice.len()

`

237

``

`-

);

`

238

``

`-

slice.as_ptr().add(self)

`

239

``

`-

}

`

``

236

`+

unsafe { slice.as_ptr().add(self) }

`

240

237

`}

`

241

238

``

242

239

`#[inline]

`

243

240

`unsafe fn get_unchecked_mut(self, slice: *mut [T]) -> *mut T {

`

244

``

`-

let this = self;

`

``

241

`+

debug_assert_nounwind!(

`

``

242

`+

self < slice.len(),

`

``

243

`+

"slice::get_unchecked_mut requires that the index is within the slice",

`

``

244

`+

);

`

245

245

`` // SAFETY: see comments for get_unchecked above.

``

246

``

`-

unsafe {

`

247

``

`-

assert_unsafe_precondition!(

`

248

``

`-

"slice::get_unchecked_mut requires that the index is within the slice",

`

249

``

`-

[T](this: usize, slice: *mut [T]) => this < slice.len()

`

250

``

`-

);

`

251

``

`-

slice.as_mut_ptr().add(self)

`

252

``

`-

}

`

``

246

`+

unsafe { slice.as_mut_ptr().add(self) }

`

253

247

`}

`

254

248

``

255

249

`#[inline]

`

`@@ -293,32 +287,25 @@ unsafe impl SliceIndex<[T]> for ops::IndexRange {

`

293

287

``

294

288

`#[inline]

`

295

289

`unsafe fn get_unchecked(self, slice: *const [T]) -> *const [T] {

`

296

``

`-

let end = self.end();

`

``

290

`+

debug_assert_nounwind!(

`

``

291

`+

self.end() <= slice.len(),

`

``

292

`+

"slice::get_unchecked requires that the index is within the slice"

`

``

293

`+

);

`

297

294

`` // SAFETY: the caller guarantees that slice is not dangling, so it

``

298

295

`` // cannot be longer than isize::MAX. They also guarantee that

``

299

296

`` // self is in bounds of slice so self cannot overflow an isize,

``

300

297

`` // so the call to add is safe.

``

301

``

-

302

``

`-

unsafe {

`

303

``

`-

assert_unsafe_precondition!(

`

304

``

`-

"slice::get_unchecked requires that the index is within the slice",

`

305

``

`-

[T](end: usize, slice: *const [T]) => end <= slice.len()

`

306

``

`-

);

`

307

``

`-

ptr::slice_from_raw_parts(slice.as_ptr().add(self.start()), self.len())

`

308

``

`-

}

`

``

298

`+

unsafe { ptr::slice_from_raw_parts(slice.as_ptr().add(self.start()), self.len()) }

`

309

299

`}

`

310

300

``

311

301

`#[inline]

`

312

302

`unsafe fn get_unchecked_mut(self, slice: *mut [T]) -> *mut [T] {

`

313

``

`-

let end = self.end();

`

``

303

`+

debug_assert_nounwind!(

`

``

304

`+

self.end() <= slice.len(),

`

``

305

`+

"slice::get_unchecked_mut requires that the index is within the slice",

`

``

306

`+

);

`

314

307

`` // SAFETY: see comments for get_unchecked above.

``

315

``

`-

unsafe {

`

316

``

`-

assert_unsafe_precondition!(

`

317

``

`-

"slice::get_unchecked_mut requires that the index is within the slice",

`

318

``

`-

[T](end: usize, slice: *mut [T]) => end <= slice.len()

`

319

``

`-

);

`

320

``

`-

ptr::slice_from_raw_parts_mut(slice.as_mut_ptr().add(self.start()), self.len())

`

321

``

`-

}

`

``

308

`+

unsafe { ptr::slice_from_raw_parts_mut(slice.as_mut_ptr().add(self.start()), self.len()) }

`

322

309

`}

`

323

310

``

324

311

`#[inline]

`

`@@ -369,32 +356,28 @@ unsafe impl SliceIndex<[T]> for ops::Range {

`

369

356

``

370

357

`#[inline]

`

371

358

`unsafe fn get_unchecked(self, slice: *const [T]) -> *const [T] {

`

372

``

`-

let this = ops::Range { ..self };

`

``

359

`+

debug_assert_nounwind!(

`

``

360

`+

self.end >= self.start && self.end <= slice.len(),

`

``

361

`+

"slice::get_unchecked requires that the range is within the slice",

`

``

362

`+

);

`

373

363

`` // SAFETY: the caller guarantees that slice is not dangling, so it

``

374

364

`` // cannot be longer than isize::MAX. They also guarantee that

``

375

365

`` // self is in bounds of slice so self cannot overflow an isize,

``

376

366

`` // so the call to add is safe and the length calculation cannot overflow.

``

377

367

`unsafe {

`

378

``

`-

assert_unsafe_precondition!(

`

379

``

`-

"slice::get_unchecked requires that the range is within the slice",

`

380

``

`-

[T](this: ops::Range, slice: *const [T]) =>

`

381

``

`-

this.end >= this.start && this.end <= slice.len()

`

382

``

`-

);

`

383

368

`let new_len = unchecked_sub(self.end, self.start);

`

384

369

` ptr::slice_from_raw_parts(slice.as_ptr().add(self.start), new_len)

`

385

370

`}

`

386

371

`}

`

387

372

``

388

373

`#[inline]

`

389

374

`unsafe fn get_unchecked_mut(self, slice: *mut [T]) -> *mut [T] {

`

390

``

`-

let this = ops::Range { ..self };

`

``

375

`+

debug_assert_nounwind!(

`

``

376

`+

self.end >= self.start && self.end <= slice.len(),

`

``

377

`+

"slice::get_unchecked_mut requires that the range is within the slice",

`

``

378

`+

);

`

391

379

`` // SAFETY: see comments for get_unchecked above.

``

392

380

`unsafe {

`

393

``

`-

assert_unsafe_precondition!(

`

394

``

`-

"slice::get_unchecked_mut requires that the range is within the slice",

`

395

``

`-

[T](this: ops::Range, slice: *mut [T]) =>

`

396

``

`-

this.end >= this.start && this.end <= slice.len()

`

397

``

`-

);

`

398

381

`let new_len = unchecked_sub(self.end, self.start);

`

399

382

` ptr::slice_from_raw_parts_mut(slice.as_mut_ptr().add(self.start), new_len)

`

400

383

`}

`