From a9de9d0d6daaa0882a38ffb4079152f9823f5494 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Thu, 21 Jan 2021 00:23:17 -0800 Subject: [PATCH] Rewrite std.meta.Stride using AliasAssign --- std/meta.d | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/std/meta.d b/std/meta.d index 4c753083297..83790a863f2 100644 --- a/std/meta.d +++ b/std/meta.d @@ -1713,23 +1713,27 @@ Returns: An `AliasSeq` filtered by the selected stride. template Stride(int stepSize, Args...) if (stepSize != 0) { - static if (Args.length == 0) - { - alias Stride = AliasSeq!(); - } + static if (stepSize == 1) + alias Stride = Args; else static if (stepSize > 0) { - static if (stepSize >= Args.length) - alias Stride = AliasSeq!(Args[0]); - else - alias Stride = AliasSeq!(Args[0], Stride!(stepSize, Args[stepSize .. $])); + alias A = Nothing; + static foreach (i; 0 .. (Args.length + stepSize - 1) / stepSize) + { + A = AliasSeq!(A, Args[i * stepSize]); + } + alias Stride = A; } + else static if (stepSize == -1) + alias Stride = Reverse!Args; else { - static if (-stepSize >= Args.length) - alias Stride = AliasSeq!(Args[$ - 1]); - else - alias Stride = AliasSeq!(Args[$ - 1], Stride!(stepSize, Args[0 .. $ + stepSize])); + alias A = Nothing; + static foreach (i; 0 .. (Args.length + -stepSize - 1) / -stepSize) + { + A = AliasSeq!(A, Args[$ - 1 + i * stepSize]); + } + alias Stride = A; } }