mirror of
https://github.com/dlang/phobos.git
synced 2025-04-27 13:40:20 +03:00
Use isQualifierConvertible in isInputRange!(R, E)
This replaces the bespoke type comparison that was previously used. All conversions allowed by the previous version are still allowed after this change.
This commit is contained in:
parent
93530131b1
commit
c4cbe0c21b
2 changed files with 12 additions and 9 deletions
|
@ -277,7 +277,7 @@ has_public_example="-etc.c.curl,\
|
|||
imports_sortedness="+disabled"
|
||||
;imports_sortedness="-etc.c.curl,-std.algorithm.comparison,-std.algorithm.internal,-std.algorithm.iteration,-std.algorithm.mutation,-std.algorithm.searching,-std.algorithm.setops,-std.algorithm.sorting,-std.array,-std.bigint,-std.bitmanip,-std.c.freebsd.socket,-std.c.linux.pthread,-std.c.process,-std.complex,-std.concurrency,-std.container.array,-std.container.binaryheap,-std.container.dlist,-std.container.rbtree,-std.container.slist,-std.container.util,-std.conv,-std.datetime,-std.datetime.date,-std.datetime.interval,-std.datetime.systime,-std.datetime.timezone,-std.digest,-std.digest.hmac,-std.exception,-std.experimental.allocator,-std.experimental.allocator.building_blocks,-std.experimental.allocator.building_blocks.affix_allocator,-std.experimental.allocator.building_blocks.allocator_list,-std.experimental.allocator.building_blocks.free_list,-std.experimental.allocator.building_blocks.free_tree,-std.experimental.allocator.building_blocks.kernighan_ritchie,-std.experimental.allocator.building_blocks.region,-std.experimental.allocator.common,-std.experimental.allocator.mallocator,-std.experimental.allocator.mmap_allocator,-std.experimental.allocator.showcase,-std.experimental.allocator.typed,-std.experimental.checkedint,-std.logger.core,-std.file,-std.format,-std.functional,-std.getopt,-std.internal.math.biguintcore,-std.internal.test.dummyrange,-std.json,-std.math,-std.meta,-std.mmfile,-std.net.curl,-std.net.isemail,-std.numeric,-std.outbuffer,-std.parallelism,-std.path,-std.process,-std.random,-std.range,-std.range.primitives,-std.regex,-std.regex.internal.backtracking,-std.regex.internal.generator,-std.regex.internal.kickstart,-std.regex.internal.parser,-std.regex.internal.tests,-std.signals,-std.socket,-std.stdio,-std.string,-std.uni,-std.utf,-std.uuid,-std.variant,-std.windows.charset,-std.windows.registry,-std.windows.syserror,-std.zip"
|
||||
; Checks for labels with the same name as variables
|
||||
label_var_same_name_check="-std.algorithm.iteration,-std.algorithm.sorting,-std.array,-std.bigint,-std.bitmanip,-std.conv,-std.encoding,-std.experimental.allocator.building_blocks.segregator,-std.internal.digest.sha_SSSE3,-std.parallelism,-std.process,-std.typecons,-std.utf,-std.traits"
|
||||
label_var_same_name_check="-std.algorithm.iteration,-std.algorithm.sorting,-std.array,-std.bigint,-std.bitmanip,-std.conv,-std.encoding,-std.experimental.allocator.building_blocks.segregator,-std.internal.digest.sha_SSSE3,-std.parallelism,-std.process,-std.range.primitives,-std.typecons,-std.utf,-std.traits"
|
||||
; Checks for subtraction from .length properties
|
||||
length_subtraction_check="+disabled"
|
||||
;length_subtraction_check="-std.algorithm.internal,-std.algorithm.iteration,-std.algorithm.mutation,-std.algorithm.searching,-std.algorithm.sorting,-std.array,-std.concurrency,-std.container.array,-std.container.binaryheap,-std.conv,-std.datetime.timezone,-std.experimental.allocator.building_blocks.segregator,-std.logger.core,-std.file,-std.format,-std.getopt,-std.internal.math.biguintcore,-std.internal.math.biguintnoasm,-std.internal.math.biguintx86,-std.internal.scopebuffer,-std.math,-std.net.curl,-std.net.isemail,-std.numeric,-std.parallelism,-std.path,-std.process,-std.range,-std.regex,-std.regex.internal.parser,-std.regex.internal.tests,-std.string,-std.uni,-std.windows.charset,-std.windows.registry,-std.zip"
|
||||
|
@ -517,4 +517,4 @@ trust_too_much="-std.regex,-std.stdio,-std.uni,-std.internal.cstring"
|
|||
; Temporarily disable until https://github.com/dlang-community/D-Scanner/issues/593 is fixed
|
||||
if_else_same_check="-std.typecons"
|
||||
; Disable checks for generated unicode tables
|
||||
long_line_check="-etc.c.odbc.sql,-etc.c.odbc.sqlext,-etc.c.odbc.sqltypes,-etc.c.odbc.sqlucode,-std.internal.unicode_decomp,-std.internal.unicode_comp,-std.internal.unicode_grapheme,-std.internal.unicode_norm,-std.internal.unicode_tables"
|
||||
long_line_check="-etc.c.odbc.sql,-etc.c.odbc.sqlext,-etc.c.odbc.sqltypes,-etc.c.odbc.sqlucode,-std.internal.unicode_decomp,-std.internal.unicode_comp,-std.internal.unicode_grapheme,-std.internal.unicode_norm,-std.internal.unicode_tables"
|
||||
|
|
|
@ -165,21 +165,24 @@ See_Also:
|
|||
|
||||
Params:
|
||||
R = type to be tested
|
||||
E = the type of the elements of the range if not `void`
|
||||
E = if present, the elements of the range must be
|
||||
$(DDSUBLINK spec/const3, implicit_qualifier_conversions, qualifier-convertible)
|
||||
to this type
|
||||
|
||||
Returns:
|
||||
`true` if R is an input range (possibly with element type `E`), `false` if not
|
||||
*/
|
||||
enum bool isInputRange(R, E = void) =
|
||||
enum bool isInputRange(R) =
|
||||
is(typeof(R.init) == R)
|
||||
&& is(typeof((R r) { return r.empty; } (R.init)) == bool)
|
||||
&& (is(typeof((return ref R r) => r.front)) || is(typeof(ref (return ref R r) => r.front)))
|
||||
&& !is(typeof((R r) { return r.front; } (R.init)) == void)
|
||||
&& is(typeof((R r) => r.popFront))
|
||||
&& (is(E == void) ||
|
||||
is(ElementType!R == E) ||
|
||||
is(const(ElementType!R) == E) ||
|
||||
(is(const(ElementType!R) == immutable E) && is(const(E) == E)));
|
||||
&& is(typeof((R r) => r.popFront));
|
||||
|
||||
/// ditto
|
||||
enum bool isInputRange(R, E) =
|
||||
.isInputRange!R && isQualifierConvertible!(ElementType!R, E);
|
||||
|
||||
///
|
||||
@safe unittest
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue