1
//! Traits for conversions between types.
2
//!
3
//! The traits in this module provide a way to convert from one type to another type.
4
//! Each trait serves a different purpose:
5
//!
6
//! - Implement the [`AsRef`] trait for cheap reference-to-reference conversions
7
//! - Implement the [`AsMut`] trait for cheap mutable-to-mutable conversions
8
//! - Implement the [`From`] trait for consuming value-to-value conversions
9
//! - Implement the [`Into`] trait for consuming value-to-value conversions to types
10
//!   outside the current crate
11
//! - The [`TryFrom`] and [`TryInto`] traits behave like [`From`] and [`Into`],
12
//!   but should be implemented when the conversion can fail.
13
//!
14
//! The traits in this module are often used as trait bounds for generic functions such that to
15
//! arguments of multiple types are supported. See the documentation of each trait for examples.
16
//!
17
//! As a library author, you should always prefer implementing [`From<T>`][`From`] or
18
//! [`TryFrom<T>`][`TryFrom`] rather than [`Into<U>`][`Into`] or [`TryInto<U>`][`TryInto`],
19
//! as [`From`] and [`TryFrom`] provide greater flexibility and offer
20
//! equivalent [`Into`] or [`TryInto`] implementations for free, thanks to a
21
//! blanket implementation in the standard library. When targeting a version prior to Rust 1.41, it
22
//! may be necessary to implement [`Into`] or [`TryInto`] directly when converting to a type
23
//! outside the current crate.
24
//!
25
//! # Generic Implementations
26
//!
27
//! - [`AsRef`] and [`AsMut`] auto-dereference if the inner type is a reference
28
//!   (but not generally for all [dereferenceable types][core::ops::Deref])
29
//! - [`From`]`<U> for T` implies [`Into`]`<T> for U`
30
//! - [`TryFrom`]`<U> for T` implies [`TryInto`]`<T> for U`
31
//! - [`From`] and [`Into`] are reflexive, which means that all types can
32
//!   `into` themselves and `from` themselves
33
//!
34
//! See each trait for usage examples.
35

            
36
#![stable(feature = "rust1", since = "1.0.0")]
37

            
38
#[cfg(not(feature = "ferrocene_certified"))]
39
use crate::error::Error;
40
#[cfg(not(feature = "ferrocene_certified"))]
41
use crate::fmt;
42
#[cfg(not(feature = "ferrocene_certified"))]
43
use crate::hash::{Hash, Hasher};
44
use crate::marker::PointeeSized;
45

            
46
#[cfg(not(feature = "ferrocene_certified"))]
47
mod num;
48

            
49
#[unstable(feature = "convert_float_to_int", issue = "67057")]
50
#[cfg(not(feature = "ferrocene_certified"))]
51
pub use num::FloatToInt;
52

            
53
/// The identity function.
54
///
55
/// Two things are important to note about this function:
56
///
57
/// - It is not always equivalent to a closure like `|x| x`, since the
58
///   closure may coerce `x` into a different type.
59
///
60
/// - It moves the input `x` passed to the function.
61
///
62
/// While it might seem strange to have a function that just returns back the
63
/// input, there are some interesting uses.
64
///
65
/// # Examples
66
///
67
/// Using `identity` to do nothing in a sequence of other, interesting,
68
/// functions:
69
///
70
/// ```rust
71
/// use std::convert::identity;
72
///
73
/// fn manipulation(x: u32) -> u32 {
74
///     // Let's pretend that adding one is an interesting function.
75
///     x + 1
76
/// }
77
///
78
/// let _arr = &[identity, manipulation];
79
/// ```
80
///
81
/// Using `identity` as a "do nothing" base case in a conditional:
82
///
83
/// ```rust
84
/// use std::convert::identity;
85
///
86
/// # let condition = true;
87
/// #
88
/// # fn manipulation(x: u32) -> u32 { x + 1 }
89
/// #
90
/// let do_stuff = if condition { manipulation } else { identity };
91
///
92
/// // Do more interesting stuff...
93
///
94
/// let _results = do_stuff(42);
95
/// ```
96
///
97
/// Using `identity` to keep the `Some` variants of an iterator of `Option<T>`:
98
///
99
/// ```rust
100
/// use std::convert::identity;
101
///
102
/// let iter = [Some(1), None, Some(3)].into_iter();
103
/// let filtered = iter.filter_map(identity).collect::<Vec<_>>();
104
/// assert_eq!(vec![1, 3], filtered);
105
/// ```
106
#[stable(feature = "convert_id", since = "1.33.0")]
107
#[rustc_const_stable(feature = "const_identity", since = "1.33.0")]
108
#[inline(always)]
109
#[rustc_diagnostic_item = "convert_identity"]
110
pub const fn identity<T>(x: T) -> T {
111
    x
112
}
113

            
114
/// Used to do a cheap reference-to-reference conversion.
115
///
116
/// This trait is similar to [`AsMut`] which is used for converting between mutable references.
117
/// If you need to do a costly conversion it is better to implement [`From`] with type
118
/// `&T` or write a custom function.
119
///
120
/// # Relation to `Borrow`
121
///
122
/// `AsRef` has the same signature as [`Borrow`], but [`Borrow`] is different in a few aspects:
123
///
124
/// - Unlike `AsRef`, [`Borrow`] has a blanket impl for any `T`, and can be used to accept either
125
///   a reference or a value. (See also note on `AsRef`'s reflexibility below.)
126
/// - [`Borrow`] also requires that [`Hash`], [`Eq`] and [`Ord`] for a borrowed value are
127
///   equivalent to those of the owned value. For this reason, if you want to
128
///   borrow only a single field of a struct you can implement `AsRef`, but not [`Borrow`].
129
///
130
/// **Note: This trait must not fail**. If the conversion can fail, use a
131
/// dedicated method which returns an [`Option<T>`] or a [`Result<T, E>`].
132
///
133
/// # Generic Implementations
134
///
135
/// `AsRef` auto-dereferences if the inner type is a reference or a mutable reference
136
/// (e.g.: `foo.as_ref()` will work the same if `foo` has type `&mut Foo` or `&&mut Foo`).
137
///
138
/// Note that due to historic reasons, the above currently does not hold generally for all
139
/// [dereferenceable types], e.g. `foo.as_ref()` will *not* work the same as
140
/// `Box::new(foo).as_ref()`. Instead, many smart pointers provide an `as_ref` implementation which
141
/// simply returns a reference to the [pointed-to value] (but do not perform a cheap
142
/// reference-to-reference conversion for that value). However, [`AsRef::as_ref`] should not be
143
/// used for the sole purpose of dereferencing; instead ['`Deref` coercion'] can be used:
144
///
145
/// [dereferenceable types]: core::ops::Deref
146
/// [pointed-to value]: core::ops::Deref::Target
147
/// ['`Deref` coercion']: core::ops::Deref#deref-coercion
148
///
149
/// ```
150
/// let x = Box::new(5i32);
151
/// // Avoid this:
152
/// // let y: &i32 = x.as_ref();
153
/// // Better just write:
154
/// let y: &i32 = &x;
155
/// ```
156
///
157
/// Types which implement [`Deref`] should consider implementing `AsRef<T>` as follows:
158
///
159
/// [`Deref`]: core::ops::Deref
160
///
161
/// ```
162
/// # use core::ops::Deref;
163
/// # struct SomeType;
164
/// # impl Deref for SomeType {
165
/// #     type Target = [u8];
166
/// #     fn deref(&self) -> &[u8] {
167
/// #         &[]
168
/// #     }
169
/// # }
170
/// impl<T> AsRef<T> for SomeType
171
/// where
172
///     T: ?Sized,
173
///     <SomeType as Deref>::Target: AsRef<T>,
174
/// {
175
///     fn as_ref(&self) -> &T {
176
///         self.deref().as_ref()
177
///     }
178
/// }
179
/// ```
180
///
181
/// # Reflexivity
182
///
183
/// Ideally, `AsRef` would be reflexive, i.e. there would be an `impl<T: ?Sized> AsRef<T> for T`
184
/// with [`as_ref`] simply returning its argument unchanged.
185
/// Such a blanket implementation is currently *not* provided due to technical restrictions of
186
/// Rust's type system (it would be overlapping with another existing blanket implementation for
187
/// `&T where T: AsRef<U>` which allows `AsRef` to auto-dereference, see "Generic Implementations"
188
/// above).
189
///
190
/// [`as_ref`]: AsRef::as_ref
191
///
192
/// A trivial implementation of `AsRef<T> for T` must be added explicitly for a particular type `T`
193
/// where needed or desired. Note, however, that not all types from `std` contain such an
194
/// implementation, and those cannot be added by external code due to orphan rules.
195
///
196
/// # Examples
197
///
198
/// By using trait bounds we can accept arguments of different types as long as they can be
199
/// converted to the specified type `T`.
200
///
201
/// For example: By creating a generic function that takes an `AsRef<str>` we express that we
202
/// want to accept all references that can be converted to [`&str`] as an argument.
203
/// Since both [`String`] and [`&str`] implement `AsRef<str>` we can accept both as input argument.
204
///
205
/// [`&str`]: primitive@str
206
/// [`Borrow`]: crate::borrow::Borrow
207
/// [`Eq`]: crate::cmp::Eq
208
/// [`Ord`]: crate::cmp::Ord
209
/// [`String`]: ../../std/string/struct.String.html
210
///
211
/// ```
212
/// fn is_hello<T: AsRef<str>>(s: T) {
213
///    assert_eq!("hello", s.as_ref());
214
/// }
215
///
216
/// let s = "hello";
217
/// is_hello(s);
218
///
219
/// let s = "hello".to_string();
220
/// is_hello(s);
221
/// ```
222
#[stable(feature = "rust1", since = "1.0.0")]
223
#[rustc_diagnostic_item = "AsRef"]
224
#[const_trait]
225
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
226
pub trait AsRef<T: PointeeSized>: PointeeSized {
227
    /// Converts this type into a shared reference of the (usually inferred) input type.
228
    #[stable(feature = "rust1", since = "1.0.0")]
229
    fn as_ref(&self) -> &T;
230
}
231

            
232
/// Used to do a cheap mutable-to-mutable reference conversion.
233
///
234
/// This trait is similar to [`AsRef`] but used for converting between mutable
235
/// references. If you need to do a costly conversion it is better to
236
/// implement [`From`] with type `&mut T` or write a custom function.
237
///
238
/// **Note: This trait must not fail**. If the conversion can fail, use a
239
/// dedicated method which returns an [`Option<T>`] or a [`Result<T, E>`].
240
///
241
/// # Generic Implementations
242
///
243
/// `AsMut` auto-dereferences if the inner type is a mutable reference
244
/// (e.g.: `foo.as_mut()` will work the same if `foo` has type `&mut Foo` or `&mut &mut Foo`).
245
///
246
/// Note that due to historic reasons, the above currently does not hold generally for all
247
/// [mutably dereferenceable types], e.g. `foo.as_mut()` will *not* work the same as
248
/// `Box::new(foo).as_mut()`. Instead, many smart pointers provide an `as_mut` implementation which
249
/// simply returns a reference to the [pointed-to value] (but do not perform a cheap
250
/// reference-to-reference conversion for that value). However, [`AsMut::as_mut`] should not be
251
/// used for the sole purpose of mutable dereferencing; instead ['`Deref` coercion'] can be used:
252
///
253
/// [mutably dereferenceable types]: core::ops::DerefMut
254
/// [pointed-to value]: core::ops::Deref::Target
255
/// ['`Deref` coercion']: core::ops::DerefMut#mutable-deref-coercion
256
///
257
/// ```
258
/// let mut x = Box::new(5i32);
259
/// // Avoid this:
260
/// // let y: &mut i32 = x.as_mut();
261
/// // Better just write:
262
/// let y: &mut i32 = &mut x;
263
/// ```
264
///
265
/// Types which implement [`DerefMut`] should consider to add an implementation of `AsMut<T>` as
266
/// follows:
267
///
268
/// [`DerefMut`]: core::ops::DerefMut
269
///
270
/// ```
271
/// # use core::ops::{Deref, DerefMut};
272
/// # struct SomeType;
273
/// # impl Deref for SomeType {
274
/// #     type Target = [u8];
275
/// #     fn deref(&self) -> &[u8] {
276
/// #         &[]
277
/// #     }
278
/// # }
279
/// # impl DerefMut for SomeType {
280
/// #     fn deref_mut(&mut self) -> &mut [u8] {
281
/// #         &mut []
282
/// #     }
283
/// # }
284
/// impl<T> AsMut<T> for SomeType
285
/// where
286
///     <SomeType as Deref>::Target: AsMut<T>,
287
/// {
288
///     fn as_mut(&mut self) -> &mut T {
289
///         self.deref_mut().as_mut()
290
///     }
291
/// }
292
/// ```
293
///
294
/// # Reflexivity
295
///
296
/// Ideally, `AsMut` would be reflexive, i.e. there would be an `impl<T: ?Sized> AsMut<T> for T`
297
/// with [`as_mut`] simply returning its argument unchanged.
298
/// Such a blanket implementation is currently *not* provided due to technical restrictions of
299
/// Rust's type system (it would be overlapping with another existing blanket implementation for
300
/// `&mut T where T: AsMut<U>` which allows `AsMut` to auto-dereference, see "Generic
301
/// Implementations" above).
302
///
303
/// [`as_mut`]: AsMut::as_mut
304
///
305
/// A trivial implementation of `AsMut<T> for T` must be added explicitly for a particular type `T`
306
/// where needed or desired. Note, however, that not all types from `std` contain such an
307
/// implementation, and those cannot be added by external code due to orphan rules.
308
///
309
/// # Examples
310
///
311
/// Using `AsMut` as trait bound for a generic function, we can accept all mutable references that
312
/// can be converted to type `&mut T`. Unlike [dereference], which has a single [target type],
313
/// there can be multiple implementations of `AsMut` for a type. In particular, `Vec<T>` implements
314
/// both `AsMut<Vec<T>>` and `AsMut<[T]>`.
315
///
316
/// In the following, the example functions `caesar` and `null_terminate` provide a generic
317
/// interface which work with any type that can be converted by cheap mutable-to-mutable conversion
318
/// into a byte slice (`[u8]`) or byte vector (`Vec<u8>`), respectively.
319
///
320
/// [dereference]: core::ops::DerefMut
321
/// [target type]: core::ops::Deref::Target
322
///
323
/// ```
324
/// struct Document {
325
///     info: String,
326
///     content: Vec<u8>,
327
/// }
328
///
329
/// impl<T: ?Sized> AsMut<T> for Document
330
/// where
331
///     Vec<u8>: AsMut<T>,
332
/// {
333
///     fn as_mut(&mut self) -> &mut T {
334
///         self.content.as_mut()
335
///     }
336
/// }
337
///
338
/// fn caesar<T: AsMut<[u8]>>(data: &mut T, key: u8) {
339
///     for byte in data.as_mut() {
340
///         *byte = byte.wrapping_add(key);
341
///     }
342
/// }
343
///
344
/// fn null_terminate<T: AsMut<Vec<u8>>>(data: &mut T) {
345
///     // Using a non-generic inner function, which contains most of the
346
///     // functionality, helps to minimize monomorphization overhead.
347
///     fn doit(data: &mut Vec<u8>) {
348
///         let len = data.len();
349
///         if len == 0 || data[len-1] != 0 {
350
///             data.push(0);
351
///         }
352
///     }
353
///     doit(data.as_mut());
354
/// }
355
///
356
/// fn main() {
357
///     let mut v: Vec<u8> = vec![1, 2, 3];
358
///     caesar(&mut v, 5);
359
///     assert_eq!(v, [6, 7, 8]);
360
///     null_terminate(&mut v);
361
///     assert_eq!(v, [6, 7, 8, 0]);
362
///     let mut doc = Document {
363
///         info: String::from("Example"),
364
///         content: vec![17, 19, 8],
365
///     };
366
///     caesar(&mut doc, 1);
367
///     assert_eq!(doc.content, [18, 20, 9]);
368
///     null_terminate(&mut doc);
369
///     assert_eq!(doc.content, [18, 20, 9, 0]);
370
/// }
371
/// ```
372
///
373
/// Note, however, that APIs don't need to be generic. In many cases taking a `&mut [u8]` or
374
/// `&mut Vec<u8>`, for example, is the better choice (callers need to pass the correct type then).
375
#[stable(feature = "rust1", since = "1.0.0")]
376
#[rustc_diagnostic_item = "AsMut"]
377
#[const_trait]
378
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
379
pub trait AsMut<T: PointeeSized>: PointeeSized {
380
    /// Converts this type into a mutable reference of the (usually inferred) input type.
381
    #[stable(feature = "rust1", since = "1.0.0")]
382
    fn as_mut(&mut self) -> &mut T;
383
}
384

            
385
/// A value-to-value conversion that consumes the input value. The
386
/// opposite of [`From`].
387
///
388
/// One should avoid implementing [`Into`] and implement [`From`] instead.
389
/// Implementing [`From`] automatically provides one with an implementation of [`Into`]
390
/// thanks to the blanket implementation in the standard library.
391
///
392
/// Prefer using [`Into`] over [`From`] when specifying trait bounds on a generic function
393
/// to ensure that types that only implement [`Into`] can be used as well.
394
///
395
/// **Note: This trait must not fail**. If the conversion can fail, use [`TryInto`].
396
///
397
/// # Generic Implementations
398
///
399
/// - [`From`]`<T> for U` implies `Into<U> for T`
400
/// - [`Into`] is reflexive, which means that `Into<T> for T` is implemented
401
///
402
/// # Implementing [`Into`] for conversions to external types in old versions of Rust
403
///
404
/// Prior to Rust 1.41, if the destination type was not part of the current crate
405
/// then you couldn't implement [`From`] directly.
406
/// For example, take this code:
407
///
408
/// ```
409
/// # #![allow(non_local_definitions)]
410
/// struct Wrapper<T>(Vec<T>);
411
/// impl<T> From<Wrapper<T>> for Vec<T> {
412
///     fn from(w: Wrapper<T>) -> Vec<T> {
413
///         w.0
414
///     }
415
/// }
416
/// ```
417
/// This will fail to compile in older versions of the language because Rust's orphaning rules
418
/// used to be a little bit more strict. To bypass this, you could implement [`Into`] directly:
419
///
420
/// ```
421
/// struct Wrapper<T>(Vec<T>);
422
/// impl<T> Into<Vec<T>> for Wrapper<T> {
423
///     fn into(self) -> Vec<T> {
424
///         self.0
425
///     }
426
/// }
427
/// ```
428
///
429
/// It is important to understand that [`Into`] does not provide a [`From`] implementation
430
/// (as [`From`] does with [`Into`]). Therefore, you should always try to implement [`From`]
431
/// and then fall back to [`Into`] if [`From`] can't be implemented.
432
///
433
/// # Examples
434
///
435
/// [`String`] implements [`Into`]`<`[`Vec`]`<`[`u8`]`>>`:
436
///
437
/// In order to express that we want a generic function to take all arguments that can be
438
/// converted to a specified type `T`, we can use a trait bound of [`Into`]`<T>`.
439
/// For example: The function `is_hello` takes all arguments that can be converted into a
440
/// [`Vec`]`<`[`u8`]`>`.
441
///
442
/// ```
443
/// fn is_hello<T: Into<Vec<u8>>>(s: T) {
444
///    let bytes = b"hello".to_vec();
445
///    assert_eq!(bytes, s.into());
446
/// }
447
///
448
/// let s = "hello".to_string();
449
/// is_hello(s);
450
/// ```
451
///
452
/// [`String`]: ../../std/string/struct.String.html
453
/// [`Vec`]: ../../std/vec/struct.Vec.html
454
#[rustc_diagnostic_item = "Into"]
455
#[stable(feature = "rust1", since = "1.0.0")]
456
#[doc(search_unbox)]
457
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
458
#[const_trait]
459
pub trait Into<T>: Sized {
460
    /// Converts this type into the (usually inferred) input type.
461
    #[must_use]
462
    #[stable(feature = "rust1", since = "1.0.0")]
463
    fn into(self) -> T;
464
}
465

            
466
/// Used to do value-to-value conversions while consuming the input value. It is the reciprocal of
467
/// [`Into`].
468
///
469
/// One should always prefer implementing `From` over [`Into`]
470
/// because implementing `From` automatically provides one with an implementation of [`Into`]
471
/// thanks to the blanket implementation in the standard library.
472
///
473
/// Only implement [`Into`] when targeting a version prior to Rust 1.41 and converting to a type
474
/// outside the current crate.
475
/// `From` was not able to do these types of conversions in earlier versions because of Rust's
476
/// orphaning rules.
477
/// See [`Into`] for more details.
478
///
479
/// Prefer using [`Into`] over [`From`] when specifying trait bounds on a generic function
480
/// to ensure that types that only implement [`Into`] can be used as well.
481
///
482
/// The `From` trait is also very useful when performing error handling. When constructing a function
483
/// that is capable of failing, the return type will generally be of the form `Result<T, E>`.
484
/// `From` simplifies error handling by allowing a function to return a single error type
485
/// that encapsulates multiple error types. See the "Examples" section and [the book][book] for more
486
/// details.
487
///
488
/// **Note: This trait must not fail**. The `From` trait is intended for perfect conversions.
489
/// If the conversion can fail or is not perfect, use [`TryFrom`].
490
///
491
/// # Generic Implementations
492
///
493
/// - `From<T> for U` implies [`Into`]`<U> for T`
494
/// - `From` is reflexive, which means that `From<T> for T` is implemented
495
///
496
/// # When to implement `From`
497
///
498
/// While there's no technical restrictions on which conversions can be done using
499
/// a `From` implementation, the general expectation is that the conversions
500
/// should typically be restricted as follows:
501
///
502
/// * The conversion is *infallible*: if the conversion can fail, use [`TryFrom`]
503
///   instead; don't provide a `From` impl that panics.
504
///
505
/// * The conversion is *lossless*: semantically, it should not lose or discard
506
///   information. For example, `i32: From<u16>` exists, where the original
507
///   value can be recovered using `u16: TryFrom<i32>`.  And `String: From<&str>`
508
///   exists, where you can get something equivalent to the original value via
509
///   `Deref`.  But `From` cannot be used to convert from `u32` to `u16`, since
510
///   that cannot succeed in a lossless way.  (There's some wiggle room here for
511
///   information not considered semantically relevant.  For example,
512
///   `Box<[T]>: From<Vec<T>>` exists even though it might not preserve capacity,
513
///   like how two vectors can be equal despite differing capacities.)
514
///
515
/// * The conversion is *value-preserving*: the conceptual kind and meaning of
516
///   the resulting value is the same, even though the Rust type and technical
517
///   representation might be different.  For example `-1_i8 as u8` is *lossless*,
518
///   since `as` casting back can recover the original value, but that conversion
519
///   is *not* available via `From` because `-1` and `255` are different conceptual
520
///   values (despite being identical bit patterns technically).  But
521
///   `f32: From<i16>` *is* available because `1_i16` and `1.0_f32` are conceptually
522
///   the same real number (despite having very different bit patterns technically).
523
///   `String: From<char>` is available because they're both *text*, but
524
///   `String: From<u32>` is *not* available, since `1` (a number) and `"1"`
525
///   (text) are too different.  (Converting values to text is instead covered
526
///   by the [`Display`](crate::fmt::Display) trait.)
527
///
528
/// * The conversion is *obvious*: it's the only reasonable conversion between
529
///   the two types.  Otherwise it's better to have it be a named method or
530
///   constructor, like how [`str::as_bytes`] is a method and how integers have
531
///   methods like [`u32::from_ne_bytes`], [`u32::from_le_bytes`], and
532
///   [`u32::from_be_bytes`], none of which are `From` implementations.  Whereas
533
///   there's only one reasonable way to wrap an [`Ipv6Addr`](crate::net::Ipv6Addr)
534
///   into an [`IpAddr`](crate::net::IpAddr), thus `IpAddr: From<Ipv6Addr>` exists.
535
///
536
/// # Examples
537
///
538
/// [`String`] implements `From<&str>`:
539
///
540
/// An explicit conversion from a `&str` to a String is done as follows:
541
///
542
/// ```
543
/// let string = "hello".to_string();
544
/// let other_string = String::from("hello");
545
///
546
/// assert_eq!(string, other_string);
547
/// ```
548
///
549
/// While performing error handling it is often useful to implement `From` for your own error type.
550
/// By converting underlying error types to our own custom error type that encapsulates the
551
/// underlying error type, we can return a single error type without losing information on the
552
/// underlying cause. The '?' operator automatically converts the underlying error type to our
553
/// custom error type with `From::from`.
554
///
555
/// ```
556
/// use std::fs;
557
/// use std::io;
558
/// use std::num;
559
///
560
/// enum CliError {
561
///     IoError(io::Error),
562
///     ParseError(num::ParseIntError),
563
/// }
564
///
565
/// impl From<io::Error> for CliError {
566
///     fn from(error: io::Error) -> Self {
567
///         CliError::IoError(error)
568
///     }
569
/// }
570
///
571
/// impl From<num::ParseIntError> for CliError {
572
///     fn from(error: num::ParseIntError) -> Self {
573
///         CliError::ParseError(error)
574
///     }
575
/// }
576
///
577
/// fn open_and_parse_file(file_name: &str) -> Result<i32, CliError> {
578
///     let mut contents = fs::read_to_string(&file_name)?;
579
///     let num: i32 = contents.trim().parse()?;
580
///     Ok(num)
581
/// }
582
/// ```
583
///
584
/// [`String`]: ../../std/string/struct.String.html
585
/// [`from`]: From::from
586
/// [book]: ../../book/ch09-00-error-handling.html
587
#[rustc_diagnostic_item = "From"]
588
#[stable(feature = "rust1", since = "1.0.0")]
589
#[rustc_on_unimplemented(on(
590
    all(Self = "&str", T = "alloc::string::String"),
