Rollup merge of #64255 - varkor:bool-to-option, r=Centril
Add methods for converting `bool` to `Option<T>` This provides a reference implementation for https://github.com/rust-lang/rfcs/pull/2757.
This commit is contained in:
commit
cd3cb281da
45
src/libcore/bool.rs
Normal file
45
src/libcore/bool.rs
Normal file
@ -0,0 +1,45 @@
|
||||
//! impl bool {}
|
||||
|
||||
#[cfg(not(boostrap_stdarch_ignore_this))]
|
||||
#[lang = "bool"]
|
||||
impl bool {
|
||||
/// Returns `Some(t)` if the `bool` is `true`, or `None` otherwise.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(bool_to_option)]
|
||||
///
|
||||
/// assert_eq!(false.then(0), None);
|
||||
/// assert_eq!(true.then(0), Some(0));
|
||||
/// ```
|
||||
#[unstable(feature = "bool_to_option", issue = "64260")]
|
||||
#[inline]
|
||||
pub fn then<T>(self, t: T) -> Option<T> {
|
||||
if self {
|
||||
Some(t)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `Some(f())` if the `bool` is `true`, or `None` otherwise.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(bool_to_option)]
|
||||
///
|
||||
/// assert_eq!(false.then_with(|| 0), None);
|
||||
/// assert_eq!(true.then_with(|| 0), Some(0));
|
||||
/// ```
|
||||
#[unstable(feature = "bool_to_option", issue = "64260")]
|
||||
#[inline]
|
||||
pub fn then_with<T, F: FnOnce() -> T>(self, f: F) -> Option<T> {
|
||||
if self {
|
||||
Some(f())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
@ -227,6 +227,7 @@
|
||||
pub mod alloc;
|
||||
|
||||
// note: does not need to be public
|
||||
mod bool;
|
||||
mod tuple;
|
||||
mod unit;
|
||||
|
||||
|
7
src/libcore/tests/bool.rs
Normal file
7
src/libcore/tests/bool.rs
Normal file
@ -0,0 +1,7 @@
|
||||
#[test]
|
||||
fn test_bool_to_option() {
|
||||
assert_eq!(false.then(0), None);
|
||||
assert_eq!(true.then(0), Some(0));
|
||||
assert_eq!(false.then_with(|| 0), None);
|
||||
assert_eq!(true.then_with(|| 0), Some(0));
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(bound_cloned)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(cell_update)]
|
||||
@ -40,6 +41,7 @@
|
||||
mod array;
|
||||
mod ascii;
|
||||
mod atomic;
|
||||
mod bool;
|
||||
mod cell;
|
||||
mod char;
|
||||
mod clone;
|
||||
|
@ -244,6 +244,7 @@ pub fn collect<'tcx>(tcx: TyCtxt<'tcx>) -> LanguageItems {
|
||||
|
||||
language_item_table! {
|
||||
// Variant name, Name, Method name, Target;
|
||||
BoolImplItem, "bool", bool_impl, Target::Impl;
|
||||
CharImplItem, "char", char_impl, Target::Impl;
|
||||
StrImplItem, "str", str_impl, Target::Impl;
|
||||
SliceImplItem, "slice", slice_impl, Target::Impl;
|
||||
|
@ -578,6 +578,10 @@ fn assemble_probe(&mut self, self_ty: &Canonical<'tcx, QueryResponse<'tcx, Ty<'t
|
||||
ty::Param(p) => {
|
||||
self.assemble_inherent_candidates_from_param(p);
|
||||
}
|
||||
ty::Bool => {
|
||||
let lang_def_id = lang_items.bool_impl();
|
||||
self.assemble_inherent_impl_for_primitive(lang_def_id);
|
||||
}
|
||||
ty::Char => {
|
||||
let lang_def_id = lang_items.char_impl();
|
||||
self.assemble_inherent_impl_for_primitive(lang_def_id);
|
||||
|
@ -67,6 +67,14 @@ fn visit_item(&mut self, item: &hir::Item) {
|
||||
ty::Dynamic(ref data, ..) if data.principal_def_id().is_some() => {
|
||||
self.check_def_id(item, data.principal_def_id().unwrap());
|
||||
}
|
||||
ty::Bool => {
|
||||
self.check_primitive_impl(def_id,
|
||||
lang_items.bool_impl(),
|
||||
None,
|
||||
"bool",
|
||||
"bool",
|
||||
item.span);
|
||||
}
|
||||
ty::Char => {
|
||||
self.check_primitive_impl(def_id,
|
||||
lang_items.char_impl(),
|
||||
|
@ -3977,7 +3977,7 @@ fn build_deref_target_impls(cx: &DocContext<'_>,
|
||||
F32 => tcx.lang_items().f32_impl(),
|
||||
F64 => tcx.lang_items().f64_impl(),
|
||||
Char => tcx.lang_items().char_impl(),
|
||||
Bool => None,
|
||||
Bool => tcx.lang_items().bool_impl(),
|
||||
Str => tcx.lang_items().str_impl(),
|
||||
Slice => tcx.lang_items().slice_impl(),
|
||||
Array => tcx.lang_items().slice_impl(),
|
||||
|
@ -679,6 +679,7 @@ fn primitive_impl(cx: &DocContext<'_>, path_str: &str) -> Option<DefId> {
|
||||
"f32" => tcx.lang_items().f32_impl(),
|
||||
"f64" => tcx.lang_items().f64_impl(),
|
||||
"str" => tcx.lang_items().str_impl(),
|
||||
"bool" => tcx.lang_items().bool_impl(),
|
||||
"char" => tcx.lang_items().char_impl(),
|
||||
_ => None,
|
||||
}
|
||||
|
@ -53,6 +53,7 @@ pub fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate {
|
||||
lang_items.f64_impl(),
|
||||
lang_items.f32_runtime_impl(),
|
||||
lang_items.f64_runtime_impl(),
|
||||
lang_items.bool_impl(),
|
||||
lang_items.char_impl(),
|
||||
lang_items.str_impl(),
|
||||
lang_items.slice_impl(),
|
||||
|
Loading…
Reference in New Issue
Block a user