From e7ba7f47a79a2881cf208ef9d944609e8fd4eec9 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 11 Jul 2020 03:04:37 +0200 Subject: Profiling tweaks --- crates/stdx/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'crates/stdx/src') diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs index 08ac6f70f..3b605c79d 100644 --- a/crates/stdx/src/lib.rs +++ b/crates/stdx/src/lib.rs @@ -87,6 +87,8 @@ where Ok(()) } } + +#[must_use] pub fn timeit(label: &'static str) -> impl Drop { struct Guard { label: &'static str, -- cgit v1.2.3 From 6b4cf5b7d8043469c9856f6578d282f9532d7fe0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 13 Jul 2020 15:54:12 +0200 Subject: Move stdx macros into submodule --- crates/stdx/src/lib.rs | 21 ++------------------- crates/stdx/src/macros.rs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 crates/stdx/src/macros.rs (limited to 'crates/stdx/src') diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs index 3b605c79d..988853ed2 100644 --- a/crates/stdx/src/lib.rs +++ b/crates/stdx/src/lib.rs @@ -1,30 +1,13 @@ //! Missing batteries for standard libraries. use std::{cell::Cell, fmt, time::Instant}; +mod macros; + #[inline(always)] pub fn is_ci() -> bool { option_env!("CI").is_some() } -#[macro_export] -macro_rules! eprintln { - ($($tt:tt)*) => {{ - if $crate::is_ci() { - panic!("Forgot to remove debug-print?") - } - std::eprintln!($($tt)*) - }} -} - -/// Appends formatted string to a `String`. -#[macro_export] -macro_rules! format_to { - ($buf:expr) => (); - ($buf:expr, $lit:literal $($arg:tt)*) => { - { use ::std::fmt::Write as _; let _ = ::std::write!($buf, $lit $($arg)*); } - }; -} - pub trait SepBy: Sized { /// Returns an `impl fmt::Display`, which joins elements via a separator. fn sep_by<'a>(self, sep: &'a str) -> SepByBuilder<'a, Self>; diff --git a/crates/stdx/src/macros.rs b/crates/stdx/src/macros.rs new file mode 100644 index 000000000..0f7690a67 --- /dev/null +++ b/crates/stdx/src/macros.rs @@ -0,0 +1,19 @@ +//! Convenience macros. +#[macro_export] +macro_rules! eprintln { + ($($tt:tt)*) => {{ + if $crate::is_ci() { + panic!("Forgot to remove debug-print?") + } + std::eprintln!($($tt)*) + }} +} + +/// Appends formatted string to a `String`. +#[macro_export] +macro_rules! format_to { + ($buf:expr) => (); + ($buf:expr, $lit:literal $($arg:tt)*) => { + { use ::std::fmt::Write as _; let _ = ::std::write!($buf, $lit $($arg)*); } + }; +} -- cgit v1.2.3 From 693ac892f2db5db1ce7cf86db7bf6207b3515c42 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 13 Jul 2020 16:16:53 +0200 Subject: Don't copy-paste `impl_froms` into every crate --- crates/stdx/src/macros.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'crates/stdx/src') diff --git a/crates/stdx/src/macros.rs b/crates/stdx/src/macros.rs index 0f7690a67..bf298460f 100644 --- a/crates/stdx/src/macros.rs +++ b/crates/stdx/src/macros.rs @@ -17,3 +17,24 @@ macro_rules! format_to { { use ::std::fmt::Write as _; let _ = ::std::write!($buf, $lit $($arg)*); } }; } + +// Generates `From` impls for `Enum E { Foo(Foo), Bar(Bar) }` enums +#[macro_export] +macro_rules! impl_from { + ($($variant:ident $(($($sub_variant:ident),*))?),* for $enum:ident) => { + $( + impl From<$variant> for $enum { + fn from(it: $variant) -> $enum { + $enum::$variant(it) + } + } + $($( + impl From<$sub_variant> for $enum { + fn from(it: $sub_variant) -> $enum { + $enum::$variant($variant::$sub_variant(it)) + } + } + )*)? + )* + } +} -- cgit v1.2.3 From 4f7a3fba59269a2b37b78655a10778ba5af796bd Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 23 Jul 2020 12:59:18 +0200 Subject: Replace superslice with API on path to stabilization --- crates/stdx/src/lib.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'crates/stdx/src') diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs index 988853ed2..ea0e6b949 100644 --- a/crates/stdx/src/lib.rs +++ b/crates/stdx/src/lib.rs @@ -158,6 +158,36 @@ impl<'a> Iterator for LinesWithEnds<'a> { } } +// https://github.com/rust-lang/rust/issues/73831 +pub fn partition_point(slice: &[T], mut pred: P) -> usize +where + P: FnMut(&T) -> bool, +{ + let mut left = 0; + let mut right = slice.len(); + + while left != right { + let mid = left + (right - left) / 2; + // SAFETY: + // When left < right, left <= mid < right. + // Therefore left always increases and right always decreases, + // and either of them is selected. + // In both cases left <= right is satisfied. + // Therefore if left < right in a step, + // left <= right is satisfied in the next step. + // Therefore as long as left != right, 0 <= left < right <= len is satisfied + // and if this case 0 <= mid < len is satisfied too. + let value = unsafe { slice.get_unchecked(mid) }; + if pred(value) { + left = mid + 1; + } else { + right = mid; + } + } + + left +} + #[cfg(test)] mod tests { use super::*; -- cgit v1.2.3 From be49547b446cba240f8f2a9592284e77d4a6896f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 30 Jul 2020 22:19:58 +0200 Subject: Use split_once polyfill --- crates/stdx/src/lib.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'crates/stdx/src') diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs index ea0e6b949..b65875c96 100644 --- a/crates/stdx/src/lib.rs +++ b/crates/stdx/src/lib.rs @@ -109,9 +109,18 @@ pub fn replace(buf: &mut String, from: char, to: &str) { *buf = buf.replace(from, to) } -pub fn split_delim(haystack: &str, delim: char) -> Option<(&str, &str)> { - let idx = haystack.find(delim)?; - Some((&haystack[..idx], &haystack[idx + delim.len_utf8()..])) +// https://github.com/rust-lang/rust/issues/74773 +pub fn split_once(haystack: &str, delim: char) -> Option<(&str, &str)> { + let mut split = haystack.splitn(2, delim); + let prefix = split.next()?; + let suffix = split.next()?; + Some((prefix, suffix)) +} +pub fn rsplit_once(haystack: &str, delim: char) -> Option<(&str, &str)> { + let mut split = haystack.rsplitn(2, delim); + let suffix = split.next()?; + let prefix = split.next()?; + Some((prefix, suffix)) } pub fn trim_indent(mut text: &str) -> String { -- cgit v1.2.3