591
    note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix",
592
))]
593
#[doc(search_unbox)]
594
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
595
#[const_trait]
596
pub trait From<T>: Sized {
597
    /// Converts to this type from the input type.
598
    #[rustc_diagnostic_item = "from_fn"]
599
    #[must_use]
600
    #[stable(feature = "rust1", since = "1.0.0")]
601
    fn from(value: T) -> Self;
602
}
603

            
604
/// An attempted conversion that consumes `self`, which may or may not be
605
/// expensive.
606
///
607
/// Library authors should usually not directly implement this trait,
608
/// but should prefer implementing the [`TryFrom`] trait, which offers
609
/// greater flexibility and provides an equivalent `TryInto`
610
/// implementation for free, thanks to a blanket implementation in the
611
/// standard library. For more information on this, see the
612
/// documentation for [`Into`].
613
///
614
/// Prefer using [`TryInto`] over [`TryFrom`] when specifying trait bounds on a generic function
615
/// to ensure that types that only implement [`TryInto`] can be used as well.
616
///
617
/// # Implementing `TryInto`
618
///
619
/// This suffers the same restrictions and reasoning as implementing
620
/// [`Into`], see there for details.
621
#[rustc_diagnostic_item = "TryInto"]
622
#[stable(feature = "try_from", since = "1.34.0")]
623
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
624
#[const_trait]
625
pub trait TryInto<T>: Sized {
626
    /// The type returned in the event of a conversion error.
627
    #[stable(feature = "try_from", since = "1.34.0")]
628
    type Error;
629

            
630
    /// Performs the conversion.
631
    #[stable(feature = "try_from", since = "1.34.0")]
632
    fn try_into(self) -> Result<T, Self::Error>;
633
}
634

            
635
/// Simple and safe type conversions that may fail in a controlled
636
/// way under some circumstances. It is the reciprocal of [`TryInto`].
637
///
638
/// This is useful when you are doing a type conversion that may
639
/// trivially succeed but may also need special handling.
640
/// For example, there is no way to convert an [`i64`] into an [`i32`]
641
/// using the [`From`] trait, because an [`i64`] may contain a value
642
/// that an [`i32`] cannot represent and so the conversion would lose data.
643
/// This might be handled by truncating the [`i64`] to an [`i32`] or by
644
/// simply returning [`i32::MAX`], or by some other method.  The [`From`]
645
/// trait is intended for perfect conversions, so the `TryFrom` trait
646
/// informs the programmer when a type conversion could go bad and lets
647
/// them decide how to handle it.
648
///
649
/// # Generic Implementations
650
///
651
/// - `TryFrom<T> for U` implies [`TryInto`]`<U> for T`
652
/// - [`try_from`] is reflexive, which means that `TryFrom<T> for T`
653
/// is implemented and cannot fail -- the associated `Error` type for
654
/// calling `T::try_from()` on a value of type `T` is [`Infallible`].
655
/// When the [`!`] type is stabilized [`Infallible`] and [`!`] will be
656
/// equivalent.
657
///
658
/// Prefer using [`TryInto`] over [`TryFrom`] when specifying trait bounds on a generic function
659
/// to ensure that types that only implement [`TryInto`] can be used as well.
660
///
661
/// `TryFrom<T>` can be implemented as follows:
662
///
663
/// ```
664
/// struct GreaterThanZero(i32);
665
///
666
/// impl TryFrom<i32> for GreaterThanZero {
667
///     type Error = &'static str;
668
///
669
///     fn try_from(value: i32) -> Result<Self, Self::Error> {
670
///         if value <= 0 {
671
///             Err("GreaterThanZero only accepts values greater than zero!")
672
///         } else {
673
///             Ok(GreaterThanZero(value))
674
///         }
675
///     }
676
/// }
677
/// ```
678
///
679
/// # Examples
680
///
681
/// As described, [`i32`] implements `TryFrom<`[`i64`]`>`:
682
///
683
/// ```
684
/// let big_number = 1_000_000_000_000i64;
685
/// // Silently truncates `big_number`, requires detecting
686
/// // and handling the truncation after the fact.
687
/// let smaller_number = big_number as i32;
688
/// assert_eq!(smaller_number, -727379968);
689
///
690
/// // Returns an error because `big_number` is too big to
691
/// // fit in an `i32`.
692
/// let try_smaller_number = i32::try_from(big_number);
693
/// assert!(try_smaller_number.is_err());
694
///
695
/// // Returns `Ok(3)`.
696
/// let try_successful_smaller_number = i32::try_from(3);
697
/// assert!(try_successful_smaller_number.is_ok());
698
/// ```
699
///
700
/// [`try_from`]: TryFrom::try_from
701
#[rustc_diagnostic_item = "TryFrom"]
702
#[stable(feature = "try_from", since = "1.34.0")]
703
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
704
#[const_trait]
705
pub trait TryFrom<T>: Sized {
706
    /// The type returned in the event of a conversion error.
707
    #[stable(feature = "try_from", since = "1.34.0")]
708
    type Error;
709

            
710
    /// Performs the conversion.
711
    #[stable(feature = "try_from", since = "1.34.0")]
712
    #[rustc_diagnostic_item = "try_from_fn"]
713
    fn try_from(value: T) -> Result<Self, Self::Error>;
714
}
715

            
716
////////////////////////////////////////////////////////////////////////////////
717
// GENERIC IMPLS
718
////////////////////////////////////////////////////////////////////////////////
719

            
720
// As lifts over &
721
#[stable(feature = "rust1", since = "1.0.0")]
722
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
723
impl<T: PointeeSized, U: PointeeSized> const AsRef<U> for &T
724
where
725
    T: [const] AsRef<U>,
