mirror of
https://github.com/dlang/phobos.git
synced 2025-04-29 22:50:38 +03:00
[std/traits] Avoid template recursion for 3 Parameter traits
This commit is contained in:
parent
ac7e69151d
commit
e55f2c2df3
1 changed files with 24 additions and 41 deletions
65
std/traits.d
65
std/traits.d
|
@ -1125,7 +1125,7 @@ if (isCallable!func && variadicFunctionStyle!func == Variadic.no)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get tuple, one per function parameter, of the storage classes of the parameters.
|
Get a tuple of the storage classes of a function's parameters.
|
||||||
Params:
|
Params:
|
||||||
func = function symbol or type of function, delegate, or pointer to function
|
func = function symbol or type of function, delegate, or pointer to function
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -1154,22 +1154,16 @@ if (isCallable!func)
|
||||||
|
|
||||||
static if (is(Func PT == __parameters))
|
static if (is(Func PT == __parameters))
|
||||||
{
|
{
|
||||||
template StorageClass(size_t i)
|
alias ParameterStorageClassTuple = AliasSeq!();
|
||||||
|
static foreach (i; 0 .. PT.length)
|
||||||
{
|
{
|
||||||
static if (i < PT.length)
|
ParameterStorageClassTuple = AliasSeq!(ParameterStorageClassTuple,
|
||||||
{
|
extractParameterStorageClassFlags!(__traits(getParameterStorageClasses, Func, i)));
|
||||||
alias StorageClass = AliasSeq!(
|
|
||||||
extractParameterStorageClassFlags!(__traits(getParameterStorageClasses, Func, i)),
|
|
||||||
StorageClass!(i + 1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
alias StorageClass = AliasSeq!();
|
|
||||||
}
|
}
|
||||||
alias ParameterStorageClassTuple = StorageClass!0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static assert(0, func[0].stringof ~ " is not a function");
|
static assert(0, func.stringof, " is not a function");
|
||||||
alias ParameterStorageClassTuple = AliasSeq!();
|
alias ParameterStorageClassTuple = AliasSeq!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1332,25 +1326,20 @@ if (isCallable!func)
|
||||||
enum Get = "";
|
enum Get = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alias ParameterIdentifierTuple = AliasSeq!();
|
||||||
|
static foreach (i; 0 .. PT.length)
|
||||||
|
{
|
||||||
|
ParameterIdentifierTuple = AliasSeq!(ParameterIdentifierTuple,
|
||||||
|
Get!i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static assert(0, func.stringof ~ " is not a function");
|
static assert(0, func.stringof ~ " is not a function");
|
||||||
|
// avoid pointless errors
|
||||||
// Define dummy entities to avoid pointless errors
|
alias ParameterIdentifierTuple = AliasSeq!();
|
||||||
template Get(size_t i) { enum Get = ""; }
|
|
||||||
alias PT = AliasSeq!();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template Impl(size_t i = 0)
|
|
||||||
{
|
|
||||||
static if (i == PT.length)
|
|
||||||
alias Impl = AliasSeq!();
|
|
||||||
else
|
|
||||||
alias Impl = AliasSeq!(Get!i, Impl!(i+1));
|
|
||||||
}
|
|
||||||
|
|
||||||
alias ParameterIdentifierTuple = Impl!();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -1408,7 +1397,7 @@ if (isCallable!func)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get, as a tuple, the default value of the parameters to a function symbol.
|
Get, as a tuple, the default values of the parameters to a function symbol.
|
||||||
If a parameter doesn't have the default value, `void` is returned instead.
|
If a parameter doesn't have the default value, `void` is returned instead.
|
||||||
*/
|
*/
|
||||||
template ParameterDefaults(alias func)
|
template ParameterDefaults(alias func)
|
||||||
|
@ -1449,25 +1438,19 @@ if (isCallable!func)
|
||||||
alias Get = void;
|
alias Get = void;
|
||||||
// If default arg doesn't exist, returns void instead.
|
// If default arg doesn't exist, returns void instead.
|
||||||
}
|
}
|
||||||
|
alias ParameterDefaults = AliasSeq!();
|
||||||
|
static foreach (i; 0 .. PT.length)
|
||||||
|
{
|
||||||
|
ParameterDefaults = AliasSeq!(ParameterDefaults,
|
||||||
|
Get!i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static assert(0, func.stringof ~ " is not a function");
|
static assert(0, func.stringof ~ " is not a function");
|
||||||
|
// avoid pointless errors
|
||||||
// Define dummy entities to avoid pointless errors
|
alias ParameterDefaults = AliasSeq!();
|
||||||
template Get(size_t i) { enum Get = ""; }
|
|
||||||
alias PT = AliasSeq!();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template Impl(size_t i = 0)
|
|
||||||
{
|
|
||||||
static if (i == PT.length)
|
|
||||||
alias Impl = AliasSeq!();
|
|
||||||
else
|
|
||||||
alias Impl = AliasSeq!(Get!i, Impl!(i+1));
|
|
||||||
}
|
|
||||||
|
|
||||||
alias ParameterDefaults = Impl!();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue