digitalmars.D.learn - Grouping variadic parameter tuples on offset and stride
- =?UTF-8?B?Tm9yZGzDtnc=?= (18/18) Jan 21 2016 I'm currently developing a new lazy variadic generic
- H. S. Teoh via Digitalmars-d-learn (35/45) Jan 21 2016 Try this:
- =?UTF-8?B?Tm9yZGzDtnc=?= (2/16) Jan 22 2016 Made it work. Thx
I'm currently developing a new lazy variadic generic range/algorithm substitute() at https://github.com/nordlow/justd/blob/master/substitution.d#L261 I plan to propose for Phobos. It is meant to be used as assert(`do_it`.substitute(`_`, ` `, `d`, `g`, `i`, `t`, `t`, `o`) .equal(`go to`)); I'm currently only lacking one thing ...namely a way to group the parameters of the call to a variadic function based on their offset and stride. That is if have haystack.substitute(x0, y0, x1, y1, x2, y2, ...); How do I extract x0,x1,x2 into a one parameter tuple and y0,y1,y2 into another?
Jan 21 2016
On Thu, Jan 21, 2016 at 10:24:55PM +0000, Nordlöw via Digitalmars-d-learn wrote: [...]I'm currently only lacking one thing ...namely a way to group the parameters of the call to a variadic function based on their offset and stride. That is if have haystack.substitute(x0, y0, x1, y1, x2, y2, ...); How do I extract x0,x1,x2 into a one parameter tuple and y0,y1,y2 into another?Try this: import std.meta; template Stride(size_t stride, size_t offset, Args...) if (stride > 0) { static if (offset >= Args.length) alias Stride = AliasSeq!(); else static if (stride >= Args.length) alias Stride = AliasSeq!(Args[offset]); else alias Stride = AliasSeq!(Args[offset], Stride!(stride, offset, Args[stride .. $])); } alias MyList = AliasSeq!("a", "b", "c", "d", "e", "f", "g", "h", "i"); pragma(msg, Stride!(1, 0, MyList)); pragma(msg, Stride!(2, 0, MyList)); pragma(msg, Stride!(2, 1, MyList)); pragma(msg, Stride!(3, 0, MyList)); pragma(msg, Stride!(3, 1, MyList)); pragma(msg, Stride!(3, 2, MyList)); Compiler output: tuple("a", "b", "c", "d", "e", "f", "g", "h", "i") tuple("a", "c", "e", "g", "i") tuple("b", "d", "f", "h") tuple("a", "d", "g") tuple("b", "e", "h") tuple("c", "f", "i") T -- This sentence is false.
Jan 21 2016
On Thursday, 21 January 2016 at 22:35:09 UTC, H. S. Teoh wrote:Try this: import std.meta; template Stride(size_t stride, size_t offset, Args...) if (stride > 0) { static if (offset >= Args.length) alias Stride = AliasSeq!(); else static if (stride >= Args.length) alias Stride = AliasSeq!(Args[offset]); else alias Stride = AliasSeq!(Args[offset], Stride!(stride, offset, Args[stride .. $])); }Made it work. Thx
Jan 22 2016