726
{
727
    #[inline]
728
16809
    fn as_ref(&self) -> &U {
729
16809
        <T as AsRef<U>>::as_ref(*self)
730
16809
    }
731
}
732

            
733
// As lifts over &mut
734
#[stable(feature = "rust1", since = "1.0.0")]
735
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
736
impl<T: PointeeSized, U: PointeeSized> const AsRef<U> for &mut T
737
where
738
    T: [const] AsRef<U>,
739
{
740
    #[inline]
741
129
    fn as_ref(&self) -> &U {
742
129
        <T as AsRef<U>>::as_ref(*self)
743
129
    }
744
}
745

            
746
// FIXME (#45742): replace the above impls for &/&mut with the following more general one:
747
// // As lifts over Deref
748
// impl<D: ?Sized + Deref<Target: AsRef<U>>, U: ?Sized> AsRef<U> for D {
749
//     fn as_ref(&self) -> &U {
750
//         self.deref().as_ref()
751
//     }
752
// }
753

            
754
// AsMut lifts over &mut
755
#[stable(feature = "rust1", since = "1.0.0")]
756
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
757
impl<T: PointeeSized, U: PointeeSized> const AsMut<U> for &mut T
758
where
759
    T: [const] AsMut<U>,
760
{
761
    #[inline]
762
    fn as_mut(&mut self) -> &mut U {
763
        (*self).as_mut()
764
    }
765
}
766

            
767
// FIXME (#45742): replace the above impl for &mut with the following more general one:
768
// // AsMut lifts over DerefMut
769
// impl<D: ?Sized + Deref<Target: AsMut<U>>, U: ?Sized> AsMut<U> for D {
770
//     fn as_mut(&mut self) -> &mut U {
771
//         self.deref_mut().as_mut()
772
//     }
773
// }
774

            
775
// From implies Into
776
#[stable(feature = "rust1", since = "1.0.0")]
777
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
778
impl<T, U> const Into<U> for T
779
where
780
    U: [const] From<T>,
