[std/traits] Avoid template recursion for 3 Parameter traits

This commit is contained in:
Nick Treleaven 2023-07-28 20:58:26 +01:00
parent ac7e69151d
commit e55f2c2df3

View file

@ -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!();
} }
/// ///