Add new comparison traits
- allSameType - isEqualityComparable - isOrderingComparable
This commit is contained in:
parent
5e40424f7d
commit
5cac28c093
@ -3012,3 +3012,99 @@ template Fields(T)
|
|||||||
|
|
||||||
static assert(is(Fields!short == AliasSeq!short));
|
static assert(is(Fields!short == AliasSeq!short));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether all $(D_PARAM Types) are the same.
|
||||||
|
*
|
||||||
|
* If $(D_PARAM Types) is empty, returns $(D_KEYWORD true).
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* Types = Type sequence.
|
||||||
|
*
|
||||||
|
* Returns: $(D_KEYWORD true) if all $(D_PARAM Types) are the same,
|
||||||
|
* $(D_KEYWORD false) otherwise.
|
||||||
|
*/
|
||||||
|
template allSameType(Types...)
|
||||||
|
{
|
||||||
|
static if (Types.length == 0)
|
||||||
|
{
|
||||||
|
enum bool allSameType = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
private enum bool sameType(T) = is(T == Types[0]);
|
||||||
|
|
||||||
|
enum bool allSameType = allSatisfy!(sameType, Types[1 .. $]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
static assert(allSameType!());
|
||||||
|
static assert(allSameType!int);
|
||||||
|
static assert(allSameType!(int, int, int));
|
||||||
|
static assert(!allSameType!(int, uint, int));
|
||||||
|
static assert(!allSameType!(int, uint, short));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether values of type $(D_PARAM T) can be compared for equality,
|
||||||
|
* i.e. using `==` or `!=` binary operators.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* T = Type to test.
|
||||||
|
*
|
||||||
|
* Returns: $(D_KEYWORD true) if $(D_PARAM T) can be compared for equality,
|
||||||
|
* $(D_KEYWORD false) otherwise.
|
||||||
|
*/
|
||||||
|
enum bool isEqualityComparable(T) = ifTestable!(T, a => a == a);
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
static assert(isEqualityComparable!int);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether values of type $(D_PARAM T) can be compared for ordering,
|
||||||
|
* i.e. using `>`, `>=`, `<` or `<=` binary operators.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* T = Type to test.
|
||||||
|
*
|
||||||
|
* Returns: $(D_KEYWORD true) if $(D_PARAM T) can be compared for ordering,
|
||||||
|
* $(D_KEYWORD false) otherwise.
|
||||||
|
*/
|
||||||
|
enum bool isOrderingComparable(T) = ifTestable!(T, a => a > a);
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
static assert(isOrderingComparable!int);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
static struct DisabledOpEquals
|
||||||
|
{
|
||||||
|
@disable bool opEquals(typeof(this)) @nogc nothrow pure @safe;
|
||||||
|
|
||||||
|
int opCmp(typeof(this)) @nogc nothrow pure @safe
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static assert(!isEqualityComparable!DisabledOpEquals);
|
||||||
|
static assert(isOrderingComparable!DisabledOpEquals);
|
||||||
|
|
||||||
|
static struct OpEquals
|
||||||
|
{
|
||||||
|
bool opEquals(typeof(this)) @nogc nothrow pure @safe
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static assert(isEqualityComparable!OpEquals);
|
||||||
|
static assert(!isOrderingComparable!OpEquals);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user