781
{
782
    /// Calls `U::from(self)`.
783
    ///
784
    /// That is, this conversion is whatever the implementation of
785
    /// <code>[From]&lt;T&gt; for U</code> chooses to do.
786
    #[inline]
787
    #[track_caller]
788
15986
    fn into(self) -> U {
789
15986
        U::from(self)
790
15986
    }
791
}
792

            
793
// From (and thus Into) is reflexive
794
#[stable(feature = "rust1", since = "1.0.0")]
795
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
796
impl<T> const From<T> for T {
797
    /// Returns the argument unchanged.
798
    #[inline(always)]
799
39
    fn from(t: T) -> T {
800
39
        t
801
39
    }
802
}
803

            
804
/// **Stability note:** This impl does not yet exist, but we are
805
/// "reserving space" to add it in the future. See
806
/// [rust-lang/rust#64715][#64715] for details.
807
///
808
/// [#64715]: https://github.com/rust-lang/rust/issues/64715
809
#[stable(feature = "convert_infallible", since = "1.34.0")]
810
#[rustc_reservation_impl = "permitting this impl would forbid us from adding \
811
                            `impl<T> From<!> for T` later; see rust-lang/rust#64715 for details"]
812
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
813
#[cfg(not(feature = "ferrocene_certified"))]
814
impl<T> const From<!> for T {
815
    fn from(t: !) -> T {
816
        t
817
    }
818
}
819

            
820
// TryFrom implies TryInto
821
#[stable(feature = "try_from", since = "1.34.0")]
822
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
823
impl<T, U> const TryInto<U> for T
824
where
825
    U: [const] TryFrom<T>,
