Skip to content

Commit 82a7946

Browse files
committed
with staticSlice
1 parent 65015c5 commit 82a7946

1 file changed

Lines changed: 35 additions & 16 deletions

File tree

source/openmethods.d

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -441,21 +441,6 @@ private enum IsCovariant(T) = false;
441441
private enum IsCovariant(T : covariant!U, U) = true;
442442
private alias UnqualType(T : covariant!U, U) = U;
443443

444-
template FilterVirtual(Q...)
445-
{
446-
template From(T...) {
447-
static if (Q.length == 0) {
448-
alias From = AliasSeq!();
449-
} else {
450-
static if (IsVirtual!(Q[0])) {
451-
alias From = AliasSeq!(T[0], FilterVirtual!(Q[1..$]).From!(T[1..$]));
452-
} else {
453-
alias From = FilterVirtual!(Q[1..$]).From!(T[1..$]);
454-
}
455-
}
456-
}
457-
}
458-
459444
private template Format(alias F, A...)
460445
{
461446
static if (isInstanceOf!(AliasPack, A[0])) {
@@ -477,6 +462,36 @@ unittest
477462
static assert(F2!(AliasPack!("int", 1)) == "int a1");
478463
}
479464

465+
// will PR
466+
template staticSlice(alias Pack, alias Positions)
467+
{
468+
static if (Positions.length == 0) {
469+
alias staticSlice = AliasPack!();
470+
} else {
471+
alias staticSlice = AliasPack!(
472+
Pack.Unpack[Positions.Unpack[0]],
473+
staticSlice!(Pack, Positions.Tail).Unpack);
474+
}
475+
}
476+
477+
unittest
478+
{
479+
static assert(
480+
staticSlice!(
481+
AliasPack!(),
482+
AliasPack!())
483+
.equals!());
484+
static assert(
485+
staticSlice!(
486+
AliasPack!(int, char, float),
487+
AliasPack!()).equals!());
488+
static assert(
489+
staticSlice!(
490+
AliasPack!(int, char, float),
491+
AliasPack!(0, 2))
492+
.equals!(int, float));
493+
}
494+
480495
// ============================================================================
481496
// Method
482497

@@ -887,7 +902,11 @@ mixin template Registrar(TheMethod, alias Spec) {
887902
TheMethod.Name, SpecParams.stringof, &wrapper);
888903
}
889904

890-
foreach (cls; openmethods.FilterVirtual!(TheMethod.QualParams).From!(SpecParams)) {
905+
foreach (
906+
cls;
907+
openmethods.staticSlice!(
908+
openmethods.AliasPack!(SpecParams),
909+
openmethods.AliasPack!(TheMethod.virtualPositions)).Unpack) {
891910
si.vp ~= cls.classinfo;
892911
}
893912

0 commit comments

Comments
 (0)