From 42236b711d53f3ccad570fe7103835d9e29b984d Mon Sep 17 00:00:00 2001 From: Sebastian Wilzbach Date: Sat, 8 Jul 2017 03:08:57 +0200 Subject: [PATCH 1/3] Provide pred-only overload to std.algorithm.searching.findSkip --- std/algorithm/searching.d | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/std/algorithm/searching.d b/std/algorithm/searching.d index 04f62474060..460b0374340 100644 --- a/std/algorithm/searching.d +++ b/std/algorithm/searching.d @@ -2712,6 +2712,7 @@ if (isInputRange!InputRange && isForwardRange!ForwardRange) * needle = The * $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to search * for. + * pred = Custom predicate for comparison of haystack and needle * * Returns: $(D true) if the needle was found, in which case $(D haystack) is * positioned after the end of the first occurrence of $(D needle); otherwise @@ -2746,6 +2747,53 @@ if (isForwardRange!R1 && isForwardRange!R2 assert(findSkip(s, "def") && s.empty); } +/** +* Advances the `haystack` as long as `pred` evaluates to `true`. +* The `haystack` is positioned before position of first falsely evaluation of `pred`. +* +* Params: +* haystack = The +* $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to search +* in. +* pred = Custom predicate for comparison of haystack and needle +* +* Returns: The number of times `pred` was truthfully evaluated. +*/ +size_t findSkip(alias pred, R1)(ref R1 haystack) +if (isForwardRange!R1 && ifTestable!(typeof(haystack.front), unaryFun!pred)) +{ + size_t result; + while (!haystack.empty && unaryFun!pred(haystack.front)) + { + result++; + haystack.popFront; + } + return result; +} + +/// +@safe unittest +{ + import std.ascii : isWhite; + string s = " abc"; + assert(findSkip!isWhite(s) && s == "abc"); + assert(!findSkip!isWhite(s) && s == "abc"); + + s = " "; + assert(findSkip!isWhite(s) == 2); + import std.stdio; + s = " "; + findSkip!isWhite(s).writeln; +} + +@safe unittest +{ + import std.ascii : isWhite; + + auto s = " "; + assert(findSkip!isWhite(s) == 2); +} + /** These functions find the first occurrence of `needle` in `haystack` and then split `haystack` as follows. From dd70c998f72c5a3d899aaf2e85aaaff0f420c754 Mon Sep 17 00:00:00 2001 From: MetaLang Date: Sun, 19 Nov 2017 00:31:13 -0400 Subject: [PATCH 2/3] Change comment as requested by Andrei --- std/algorithm/searching.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/algorithm/searching.d b/std/algorithm/searching.d index 460b0374340..7e557be38f3 100644 --- a/std/algorithm/searching.d +++ b/std/algorithm/searching.d @@ -2749,7 +2749,7 @@ if (isForwardRange!R1 && isForwardRange!R2 /** * Advances the `haystack` as long as `pred` evaluates to `true`. -* The `haystack` is positioned before position of first falsely evaluation of `pred`. +* The haystack is positioned so as pred evaluates to false for haystack.front. * * Params: * haystack = The From 67e853607eca22e8c0dc24b7d5db4ba670260b2e Mon Sep 17 00:00:00 2001 From: MetaLang Date: Sun, 19 Nov 2017 00:33:35 -0400 Subject: [PATCH 3/3] More precisely define what this overload returns --- std/algorithm/searching.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/algorithm/searching.d b/std/algorithm/searching.d index 7e557be38f3..98a2c32c7e5 100644 --- a/std/algorithm/searching.d +++ b/std/algorithm/searching.d @@ -2757,7 +2757,7 @@ if (isForwardRange!R1 && isForwardRange!R2 * in. * pred = Custom predicate for comparison of haystack and needle * -* Returns: The number of times `pred` was truthfully evaluated. +* Returns: The number of times `pred(haystack.front)` returned true. */ size_t findSkip(alias pred, R1)(ref R1 haystack) if (isForwardRange!R1 && ifTestable!(typeof(haystack.front), unaryFun!pred))