826
{
827
    type Error = U::Error;
828

            
829
    #[inline]
830
256
    fn try_into(self) -> Result<U, U::Error> {
831
256
        U::try_from(self)
832
256
    }
833
}
834

            
835
// Infallible conversions are semantically equivalent to fallible conversions
836
// with an uninhabited error type.
837
#[stable(feature = "try_from", since = "1.34.0")]
838
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
839
impl<T, U> const TryFrom<U> for T
840
where
841
    U: [const] Into<T>,
842
{
843
    type Error = Infallible;
844

            
845
    #[inline]
846
1
    fn try_from(value: U) -> Result<Self, Self::Error> {
847
1
        Ok(U::into(value))
848
1
    }
849
}
850

            
851
////////////////////////////////////////////////////////////////////////////////
852
// CONCRETE IMPLS
853
////////////////////////////////////////////////////////////////////////////////
854

            
855
#[stable(feature = "rust1", since = "1.0.0")]
856
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
857
#[cfg(not(feature = "ferrocene_certified"))]
858
impl<T> const AsRef<[T]> for [T] {
859
    #[inline(always)]
860
    fn as_ref(&self) -> &[T] {
861
        self
862
    }
863
}
864

            
865
#[stable(feature = "rust1", since = "1.0.0")]
866
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
867
impl<T> const AsMut<[T]> for [T] {
868
    #[inline(always)]
869
    fn as_mut(&mut self) -> &mut [T] {
870
        self
871
    }
872
}
873

            
874
#[stable(feature = "rust1", since = "1.0.0")]
875
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
876
#[cfg(not(feature = "ferrocene_certified"))]
877
impl const AsRef<str> for str {
878
    #[inline(always)]
879
    fn as_ref(&self) -> &str {
880
        self
881
    }
882
}
883

            
884
#[stable(feature = "as_mut_str_for_str", since = "1.51.0")]
885
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
886
impl const AsMut<str> for str {
887
    #[inline(always)]
888
    fn as_mut(&mut self) -> &mut str {
889
        self
890
    }
891
}
892

            
893
////////////////////////////////////////////////////////////////////////////////
894
// THE NO-ERROR ERROR TYPE
895
////////////////////////////////////////////////////////////////////////////////
896

            
897
/// The error type for errors that can never happen.
898
///
899
/// Since this enum has no variant, a value of this type can never actually exist.
900
/// This can be useful for generic APIs that use [`Result`] and parameterize the error type,
901
/// to indicate that the result is always [`Ok`].
902
///
903
/// For example, the [`TryFrom`] trait (conversion that returns a [`Result`])
904
/// has a blanket implementation for all types where a reverse [`Into`] implementation exists.
905
///
906
/// ```ignore (illustrates std code, duplicating the impl in a doctest would be an error)
907
/// impl<T, U> TryFrom<U> for T where U: Into<T> {
908
///     type Error = Infallible;
909
///
910
///     fn try_from(value: U) -> Result<Self, Infallible> {
911
///         Ok(U::into(value))  // Never returns `Err`
912
///     }
913
/// }
914
/// ```
915
///
916
/// # Future compatibility
917
///
918
/// This enum has the same role as [the `!` “never” type][never],
919
/// which is unstable in this version of Rust.
920
/// When `!` is stabilized, we plan to make `Infallible` a type alias to it:
921
///
922
/// ```ignore (illustrates future std change)
923
/// pub type Infallible = !;
924
/// ```
925
///
926
/// … and eventually deprecate `Infallible`.
927
///
928
/// However there is one case where `!` syntax can be used
929
/// before `!` is stabilized as a full-fledged type: in the position of a function’s return type.
930
/// Specifically, it is possible to have implementations for two different function pointer types:
931
///
932
/// ```
933
/// trait MyTrait {}
934
/// impl MyTrait for fn() -> ! {}
935
/// impl MyTrait for fn() -> std::convert::Infallible {}
936
/// ```
937
///
938
/// With `Infallible` being an enum, this code is valid.
939
/// However when `Infallible` becomes an alias for the never type,
940
/// the two `impl`s will start to overlap
941
/// and therefore will be disallowed by the language’s trait coherence rules.
942
#[stable(feature = "convert_infallible", since = "1.34.0")]
943
#[derive(Copy)]
944
pub enum Infallible {}
945

            
946
#[stable(feature = "convert_infallible", since = "1.34.0")]
947
#[rustc_const_unstable(feature = "const_clone", issue = "142757")]
948
impl const Clone for Infallible {
949
    fn clone(&self) -> Infallible {
950
        match *self {}
951
    }
952
}
953

            
954
#[stable(feature = "convert_infallible", since = "1.34.0")]
955
#[cfg(not(feature = "ferrocene_certified"))]
956
impl fmt::Debug for Infallible {
957
    fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
958
        match *self {}
959
    }
960
}
961

            
962
#[stable(feature = "convert_infallible", since = "1.34.0")]
963
#[cfg(not(feature = "ferrocene_certified"))]
964
impl fmt::Display for Infallible {
965
    fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
966
        match *self {}
967
    }
968
}
969

            
970
#[stable(feature = "str_parse_error2", since = "1.8.0")]
971
#[cfg(not(feature = "ferrocene_certified"))]
972
impl Error for Infallible {}
973

            
974
#[stable(feature = "convert_infallible", since = "1.34.0")]
975
#[rustc_const_unstable(feature = "const_cmp", issue = "143800")]
976
#[cfg(not(feature = "ferrocene_certified"))]
977
impl const PartialEq for Infallible {
978
    fn eq(&self, _: &Infallible) -> bool {
979
        match *self {}
980
    }
981
}
982

            
983
#[stable(feature = "convert_infallible", since = "1.34.0")]
984
#[cfg(not(feature = "ferrocene_certified"))]
985
impl Eq for Infallible {}
986

            
987
#[stable(feature = "convert_infallible", since = "1.34.0")]
988
#[cfg(not(feature = "ferrocene_certified"))]
989
impl PartialOrd for Infallible {
990
    fn partial_cmp(&self, _other: &Self) -> Option<crate::cmp::Ordering> {
991
        match *self {}
992
    }
993
}
994

            
995
#[stable(feature = "convert_infallible", since = "1.34.0")]
996
#[cfg(not(feature = "ferrocene_certified"))]
997
impl Ord for Infallible {
998
    fn cmp(&self, _other: &Self) -> crate::cmp::Ordering {
999
        match *self {}
    }
}
#[stable(feature = "convert_infallible", since = "1.34.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
#[cfg(not(feature = "ferrocene_certified"))]
impl const From<!> for Infallible {
    #[inline]
    fn from(x: !) -> Self {
        x
    }
}
#[stable(feature = "convert_infallible_hash", since = "1.44.0")]
#[cfg(not(feature = "ferrocene_certified"))]
impl Hash for Infallible {
    fn hash<H: Hasher>(&self, _: &mut H) {
        match *self {}
    }
}